catcodeはいつ実行されますか?



When Is Catcode Executed



解決:

TeXは、一度に1つのレコード(通常は1行)を吸収しますが、すぐにはトークン化しません。オペレーティングシステムがEOL文字を使用している場合は、EOL文字を変更して正規化し、文字はの現在の値に対応します。 endlinechar。

次に、入力をトークン化する行の読み取りを続行します 必要に応じて 何が起こっているのかを判断するため。



たとえば、見つかった場合 foo {xyz}と fooは単一引数のマクロであり、スペースを無視し、開いている中括弧と、一致する閉じている中括弧が見つかる(そしてトークン化される)まで、見つかったものをすべてトークン化します。例を続けると、 fooには次のようなものが含まれます catcode endlinechar = 12、まだトークン化されていない行末文字は、カテゴリコード12であると解釈されます。したがって、catcodeの変更は胃で行われますが、口にまだ入力されていない入力に影響を与える可能性があります。 、まだトークン化されていません。

ただし、TeXは、マクロの置換テキストを吸収するときに、命令を解釈せず、マクロを展開しないことに注意してください。これは主に、クヌースがすでにトークンリスト内にある文字で参照しているものです。



奇妙な例:

x  obeyspaces x  bye

あなたはそれを知っているかもしれません obeyspacesは単に

 catcode`  =  active

そして、そのプレーンTeXは、アクティブスペース文字をcatcode10スペースに展開するように設定します。出力が



ここに画像の説明を入力してください

待って! TeXは制御ワードの後のスペースを無視しませんか?はいといいえ。入力をトークン化するとき、TeXは次の文字が次の文字であると判断しますsは文字ではないため(つまり、catcodeの内部テーブルはコード11を割り当てません)、制御シーケンス名の検索を停止し、入力スキャナーは空白をスキップする状態になりますが、スペースはまだありません。トークン化。トークン obeyspacesはパラメータのないマクロであるため、展開され、カテゴリコードの変更が実行されます。 TeXはさらにトークンを必要とするため、スペースである次の文字をトークン化し、(変更されたばかりの)catcodeテーブルの指示に従ってカテゴリコード13を割り当てます。次の文字にはcatcode 10がないため、状態空白のスキップから行の中央に変更されました。次に、TeXはアクティブな文字を展開し、出力にスペースが表示されます。


TeXbookによると、ファイル内の文字は最初にcatcodeを使用してトークンに変換され(「口」)、次に拡張不可能なコマンドが実行されます(「胃」)。

ここでは、そのときの意味に注意する必要があります。

文字が口でトークンに変換され、これらのトークンが胃に渡されるのは事実です。しかし、ファイル内のすべての文字が最初にトークン化され、その後(すべてがトークン化された後)胃が機能するようになると解釈した場合、それは真実ではありません。代わりに、2つのシステムが相互作用します。口が胃にコマンドを渡す場合があります。胃はいくつかのアクションを実行してから 尋ねる より多くのトークンのための口など。胃で行われる行動は、口の将来の働きに影響を与える可能性があります。

口と胃の他の名前を検討するのに役立つ場合があります。これらは、入力プロセッサ[+拡張プロセッサ]および実行プロセッサと呼ばれます。 トピックによるTeX 、およびTeXプログラムのKnuthによる構文ルーチンと意味ルーチン:

TeXプログラムから

最初の概算では、TeXのメイン制御ループは空腹の胃と考えることができます。コマンドを次々に実行し、前のコマンドを完了した後、または前のコマンドを完了した後、繰り返し口にトークンを要求します。 実行中 特定のコマンド。たとえば、次の入力ファイルがあるとします。

hi  hskip 10 pt  end

その後、胃が取得します

  • トークンh₁₁(基本的にその文字をタイプセットするコマンドとして実行されます—その文字を適切なリストに入れます)。
  • トークンi₁₁(上記と同じように実行されます)。
  • トークン hskip —この時点で、胃はhskipコマンド、 その一部として 構文ルーチン(口)が呼び出され、トークンを要求されて、接着剤の仕様がスキャンされます10ポイント
  • トークン end(コマンドとして実行されます)。

そうするとき TeXbook あなたが言及した例を(38ページに)示します。{ hskip 36pt}がトークンのシーケンスに変換されます{₁、hskip、3₁₂、6₁₂、p₁₁、t₁₁、}₂、少し誤解を招く可能性があります。文字は実際にある時点でそれらのトークンに変換されますが、このトークン化(のpとたとえば)胃が見る前に完全には起こりません hskipコマンド;それの多くは後に起こります。

catcodeは展開不可能なコマンドであるため、実行する必要があります 文字トークンにはcatcodeが割り当てられています。 […]だから catcodeコマンドが「口」で検出されましたが、TeXはそれを自動的に実行して、その後のトークンに影響を与えますか?それとも、それに続くトークンがすでに間違ったcatcodeに割り当てられている可能性がある後、それはまだ胃の中で実行されていますか?

ここには多くの(理解できる)混乱がありますが、答えは次のとおりです。 catcodeは、後、胃の中で実行されます 文字にはcatcodeが割り当てられ、トークンに変換されています。

  • もしも catcodeが口の中で遭遇しました 胃が実行するコマンドを探しているとき 、次にそれは胃に渡され、そこで実行され、将来のトークンに影響を与えます。

  • もしも catcodeは、胃が単にトークンを収集しているときに(マクロの定義やトークンリストの割り当てなどで)口の中で検出され、さらに別のトークン(実行されていない)および将来のトークン(収集中のリスト)は、収集開始時にcatcodeに従ってスキャンされます。

説明のために、文字のカテゴリコードを変更する catcode`S = 3Sから3(つまり、数学シフト、$)。

最初のケースの例:

こんにちは catcode`S = 3 SxS  bye

結果:
こんにちはx

2番目のケースの例:

 def  change {hello  catcode`S = 3 SxS}  change now SyS  bye

結果:
こんにちはSxS

(ここでは、最初にの定義 changeは、明示的な文字トークンSが含まれるトークンリストとして収集されたため、 changeそれは、タイプセットされたものであるその文字-Sトークンを含むリストに展開されました。しかし、その拡大 changeには今回実行され、将来のトークンに影響を与える catcodeコマンド。)

TeXの「オルガン」/ステージはどこにありますか catcodeが実行されましたか?

簡単な答え:胃の中。