欧米ではすっかりpdfTeXに移行してPDFを直接生成するワークフローになっているのに、なぜ日本語ではPDFを出力できない(u)pTeXがいまだに生き残っているのか。 簡単に言うと、TeXと事実上互換性があるpdfTeXが発明されたときに、日本語圏のデファクトだったpTeXのことが一切考慮されなかったからである。
このような事情により、pTeXをpdfTeXベースに改修することも、pdfTeXをpTeXとの互換性を最大限に保って日本語に対応させることも、技術的な制約によって無理という状態になった。 pdfTeXベースの日本語TeXを作るには、ぜんぜん違う日本語TeXを改めて作るしかなかったのである。
そのようにして作られたのがLuaTeX向けのluatex-jaである。 これはLuaTeXそのものを改良するという方法ではなく、LuaTeX向けのパッケージとして作られた。
同じ要領でpdfTeXを日本語対応すればいいじゃないか、あるいは、pTeXを作ったときになんでそうしなかったんだ、という気持ちになるかもしれないが、luatex-jaでこれが可能だったのは、LuaTeXがUnicodeエンジンだからである*1。 TeXはもちろん、pdfTeXでも日本語はそのままでは扱えないので、このアプローチが原理的にとれなかった。
と言ってしまうと、実は微妙に嘘になる。TeXやpdfTeXでも超絶技巧でUnicodeを扱うことはできる。 CJKパッケージがそれである。 pdfTeXでCJKパッケージを使って日本語の組版をする手もないわけではない。
ないわけではないのだが、やはりpTeXの資産は偉大で、それはpTeXがもともとアスキーという出版社が出版のために開発したものだったからという背景があるのだろう。 pTeXほどの日本語組版をCJKパッケージで実現するのはたいへんなのである(BXcjkjatypeがそれを目指していて、用途を選べば使える)。 そもそもpTeXが開発された当時にはCJKパッケージなどない(そもそもそもそもUnicode 1.0より前の話だ)。
というわけで、現在でも日本語の組版ではpTeX(あるいはその内部処理を拡張したupTeX)がよく使われており、これは出力がPDFではなくDVIなので、DVIをPDFにするというワークフローが必要になる。
さっさとluatex-jaに移行すればいいのはもちろんだが、pTeXと完全に互換というわけではないので、そんなに単純にもいかない。 新しく文書クラスを作るときはluatex-jaを前提にしましょう。
DVIはTeXとは別に発明されたものだった
TeXのオリジナルの出力形式と思われがちなDVIだが、TeXのエコシステムに最初からあった仕組みではなく、Knuthの発明でもない。 Knuthが最初に実装したTeXは、DVIではなく、スタンフォード大学にあったプリンタ向けの出力を吐き出す組版エンジンだった。
当然、プリンタが更新されたらそれまでの実装では使えなくなる。 プリンタのリプレイスのたびにTeX本体の実装をいじるのは厄介だぞ、ということで、その当時にKnuthの学生だったDavid Fuchsさんが中間形式としてDVIという出力形式を発明した。 DVIは文字通り「Device Independent」だったのである。
DVIではフォントの扱いもTeX本体から切り離された。 TeX本体ではフォントを「文字のメトリクス」としてだけ扱い、現物のフォントを扱うのはDVIドライバの仕事になった。
さらに、このレイヤー分けを応用して、仮想フォントという仕組みも発明された。 おかげで、実体フォントの一部のグリフだけを別のフォントのものに差し替えるといった芸当も可能になった(合成フォントのような機能) *2。
余談だが、DVIの発明者であるDavidさんは、2019年にスタンフォード大学で開催されたTUG(TeX User Group)ミーティングでかなり現代的なDVIビューワーを実装して発表されていた。 大規模なTeXソースの変更にリアルタイムで追随して再組版した結果が閲覧できるという、わりととんでもないビューワーで、DVIのDevice Independentっぷりと仮想フォントの威力を見せつけられるものだった。
DVIを発明した当時、DavidさんはKnuthの学生だったわけだけど、博士号はとらないまま学校を去ることになったらしく、2019年の発表では最前列にいたKnuth本人に「これで私も博士号がもらえますか?」と冗談を飛ばしていた。 Knuthは「Yes」と答えていた。 ハートウォーミングである。