TeX by Topic を読んで初めて知った、TeX の字句解析の怖い話。
改行文字でないカテゴリコード5の話
以下のコードを実行すると何が出力されるか。*1
\catcode`\!=5 Foo!Bar!Gee Whiz
正解は次のコードの出力と同じ。
Foo Whiz
何故なら、本物の改行に区切られた「行」の途中にカテゴリコード 5 の文字がある場合、TeX はそこで「改行文字の動作」を行った後、「行」の残りの部分を無視するからである。
空白文字でないカテゴリコード10の話
次のコードを実行した時、端末に「Yes」は表示されるか。
\def\X{ }
{\catcode`\!=10 \gdef\Y{!}}
\ifx\X\Y \message{YES}\fi正解は、「表示される」。カテゴリコード 10 の文字は、(無視されない状況では)その文字コードに関わらず、必ず文字コード 32 の(カテゴリコード 10 の)文字トークンを生み出すからである。
ちなみに、カテゴリコード 10 でありかつ文字コードが 32 でない文字トークンは、例えば次のように \lowercase トリックを使えば生成できる。
{\lccode`\ =`\! \lowercase{\gdef\Z{ }}}
% \Z は"文字コード33の空白トークン"に展開される
\message{\expandafter\meaning\Z}%==>「blank space !.」