2011-04-04 の記事の続き。いよいよ e-TeX での解決法を述べる。基本的なアイデアは以下の通りである。
- 任意の整数の引数を読み取って空に展開されるプリミティブはないらしい。
- でも寸法ならば「読み取って空に展開される」ようなマクロが作れる。
- 従って、任意の整数の引数を読み取って寸法として働くプリミティブがあればよい!
そして、e-TeX にはこの条件を満たすプリミティブとして \parshapeindent
が存在する。\parshapeindent〈n〉
は \parshape
プリミティブによって設定された n 行目のインデント量を表す(\parshape
は非 e-TeX にもあるが、設定された値を参照する機能は e-TeX にしか存在しない)。そして n が無効な値(0 以下も含めて)の場合はエラーでなく 0pt を返す。つまり、任意の整数 n に対して \parshapeindent〈n〉
は何らかの寸法値となっているのである。
従って、実装は、以前の記事の「寸法を読み飛ばすマクロ」の \the
の後に \parshapeindent
を入れるように変えただけのものになる。((\xx@gobblenum@a
は以前の記事の \xx@gobbledimen@a
と同じものを別の方法で定義したものである。))
\def\gobblenum{%
\expandafter\xx@gobblenum@a\the\parshapeindent
}
\begingroup \lccode`8=`p\lccode`9=`t
\lowercase{\endgroup
\def\xx@gobblenum@a#189{}
}
\gobblenum〈n〉
を 3 回展開すると空になる。
\edef\test{3\gobblenum42 1} % \test→「31」
\edef\test{AB\gobblenum"CDEFG} % \test→「ABG」
\edef\test{1\gobblenum-2\space\space3} % \test→「1 3」
\edef\test{\gobblenum1\the\year 2 3} % \test→「3」
3 番目の例では「-2\space
」が数値 −2 を表わす部分として読み飛ばされている。4 番目の例は、\year
が 2011 だとすると、「1\the\year 2
」が数値 120112 として飛ばされる。