L^{A}TEX 2εマクロ備忘録�

ver-1.2

平成 14 年 10 月 21 日

目次

1 step0 （緒言） 2 1.1 おことわり . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2 step1 （準備） 3 2.1 引数の無いマクロ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 引数を持つマクロ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3 なんでも定義できるか . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 step2 （基礎） 5 3.1 条件・分岐を使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2 反復を使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.3 カウンタ・ディメンション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

3.3.1 カウンタの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.3.2 カウンタの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.3.3 ディメンションの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.3.4 ディメンションの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.4 オプション引数を使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.4.1 @を使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.4.2 オプション引数の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.4.3 オプション引数を複数使う . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3.5 図表もマクロに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.6 環境定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

4 step3 （鑑賞） 11

4.1 いろいろなマクロを眺めてみる . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.1.1 マクロの方言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.1.2 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.1.3 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 5 step4 （盗用） 13

5.1 パクル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.1.1 パクリの基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

5.1.2 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.1.3 パクリの元を探す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

6 step5 （雑記） 14 6.1 行末の% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 6.2 高度なマクロのために . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

6.2.1 あえて触れなかったコマンドたち . . . . . . . . . . . . . . . . . . . . . . . 14

6.2.2 それでも反面教師的に . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

7 さいごに 17 7.1 あとがき . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 7.2 続編予告 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1 step0 （緒言）

1.1 おことわり

この備忘録は著者がマクロを学習した際のメモをまとめたものであり、あくまでも個人的な経験を元に作られています。もともと他人の目に触れる目的で書かれていませんので記述に関してかなり不親切な部分があります。なおかつ、学習途上の不正確な理解が反映されているところも多いかと思いますので、使用についてはある程度の疑心をもってかかってください。

1.2 はじめに

まずは当たり前のことですが、マクロというのは、「ある一連の手続きをまとめ上げて定義あるいは再定義たもの」と理解してください。そして、 TEX でマクロを使おうというのは、極めて基本的な欲求であると思います。それは

• 原稿入力の手間を簡略化するため

• 出力原稿の可塑性を保証するため

というあたりが理由として大きいと思います。もちろんこの他に

• 原稿内容の高度化を促進するため

というまさに DTP の本質というか、そのものを追求せむがためのマクロ、マクロ集、及びスタイルファイル等の作成の欲求があるやも知れません。しかしここではあえて

• なるべく特別な道具は使わない

• なるべく特別な手法は使わない

• なるべく特別な話題は扱わないということにこだわってみたいと思います^{1}。

はじめの部分に関して言えば、最近のエディタは軽くて有能なものがあるので、置換やコピーとペーストを厭わなければそれほどのメリットは無いということになりますが、それでも例えば 2 × 2 行列を \mat{1}{2}{3}{4} という感じで入力できればそれはそれで簡単であるし、便利なことに違いはありません。また、次の部分に関して言えば、例えば演習問題の間の縦の空白（空行）を挿入したいときに \vspace をよく使います。その際、原稿の仕上がりを見てから、いちいちその値をすべて変えるよりは、仮に \bigsp や \midsp などのマクロ定義をしておいて、その部分だけを変えれば全体の調整が可能です。そしてそういうレベルのマクロの作成は特に大げさなものでもないし、特段のテクニックを要するものでも無いと断言できます。そこで、ここではその程度の使用を前提とするマクロ作成の実際について説明をしたいと思います。

なお、文献としては以下のものを参照します。

• 改訂新版 TEX ブック Donald E.Knuth 著斎藤信男 監修 鷺谷好輝 訳

• L^{A}TEX 2εfor WINDOWS Another Manual Vol.2 乙部厳己 江口庄英 著

• L^{A}TEX 自由自在 磯崎秀樹 著

最後のものは特に文中単に「磯崎」本と省略します。

2 step1 （準備）

2.1 引数の無いマクロ

マクロというのは、「ある一連の手続きをまとめ上げて定義あるいは再定義したもの」といいました。はじめは最も簡単な置き換え程度のものから始めます。 TEX のマクロではその一連の手続きに名前を付けたものをマクロとしています。実際のマクロの定義は \def または \newcommand を用います。どちらも似たようなものですので心配ありません。勿論本当は区別されるべきもので用途も違うのですが、あくまでも初等マクロの作製には本質的に違いがありません。で、前置きはこれくらいにして、実際を見ます。

定義あるいは再定義（本当はこの言い方は違いますが、引数をとらない場合には、単に名前を定義したり再定義するようなものですから、ここではこの言い方をすることにします。）そして

  基本の書式は \def\A{B} または \newcommand{\A}{B} です

この形で「B という一連の手続き」を \A という名前のマクロとして定義することになります。

例

\def\lra{\leftrightarrow}
\def\wa{\sum_{k=1}^n}

本来は \leftrightarrow と入力すべき両側矢印記号を、 \lra と入力すればよいようにしたり、また ∑_{k=1}^{n} を \wa で済むようにしたりというのがこれです。

1うそつき！本当はそんなこと解説できないからだろ！ごめんなさい！

2.2 引数を持つマクロ

次に引数を持つマクロです。このマクロは使うときに引数と呼ばれる値を同時に入力して、その値を使った命令としてマクロが展開されるようにするものです。初等的なマクロはこれが使えれば充分です。そして引数が１つの場合

  基本の書式は \def\A#1{B} または \newcommand{\A}[1]{B} です

また引数が２つの場合

  基本の書式は \def#1#2\A{B} または \newcommand{\A}[2]{B} です

例

\def\bango#1{{\Large{#1}.}}
\newcommand{\permu}[2]{{}_{#1}{\mathrm P}_{#2}}

ここで

\bango{1}
$\permu{6}{2}$

と入力すれば、 1. _{6}P_{2} と出力されます。はじめのものは引数となる番号を大文字にしてピリオドをつけています。次のものは順列記号をローマン体で出力させているだけですが、ついでに入力の手間も若干省けています。この場合では引数が２つになっています。また引数を省略した場合にデフォルトを定義することもできますが、ここでは省略します。

2.3 なんでも定義できるか

マクロにするときに単純でありながら

\def\facemark{(^_^)}

はエラーを起こします。あたりまえのことですが TEX で通常使用できない文字はマクロでもそのままでは使えません。また

\def\A{B}
\def\A{$\A+C$}

というマクロは、はじめに \A に B を、次にまた \A を B+C にしたいと思って作ったものですが、これは実行できません。これは展開のことを知らなくてはいけません。

3 step2 （基礎）

3.1 条件・分岐を使う

これまで何らかのプログラミング言語を経験したことのある人にはなんのことはありません。 TEX のマクロにおいても条件・分岐が使えます。そして

基本の書式は \if 系コマンド条件真の場合 \else 条件偽の場合 \fi です

例

\def\toiban#1{\ifnum#1<10 ( #1)\else (#1) \fi}

ここで

\toiban{1}
\toiban{10}

と入力すれば、 ( 1) (10) と出力されます。これは見てお分かりの通り桁数によって括弧の幅を変えたくないときに一桁の数字の前に半角空白を挿入しています。そしてこの場合は \ifnum によって引数が一桁かどうか判断して処理を分岐させています。初等的なマクロで条件・分岐に使うのは以下のようなものだと思います。

• \ifnum 整数値を比較する。比較に使えるのは =, ⟨, ⟩

• \ifodd 整数値が奇数の場合に真、偶数の場合に偽を返す

• \ifdim 長さを比較する。比較に使えるのは =, ⟨, ⟩

• \if 続く一文字を比較する。

• \ifx 続く文字列を比較する。

またスイッチ系の命令としては \ifcase があります。

基本の書式は \ifcase 数値=１の場合 \or 数値=２の場合 \or⋯ \fi です

3.2 反復を使う

これもこれまで何らかのプログラミング言語を経験したことのある人にはなんのことはありません。 TEX のマクロにおいてもまた反復が使えます。そしてある条件が真である間繰り返す反復処理について

  基本の書式は \loop \if 系コマンド \repeat です

例

\def\ncdots#1{\newcount\cnt\cnt=0%
              \loop \ifnum#1>\cnt ・ \advance \cnt by 1\repeat}

ここで

\ncdots{7}
\ncdots{20}

と入力すれば・・・・・・・・・・・・・・・・・・・・・・・・・・・と出力されます。これも見てお分かり

の通りのものです。ただしここでカウンタのインクリメントに \advance というコマンドを使っていることにご注意ください。カウンタなどの四則については後ほど説明します^{2}。

3.3 カウンタ・ディメンション

3.3.1 カウンタの定義

先の反復では、一定の数値までの繰り返しなどに整数カウンタを使用します。カウンタというとページのカウンタや箇条書き環境でのカウンタでお馴染みではありますが、ここではいま触れたようなマクロの中での使い捨てカウンタについて説明します。そしてその定義は

基本の書式は \newcount\カウンタ名\カウンタ名=初期値% です

ただし \count0,\count1,\count2, ・・・は改めて定義しなくてもそのまま使えます。例

\def\ncdots#1{\newcount\cnt\cnt=0%
              \loop \ifnum#1>\cnt ・ \advance \cnt by 1\repeat}

これは先の反復のところの例そのままです。今回はカウンタの使い方として見ていただければ結構です。

3.3.2 カウンタの操作

カウンタの操作について触れます。まずカウンタの値が見たいというときにはカウンタ名の前に \the を付けます。例えば

\def\ncdots#1{\newcount\cnt\cnt=0%
         \loop \ifnum#1>\cnt ・ \the\cnt \advance \cnt by 1\repeat}

2うそつき！

とすると・ 0 ・ 1 ・ 2 ・ 3 ・ 4 という出力が得られます。

次にカウンタのインクリメントです。いろいろ方法はありますが上記のように\advance を使うのが見やすいのではないかと思います。

基本の書式は \advance \カウンタ名 by 増分です

これは和を行うコマンドですから by の後ろの値を変えればその分だけ増加します。また当然この他に四則演算のコマンドがありますが、ここでは止めます。^{3}

3.3.3 ディメンションの定義

図表や box 関係の操作に欠かせないのが長さのお話です。これを新たに定義することができます。そしてこの定義の仕方は先のカウンタとほぼ同じです。つまり

基本の書式は \newdimen\ディメンション名\ディメンション名=値% です

  この場合も \dimen0,\dimen1,\dimen2, ・・・はそのまま使えます。

例

\setbox0\hbox{あ}
\newdimen\txtlen\txtlen=\wd0

これは「あ」という文字の横の長さを測って（box に「あ」を入れてその幅をとりだすコマンド \wd で取り出している）それを新しいディメンション \txtlen に代入しています。またその長さを見るのに \the を付けて \the\txtlen とすれば 9.62216pt という出力が得られます。このときに出力されたものに長さの単位 pt がついていることに注意しましょう。また L^{A}TEX 流^{4}に書けば次のような書き方も可能です。

  基本の書式は \newlength{\ディメンション名}\setlength{\ディメンション名}{値}% です

例

\newlength{\txtlen}
\settowidth{\txtlen}{あ}

先の例はこのように書いても同じです。こちらの出力もやはり 9.62216pt となります。こちらのほうが簡単だと思えばこちらをご使用ください。簡単なのがなによりです。どちらを選ぶかはあくまでも個人的な好みの問題です。 3.3.4 ディメンションの操作

3不親切！

4前のは plain TEX 流ということになります

ディメンションの操作が必要になってくることがしばしばあります。たとえば数式モードでない通常のモードでテキストの上部に傍線（オーバーライン）をつけるコマンドをマクロを使って定義してみるとします。そのような時にテキストの高さのディメンションの 1.3 倍の高さのところに線を引きたい。などということになります。このときのようにあるディメンションの倍数は簡単に操作が可能で、それには次のようにします。

基本の書式は倍数値\ディメンション名です

実にわかりやすくて簡単です。

例

\def\ovline#1{\setbox0\hbox{#1}\newdimen\txtlen\txtlen=\wd0%
              \setbox0\vbox{#1}\newdimen\txthgt\txthgt=\ht0%
              {\ooalign{\hfill\rule[1.3\txthgt]{\txtlen}{0.4pt}%
                        \hfill\crcr\hfill #1\hfill}}}

ここで \ovline{DC} \ovline{あいうえお} と入力すれば、 DC あいうえおが得られます。ただしここで \ooalign は \hfill で挟まれたものを重ね合わせるコマンドです。

次に、ディメンションの加減ですが、これはカウンタの時と同様に \advance コマンドを必要とします。使い方はカウンタの場合と同じで、

基本の書式は \advance \ディメンション名 by 増分です

3.4 オプション引数を使う

3.4.1 @を使う

マクロにはオプションの引数をつけることができます。通常の引数の前に [ ] を使って記述するのが一般的です。

そしてこのようなマクロを作製するには \@ifnextchar コマンドを用います。このコマンドには見慣れない @ が付いています^{5}。このコマンドを使ったマクロを作製する場合には必ず前後を \makeatletter と \makeatother で挟む必要があります。したがって @ が付いているマクロについて

  基本の書き方は \makeatletter マクロ \makeatother です

\@ifnextchar はこれに続く文字が何であるかを判断してくれるので、次のようにすればオプション引数があるかを判断して分岐させることができます。 3.4.2 オプション引数の設定

5通常のマクロにはたくさん使われている

前述の \@ifnextchar を使ってオプション引数を使うには次のようにします。

基本の書き方は \def\マクロ名{\@ifnextchar[{指定文字マクロ}{指定以外マクロ}} です

例

\makeatletter
\def\ban{\@ifnextchar[{\@ban}{\@ban[]}}
\def\@ban[#1]#2{\if#1l\large #2.\else #2\fi}
\makeatother

このようにするとオプションとして \ban[l] としたときだけ大きいフォントを使用することになります。

3.4.3 オプション引数を複数使う

オプション引数を複数使うには基本の書式に加えて \@tfor を用います。これについては説明するよりも先に例を示します。先ほどの例を少し変えて、大きさ（ここでは Large）と書体（ここではサンセリフ）をオプションで変えられるようにしてあります。ただし実際のマクロの中身はあまり参考にしないようにしてください。とにかく\@tfor があれば文字を逐次読み出してくれますからそれによって条件定義をしてやればよいということになります。

例

\makeatletter
\def\ban{\@ifnextchar[{\@ban}{\@ban[]}}
\def\@ban[#1]#2{{%
 \@tfor\opti:=#1\do{%
    \if\opti L \Large {}\fi
    \if\opti S \sf {}\fi}
    #2.}}
\makeatother
これによる出力は、それぞれ \ban{3},\ban[L]{5},\ban[SL]{7} に対して 3., 5., 7. となり

ます。例を見て判るとは思いますが、それでも一応これだけは付けておきます。

  基本の書き方は \@tfor#1:=文字列\do{処理} です

3.5 図表もマクロに

一連の手続きとして図表を対象とすれば、当然といえば当然ですが図表のマクロができあがります。図表は通常入力する手間がかかりますから、よく使う図表はもちろんマクロにする価値があります。ただし、図の大きさを適宜変えたいときや、その一部だけを原稿によって変更したい場合があります。このような場合には、いちいち大きさを変えて一つずつの別のマクロを定義するよりも引数を使って大きさを変えるなどの工夫が有用です。さらにオプション引数を使えばいろいろな場合分けも可能となります。ここでは例を示すのみとします。

例

\def\xyplane{%
 \unitlength=1.0mm%
  \begin{picture}(100,100)(-50,-50)
    \put(-50,0){\vector(1,0){100}}
    \put(0,-50){\vector(0,1){100}}
     \put(0,0){\circle*{1}}
     \put(0,50){\small{$y$}}
     \put(50,0){\small{$x$}}
  \end{picture}}

これは見ての通りの座標平面です。 \xyplane の出力として

[figure: y; x] を得ます。

3.6 環境定義

次に新しい環境を作ってみます。これは、別に難しいことはありません。通常新しい環境を定義

するには \newenvironment を使います。

基本の書き方は \newenvironment{環境名}{環境開始時処理}{環境終了時処理} です

例

\makeatletter\newenvironment{tiisai}{\tiny}{}\makeatother
\begin{tiisai}

小さいサイズで出力される

\end{tiisai}

という環境定義に対して小さいサイズで出力されるという感じになります。さらに均等割付環境などは^{6}

6乙部 p248 による

\newenvironment{kintou}[1]{%
\hbox to #1\bgroup\kanjiskip=0pt plus 1fil minus 1fil}{\egroup}
\begin{kintou}{8zw}

均等割り付け

\end{kintou}%

によって、均等割り付けなどとなります。

4 step3 （鑑賞）

4.1 いろいろなマクロを眺めてみる

ここでは少し既製のマクロを眺めてみることにします。ただし、あくまでも初級の範囲とレベルで行きたいと思います^{7}。

4.1.1 マクロの方言

マクロを眺めていると @ を使ったコマンドがたくさん出てきます。これらはいわばマクロの方言のようなもので、それはそれなりに使う根拠があるのですが、解説はとても無理^{8}なのでとにかく重要なもののみその解釈だけ示します。

• \z@ ・・・ 0 または 0pt です

• \p@ ・・・ pt です

• \@vpt ・・・ 5pt です

• \@xpt ・・・ 10pt です

4.1.2 例

奥村 晴彦著 L^{A}TEX 2ε 美文書作成入門にあるマクロを眺めてみたいと思います。なお、解説の便宜の為に行番号を付加しています。ご注意ください。

 1:\newcommand{\ruby}[2]{%
 2:\leavevmode
 3:\setbox0=\hbox{#1}%
 4:\setbox1=\hbox{\tiny #2}%
 5:\ifdim\wd0>\wd1 \dimen0=\wd0 \else \dimen0=\wd1 \fi
 6:\hbox{%
 7:  \kanjiskip=0pt plus 2fil
 8:  \xkanjiskip=0pt plus 2fil
 9:  \vbox{%

7どこまでが初級やねん！？

8私の能力が・・・

10:   \hbox to \dimen0{%
11:    \tiny \hfil#2\hfil}%
12:    \nointerlineskip
13:    \hbox to \dimen0{\mathstrut\hfil#1\hfil}}}}

このマクロはルビを振るもので、入力 \ruby{習志野}{ならしの} に対して習志野^{ならしの}を出力するものです。このマクロではディメンションの使い方を見ます。また box 関係の使い方も一緒に見ればわかりやすいと思います。

１行目のマクロ宣言のあと、３行目は入力漢字の横幅を測るために box に放り込んでいます。４行目は同じく入力ルビの横幅を測るために box に放り込んでいます。５行目ではその各 box の幅を \wd で取り出して、長い方を \dimen0 カウンタに入れています。次に７行目では漢字間のスペースファクターを 0pt から伸びるように定義しています。同じく８行目は漢字と欧文とのスペースファクターを 0pt から伸びるように定義しています。これらは、入力漢字とルビのどちらか長いほうに合わせて出力を得るようにするための工夫です。１０行目でルビを振るための横 box を作り、１１行目でセンタリングしてルビを置いています。さらにルビの box と漢字の box が密着するようにするのが９行目と１２行目の工夫です。１３行目で最後に入力漢字のための box を作成しています。ここで２行目のコマンドが何のために使われているのか？というのは考えてみてください^{9}。

4.1.3 例

次のマクロは著者が作ったもので、２つの集合の標準的なヴェン図を出力するものです。大きさを指定すること、オプションで全体集合の外枠を付けることなどができます。オプション引数の指定の仕方や図表のマクロにおける大きさの指定など適当に参考にしてください。なお、 \arc コマンドの使い方については適当です。 (^^;)

 1:\makeatletter
 2:\def\venn{\@ifnextchar[{\@venn}{\@venn[]}}
 3:\def\@venn[#1]#2{\unitlength=#2mm%
 4: \begin{picture}(100,100)(-50,-50)%
 5: \if#1u\put(-50,-35){\line(1,0){100}}\put(-27,33){$U$}
 6:       \put(-50,-35){\line(0,1){70}}\put(50,-35){\line(0,1){70}}
 7:       \put(-50,35){\line(1,0){20}}\put(-20,35){\line(1,0){70}}\fi%
 8:  \put(15,0){\arc{50}{-.6}{4.8}}\put(-15,0){\arc{50}{-1.6}{3.8}}
 9:  \put(-30,20){$A$}\put(25,20){$B$}
10:  \end{picture}}
11:\makeatother
  \venn{.5} \venn[u]{.5}という入力に対して、

9ええ加減！

A  B  ^{U A  B}

という出力を得ます。特に解説の必要なところは無いと思うのですが、２行目でオプション引数の扱いを定めています。

5 step4 （盗用）

5.1 パクル

学ぶことは何とかといいますが、一歩進んでパクリましょう。著作権は侵害してはいけませんが、個人で楽しむ分には良しとしましょう^{10}。

5.1.1 パクリの基本

マクロをパクルには元がなければいけません。その元は「本」かも知れませんし、既存のファイルかも知れません。そこに書いてあることがすべて理解（解読）できれば、自分流にアレンジすることも充分に可能ですが、必ずしもそのように簡単にいくとは限りません。マクロに限らず、他人の作ったプログラムほど判りにくいものは無いからです^{11}。どちらにしても、「初級程度の範囲を超えて、よくわからないけれどここらあたりが使えそう」という動物的な感覚が役に立ちます。そしてまずはいろいろ試してみる！このカットアンドトライの精神こそが、パクリの基本です。

5.1.2 例

あるところで次のようなマクロを見つけました。まだ L^{A}TEX2.09 だったころには不等号記号が使いにくかったのでみなさん苦労して？作られていたようです^{12}。

\makeatletter
\def\LEQQ{\mathrel{\mathpalette\gl@align<}}
\def\GEQQ{\mathrel{\mathpalette\gl@align>}}
\newcommand{\gl@align}[2]{\lower.6ex\vbox{\baselineskip\z@skip\lineskip\z@
    \ialign{$\m@th#1\hfill##\hfil$\crcr#2\crcr=\crcr}}}
\makeatother

10勝手な判断！

11もちろん能力の問題もある

12奥村 p138 にもある

このマクロを見て部分集合記号を作ろうと思うのは自然なことです^{13}。しかしこのマクロでは \ialign,\m@th などの意味が判りません。そこで、そこはパクリの基本にたって、関係ありそうなところだけいじってみました。そこは < と２つ目の \z@ です。そうして作ったのが

\makeatletter
\def\SUBEQQ{\mathrel{\mathpalette\gl@align\subset}}
\def\SUPEQQ{\mathrel{\mathpalette\gl@align\supset}}
\newcommand{\gl@align}[2]{\lower.6ex\vbox{\baselineskip\z@skip\lineskip\p@
    \ialign{$\m@th#1\hfill##\hfil$\crcr#2\crcr=\crcr}}}
\makeatother

です。これで $A\SUBEQQ B$, $A\SUPEQQ B$ と入力すると A ⊂ = B, A ⊃ = B が得られます。このときはじめからどこを変えればよいのかが判っていたのは < だけです。最初この部分を変えたものを実行すると、上の記号 ⊂ と下の記号 = が詰まってほとんど重なってしまいました。そこで間隔を空けるためにいろいろ触ってみてたどり着いたのがこの結果です。このようにして、カットアンドトライでたどり着くのがパクリでは往々にしてあることです。

5.1.3 パクリの元を探す

パクリの元として一番良いのは TEX ブックだと思っています。後半に Appendix B というところがパクリの元の宝庫です。それからあとは様々な既存のスタイルファイルになろうかと思います。それには雑誌や本の付録の CD-ROM やインターネットが役に立ちます。いろいろ解説つきで紹介されているのが普通なので、興味のあるものを見て、パクルことができそうなものを探すと良いと思います。ただし、著作権には充分に注意しましょう。

6 step5 （雑記）

6.1 行末の%

「磯崎」本によると、なにもない行末にわざわざ%をつけるのは、その直後の改行によってスペースが挿入されるのを回避するという意味があるそうです。詳細は「磯崎」本 p12,13 あるいは TEX ブックを参照してください。

6.2 高度なマクロのために

6.2.1 あえて触れなかったコマンドたち

独断と偏見と我儘と怠慢により、勝手に選んだ下記のコマンドは初級の趣旨に見合わないものとしてここでは触れませんでした。

   • \edef,\gdef,\xdef
   • \let
   • \relax,\empty

13amssymb を使えば必要無い

   • \expandafter
   • \protect
   • \catcode
   • \@namedef,\@nameuse,\csname,\endcsname
   • \@whilenum,\@whiledim

要するに展開関係などは避けたわけです。でも通常のマクロではたくさん使われています。

6.2.2 それでも反面教師的に

それでもここでは反面教師的に自作マクロを載せます。２次関数のグラフをかくためのマクロなのですが、丁度、カウンタのあたりを学習中のときのものです。ですから試行錯誤の挙げ句の作ということで、とても汚いマクロに仕上がっています。それ故にこのマクロを見て適当に改編していただくことが演習問題となります。エレガントな形にしてみてください^{14}。演算部分は完全に「磯崎」本のパクリであります。パクリは学習の基本なので良しとしませう！

例

 1:\makeatletter
 2:\newdimen\rval
 3:{\catcode`\p=12\catcode`\t=12\gdef\Rval#1pt{#1}}
 4:%
 5:\def\Eval#1#2{\edef#2{\expandafter\Rval\the#1}}
 6:%
 7:\def\multi#1#2#3{\rval=#1pt\rval=#2\rval
 8:\edef#3{\expandafter\Rval\the\rval}}
 9:%
10:\def\advan#1#2#3{\rval=#1pt\advance\rval by #2pt
11:\edef#3{\expandafter\Rval\the\rval}}
12:%
13:\def\qfgra#1#2#3#4{\unitlength=10pt%
14:\unitlength=#1\unitlength%
15:\begin{picture}(20,20)(-10,-10)
16:    \put(-10,0){\vector(1,0){20}}
17:    \put(0,-10){\vector(0,1){20}}
18:     \put(0,0){\circle*{0.1}}
19:     \put(0,10){\small{$y$}}
20:     \put(10,0){\small{$x$}}
21:%
22:\newdimen\cnt\cnt=-10pt
23:\loop

14エレガントな結果を教えてください！

24:\ifdim \cnt<10pt
25:\Eval\cnt\XX
26:\multi{\XX}{\XX}{\BB}
27:\multi{\BB}{#2}{\CC}
28:\multi{\XX}{#3}{\DD}
29:\advan{\CC}{\DD}{\EE}
30:\advan{\EE}{#4}{\YY}
31:\ifdim\YY\p@<10pt
32:\ifdim\YY\p@>-10pt
33:\put(\XX ,\YY){\rule{.5pt}{.5pt}}\else \relax \fi \fi
34:\advance\cnt by 0.01pt
35:\repeat
36:\end{picture}}
37:\makeatother

使い方は \qfgra{大きさ}{２乗項係数}{１乗項係数}{定数項値} なので、このマクロ群に対し

て \qfgra{1}{1}{4}{2} とすれば y = x^{2} + 4x + 2 のグラフ

[figure: y; x]

が得られます^{15}。ここで \edef,\gdef,\expandafter などのコマンドの使い方は初級を超えると思っていますのでここでは触れません。ここは単なる「磯崎」本のパクリで使用しているものです。さて、出力等に問題があれば適当にパラメータの値をいじったり、各点プロットのところを曲線や直線で補間したりしてください。ただ、例示する程度ならこれで充分だと著者は思っています。問題となるのは２２行目〜３５行目までの２次関数の計算部分です。小数計算が不可欠ですが、その小数計算をするのがよくわからずに作ったものですから、ディメンションの使い方、またはディメンションとしての使い方と数値代入がごちゃごちゃで醜悪な様相となっています。おまけに使い捨ての文字が \BB などの安易な名称になっているので汎用性にも著しく欠けています。このあたりをシンプルかつエレガントにしてください。ちなみに今、自分で改編するなら四則演算は

迷わず eclarith.sty を使うと思います。

15出力では格子入れています。スミマセン！

7 さいごに

7.1 あとがき

さらに高度なマクロを組むためにはかなりの鍛錬が必要になるかも知れません。しかし、経験と能力のある人はどんどん新しいものにも挑戦できると思います。 TEXnician となって有用なマクロを提供してください^{16}。それにはやはり

• TEX ブックを熟読すること

• 既製のマクロを研究すること

• 既製のマクロをパクルこと^{17}

• 有能な人に教えてもらうこと^{18} ということに尽きると思います。

7.2 続編予告

続編内容予告^{19}。

• 引数のパターンマッチング

• 文字のカテゴリーコード

• カウンタ・ディメンションの四則演算初中級編

• 複数のマクロの関係初中級編

16わがまま！ 17著作権に注意！ 18決して無能な人に聞いてはならない！ 19発行未定