前回取り上げた「電子書籍と Web と XML の組版技術」の講演の中で、「XML と XSL-FO の関係は LaTeX と TeX の関係に似ている」という話があった。これについて自分なりにまとめておく。
この対応関係を理解するには、TeX の処理を
- マクロプロセッサ(所謂「口」の部分)
- 組版処理器(所謂「お腹」の部分)
の 2 つに分離して考えるのが妥当である。つまり、入力の TeX 文書(普通は plain TeX や LaTeX の文書であろう)について、TeX マクロを一旦全部展開してプリミティブ命令の列にして、それを「組版処理器」に通して DVI/PDF の出力を得る、と(仮に)考えるのである。無論、実際にはこの 2 つの処理は常に並行して走っているので、実際に「プリミティブの列」を目にすることはないが、敢えて中間出力にこれを含める方が都合がよい。
以上を前提にして、私の考える、XML 組版と TeX 組版の関係は以下のようになる。
- ① は文書の著者(一般的に非技術者)が書くことが想定されている。LaTeX や XHTML のマークアップの直書きはそれほど難しいものではないが、それに困難を感じる場合は、簡易マークアップ(Wiki 記法の類)からの変換も考えられる。なお、目的の文書に特化した独自のマークアップ言語を用意することも可能であるが、そうすると ② での対応の手間が増大する。
- ② のプログラムはその言語の知識をもつ技術者が作成する。① の文書毎に作成する必要があるが、マークアップとレイアウトの類似度に応じて使い回しができる(全く同じであれば同じものが使える)。ちなみに、XSLT は(チューリング完全な)プログラミング言語であるが、普通の言語とはかなり異なる文法概念と外観を持っている。こんな所も TeX のマクロ言語と通じるところがあるという……。
- なお、LaTeX の場合、② は LaTeX カーネルと文書クラスと各種パッケージの全てのプログラムに相当する。ちなみに、XML に基づく言語では、「名前空間」を用いて別種の言語を組み込むことができる――例えば、XHTML の中に SVG や MathML を組み込むことができる――が、これは LaTeX でパッケージを読み込んで使用可能な命令(機能)を増やすことと類似性がある。
- ③ は ① と ② から生成される。人間が書くものではない。断じてない。
- ④ は言語ではなく純粋にソフトウェアである。主要な XSL-FO の組版エンジンの一覧は発表スライドの 9 ページに掲載されている。
- ⑤ は元来の TeX では DVI 形式になる。pdfTeX/LuaTeX では PDF 文書が直接出力される。
- ③ と ⑤ の違い(つまり「AH Formatter は何をするものなのか」)が解り難いかも知れない。PDF や PS(の各ページ)は中にテキストを含みうるが基本的に画像であると考えるとよい(EPS 形式は単一ページの PS 文書に過ぎないが、多くの人は画像形式だと思っているだろう)。つまり、各描画要素やテキスト中の各文字はその絶対位置が既に確定している。③ については、例えば本文の場合、「各ページ内の本文領域の位置とそこに流し込まれる一連の(書式付き)テキスト」が定まっているという状態で、文字の位置はまだ決まっていないのである。つまり、行分割やページ分割の実施は ④ の役割であり、従って、禁則処理や空き調整などの「日本語の組版規則」の実現というのも ④ の重要な目的だということになる。
- XML 側の ①、②、③ の結びつきは弱い。独自 XML → XSL-FO の変換は XSLT でなくとも他の任意のプログラム言語を用いて行える。独自 XML を XSLT で変換するとしても、変換先を XHTML にしたり(CSS との組合せでブラウザで表示させる)TeX にしたりすることもある(発表スライドでも述べられている)。*1さらにこの変換を XSLT 以外で行うことも可能である。(要するに、適当なプログラミング言語を使えばどんな変換でもできるよ、ということ。)
- TeX 側の ①→⑤ は実際には一続きの処理なので、そこから途中で抜けることはできない。*2しかし、①→③ の部分には途中から入ることができる。他の文書形式から自動変換する場合、その目的が ⑤ を得ること(① 自体ではない)であれば、①(例えば完全な LaTeX 形式の文書)ではなく ①→③ の途中(つまり「TeX on LaTeX」な文書)を変換先にする方が簡便であることもあるだろう。
- TeX 側の ③ は TeX でしか扱えない*3が、①(LaTeX 等)は必ずしもそうではないことに注意。無論、LaTeX でも TeX でパッケージを書くことで幾らでも拡張可能(そして大概の場合何らかのパッケージが使われる)なのでそれについて上手くマネージする必要が生じるが、LaTeX2HTML のモデルが一つの解決例になっているであろう。