マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

本当に怖い TeX の字句解析の話(負け惜しみ編)

自分の TeX の知識がアレだったことが解ってアレな ZR さんが、TeX by Topic の記述にイチャモンをつけ始めたようです。

(“TeX by Topic”を今すぐ読みたい、というTeX Live ユーザは「texdoc texbytopic」を実行しよう!)

*  *  *

(以下、何れも 2.7 節について)

コメント文字(カテゴリコード14)の説明

ここでは、

行末文字は見られないので、オートマトンの状態が M(行の途中)であった場合でも空白トークンは入らない

と述べられていて、この結論自体は正しいけど、これをそのまま信じると、行末文字を読んでいないため、次の行に状態 M のまま移行する(N にならない)ことになる。つまり、次のような例で、「ABC」と「DEF」の間に空白トークンが入ることになるだろう。

ABC%comment
   DEF

もちろん、実際には、「行頭の空白文字」はいかなる場合でも決して空白トークンにならない。

パラメタ文字(カテゴリコード6)とパラメタトーク

ここの説明では、入力処理(字句解析)の段階で以下のようになるとされている。

  • #1#2、……、#9 は特殊な「パラメタトークン」になる。
  • ## は単一の # の文字トークン(カテゴリコード6)になる。
  • 文字 # の後に他の文字が続くのは許されない。

でもこれだと、次のようなものは「入力処理の段階で失敗する」のでエラーになるはずである。

\def\mogu#1{} \mogu{#abc#}

実際にはこれはエラーにならない。実のところ、入力処理および展開処理の段階では、(カテゴリコード 6 の)文字 # は単純にいつでも(カテゴリコード 6 の)単一の文字トーク# になっているように私は感じている。次のような(凶悪な)例を見れば判る。

\def\evil#1#2#3:{\def\a#1#2#1#3{#3}}
\evil#12: \message{\meaning\a} %==>macro:#1#2->2
\message{\a9876} %==>276

マクロ \evil の展開において、その引数 #1#2#3 はそれぞれ #12 に対応したと見るべきだろう。すなわち、\evil の後に続いていた「#12」は 3 つのトークンなのである。

カテゴリコード10の説明

ここの小節は次のように始まっている:

カテゴリコード 10 のトークン――それは文字コードと無関係に〈空白トークン〉と呼ばれる――は状態 N および S では無視される……

ここは入力処理器の話をしているので、この段階の処理対象は本来なら「トークン」ではなく「文字」でないといけないはずである。そして「カテゴリコード 10 の文字は状態 N および S では無視される」だと説明は全く以て正しい。

他のカテゴリコードの小節ではちゃんと「文字」になっているのに、ここだけ何故「トークン」なのだろう……? 単なる間違いか、それとも何か意図があるのか……?