\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はほとんど使われておらず,フロート関係で使われているのみです.フロート系環境はマクロの引数にはできないのです.