Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2014-01-26

先日リリースされた最新版の TeX を徹底解説!

Knuth 氏のオリジナルの TeX の最新版のリリースが 1 月 20 日に CTAN からアナウンスされた。

前回の改版が 2008 年のことだったので、実に 6 年ぶりの新しい版ということになる。バージョン番号はさらに 1 桁増えて“3.14159265”である。本記事では、今回の改版による変更点を、余すところなく全て解説する。

変更点  空制御綴の文字列化の不具合の解消

TeX プログラミングの経験者であれば、\csname プリミティブを用いて任意の名前をもつ制御綴のトークンを生成できることはご存知であろう。例えば、\csname foo\endcsname を一回展開するとトークン \foo が得られるし、また \csname 1+1=2\endcsname を一回展開すると、TeX の普通の名前の規則から外れる「1+1=2」という名前をもつ制御綴が得られる。

\csname\endcsname の間の文字列がそのまま名前になる、ということは、この文字列の部分を空にして \csname\endcsname とすれば「名前が空」の制御綴が作れそうである。実際にそれは可能であり、そういう「名前が空」の制御綴について TeXbook では“null control sequence”という名称をわざわざ与えている(ここでは訳語を「空制御綴」とする)。空制御綴は他の制御綴と同様に \let\def で意味を与えることができる。*1

\expandafter\def\csname\endcsname{アレ}
{\TeX}は\csname\endcsname です。

今回の改版で変更されたのはこの「空制御綴」の文字列化の処理である。\show\message\writeトークン列を端末やファイルに書き出す時には、制御綴を何等かの文字列で表す必要が生じる。規則外の名前をもつものも含み、制御綴を文字列化すると〈\*2の後に名前を続けたものになる。*3

\message{[\relax][\csname 1+1=2\endcsname]}
%==> “[\relax ][\1+1=2 ]”と表示される

ところが例外的に、空制御綴を文字列化すると、「\csname\endcsname」という文字列になる。恐らく「\」だけ表示したのでは他のものと紛れやすいので敢えてこのような仕様にしているのだと思われる。(この表示では 2 つのトークンがあるようにも見えるが、これは飽くまでも表示だけで、「文字列化」以外の点においては空制御綴も他の制御綴と変わらないことに注意。)

\message{[\csname\endcsname]}
%==> “[\csname\endcsname]”と表示される

ところで、上の 2 つの例をよく見ると、表示では \relax\1+1=2 の後に空白が置かれていることに気付くだろう。トークン列を文字列化する場合は、名前が複数文字の制御綴の後に空白を入れる規則になっている。*4これがないと、例えば「\relax xx」を文字列化したときに「\relaxxx」となり紛らわしくなる。ところが、空制御綴の方は、出力の \csname\endcsname の後に空白が入っていない! つまり、次のようなことが起こることになる。

\message{\csname\endcsname x}
%==> “\csname\endcsnamex”と表示される

これは紛らわしい! というわけで、新版ではこれが修正される。つまり次のような結果になる。

\message{\csname\endcsname x}
%==> “\csname\endcsname x”と表示される

素晴らしい! これで TeX がさらに一層便利になったね!

以上です

以上で、最新版の TeX における変更点 1 点を全て解説し終えた。

なお、TeX Live では「実行ファイルの更新は年次のリリースの時のみに行う」というポリシーがあるので、新版の TeXTeX Live に収録されるのは TeX Live 2014 のリリースの時となるはずだ。新しい TeX Live のリリースが待ち遠しいものである。

* * *

*「何だ、この細かすぎて伝わらない改修は」
ZR「えーと、一応説明しとくと、Knuth が既に 20 年以上前に『終結宣言』を出していて、それ以降は TeX の改修はデバッグ以外は行われてない。で、元々 TeXバグが極めて少なくて、影響の大きなバグは全くといっていいほど残っていない。だから、こんな物凄く細かい話ばかりになるわけで…。TeX の新機能を求めるなら、現在開発中の拡張エンジン、例えば XeTeX や LuaTeX を見るべき。あと pdfTeX の機能追加もまだ続けられている模様で……」
*「それは解ってる! で、じゃあなんでこんな記事書いたんだ!?」
ZR「…………ネタにマジレス(ry」

*1\csname\endcsname “を一回展開したもの”が空制御綴なので、以下の例では \expandafter が必要である。

*2:正確にいうと \escapechar で指定した符号位置の文字。\escapechar が負の場合は何も表示されない。

*3:なお、\csname...\endcsname を展開するとその時点でその制御綴の意味が(未定義なら)\relax になり展開不能トークンとなるので、\message で「その制御綴の文字列化」が表示される。

*4:名前が 1 文字(例えば \X)の場合、現在のカテゴリコード設定において、\X が制御語(control word;つまり X のカテゴリコードが 11)であるなら空白が入り、そ例外は空白が入らない。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/zrbabbler/20140126/1390695988
 |