TeX 言語は他の一般に普及しているプログラム言語に比べると、習得が難しいと言われることが多い。その主因の一つだと思われるのが、TeX の実行モデルが他の言語と大きく異なることである。TeX 言語はその実行制御を「マクロの展開」という文字列(正確にはトークン列)の置き換えに委ねている。そのため、少々複雑なプログラムを意図通りに動かすためには、「展開制御」という、他の言語の使用者には馴染みのない概念に習熟する必要が生じる。((この奇異な特性を象徴するのが、かの有名な \expandafter
というプリミティブである。))Knuth 氏が TeX 言語を設計した際に、本格的なプログラム言語ではなく、寧ろ plain TeX のような「少し凝った」マークアップの作成を容易にすることを目的としたらしいので、TeX が先述のような特徴をもつのもそれと関係があるのかも知れない。*1
しかしその反面、TeX 言語と他言語でのプログラミングを比べた時に、共通する点も多いことも事実である。実際、この記事「プログラマーのためプログラミングLaTeX」では、Python 等の「普通の」言語のプログラムからの機械的な変換により TeX(on LaTeX)のプログラムが得られると述べている。この主張は至極真っ当なもので、私自身も、割と複雑なロジックを要するプログラム(アレとかコレとかソレとか)を書く場合には、まず Perl や Lua 等の「普通の」言語で書きあげて、できたプログラムのロジックが正しいことを確認してから、それを TeX 言語に書き換えるという手順をとっている。(そういえば、コレは Lua 版も公開してますね。)
そういうわけで、これから始まる一連の記事においては、そういう「他の言語のプログラミングの類推で TeX (on LaTeX)のプログラミングを始めよう」と考える人にとって特に用心すべき「TeX 言語の癖」について解説しようと思う。要点をあげると次の 4 つになる。
- TeX はフリーフォーマットじゃない
- ローカル変数なんてものはない
- 関数に相当するものは(普通は)ない
- 引数パラメタ(
#1
等)は実際に渡されたものの別名である
(続く)