\defと\edef

TeXのマクロの基本は\defなのですが,TeXのマクロは「単なる文字列の置き換えに過ぎない」という根本的な大原則があります.この原則を踏まえないでTeXのマクロを作ろうとすると絶対にいつかしっぺ返しをくらいます.例えば

\def\temp{太郎}
\def\marcoA#1{\temp#1の子です.}

\macroA{}%%%太郎は女の子です.

\def\temp{花子}
\macroA{}%%%花子は男の子です.

のように動作します.\macroAの中の\tempはマクロが定義されたときの値が使われるのではなく,マクロが使用されたときの値が使われるのです.あくまでも「置き換え」なので,\macroA{XX}は「\tempはXXの子です.」に置き換わるだけです.そして置き換わった時点での\tempが使われます.

しかし,これはとても不便なことがあります.そのマクロが定義されたときの値をそのまま保持して使いたいこともよくあります.そのようなときに使うのが\edefです.\edefを使うと,

\def\temp{太郎}
\edef\marcoA#1{\temp#1の子です.}

\macroA{}%%%太郎は女の子です.

\def\temp{花子}
\macroA{}%%%太郎は男の子です.

となります.つまり,\edefは定義された時点で「\temp は#1の子です.」の\tempをそのときの\tempの値を使って「太郎は#1の子です.」と展開して,それを\macroAと定めます.

したがって,TeXのマクロは\def/\edefに\global/\long/\outerの修飾子を組み合わせて定義することになります.そして,展開をいかに自在に制御するかがTeXのマクロ作成においては極めて重要なテーマです.