マクロツイーター

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

LaTeX3 と expl3 パッケージ

「TeX Q & A」で expl3 パッケージの話が出てきた(qa:55478)ので、LaTeX3 のデザインと expl3 について少し本気を出して調べてみた。

未来の LaTeX について以前に自分の妄想を書き連ねたことがあるが、実際の LaTeX3 もそこで挙げた事項とほぼ同じものを意識して計画されているようで、次の 3 つの「言語」を持つことが予定されている。

(参照: The expl3 package and LaTeX3 programming、expl3 パッケージ内の解説文書)

  • 文書マークアップ用の言語: これについては LaTeX2e の時と概念的に変わらない。要するに「LaTeX 文書ソース」で使われている言語のことで、LaTeX2e では \documentclass\section\parbox\enlargethispage 等の「命令」と、itemizepicturesloppypar 等の「環境」からなる。これはプログラミング言語ではない。
  • 文書レイアウト設計用言語: レイアウト設定を記述するための言語(CSS に類するもの)。これもプログラミング言語であるべきでない。LaTeX2e でいえば、本来ならば、文書クラスがこの言語で記述されているべきであるが、残念なことに実際は後項の「開発用言語」と混然としてしまっている。
  • 開発用言語: LaTeX 上での開発を行うための言語。これを操ることは、プログラミングの名に値する。

現在の開発状況としては、最後の「開発用言語」がかなり出来上がっている。そしてこの「LaTeX3 の開発用言語」を LaTeX2e の上で使えるようにした LaTeX パッケージが expl3 パッケージである。LaTeX3 開発チームがこのようなものを作った理由は、「ユーザテストの為」である。勿論ここでいう「ユーザ」は「LaTeX 上の開発者」のことである。(実際に、開発チームはパッケージ開発者に expl3 を使う(=実験台になる)ことを呼びかけていた。)

現在、expl3 を導入している著名なパッケージは、元の「Q & A」の記事で触れられている siunitx の他に、fontspec パッケージ(XeTeX/LuaTeX で拡張されたフォント選択機能を LaTeX で使用するためのパッケージ)がある。どうも、XeTeX 等の「未来の TeX エンジン」上の開発者はこういう「未来の仕様の採用」に積極的であるようで、確か polyglossia パッケージ(Babel の XeTeX 版)にも expl3 採用の話があったことを記憶している。

LaTeX3 が e-TeX 拡張をを必須とすることは「集い」の発表の中でも触れたが、当然の帰結として、expl3 も e-TeX 拡張を必要とする。今回調べたところでは、現状の expl3 は(つまり LaTeX3 は)さらに pdfTeX 拡張の \pdfstrcmp プリミティブを要求するようである。

名前から容易に想像されるように、\pdfstrcmp 命令は C 言語標準ライブラリの strcmp() (あるいは Perl の cmp 演算子Java の String.compareTo() メソッド)と同じように、2 つの文字列を受け取り、その(内部文字コードの辞書順での)大小を整数値の符号として返す。正確にいうと、\pdfstrcmp{<テキストA>l}{<テキストB>} はまず 2 つのテキスト A と B を完全展開して非トークン化した(\write の出力結果と同じ)後、辞書順で文字列比較し、A < B、A = B、A > B の各々が成立するときにそれぞれ「-1」「0」「1」に展開される(つまり完全展開可能である)。

例を少し挙げておく(plain TeXLaTeX での既定状態を仮定する):

  • \pdfstrcmp{A}{a} は「-1」に展開される。(〈A〉の符号位置 = 65、〈a〉の符号位置 = 97)
  • \pdfstrcmp{\string \indent\space$}{\indent \string$} は「0」に展開される。(完全展開後の(比較対象となる)文字列はどちらも「\indent $」となる。)