マクロツイーター

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

TeX で if-トークンを使わずにナベアツする

さて、しばらくの間 Ruby の話が続いたが、このブログの読者であれば「TeX で如何にして \if を自分で実装するか」について思案を巡らせていたであろうことは想像に難くない。

しかし、残念ながら、TeX で既存の条件判断を使わずに自前の等価な実装に置き換えるのは非常に困難であることは確かである。何故なら、TeX では、例えば \ifvoid のように真理値型の情報取得命令が if 文と融合してしまっているからである。つまり、「既存の if 文を使わない」という規則を忠実に守るなら、\ifvoid が行う情報取得自体を別の手段を用いて行う必要が生じるからである。

といっても、これで終わってしまうのは非常に残念である。そこで要求事項を思い切り少なくして、「ナベアツ」だけできればよいこととしよう。というわけで、以下の問題を出題する。


  • 例の記事に示されている仕様のマクロ \NabeAzz を実装する。
  • ただし、\NabeAzz の実装のコードは、非アクティブな文字トークンの他は、TeX のプリミティブまたはそれらを用いて自身で定義した制御綴のみを用いて構成されなければならない。((動作検証のコードでは当然 \begin{document 等を書く必要があるが、これは構わない。))
  • さらに、TeX の条件分岐のプリミティブ(if-トークン((\fi と対になって条件ネストを構成するプリミティブのこと:\if\ifnum\ifx\ifcase 等。))、\else\fi の各プリミティブ、およびこれらに \let されたトークン)は使ってはならない。

この出題では、「本当に if-トークンを使ってないこと」を明確にするために、プリミティブだけでのコーディングを要請したが、そうすると \newcount 等のマクロ((ちなみに、\newcount は内部で if-トークンを使っている。))も使えないことになる。従って、レジスタが必要な場合には、当該のマクロの処理全体を局所化した上で、スクラッチのものを使う必要が生じる。といっても、整数レジスタで自由に使えるものは \count255 しかない((今の問題では出力を行うので、途中で出力ルーチン(\output が走る可能性があり、従ってページ数を表す \count0〜9 や既に割り当てたレジスタの値を破壊することは、例え局所化したグループの中でも安全ではない。))ので、そこは寸法レジスタ((こちらは \dimen0〜9 は自由に使える。))や整数値マクロで代用する等の工夫が必要かも知れない。

ところで、既存の if を使わないことに何の意味があるのか疑問に思っている人に答えておく。何の意味もない。単なるパズルである。