マクロツイーター

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

整数を読み飛ばす(解決編)

「整数を読み飛ばす」の記事での出題の解答。

前置きを繰り返すのはやめて、本題だけをいうと次の通り。

\prebreakpenalty〈非負整数n〉 が n の値に関わりなく \xx@dummy@count に展開されるようにマクロ \prebreakpenalty を実装せよ。(必要ならば追加のレジスタを確保してもよい。)

もっと本質的には、「直後に続く非負整数を受け取って何もしないような TeX の命令列は何か」ということであるともいえる。ただし「何もしない」は「空列に展開される」でないといけない。出題と同じ記事では、「何もしない」ものとして、ダミーのレジスタ \xx@dummy@count@a を用意して、


\xx@dummy@count@a=<>

とする方法を試したが、これは「展開」でないのでダメである。また、整数部分の前後に区切りとなるものがある訳ではないので、\@gobble のようなマクロでも対処できない。(整数が { } で囲まれているのならば、単に前に \@gobble を付せば、それは「空」に展開される。)

実は、ここで整数に「非負」という条件が付いているのが重大なヒントとなる。答えは次の通り。


\romannumeral-<n>

n が非負なので、-n は「非正」(0 以下)になる。\romannumeral は直後に続く整数をローマ数字の文字列に「展開」するプリミティブである(例えば \romannumeral 2011mmxi に「展開」される)が、整数が 0 以下の場合は「ローマ数字」は定義されないので、この場合は「空」に展開される。すなわち、任意の非負整数 n について、\romannumeral-<n> は空になる。

そしてこれを利用して元の問題の正解が構成できる。


\def\prebreakpenalty{%
\expandafter\xx@dummy@count\romannumeral-%
}

\expandafter は必ずしも要らないが、例えば、


\count100=\prebreakpenalty200

のように使った場合に、代入が完了した時点で既に後ろの数字が消えてほしいと思うならば必要になる。

(続き)