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 !.」