pt(ポイント)は一般的な定義よりわずかに小さくなっています。おける長さの基本単位です。単位の長さとして解釈されます。<数値>|どの演算も<レジスタ>のところに指定したレジスタに演算がなされて、その<レジスタ>の値が更新されます。文脈によって“by”は省略可能です。複雑なマクロを組むときには、レジスタごとの役割を表すレジスタ名を付けることができれば便利です。指示することで、<トークン>が整数レジスタ代わりに使えるようになります。アクセスする値が知らないうちに変えられてしまいます。統一的にレジスタを割り当てる仕組みが(これまたマクロによって)実装されています。指示するとレジスタ番号の若い方から順に整数レジスタを割り当てて、<トークン>がそのレジスタ代わりに使えるようになります。内部に保持されているので、何番レジスタに割り当てられたかは分かりませんが、気にせずに使えるようになります。ような使い方はしないようにしています。これによって、様々な人が作成したマクロを組み合わせて使えるようになっています。[#v38e683c]マクロの定義のしかたです。ここの解説を読む前に,トークンについて理解しておくとよいでしょう。上のほうの解説がまだなら先にそちらをお読みください。[#e7dd9b15]一般に、プログラムソース中に命令やトークンから成る特定の並びが何度も現れるとき、その並びに短い名前を付けて管理する仕組みをマクロといいます。ソースファイル内に、その特定の並びの代わりに短い名前を書いておくと、プログラムの実行中や前処理の段階で本来の並びに置き換えて処理されるので、ソースファイルを簡略化するのに使われます。マクロ機能を有するプログラム言語は多くあり、マクロ機能の詳細は、言語ごとに様々です。TeXのマクロ定義の基本は,引数を取らない簡単な置き換えマクロで,次のように定義します。\def<トークン>{置き換えテキスト}ここで,<トークン>のところには定義しようとするコントロールシークエンスかアクティブ文字を書きます。マクロとして次のように定義されています。-.125emX”に置き換えられて処理されます。これは,“T”に続けて0.1667emの長さの分だけ左に詰めて,0.5exという長さの分だけ下に下げたところに“E”を置き,それに続けて0.125emだけ左に詰めて“X”を置くという動作をさせるもので,“TeX”のロゴを文書中に表現するものです。入力して済ませられるようになるわけです。簡単に入力できるようになりますし,タイプミスを防ぐのにも役立ちます。この項、ここ以外にふさわしい場所があるかもしれません。中で使えたりする、ということを説明するのに、“展開”と“実行”についてどこかで説明が必要と考えました。ユーザーが定義する命令をマクロというのに対して、もともとTeXに備わっている命令はプリミティブ(=“原始的な組版命令”)といいます。実行中に、マクロがマクロ定義に従って対応するトークンの並びに置き換えられることを“展開”といいます。典型的なマクロは、より長いトークン列に置き換えられるので、その置き換えられる様子を“展開”といい表すわけですが、それに止まらず、マクロと引数(引数については次項参照)からなる長いトークン列がより短いトークン列や空のトークン列に置き換えられる場合や、マクロ以外のプリミティブ命令の一部が別のトークン列に置き換えられる場合も含めて、トークン列の変換の様子を“展開”といいます。トークン列の変換を表す“展開”に対して、TeXが内部のレジスタ(変数)の値を変更したり、組み立て中の組版リストに文字を付け加えたり、現在の組版モード(水平モード、数式モードなど)を変更したりといった、TeXがプリミティブ命令を処理して動作を進めることを、命令を“実行”するといいます。動作を考えるときには、この“展開”と“実行”を区別することが肝要です。[#ub81277c]マクロには、実行時に引数に応じて動作を変えるようなものもあります。場合は引数の与え方が全く異なるので、先入観を捨てておかないと理解しづらいでしょう。単純な引数を取るマクロを定義するには、次のように記述します。使える}ここで,<トークン>は定義しようとするコントロールシークエンスかアクティブ文字です。9個以内で必要な分だけつなげて書きます。引数の番号は1から順に書いていきます。3個の引数を取る場合です。ところにはめ込まれます。部分は決まりきった表現なので省略したいとしましょう。定義しておけば、「アボガドロ定数は$\N{6.02}{23}$とする」のように使えるわけです。同じ大きさで出力されてしまうことになります。使ってしまうと、「\N(6」までがマクロの引数と見なされて「(\times10^{6}」と展開されて、そのあとに未処理の「.02)(23)」が続くことになります。マクロの引数の形式には上に挙げた単純な引数の他に区切り付き引数と呼ばれるものもあります。(どなたかお願いします。おける条件分岐は,他のプログラミング言語の条件分岐とはまったく異なるものです。先入観を持っていると混乱するでしょう。文というものが用意されています。文は,論理演算子を組み合わせた論理式の真偽値を算出して,それに応じて処理を分岐します。論理式はおろか論理演算子というようなものすらもありません。状態を問い合わせるものや,二つのトークンが同じものかどうか比較するものなど,ごく限られたものしかありません。する動作というものは,条件に応じて処理を分岐するのではなく,条件に応じて実行する必要がなくなった部分を読み飛ばすに過ぎません。基本的な例を見てみましょう。ついての先入観を招きそうだと考えたためです。$P$\fiこの例は,“P”という文字をいつでも数式イタリック体で印字しようというものです。よってもとのモードに復帰させればよいでしょう。次のようなトークンの列として読み込まれます。プリミティブ命令です。いう名前から推察されるとおりです)。数式モードならば,[else]や[fi]を見つけるまではそのまま処理を続けます。この状態で[else]を見つけたならば,それ以降は[fi]を見つけるまでひとつひとつのトークンを読み飛ばしてゆきます。そのあとに続く処理を続行します。“fi”というのは“if”の逆さつづりで,開き括弧と閉じ括弧が左右逆向きになっているのを連想させるようなしゃれでしょう。いう英単語があるというわけではないようです。現在のモードが数式モードでなかった場合を考えましょう。[ifmmode]のあとに続くトークンを[else]や[fi]を見つけるまでひとつずつ読み飛ばしていきます。この状態で[else]を見つけたならば,読み飛ばすのは止めにして[else]のあとに続くトークンに従って処理を続けてゆきます。そのあとに続く処理を続行します。条件分岐処理は,上の例で[ifmmode]が担っていた条件判断の部分に何種類かのプリミティブ命令が用意されているだけで,あとのトークンの読み飛ばし方や,[else]や[fi]の扱いについては同じです。代わりに使える条件分岐命令を列挙してみましょう。|\ifmmode|現在のモードが数式モードかどうか||\ifhmode|現在のモードが水平モードかどうか||\ifx<トークン1><トークン2>|<トークン1>と<トークン2>が同じトークンかどうか。[#na8d9f89]各トークン列の実行は,原則として先頭から行われていきます。\def\testB#1{[#1]}まずは\testB\testAとした場合を考えてみましょう。\testBが展開されます。\testAですから,その展開結果は[\testA]となります。\testAが展開され,[{A}{B}]となります。,\expandafter\testB\testAとしてみます。\expandafterが展開され,\testBの展開が抑制されます。その結果先に\testAが展開され,\testB{A}{B}となります。その後\testBが展開されます。今回は#1={A}となり,結局[A]Bと展開されます。\expandafter自身も\expandafterの対象となります。\expandafter\expandafter\testCを考えてみます。最初の\expandafterにより次の\expandafterの展開が抑制され,その次の\testCが展開されます。その結果展開列は\expandafter\testB\testAとなります。上でみたように,全体の展開結果は[A]Bとなります。いくつか例を見てみましょう。\expandafter\def\expandafter\test\expandafter{\test,ABCDE}最初の\expandafterで\defが抑制されます。その後二番目の\expandafterが展開され,\testの展開が抑制されます。{が抑制され,\testが展開されます。\def\test{<\testの展開結果>,ABCDE}となります。加えるという操作に相当します。