\defの修飾子

TeXでマクロを定義するには\defを使います.しかし,この\defはスコープ(TeXではグループと呼ばれる)に影響されるので,同じスコープ内でのみ有効です.これを問答無用でグローバルにするための修飾子が\globalです.TeXのマクロは「動的スコープ」を持つといえます.Perlでいうところのlocalがついているようなものです.

また,TeXのマクロの引数には改段落はデフォルトでは許されません.この仕様は一種のリミッターになっているのですが,このリミッターを解除するのが\longという修飾子です.さらに,マクロの引数中で使うことができないマクロを定義するために\outerという修飾子が定義されています.

結果,\global/\long/\outerの修飾子と\defを組み合わせてマクロを定義することになります.これら三つの修飾子は排他的ではありません.

\globalについては以下のような動きになります.

\def\macroA#1{#1はカバ.}
\macro{アヤメちゃん}%%%アヤメちゃんはカバ.

{%
\def\macroA#1{はサル.}
\macro{アヤメちゃん}%%アヤメちゃんはサル.
}%

\macro{アヤメちゃん}%%%アヤメちゃんはカバ.

{%
\global\def\macroA#1{はサル.}
\macro{アヤメちゃん}%%アヤメちゃんははサル.
}%

\macro{アヤメちゃん}%%アヤメちゃんははサル.

\longについはこのような感じです.

\def\longmacroA#1{#1」には複数の段落がある.}
\longmacroA{本日は晴天なり.
\par
明日は雨かも.}%%%これはエラーになる.

\long\def\longmacroA#1{#1」には複数の段落がある.}
\longmacroA{本日は晴天なり.
\par
明日は雨かも.}%%%これならOK.

\outerはこんな感じです.

\def\macroA#1{#1」は本当です.}
\outer\def\outermacro#1{#1はカエルではありません.}

\macroA{\outermacro{アヤメちゃん}}%%%エラーになります.

! Forbidden control sequence found while scanning use of \macroA.

\def\macroA#1{\outermacro{#1}}
\outer\def\outermacro#1{#1はカエルではありません.}

\macroA{アヤメちゃん}%%これはOK

もっとも,LaTeX2eでは\outerはほとんど使われておらず,フロート関係で使われているのみです.フロート系環境はマクロの引数にはできないのです.