マクロツイーター

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

きょうの e-TeX (2): \unless


  • \unless  :[一般命令] 直後に真偽判定の(= \ifcase 以外の)if-トークンを伴い、その if-トークンの真偽判定を反転させる。

勿論、\unless 付の if-トークンは、原理的にはその後の「真の時の処理」と「偽の時の処理」を逆にしたものに等価であるはずであるが、機械的には置き換えられない場合もある。変則的なマクロで、可変な条件部を if-トークンで直接指定する場合等が考えられる。例えば、plain TeX のマクロ(LaTeX でも使える)の \loop...\repeat が該当する:


\xx@cnt=0 \loop % \xx@cnt, \xx@foo は整数レジスタ
%...
\xx@foo=\csname xx@foo/\the\xx@cnt\endcsname\relax
\advance\xx@cnt1
\ifnum\xx@foo=2 \repeat

上の例ではループ継続条件を「\xx@foo が 2 である」としているが、これを「\xx@foo が 2 でない」に変更したいとする。最後の行を次のように変えるのはエラーになり失敗する:


\ifnum\xx@foo=2 \else \repeat

これに対して、\unless を用いれば期待通りの動作になる:


\unless\ifnum\xx@foo=2 \repeat

ちなみに、\else を用いた方が失敗するのは、「plain TeX\loop ... \repeat がそういう仕様だから」であって、これを \else が使えるように再定義することは勿論可能である。