さて、しばらくの間 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 を使わないことに何の意味があるのか疑問に思っている人に答えておく。何の意味もない。単なるパズルである。