tex はいつマクロ展開を行うのでしょうか?

tex はいつマクロ展開を行うのでしょうか?

教科書のいくつかの章を読んだところ、tex はコマンド ラインまたはファイルからの入力行を取り込み、それをトークンに変換することがわかりました。これらのトークンが消化管に入ると、tex はそれらをボックス、グルー、その他の何とかに変換して消化する準備を行い、いくつかのリストを構築します。

マクロに関しては、Tex がマクロ定義を保存するステージはどれですか? また、Tex がマクロ展開を行って置換を行うステージはどれですか?

答え1

それは簡単です! TeX は、そうでない場合を除き、常にマクロ展開を実行します。

215ページの2番目の二重に危険な段落には、

以下の場合には拡張が抑制されます。

  • エラー回復中にトークンが削除されている場合(第 6 章を参照)。
  • 条件付きテキストが無視されているためトークンがスキップされている場合。
  • TeX がマクロの引数を読み取っているとき。
  • TeXが \let、、、、、、、、、、、、、、、、および\futureletで定義さ れる制御シーケンス \defを読み取るとき。​​\gdef\edef\xdef\chardef\mathchardef\countdef\dimendef\skipdef\muskipdef\toksdef\read\font
  • TeXが\expandafter、、、、、、、、、、 \noexpandの引数トークン\stringを読み取って\meaningいるとき 。\let\futurelet\ifx\show\afterassignment\aftergroup
  • \defTeX が、、、または\gdefの パラメータ テキストを吸収している場合。\edef\xdef
  • \defTeX がまたは \gdefまたはの置換テキスト、または または のようなトークン変数のテキスト、または または または のトークン リストを吸収している場合 。\read(のトークン リストは、実際にファイルに出力されるときに後で展開されます。)\everypar\toks0\uppercase\lowercase\write\write
  • TeX がアライメントのプリアンブルを読み取っているとき、ただし、プリミティブ コマンドのトークンの後、\spanまたは after を読み取っているときを除く\tabskip
  • $数式モードを開始する3などのトークンの直後に、カテゴリ 3 の別のトークンが続くかどうかを確認します。
  • アルファベット定数を開始する`12トークンの直後。

不合理ではないですよね? 定義を行うときは、何も展開されないこと (\edefとを除く\xdef) を望み、4 番目、5 番目、6 番目、7 番目の箇条書きがこれを扱います。同様に、トークン リストをレジスタまたは に格納する場合も同様です\write

同様に、、、またはの後のトークンは\expandafter、明らかな理由により展開してはいけません。後で TeX が適切なタイミングで再度検査するときに展開されます。\noexpand\afterassignment\aftergroup

最後の箇条書きには技術的な理由があります。0、5、9、13、14、または 15 の文字に対応するアルファベット定数を参照する場合は、その前にバックスラッシュを付けて「エスケープ」できますが、これは実際には制御シーケンスを形成しません。したがって、定数 13 を参照する場合は 、または を\catcode実行できます。`\^^M\chardef\%=`\%

2番目の箇条書きには重要な注釈が付け加えられる。TeXは条件付きテキストをスキップする際に展開を行わないにもかかわらず、するトークンを調べて、条件文が または に一致するかどうかを確認します\else。プリミティブ条件文、またはに一致\fiするトークンはすべて、この点でカウントされます。\let\else\fi

答え2

本文中TeX の概要コマンドとそのパラメータは青色で書かれていますが、パラメータが展開されていない場合は赤色で書かれています。ここで青色で書かれたパラメータは、展開後に読み取られます。TeX の基本構造の概要が始まる 9 ページからのこのテキストを参照してください。

関連情報