LaTeX フォーマット(pLaTeX / LuaLaTeX / XeLaTeX)

pdflatexlualatexplatex… コマンド名が似ていて混乱しがちですが、その正体は 「フォーマット」と「エンジン」の組み合わせ です。フォーマットはあらかじめコンパイルしておいたマクロの集まり、エンジンはそれを実際に動かすプログラム。LaTeX はフォーマットの一つで、いくつものエンジンの上で走ります。このページでは LaTeX2e・pLaTeX/upLaTeX・LuaLaTeX・XeLaTeX を、その軸で整理します。

フォーマットとエンジン

エンジン とは、.tex ファイルを読んで組版する実行プログラムそのものです(TeX, pdfTeX, XeTeX, LuaTeX, e-pTeX など)。一方 フォーマット(format) とは、\documentclass\section といった膨大なマクロをあらかじめ読み込み、**プリコンパイルして一つにまとめた状態(.fmt というダンプファイル)** を指します。エンジンは起動時にこの .fmt を一瞬で読み込むことで、毎回マクロを定義し直す手間を省いています。

つまり 「LaTeX」はフォーマットの名前 であって、エンジンの名前ではありません。同じ LaTeX フォーマットを別々のエンジンの上で走らせることができ、あなたが打つ コマンド名は「エンジン+フォーマット」の組み合わせを符号化 したものなのです。たとえば pdflatex は「pdfTeX エンジン+LaTeX フォーマット」、lualatex は「LuaTeX エンジン+LaTeX フォーマット」を意味します。

フォーマットは LaTeX だけではありません。クヌース自身が作った素の plain TeX、ConTeXt なども別のフォーマットです。本ページではもっとも広く使われている LaTeX フォーマットに絞り、それを載せる代表的なエンジンごとに見ていきます。

LaTeX(2e)

今日「LaTeX」と言えば、ほぼ例外なく LaTeX2e(ラテフ・ツーイー)を指します。レスリー・ランポートが作った LaTeX のマクロ体系を、LaTeX プロジェクト が引き継いで保守している現行版で、1994 年 に登場しました。それ以前の LaTeX 2.09 からの「小さな改訂」のつもりで 2e と名付けられ、本命の LaTeX3 への中継ぎとされていました。

ところがその LaTeX3 は単独の新カーネルとしては結実せず、その成果は expl3(LaTeX3 プログラミング層) という形で LaTeX2e の上に積み上げられました。expl3 は 2020 年以降カーネルに標準で読み込まれ、新機能の実装にも内部で広く使われています。結果として、私たちが日々使うのはあくまで LaTeX2e でありながら、その中身は LaTeX3 の技術で着実に近代化され続けています。

LaTeX2e のカーネルは、現在 年 2 回(おおむね 6 月と 11 月) の定期リリースで更新されています。文書の書き方は一貫していて、冒頭で \documentclass により文書クラスを選び、\begin{document} までの プリアンブル でパッケージ読み込みや設定を行い、本文を書く——という「クラス+プリアンブル」モデルが基本です。

このフォーマットを pdfTeX エンジン の上で走らせるのが、もっとも古典的で標準的な組み合わせです。同じ pdfTeX でも出力先で 2 つのコマンドに分かれます。latex は pdfTeX を DVI モード で動かして中間形式の DVI を出力し(後で別ツールで PDF へ変換)、pdflatex は pdfTeX が PDF を直接 出力します。今日の欧文中心の文書では pdflatex が事実上の定番です。

pLaTeX / upLaTeX

pLaTeX(ピー・ラテフ)と upLaTeX(ユーピー・ラテフ)は、日本語組版に特化したエンジンの上に LaTeX フォーマットを載せたものです。縦組み・ルビ・和文の行組版といった日本語固有の処理は、アスキー社が拡張した pTeX 系のエンジンが受け持ちます。platexe-pTeX エンジン、uplatex は内部 Unicode 対応の e-upTeX エンジンの上で走ります。

この系統は 必ず DVI を出力 し、和文を含む DVI を **dvipdfmx** で PDF へ変換する、という二段構えが基本です(uplatex file.tex のあとに dvipdfmx file.dvi)。upmendex を併用すれば日本語の索引も作れます。文書クラスは奥村晴彦氏による jsarticle/jsbook(pLaTeX 用)、その Unicode 版 ujarticle など、そして近年の JIS X 4051 準拠の **jlreq** がよく使われます。

platexuplatex の違いは、内部の文字の扱いです。旧来の platex は内部コードに制約があり外字や多言語に弱い一方、uplatex は内部を Unicode 化しており、ハングルやキリル文字を含む和文混在文書に強いのが利点です(なお 2023 年以降 platex は後方互換を保ったまま実行エンジンを e-upTeX へ移行しています)。新規の日本語論文では uplatex が標準的な選択肢です。

いつ使うか——日本の学会・出版社が pLaTeX 用のクラスファイルやスタイルを配っている とき、あるいは縦組みなど pTeX 系の成熟した和文組版に頼りたいときは、pLaTeX/upLaTeX が手堅い選択です。逆に OS のフォントをそのまま使いたい、Unicode をそのまま流し込みたいなら、後述の LuaLaTeX-ja が向きます。

LuaLaTeX

LuaLaTeX は、LuaTeX エンジン の上に LaTeX フォーマットを載せたものです。コマンドは lualatex。LuaTeX は pdfTeX を発展させたエンジンで、入力を Unicode で直接扱い、OS にインストールされた OpenType / TrueType のシステムフォントfontspec パッケージで読み込めます。出力は中間形式を経ずに PDF を直接 生成します。

名前のとおり最大の特徴は、組版エンジンに Lua スクリプト言語が組み込まれている ことです。\directlua{...} で TeX の内部に踏み込んだ処理を Lua で書け、従来は困難だった拡張がしやすくなりました。日本語組版は **luatexja** パッケージが担い、pLaTeX に匹敵する品質の和文組版を、システムフォントと Unicode のまま実現します。

こうした近代性から、LaTeX チームも現代的なエンジンとして LuaLaTeX を推す 流れにあり、新規プロジェクトの既定として勧められることが増えています。難点は処理速度で、pdflatexxelatex に比べてコンパイルが重め(XeLaTeX のおよそ 2 倍かかることもある)です。日本語・多言語・凝ったフォント運用・プログラム的な組版を一台でこなしたいなら、まず候補に挙がるエンジンです。

XeLaTeX

XeLaTeX(ゼットラテフ/ジーラテフ)は、XeTeX エンジン の上に LaTeX フォーマットを載せたものです。コマンドは xelatex。LuaLaTeX と同じく Unicode 入力 と、fontspec による システムフォントの直接利用 に対応します。出力は、内部に組み込まれた **xdvipdfmx(dvipdfmx 由来のドライバ)を通じて PDF** を生成します。

XeLaTeX の持ち味は シンプルさ です。「とにかく手元の OS フォントをそのまま使いたい」という用途では、LuaLaTeX より設定が軽く、コンパイルも速い傾向があります。非ラテン文字のフォント名(たとえば日本語名のフォント)を名前で指定できるのも XeLaTeX の利点です。一方で、Lua のような深いプログラマビリティは持たず、近年の機能拡張の主軸は LuaTeX 側に移りつつあります。

コマンド早見表

同じ LaTeX フォーマットでも、コマンド名によって背後のエンジン・出力形式・フォントの扱いが変わります。次の表で、いちばん左の コマンド名 から右へたどってください。

コマンドエンジン出力Unicode・システムフォント
latexpdfTeX(DVI モード)DVI → 要変換×(要 inputenc 等)
pdflatexpdfTeXPDF(直接)×(要 inputenc 等)
platexe-pTeXDVI → dvipdfmx日本語可・従来フォント
uplatexe-upTeXDVI → dvipdfmx内部 Unicode・従来フォント
lualatexLuaTeXPDF(直接)○ fontspec / luatexja
xelatexXeTeXPDF(xdvipdfmx 経由)○ fontspec

実際のコマンド操作で見ると、PDF を直接吐くエンジンは 1 コマンドで完結し、DVI 経由のものは変換を 1 段はさみます。

console
# pdfTeX: PDF を直接出力 / emits PDF directly
$ pdflatex main.tex      # → main.pdf

# LuaTeX: PDF を直接出力 / emits PDF directly
$ lualatex main.tex      # → main.pdf

# upLaTeX: DVI を出力し、dvipdfmx で PDF へ変換
# upLaTeX emits DVI, then dvipdfmx converts to PDF
$ uplatex main.tex       # → main.dvi
$ dvipdfmx main.dvi      # → main.pdf

どれを選ぶか

おおまかな指針は次のとおりです。詳しい判断基準(速度・パッケージ互換・日本語事情など)は「エンジンの選び方」のページで掘り下げます。

  • 欧文中心で手早くpdflatex。最も枯れていて、対応パッケージも最大。
  • 日本語の論文・既存のクラス指定uplatex(必要に応じて platex)。DVI → dvipdfmx
  • 現代的に一台で何でも・日本語もlualatex。Unicode+システムフォント+luatexja
  • システムフォントを手軽に使いたいxelatex。設定が軽く、コンパイルも速め。