错误与警告列表

LaTeX 的报错信息经过设计,只看 ! 后面的头几个词,就能知道是谁在抱怨。什么前缀都没有的 ! Missing $ inserted. 来自 TeX 引擎本身,! LaTeX Error: 来自 LaTeX 内核,! Package hyperref Error: 来自它点名的那个宏包。学会分辨这一点,第一行就能决定该改的是自己的稿件、导言区的加载顺序,还是别人的缺陷追踪系统。本页是一份索引:把人们真正会遇到的消息按原文列出,说明每一条实际上在讲什么,并指向深入讲解它的页面。这里列出的每条消息都在 TeX Live 2024 上实际复现过。

! 后面的字眼指出发话者:TeX、LaTeX、宏包,还是警告

! 开头的行是错误,可能中止构建;没有 ! 的行是警告或提示,构建照常继续。而错误又分三层,! 紧后面的字眼说明是哪一层。 最底层是 TeX 引擎,它的消息完全没有前缀——! Missing $ inserted. 四十年来一字未改,不加载 LaTeX 的纯 TeX 也会打印一模一样的句子。中间层是 LaTeX 内核的 ! LaTeX Error: …,最上层是宏包和文档类的 ! Package X Error: …! Class X Error: …层次越高措辞越友好,层次越低就越接近 TeX 真正卡住的地方。 出现没有前缀的消息,通常意味着稿件本身的语法坏了。

行的形态发话者,以及对构建的影响
! Missing $ inserted.TeX 引擎本体;没有前缀就是标志,说明稿件语法坏了
! LaTeX Error: ...LaTeX 内核;违反了 LaTeX 关于环境、引用或导言区的规则
! Package X Error: ...被点名的宏包 X;用 texdoc X 读它自己的手册通常是最快的下一步
! Class X Error: ...文档类 X;在期刊类里往往是在通知你违反了排版规定
LaTeX Warning: ...内核警告;构建照样成功,退出码仍为 0,过期引用就是这样活下来的
Package X Warning: ...宏包警告;有的会带 on input line N,有的故意不带
Overfull \hbox (...)直接来自段落排版器;既没有 ! 也没有 Warning 这个词
Package X Info: ...纯信息;只留在 .log 里,不进终端,但常常能解释后面的失败

TeX 引擎的错误:没有前缀的消息

这一组消息是在报告「TeX 无法继续读下去了」,原因几乎无一例外是花括号、$& 的配对,以及数值的写法。 措辞生硬,是因为它写于 LaTeX 尚不存在的年代。反过来说,这些字符串在任何发行版、任何年代的文档里都完全一致,很适合拿去搜索。下面的文面都在 TeX Live 2024 上实际复现过。

消息真正的含义与第一步
! Undefined control sequence.上一行最右端的命令未定义:拼写错误、忘了加载宏包,或定义写得太晚
! Missing $ inserted.在正文里用了只属于数学模式的符号;_^\alpha 是常见的触发者
! Missing } inserted.{ 尚未闭合就有东西结束了;原因在报告位置的上游
! Too many }'s.} 多了一个;多半是前面某行少写了一个 {
! Extra alignment tab has been changed to \cr.表格某行的 & 超过了列格式允许的数量;对照列说明数一数
! Misplaced alignment tab character &.在表格之外写了 &;要字符本身请写 \&
! Double subscript.同一个原子上有两个 _,如 x_1_2;用花括号合并成 x_{12}
! Missing number, treated as zero.该给长度或个数的地方没有数字;\hspace{} 这样的空参数最典型
! Illegal unit of measure (pt inserted).数字没带单位,如 \rule{1}{2pt};补上 cmptem
! Paragraph ended before \x was complete.参数中间出现了空行;上方紧接着的 Runaway argument? 就是线索
! File ended while scanning use of \x.文件读完了参数还没闭合——缺 } 的终末形态
! Missing \endcsname inserted.\csname … \endcsname 中间混进了不可展开的东西;怀疑拼接出来的宏名
! TeX capacity exceeded, sorry [...]方括号里是耗尽的资源名;[grouping levels=255] 指向失控的递归
! Emergency stop.在无法交互的场合被索要输入——非交互模式下找不到文件时的常见结局

LaTeX 内核的错误:以 ! LaTeX Error: 开头的那些

这一类违反的是 LaTeX 的规矩而不是 TeX 的语法,措辞具体得多,因此改法往往是唯一的。 环境不匹配、\usepackage 放错地方、只能用于导言区的命令、文件不存在——每一条都是 LaTeX 自己定下的规则。另外,.log 里每条这样的消息后面都跟着一段帮助文字,比终端上那一行说得更具体,看不明白时请打开日志。

消息真正的含义与第一步
! LaTeX Error: File `x.sty' not found.宏包未安装或拼错;用 kpsewhich x.sty 确认,用 tlmgr install x 安装
! LaTeX Error: Environment x undefined.定义该环境的宏包没有加载;顺便也检查一下环境名的拼写
! LaTeX Error: \begin{x} on input line N ended by \end{y}.环境是交叉而不是嵌套;N 是打开的那一行,从那里往下看
! LaTeX Error: Command \x already defined.对已存在的名字用了 \newcommand;确实想覆盖就改用 \renewcommand
! LaTeX Error: Missing \begin{document}.导言区里出现了可打印的东西;一个非空白字符就足以引发
! LaTeX Error: Option clash for package x.第二次加载索要了第一次没有的选项;用 \PassOptionsToPackage 解决
! LaTeX Error: Something's wrong--perhaps a missing \item.列表是空的,或者在第一个 \item 之前有正文
! LaTeX Error: There's no line here to end.在还没有行的位置写了 \\,常见于段首或 center 的开头
! LaTeX Error: Not in outer par mode.把浮动体放进了另一个浮动体或盒子里;figure 不能放在 figureminipage
! LaTeX Error: \caption outside float.\caption 出现在 figuretable 之外;把它包进去,或改用 \captionof
! LaTeX Error: Can be used only in preamble.在正文里用了 \usepackage 之类只能出现在导言区的命令
! LaTeX Error: \usepackage before \documentclass.\documentclass 之前用了 \usepackage;那个位置只有 \RequirePackage 有效
! LaTeX Error: Unknown option `x' for package `y'.该宏包从未声明这个选项;检查拼写和宏包版本
! LaTeX Error: Unicode character X (U+NNNN)该字符没有定义;在 pdfLaTeX 下这涵盖 CJK 和表情符号,而 XeLaTeX、LuaLaTeX 可以接受

宏包的错误:! Package X Error: 是 X 在说话

这一层的消息是被点名的宏包自己写的文字,也就是说同样的措辞会出现在该宏包的手册里——打开 texdoc X 搜索这条消息,是最短的路径。 内容也很具体:这个环境不能用在这里、这个颜色没有定义、这个宏包和那个不能共存。处理办法常常就直接写在里面。下面这些都是在 TeX Live 2024 上实际触发出来的。

消息真正的含义与第一步
! Package biblatex Error: Incompatible package 'natbib'.biblatexnatbib 无法共存;改用 \usepackage[natbib=true]{biblatex}
! Package cleveref Error: cleveref must be loaded after hyperref!.加载顺序的要求:cleveref 要在 hyperref 之后,也要在 varioref 之后
! Package amsmath Error: \begin{split} won't work here.split 不能单独使用;必须放在 equationalign 内部
! Package xcolor Error: Undefined color `x'.颜色名未定义;加载 dvipsnames 之类的色名集,或用 \definecolor 声明
! Package babel Error: Unknown option 'x'.语言名拼错,或者该语言的文件没有安装
! Package pdftex.def Error: File `x.png' not found: using draft setting.找不到图片;会排出一个空框并继续运行,请检查路径和扩展名
! Package inputenc Error: ...在 TeX Live 2024 上几乎见不到:UTF-8 的处理已移入内核,inputenc 基本无事可做

警告:不会中止构建,但放着不管就会交出错误的 PDF

警告不会中止构建,也不会把退出码从 0 改掉,于是 CI 会判定为「成功」。这正是它们危险的地方:引用还是 ?? 的 PDF、编号落后一版的 PDF,都是从这里诞生的。 其中两条尤其要紧——LaTeX Warning: There were undefined references.Label(s) may have changed. Rerun to get cross-references right.——它们是「请再编译一次」的指令,不是可以将就的警告。写构建脚本时,要么检测这两行并重跑,要么干脆把这件事交给 latexmk

消息真正的含义与第一步
Overfull \hbox (12.3pt too wide) in paragraph at lines 4--5某行超出了版心;括号里的数值就是超出量,不到 1pt 大可不必理会
Underfull \hbox (badness 10000) in paragraph at lines 4--5某行被拉得过松;badness 10000 是最差值,滥用 \linebreak\\ 是常见诱因
Overfull \vbox (26.3pt too high) detected at line 4溢出发生在纵向:某个盒子塞不进这一页
LaTeX Warning: Reference `x' on page 1 undefined on input line 3.该标签还不在 .aux 里:要么这是第一次运行,要么 \label 拼错了
LaTeX Warning: Citation `x' on page 1 undefined on input line 3.还没运行 bibtexbiber,或者这个文献键不在 .bib
LaTeX Warning: Label `x' multiply defined.同一个标签存在两处;指向它的 \ref 只能落在其中一个上
LaTeX Warning: There were undefined references.运行结束时的汇总;带着这行出货,PDF 里就还留着 ??
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.编号与上一次不一致;再编译一次就会消失
LaTeX Font Warning: Font shape `OT1/cmr/bx/sc' undefined粗体加小型大写这类组合并不存在;会用替代字体,只是外观有变
Package hyperref Warning: Token not allowed in a PDF string (Unicode):标题里的数学无法进入 PDF 书签;用 \texorpdfstring{数学}{纯文本} 分开写

已经不再出现的消息:只活在过时资料里

搜索到的老答案里,仍然引用着 TeX Live 2024 已经不会产生的消息;看不到同样的字符串,并不说明你的环境坏了。 最典型的是 Unicode 字符错误。它过去写作 ! Package inputenc Error: Unicode character …;如今 UTF-8 的处理已在内核里,于是变成 ! LaTeX Error: Unicode character 日 (U+65E5),下一行接 not set up for use with LaTeX.。而且 已经完全不再报错——实测下来,字符分成 pdfLaTeX 现在接受的和依然拒绝的两类,后者包括 CJK、表情符号和 xcolor 的选项冲突也出于同样的原因成了历史(详见「宏包冲突」一页)。

  • Unicode 字符 — 现在的消息是 ! LaTeX Error: Unicode character 日 (U+65E5),而不是 ! Package inputenc Error:。在 pdfLaTeX 下 能过,CJK、表情符号和 仍然不能。
  • xcolor 的选项冲突\usepackage[dvipsnames]{xcolor} 之后再写 \usepackage[table]{xcolor} 完全不报错,因为 xcolor 已改用键值式选项。
  • captionsubfigure — 过去那条「不能与之合作」的错误已经消失,如今 .log 里只留下 Package caption Info: subfigure package is loaded.
  • subfiguresubcaption — 同时加载不会报错。取而代之的是 \begin{subfigure} 被老的 \subfigure 命令吞掉,冒出 ! Missing number, treated as zero. 这类看似无关的错误。