マクロツイーター

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

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

空白文字のカテゴリーコードを変更する激ヤバ呪文 \catcode`^^I=12\relax

ウッ……。

*  *  *

まあいかにもなネタなんだが、\catcode`^^I\catcode9 でなく \catcode32 の意味になることを知って身震いしたのは間違いない事実である。

ちなみに、この挙動は TeX の「文字符号形の“数字”表記」自体に起因するもので、数値が \catcode の引数になっていることは特に関係がない。これは次のような例をみれば判る。

[TeX の対話モードで]
*\message{\number`^^I,\number` ,\number`\^^I,\number`\ }
32,32,9,32
*

念のため補足すると、^^I はタブ文字の TeX エスケープ表現であり、その符号位置は 9 であり、また空白文字の符号位置は 32 である。従って、`\^^I`\␣`␣ は期待通りの数値に解釈されているが、`^^I は初級の TeX 学習者の期待を裏切る結果になっている。

この世にも恐ろしい挙動の原因は、世にも恐ろしい「TeX の字句解析」の仕様である。

カテゴリコード 10 の文字は、(無視されない状況では)その文字コードに関わらず、必ず文字コード 32 の(カテゴリコード 10 の)文字トークンを生み出す

つまりは、`^^I と書いても `␣ と書いたのと全く同じトークン列になり、後ろのトークンの文字コードは 32 なので、この“数字”が表す整数は結局 32 になる、というわけである。何とも恐ろしい……。

*  *  *

*「で、そもそもこんな恐ろしい \catcode`^^I なんて使う必要があるの?」
ZR「さあ……。“`␣”が書けない状況(例えば空白文字のカテゴリが 9 である)で空白文字のカテゴリを変える、とかの用途かな。でもその場合ももっと素直に \catcode`\␣ とか \catcode32 と書けば済むんだけど」
*「え、じゃあ、なんで、こんな恐ろしいものが出てきてしまったんですか…?」
ZR「多分、TeX言語コードを書きすぎて、正気が失われたのではないかと」
*「ヒィーーッ」