コンパイルコマンド

.tex を PDF にするには、ターミナルでコンパイルコマンドを実行します。pdflatexlualatexxelatexlatex、日本語の platexuplatex ——どれも「LaTeX」ですが、選んだコマンドによって裏で動く エンジン が変わり、出力形式(PDF か DVI か)や、使えるフォント・文字の範囲まで決まります。このページは、それぞれのコマンドの正体と、実務で打つオプションの早見表です。

コマンド名がエンジンを選ぶ

LaTeX は フォーマット(命令の体系)で、それを実際に処理する エンジン(プログラム)は別物です。コマンド名は両者の組み合わせを表します。たとえば pdflatex は「pdfTeX エンジン + LaTeX フォーマット」、lualatex は「LuaTeX + LaTeX」という具合です。使い方はどれも同じで、ソースファイルを引数に渡すだけ。拡張子 .tex は省略できます。

terminal
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 つ

pdflatexlualatexxelatex は、いずれも 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 / フォント
pdflatexpdfTeXPDF を直接内蔵フォント中心。速くて互換性◎
lualatexLuaTeXPDF を直接OS フォント+Unicode+Lua
xelatexXeTeXPDF(内部で .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 オプションで入力コードを変えられます。

terminal
# 日本語: 組版 → 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 を併用します。なお lualatexluatexja を使えば、DVI を経由せず日本語のまま PDF を直接出せます。

よく使うオプション

コマンドはソース名の にオプションを並べて渡します。次は pdfTeX/XeTeX/LuaTeX で共通して使えるものです。

オプション働き
-synctex=1SyncTeX 情報を出力し、エディタ↔PDF の相互ジャンプを可能にする
-interaction=nonstopmodeエラーで止まらず最後まで処理(batchmode はさらに静か)
-halt-on-error最初のエラーで処理を中止する
-file-line-errorエラーを file:line: 形式で出す(IDE 連携向き)
-output-directory=DIR補助ファイルと出力を指定フォルダへ(事前に作成しておく)
-jobname=NAME出力ファイル名(拡張子の前)を指定する
-shell-escape\write18 による外部コマンド実行を許可(後述の注意)
-draftmodePDF を書かず高速に通す(pdfTeX / LuaTeX)。下書き検査用
terminal
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)か、lualatexluatexja
  • 英語・欧文が中心pdflatex。速くて互換性が高い。
  • OS のフォントをそのまま使いたいlualatexxelatex
  • DVI 経由の古い仕組みが必要latex(→ dvipdfmx / dvips)。

実際には、これらのコマンドを手で 2 回打つより、必要な回数や DVI 変換まで面倒を見てくれる latexmk などのビルドツールに任せるのがふつうです。エンジンそのものの違いをもっと知りたいときは「エンジン・フォーマットの選び方」へ。

コンパイルコマンド章の提出前チェック

  • まず単体で確認: pdflatexlualatexuplatex など、選んだコマンドを一度ターミナルで実行し、エディタ依存の失敗でないことを確かめます。
  • 提出前の定番: -halt-on-error -file-line-error -interaction=nonstopmode を付けて、最初の本当のエラー位置がCIやログで読める形にします。
  • 日本語PDFの判断: upLaTeX なら uplatex のあと dvipdfmx、LuaLaTeX ならPDFを直接出す、という経路を混ぜないようにします。
  • ログの読み方: .log の最後だけでなく、最初の ! から読むと、連鎖したエラーではなく原因の命令に戻れます。