.tex を PDF にするには、ターミナルでコンパイルコマンドを実行します。pdflatex・lualatex・xelatex・latex、日本語の platex・uplatex ——どれも「LaTeX」ですが、選んだコマンドによって裏で動く エンジン が変わり、出力形式(PDF か DVI か)や、使えるフォント・文字の範囲まで決まります。このページは、それぞれのコマンドの正体と、実務で打つオプションの早見表です。
コマンド名がエンジンを選ぶ
LaTeX は フォーマット(命令の体系)で、それを実際に処理する エンジン(プログラム)は別物です。コマンド名は両者の組み合わせを表します。たとえば pdflatex は「pdfTeX エンジン + LaTeX フォーマット」、lualatex は「LuaTeX + LaTeX」という具合です。使い方はどれも同じで、ソースファイルを引数に渡すだけ。拡張子 .tex は省略できます。
pdflatex document.tex # → document.pdf, document.aux, document.log
lualatex document # 拡張子は省略可 / extension optional
xelatex document.tex実行すると、本体の出力(.pdf または .dvi)に加えて、相互参照や目次の情報を貯める .aux、処理の記録である .log などの補助ファイルができます。番号や参照、目次を確定させるには 同じコマンドをふつう 2 回 走らせる必要があります(1 回目で .aux に番号を書き、2 回目で本文へ反映する)。この多段処理を自動化するのが latexmk などのビルドツールです。処理全体の流れは「ソースから PDF へ」で詳しく扱います。
PDF を直接出力する 3 つ
pdflatex・lualatex・xelatex は、いずれも PDF を直接生成します。違いは Unicode とフォントの扱い、そして速度です。
pdflatex は pdfTeX エンジンを使います。pdfTeX は Hàn Thế Thành が博士研究(行末の文字突き出しや微妙な字幅伸縮といった マイクロタイポグラフィ)の中で TeX を拡張したもので、DVI を経由せず PDF を直接吐けるようにした点が要でした。最も歴史が長く、既存パッケージとの互換性が高く、コンパイルも速い。一方で入力は本来バイト単位で、Unicode や OS フォントは扱えません(現代の LaTeX は既定で UTF-8 入力を受け付けますが、フォントは TeX 内蔵のものに限られます)。
lualatex は LuaTeX エンジン。UTF-8 を最初から前提 とし、fontspec パッケージを通じて OS にインストールされた OpenType/TrueType フォントをそのまま使えます。さらにスクリプト言語 Lua が組み込まれていて、組版処理に手を入れられるのが最大の特徴です。LaTeX の標準的な未来として推されており、日本語組版は luatexja パッケージで行います。
xelatex は XeTeX エンジン(Jonathan Kew が 2004 年頃に開発)。これも Unicode と OS フォントに対応しますが、実装は外部ライブラリ寄りで LuaTeX とは別物です。内部では PDF を直接ではなく、DVI の拡張版 .xdv を作り、それを xdvipdfmx が自動で PDF に変換します。-no-pdf を付けると変換前の .xdv で止められます。
| コマンド | エンジン | 出力 | Unicode / フォント |
|---|---|---|---|
pdflatex | pdfTeX | PDF を直接 | 内蔵フォント中心。速くて互換性◎ |
lualatex | LuaTeX | PDF を直接 | OS フォント+Unicode+Lua |
xelatex | XeTeX | PDF(内部で .xdv 経由) | OS フォント+Unicode |
DVI を出す latex コマンド
無印の latex コマンドは、現在の TeX Live では pdfTeX エンジンを DVI モードで動かし、PDF ではなく .dvi を出力します。DVI(device-independent)は出力機器に依存しない中間形式で、そのままでは表示・印刷しづらいので、dvipdfmx で PDF に、または dvips で PostScript に変換します。pdflatex が PDF を直接出すのに対し、こちらは「組版」と「PDF 化」を分ける二段構えです。
なぜ今も DVI を使うのか。DVI 経由でしか動かない古い仕組み(PSTricks の一部など)があること、そして次に述べる 日本語組版が伝統的に DVI 経由 だからです。LuaTeX で DVI を出したいときは dvilualatex を使います。DVI からの変換は「DVI 変換ツール」で詳しく扱います。
日本語のコマンド — platex / uplatex
platex は、日本語組版に特化した pTeX エンジン(アスキー社が開発、現在は e-pTeX)の上で動く pLaTeX です。縦組み、和文の行間・禁則処理、和欧文の間隔調整などを正しく扱います。出力は DVI。入力文字コードは環境によって既定が異なり(Shift_JIS / EUC-JP / UTF-8)、-kanji=utf8 を付けると UTF-8 入力として読みます。ただし pTeX が直接扱えるのは ASCII+JIS X 0208 の範囲に限られます。
uplatex は、内部処理を Unicode 化 した upTeX エンジン(田中琢爾氏による)上の upLaTeX です。既定の入力が UTF-8 で、JIS X 0208 の外にある文字(人名外字や CJK 統合漢字など)もそのまま扱えるため、現代の日本語論文の定番 になっています。こちらも出力は DVI で、-kanji オプションで入力コードを変えられます。
# 日本語: 組版 → DVI → PDF / Japanese: typeset → DVI → PDF
uplatex -kanji=utf8 document.tex # → document.dvi
dvipdfmx document.dvi # → document.pdf(u)platex が出した DVI は dvipdfmx で PDF にします(TeX Live の dvipdfmx は upTeX に対応済み)。最近の TeX Live は入力既定が UTF-8 なので -kanji=utf8 は省けることも多いですが、明示しておくと環境差で事故りません。BOM なし UTF-8 で確実に通すには、uplatex に -no-guess-input-enc を併用します。なお lualatex+luatexja を使えば、DVI を経由せず日本語のまま PDF を直接出せます。
よく使うオプション
コマンドはソース名の 前 にオプションを並べて渡します。次は pdfTeX/XeTeX/LuaTeX で共通して使えるものです。
| オプション | 働き |
|---|---|
-synctex=1 | SyncTeX 情報を出力し、エディタ↔PDF の相互ジャンプを可能にする |
-interaction=nonstopmode | エラーで止まらず最後まで処理(batchmode はさらに静か) |
-halt-on-error | 最初のエラーで処理を中止する |
-file-line-error | エラーを file:line: 形式で出す(IDE 連携向き) |
-output-directory=DIR | 補助ファイルと出力を指定フォルダへ(事前に作成しておく) |
-jobname=NAME | 出力ファイル名(拡張子の前)を指定する |
-shell-escape | \write18 による外部コマンド実行を許可(後述の注意) |
-draftmode | PDF を書かず高速に通す(pdfTeX / LuaTeX)。下書き検査用 |
pdflatex -synctex=1 -interaction=nonstopmode -halt-on-error -file-line-error document.tex出力形式は pdfTeX と LuaTeX なら -output-format=dvi|pdf で切り替えられます(XeTeX は代わりに -no-pdf で .xdv)。-shell-escape は要注意:minted(コード装飾)や一部の作図パッケージが外部プログラムを呼ぶために必要ですが、文書が任意のシェルコマンドを実行できてしまうため、信頼できないソースには使わないでください。
結局どれを使うか
- 新規の日本語文書 —
uplatex(→dvipdfmx)か、lualatex+luatexja。 - 英語・欧文が中心 —
pdflatex。速くて互換性が高い。 - OS のフォントをそのまま使いたい —
lualatexかxelatex。 - DVI 経由の古い仕組みが必要 —
latex(→dvipdfmx/dvips)。
実際には、これらのコマンドを手で 2 回打つより、必要な回数や DVI 変換まで面倒を見てくれる latexmk などのビルドツールに任せるのがふつうです。エンジンそのものの違いをもっと知りたいときは「エンジン・フォーマットの選び方」へ。
コンパイルコマンド章の提出前チェック
- まず単体で確認:
pdflatex、lualatex、uplatexなど、選んだコマンドを一度ターミナルで実行し、エディタ依存の失敗でないことを確かめます。 - 提出前の定番:
-halt-on-error -file-line-error -interaction=nonstopmodeを付けて、最初の本当のエラー位置がCIやログで読める形にします。 - 日本語PDFの判断: upLaTeX なら
uplatexのあとdvipdfmx、LuaLaTeX ならPDFを直接出す、という経路を混ぜないようにします。 - ログの読み方:
.logの最後だけでなく、最初の!から読むと、連鎖したエラーではなく原因の命令に戻れます。