LaTeX は、原稿を書いている最中に結果を見せてはくれません。テキストの .tex ファイルを書き、それを コンパイル して PDF を得る——この「書いてから一括処理する」流れが TeX 流です。途中に DVI という中間ファイルを挟む経路と、いきなり PDF を出す経路の 2 通りがあります。
なぜ WYSIWYG ではないのか
TeX の行分割は 段落全体を見渡して 最適化されます。だから段落の末尾に 1 文字足しただけで、その段落の 最初の行の折り返し位置まで変わる ことがあります。これをキー入力のたびにやり直すのは計算量が大きすぎます。
そこで TeX は、画面を逐次更新する WYSIWYG(ワープロ型)ではなく、原稿を一括で処理する バッチ方式 を採ります。引き換えに「打ちながら結果を見る」ことはできませんが、全体最適な組版・文書全体での体裁の一貫性・プレーンテキストゆえの自動化という利点が得られます。
ソースから出力まで — 2 つの経路
あなたが書いた .tex をエンジンが処理します。出力のされ方には 2 系統あります。モダンな経路 では、pdfTeX・XeTeX・LuaTeX が いきなり PDF を出力 します。とくに XeTeX・LuaTeX は入力が Unicode で、OS にインストールされた OpenType フォントをそのまま使えます。
レガシーな経路 では、エンジンはまず DVI ファイルを出力します。DVI は *device independent*(装置非依存)の略で、「どの出力機にも縛られない、純粋なページの記述」です。これを dvi ドライバ が目的の形式へ変換します——dvipdfmx なら PDF、dvips なら PostScript、dvisvgm なら SVG。画面表示用のドライバは dvi ビューア と呼ばれます。日本語の pLaTeX/upLaTeX はこの DVI 経路を使います。
# Direct PDF (modern engines)
lualatex document.tex # → document.pdf
# Via DVI (legacy route, e.g. Japanese upLaTeX)
uplatex document.tex # → document.dvi
dvipdfmx document.dvi # → document.pdf例外として pdfLaTeX は、入力こそ昔ながら(非 Unicode 寄り)ですが、DVI を介さず PDF を直接出力します。要するに「DVI を経由するか/直接 PDF か」と「Unicode・OS フォントが使えるか」は別の軸だと捉えると整理しやすいです。
| エンジン | 出力 | 入力・フォント | 画像形式 |
|---|---|---|---|
latex | DVI(dvi ドライバが必要) | ASCII 中心 | EPS・PS |
pdflatex | PDF(直接) | Unicode は限定的 | PNG・JPG・PDF(EPS は自動変換) |
xelatex | PDF(直接) | Unicode・OS の OpenType(fontspec) | PNG・JPG・PDF・EPS |
lualatex | PDF(直接) | Unicode・OS フォント・Lua | PNG・JPG・PDF・EPS |
補助ファイルと「2 回コンパイル」
コンパイルすると、PDF のほかに .aux(ラベルや参照の情報)、.toc(目次)、.log(記録)などの補助ファイルができます。相互参照や目次は 2 回処理が必要 です——1 回目で「第 3 章は何ページか」といった番号と位置を .aux に書き出し、2 回目でそれを読み込んで \ref や目次に正しい値を埋めます。
だから「?? と表示される」「*Rerun to get cross-references right* と警告が出る」ときは、もう一度コンパイルすれば直ります。参考文献(BibTeX/biber)や索引(makeindex)を使うと、さらに処理回数が増えます。
止まったときは処理のどこを見るか
コンパイルが止まったら、まず PDF ではなく .log の最初のエラー を読みます。TeX は一つ目のエラーから無理に続行するため、後ろに出る十数個のエラーは連鎖反応であることが多いからです。! Undefined control sequence なら命令名の綴りかパッケージ不足、File ... not found なら画像・クラス・パッケージの探索、LaTeX Warning: Label(s) may have changed なら再実行が必要、というように、処理段階ごとに原因を切り分けます。
- 相互参照だけがおかしいなら、
.auxや.tocを消す前に、まずlatexmkで必要回数だけ再実行する。 - 画像が出ないなら、使っている経路が直接 PDF か DVI 経由かを見て、対応する画像形式を選ぶ。
- 古い補助ファイルが原因らしいときだけ、
.aux、.toc、.outなどを削除して作り直す。
回数を気にしない — latexmk とエディタ
毎回手で回数を数えるのは面倒です。latexmk は、.aux などの変化を見て 必要な回数だけ自動で再実行 し、必要なら BibTeX/biber や makeindex も走らせ、安定したら止まります。デフォルトでは最大 5 回まで繰り返し($max_repeat = 5)、それでも収束しなければ無限ループとみなして停止します——通常はこれで十分です。
latexmk -lualatex document.tex # LuaLaTeX, as many passes as needed
latexmk -pdf document.tex # pdfLaTeX
latexmk -c # clean .aux/.log and friendsVS Code(LaTeX Workshop)や TeXShop、Overleaf などの環境は、裏で latexmk を呼んでいることが多く、あなたは「コンパイル」を押すだけで済みます。さらに SyncTeX が有効なら、ソースの該当行と PDF の該当箇所をクリックで行き来できます。