マクロツイーター

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

本当に怖い TeX の字句解析の話

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

*1:plainj TeX の起動直後の状態を仮定する。