よくある質問(FAQ)

LaTeX の不具合には、! で始まる行がはっきり出るものと、何も言わずに静かに壊れるものがあります。時間を食うのはたいてい後者です——何度組んでも ?? のままの参照、2 ページ後ろにずれた図、letterpaper と書いたのに A4 で出てくる PDF、自分の環境では通るのに共著者の環境だけ落ちる原稿。このよくある質問のページは、そうした 複数の仕組みにまたがる質問 だけを集め、「実行中に何が起きているか」で答えます。エラーメッセージ 1 本で答えが決まる問題は、それぞれ専用のページが持っているので、最後の索引から辿ってください。

なぜ 2 回コンパイルしないと参照が合わないのか

LaTeX は原稿を先頭から末尾へ 一度だけ 読み、先を見通せないからです。1 ページ目の \ref{sec:first} を組む時点では、その \label が何番になるのかまだ決まっていません。そこで \label は番号を .aux ファイルへ書き出し、\ref前回の実行が残した .aux を読みます。TeX Live 2024 で実測すると、1 回目は LaTeX Warning: Reference 'sec:first' on page 1 undefined on input line 4.LaTeX Warning: There were undefined references. を出し、PDF には本当に「See Section ?? on page ??.」と印字されます。その時点の .aux には \newlabel{sec:first}{{1}{1}{}{}{}} が入っており、2 回目はこれを読んで「See Section 1 on page 1.」になります。つまり ?? は壊れているのではなく、まだ 1 周目だという表示です。

terminal
$ pdflatex ref.tex        # run 1
LaTeX Warning: Reference 'sec:first' on page 1 undefined on input line 4.
LaTeX Warning: There were undefined references.
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

$ pdftotext ref.pdf -
See Section ?? on page ??.

$ pdflatex ref.tex        # run 2 — no warnings
$ pdftotext ref.pdf -
See Section 1 on page 1.

最後に出る LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. は、「.aux の中身が前回と変わったので、もう一度回してほしい」という LaTeX 自身の申告です。ここで重要なのは、2 回は下限であって規則ではない こと。番号がひとつ増えて行が折り返し、ページ番号が変わり、その結果 .aux がまた変わる——目次・図表目次・hyperref のしおりが絡むと 3 回、4 回を要することも普通にあります。latexmk.aux が安定するまで自動で回すためだけに存在する道具なので、手で回数を数えるのはやめて latexmk に任せるのが定石です。逆に、?? が消えないときはまず 2 回組んでから疑うこと。それでも残るなら \label の綴り違いか、そもそも \label が無い、あるいは古い .aux が壊れています(.aux を消すと 1 回目からやり直しになります)。

文献リストが出ない・引用が [?] のまま

文献処理は LaTeX の外側にある 別のプログラム が担当し、しかも一巡に 4 つのコマンドが要るからです。bibtex.tex を読みません。LaTeX が書き出した .aux\citation\bibdata を読み、.bib から該当項目を拾って .bbl を作ります。TeX Live 2024 での実測はきれいに三段階でした。1 回目の pdflatexLaTeX Warning: Citation 'knuth1984' on page 1 undefined を出し、PDF は「As shown by [?].」で文献リストは影も形もありません。bibtex を走らせると The top-level auxiliary file: doc.auxThe style file: plain.bstDatabase file #1: refs.bib と読み込み元を報告します。2 回目の pdflatexReferences の一覧は出る のに、本文の引用はまだ [?] のまま。3 回目でようやく [1] になります。

terminal
pdflatex doc     # writes \citation and \bibdata into doc.aux; text shows [?]
bibtex   doc     # reads doc.aux + refs.bib, writes doc.bbl
pdflatex doc     # pulls in doc.bbl: the list appears, the mark is still [?]
pdflatex doc     # now the \bibitem labels are in doc.aux: the mark becomes [1]

latexmk -pdf doc # does all four, and repeats until nothing changes

3 回目が要る理由も .aux の往復で説明がつきます。2 回目に読み込まれた .bbl\bibitem が「この鍵は [1]」という対応を .aux へ書き込むのは、その 2 回目の実行の途中です。本文の \cite はそれより前に組まれてしまっているので、対応表を使えるのは次の実行から——だから 3 回目、コマンドとしては 4 本目が必要になります。biblatexbiber でも形は同じで、bibtex の代わりに biber.bcf を読みます。実務では latexmk に任せれば回数を意識せずに済みます。それでも空のままなら、原因はたいてい 3 つ。\bibliography{refs} に拡張子 .bib を付けてしまった本文に \cite が 1 つも無い\nocite{*} を足すと全件出ます)、.bib の鍵の綴り違い.blg ログに Warning--I didn't find a database entry for "..." と出ていれば最後のケースです。

図が思った位置に出ない・違うページにずれる

figure 環境は フロート(浮動体) で、置ける場所が空くまで LaTeX が抱え込んだままにするからです。ここで多くの人がつまずくのが \newpage\clearpage の違いです。\newpage は「いまのページをここで終える」だけで、待たされているフロートを吐き出しません\clearpage は待機中のフロートをすべて出力してからページを終えます。同じ原稿で \newpage\clearpage に変えただけの 2 本を TeX Live 2024 で組み、pdftotext でページごとに中身を見ると差は決定的でした。

latex
\section{Alpha}
... a page of text ...
\begin{figure}[t]
  \centering \rule{10cm}{16cm}
  \caption{First figure}
\end{figure}

\newpage      % <- only this line differs between the two builds
%\clearpage

\section{Beta}
\begin{figure}[t]
  \centering \rule{6cm}{5cm}
  \caption{Second figure}
\end{figure}
Text of Beta.

\newpage 版は 4 ページになり、p.1 が Alpha の本文、p.2 が「Beta」の見出しと本文、p.3 に図 1、p.4 に図 2。Alpha 節に属する図 1 が、次の節の見出しを 飛び越えて 後ろへ出てしまいました。\clearpage 版は 3 ページで、p.1 が Alpha の本文、p.2 が図 1 だけ、p.3 に図 2 と「Beta」の見出しと本文。図が節の境界を越えなくなり、ページ数も 1 枚減っています。つまり「図が違う章に紛れ込む」現象の多くは、章の切れ目に \newpage を使ったことが原因です。章や節の区切りには \clearpage(両面印刷なら \cleardoublepage)を使ってください。加えて、位置指定は [h] 単独ではなく [htbp] にすること——[h] は「ここに置けなければ後回し」であり、\textheight より高いフロートは本文ページには絶対に載りません。フロートの詳しい制御は「フロートと配置」が持っています。

画像がまったく出ない・枠だけになる

症状が「何も出ない」なら形式と経路の食い違い、「枠だけ出る」なら draft を疑うのが先です。pdflatex が直接読めるのは PDF・PNG・JPEG で、EPS は読めません(epstopdf で変換するか、epstopdf パッケージに任せます)。一方、platexdvipdfmx の DVI 経路は EPS も扱えます。ファイルが見つからないときのメッセージは ! LaTeX Error: File 'fig.eps' not found. で、拡張子を書き忘れた・パスが違う・\graphicspath{{figures/}} の末尾スラッシュを落とした、のどれかがほとんどです。ビットマップを取り込んだときに出る ! LaTeX Error: Cannot determine size of graphic in xxx.png (no BoundingBox). は、graphicx にドライバの指定が伝わっていない場合に起きます(Cloud LaTeX の FAQ もこの 1 件を独立した項目として載せています)。

枠だけになる方は、原因がわかれば拍子抜けするほど単純です。\documentclass[draft]{article} として画像を取り込み、TeX Live 2024 で組んで pdftotext にかけたところ、絵の代わりに ファイル名の文字列 が出てきました。draft は画像の描画を省き、同じ寸法の枠とファイル名だけを置く指定です。クラスオプションに draft を書いたことを忘れたまま「画像が壊れた」と悩むのは、よくある事故のひとつ。提出版では必ず draft を外してください(速度目的なら graphicx 側だけを \usepackage[draft]{graphicx} にする手もあります)。なお、この節で挙げた原因をすべて潰しても図が出ないときは、そもそも図が「出ていない」のではなく「別のページに流れている」可能性があります——ひとつ前の節に戻ってください。

自分の環境では通るのに共著者の環境で落ちる

2 台の環境が食い違う原因は、実際には 3 つに絞れます。TeX Live の年度入っているパッケージの版個人用ツリーに置いた自前のファイルです。最初の 2 つは \listfiles を前置きするだけで可視化できます。プリアンブルの前に \listfiles と書いて組むと、.log の末尾に *File List* が出力され、TeX Live 2024 では amsmath.sty 2023/05/13 v2.17o AMS math featuresgraphicx.sty 2021/09/16 v1.2d Enhanced LaTeX Graphics のように 1 行 1 ファイルで日付と版 が並びます。共著者に同じものを送ってもらって差分を取れば、犯人はたいてい 1 行で見つかります。エンジン自体の年度は pdflatex --versionpdfTeX 3.141592653-2.6-1.40.26 (TeX Live 2024) と答えます。

terminal
% put this on the very first line of the source
\listfiles

$ pdflatex doc.tex && sed -n '/File List/,/^ \*\*\*/p' doc.log
 *File List*
 article.cls    2023/05/17 v1.4n Standard LaTeX document class
 amsmath.sty    2023/05/13 v2.17o AMS math features
graphicx.sty    2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR)

$ kpsewhich -var-value=TEXMFHOME   # macOS, TeX Live 2024
/Users/you/Library/texmf

$ pdflatex --version | head -1
pdfTeX 3.141592653-2.6-1.40.26 (TeX Live 2024)

3 つ目の「個人用ツリー」がいちばん見つけにくい原因です。kpsewhich -var-value=TEXMFHOME を実行すると、TeX Live 2024 の macOS 環境では /Users/あなた/Library/texmf が返ります(TeX Live 2024 の texmf.cnfTEXMFHOME = ~/Library/texmf と書かれているためで、Windows・Linux では ~/texmf が既定です)。ここに置いた .sty.bst、自前のフォントは あなたの環境でだけ見える ので、原稿を渡した相手側では ! LaTeX Error: File 'mystyle.sty' not found. になります。対策は単純で、自作ファイルは原稿と同じフォルダに置いて一緒に渡すこと。TeX Live の年度差まで完全に消したい場合は、環境そのものを Docker イメージなどで固定するのが確実です。共同作業の作法は「共同執筆と変更管理」、環境の固定は「Docker / CI」がそれぞれ持っています。

letterpaper と書いたのに PDF が A4 で出る

クラスオプションが変えるのは 版面(本文の寸法と余白) であって、PDF の用紙そのものではないからです。TeX Live 2024 で \documentclass[letterpaper]{article} をそのまま組み、pdfinfo にかけると Page size: 595.276 x 841.89 pts (A4) と返ってきます。理由は pdfTeX の起動時設定にあります。フォーマットに焼き込まれる pdftexconfig.tex\pdfpageheight = 297 true mm\pdfpagewidth = 210 true mm を設定しており、これは PDF のメディアボックスを決める プリミティブ です。クラスオプションはこの層に手が届きません。同じ文書に \usepackage[letterpaper]{geometry} を足すと 612 x 792 pts (letter) に変わります——geometry は版面と用紙寸法の両方を面倒みるからです。

terminal
$ pdflatex letter.tex && pdfinfo letter.pdf | grep "Page size"
Page size:       595.276 x 841.89 pts (A4)      # \documentclass[letterpaper]{article}

# fix 1 — geometry sets the type area AND the sheet
%   \usepackage[letterpaper]{geometry}
Page size:       612 x 792 pts (letter)

# fix 2 — set the pdfTeX primitives before \documentclass
%   \pdfpagewidth=8.5truein \pdfpageheight=11truein
Page size:       612 x 792 pts (letter)

対処は 3 通りあり、状況で選びます。もっとも素直なのは geometry を使うことで、余白の指定もここに一本化できます。プリアンブルを増やしたくない場合は、\documentclass\pdfpagewidth=8.5truein \pdfpageheight=11truein と書けば同じく 612 x 792 pts (letter) になります(実測)。DVI 経路の場合はそもそも PDF を作るのが dvipdfmx なので、dvipdfmx -p letter のように 変換側 で指定します。ここで true を付けている理由も押さえておくと役に立ちます。\mag で全体を拡大縮小したときに、true の付いた寸法だけが拡大の影響を受けないからです。用紙まわりの詳細は「PDF の生成」が持っています。

日本語が出ない・文字化けする

ほぼ確実に エンジンか文字コードの取り違え です。pdflatex は和文をまったく組めません。日本語向けの構成は 2 系統で、uplatex(+ jsarticlejlreq クラス)から dvipdfmx へ渡す経路と、lualatexluatexja の経路。ソースは UTF-8 で保存します。ここで見落とされがちなのが、同じ「日本語対応」でも platexuplatex は扱える文字の範囲が違うことです。TeX Live 2024 で「髙」(U+9AD9、いわゆるハシゴ高)を含む 1 行を platex に食わせると ! LaTeX Error: Unicode character ^^e9^^ab^^99 (U+9AD9) not set up for use with LaTeX. で止まりますが、uplatex は同じ行を警告なしで通します。人名や異体字のところだけ落ちるなら、フォントではなくエンジンを疑ってください。

文字は出るのに 豆腐(□)や別の書体になる 場合は、和文フォントの設定です。dvipdfmx 経路では kanji-config-updmap で埋め込む和文フォントを選び、LuaTeX-ja では \setmainjfont などで指定します。もうひとつ、原稿を渡した相手だけ化けるときは改行コードと文字コードを疑ってください——UTF-8 以外(Shift_JIS や EUC-JP)で保存されたファイルが混じっていると、platex-kanji= の指定次第で読み方を変えます。日本語組版の方式そのものは「日本語組版の方法」、文字コードと改行の扱いは「文字コードと改行」がそれぞれ持っています。

フォントが埋め込まれていないと言われる

確認は推測ではなく pdffonts で行います。TeX Live 2024 で作った素の pdfLaTeX 出力にかけると、emb sub uni という列が並び、KJJYRX+CMR10 Type 1 Builtin yes yes yes のように embyes で、フォント名の頭に 6 文字のサブセット接頭辞が付きます。この 2 点がそろっていれば埋め込み済みです。逆に embno の行があれば、学会の投稿システムや PDF/A の検査は必ずそこで止まります。原因の典型は 3 つ——Type 3 のビットマップフォント(対応する Type1 が無く METAFONT のビットマップが使われた)、PDF 標準 14 書体Helvetica などを実体なしで参照している)、そして dvipdfmx のマップが埋め込み不可のフォントを指している 場合です。

terminal
$ pdffonts document.pdf
name                       type       encoding  emb sub uni object ID
-------------------------- ---------- --------- --- --- --- ---------
KJJYRX+CMR10               Type 1     Builtin   yes yes yes      4  0

# "yes" under emb, plus the six-letter subset prefix, means embedded.
# Any line with "no" under emb will fail a PDF/A or journal check.

エラーメッセージ別の入口——どのページを読むべきか

ここまでの質問には共通のエラーメッセージがありませんでしたが、! で始まる行が出た場合は話が別で、メッセージそのものが行き先を決めます。このサイトの errors 区画には 1 メッセージ 1 ページの索引があり、! Missing $ inserted.! Undefined control sequence.! LaTeX Error: Missing \begin{document}.Runaway argument?! LaTeX Error: Option clash for package ...Overfull \hbox はそれぞれ専用の解説を持っています。下の表は TeX Live 2024 で実際に再現させたときの文言と、その一行が何を意味しているかの対応です。読み方のコツはひとつだけ——いちばん上のエラーから直すこと。TeX のエラーは連鎖するので、下のほうは最初の 1 件の余震であることがほとんどです。

メッセージたいていの原因
! Missing $ inserted._ ^ やギリシャ文字など、数式でしか使えない記号を地の文に書いた
! Undefined control sequence.命令名の綴り違い、または必要な \usepackage を書いていない
! LaTeX Error: Missing \begin{document}.プリアンブルに印字される文字がある(迷い込んだ 1 文字や BOM が典型)
Runaway argument?閉じ忘れた }、または引数の途中に空行がある。続けて ! File ended while scanning use of ... が出る
! LaTeX Error: Option clash for package同じパッケージを違うオプションで二度読み込んだ(クラスが先に読んでいることも多い)
Overfull \hbox行が分割できず版面からはみ出した。エラーではなく警告で、PDF は生成される
LaTeX Warning: There were undefined references.まだ 1 周目。もう一度組めば消える(消えなければ \label 側の問題)