マクロツイーター

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

それでも TeX でプログラミングしたい人のための何か (1)

TeX 言語は他の一般に普及しているプログラム言語に比べると、習得が難しいと言われることが多い。その主因の一つだと思われるのが、TeX の実行モデルが他の言語と大きく異なることである。TeX 言語はその実行制御を「マクロの展開」という文字列(正確にはトークン列)の置き換えに委ねている。そのため、少々複雑なプログラムを意図通りに動かすためには、「展開制御」という、他の言語の使用者には馴染みのない概念に習熟する必要が生じる。((この奇異な特性を象徴するのが、かの有名な \expandafter というプリミティブである。))Knuth 氏が TeX 言語を設計した際に、本格的なプログラム言語ではなく、寧ろ plain TeX のような「少し凝った」マークアップの作成を容易にすることを目的としたらしいので、TeX が先述のような特徴をもつのもそれと関係があるのかも知れない。*1

しかしその反面、TeX 言語と他言語でのプログラミングを比べた時に、共通する点も多いことも事実である。実際、この記事「プログラマーのためプログラミングLaTeX」では、Python 等の「普通の」言語のプログラムからの機械的な変換により TeX(on LaTeX)のプログラムが得られると述べている。この主張は至極真っ当なもので、私自身も、割と複雑なロジックを要するプログラム(アレとかコレとかソレとか)を書く場合には、まず PerlLua 等の「普通の」言語で書きあげて、できたプログラムのロジックが正しいことを確認してから、それを TeX 言語に書き換えるという手順をとっている。(そういえば、コレLua 版も公開してますね。)

そういうわけで、これから始まる一連の記事においては、そういう「他の言語のプログラミングの類推で TeX (on LaTeX)のプログラミングを始めよう」と考える人にとって特に用心すべき「TeX 言語の癖」について解説しようと思う。要点をあげると次の 4 つになる。

  • TeX はフリーフォーマットじゃない
  • ローカル変数なんてものはない
  • 関数に相当するものは(普通は)ない
  • 引数パラメタ(#1 等)は実際に渡されたものの別名である

続く

*1:これから TeX でのプログラミングを志す者は、その行為がどういう性質を帯びるのかを述べた、「The TeXbook」の付録 D(Dirty Tricks)の冒頭の節をぜひ読んでほしい。