「整数を読み飛ばす」の記事での出題の解答。
前置きを繰り返すのはやめて、本題だけをいうと次の通り。
\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 2011
は mmxi
に「展開」される)が、整数が 0 以下の場合は「ローマ数字」は定義されないので、この場合は「空」に展開される。すなわち、任意の非負整数 n について、\romannumeral-<n>
は空になる。
そしてこれを利用して元の問題の正解が構成できる。
\def\prebreakpenalty{%
\expandafter\xx@dummy@count\romannumeral-%
}
\expandafter
は必ずしも要らないが、例えば、
\count100=\prebreakpenalty200
のように使った場合に、代入が完了した時点で既に後ろの数字が消えてほしいと思うならば必要になる。