10_LaTeX之排除错误和寻求帮助

10_LaTeX 之排除错误和寻求帮助

本文主体内容来自一份 (不太) 简短的 LATEX2ε 介绍

LATEX 入门用户总会为两大问题头疼:我写的代码到底哪里出错了?如果想要实现某种用法该怎么办?本章首先总结了常见的 LATEX 错误及应对的办法。

LATEX 错误

当用排版引擎编译 LATEX 代码时,命令行的窗口(终端)会显示大量信息(TeXworks 等编辑器会有一个区域显示这些信息)。
当编译过程中出现错误时,信息将会停止在出错的地方,等待我们接下来的操作。

比如说我们有一个明显出错的例子:

\documentclass{article}
\begin{document}
Test \LaTEx{} and it's friends.
\end{document}

编译过程中遇到这个错误将会停顿下来,提示错误,并等待用户输入指令:

! Undefined control sequence.
l.3 Test \LaTEx
             {} and it's friends.

这种错误信息分两部分,前一部分提示了错误的信息,后一部分指出了错误发生的行号,以及通过错落的文字告知发生错误的命令所在位置。如上错误显示 \LaTEx 位置发生了错误,错误信息是“未定义的控制序列”,意思是 \LaTExTEX 编译器无法识别的一个命令,很显然是把 \LaTeX 的大小写写错了。

处理方式

出现错误时,编译过程将暂停,等待用户输入命令。用户可以直接敲回车跳过当前的错误,继续编译,相当于丢掉了写错的命令,将“Test and it's friends.”排版出来。但这个例子过于简单,有些复杂的代码中,有可能会由于一个小问题导致一连串的错误。此时可以选择按 S/R/Q 选择跳过接下来的所有错误,或者按 X 直接退出编译,将源代码中的错误修改后重新编译。

常见的 LATEX 错误信息

在此总结一些经常发生、问题比较明确的 LATEX 错误:

  • ! Undefined control sequences.

    使用了未定义的命令。拼写错误是原因之一(标点符号中英文不匹配)。也有可能是没有调用某个宏包,但用了该宏包定义的命令。

  • ! LaTeX error: Environment ... undefined.

    使用了未定义的环境。

  • ! Missing $ inserted.

    缺少数学环境的符号 $。多由于将数学符号用在公式之外而导致。

  • Runaway argument?

    ! Paragraph ended before ... was complete.

  • ! File ended while scanning definition/use of ...

    这两个错误主要是由于漏写了包裹命令参数的花括号,导致识别参数时出现错误。许多编辑器的括号配对功能有助于检查和消除这类错误。

    这类错误还有可能是由于前一次编译中断导致 .aux 等辅助文件不完整,再次编译读入不完整的文件产生错误。解决办法是删除辅助文件并重新编译。

  • ! Extra alignment tab has been changed to \cmd{cr}.

  • ! Misplaced \cmd{noalign}.

    两个错误信息都与表格有关。

    • 前者的字面意义是“一行中使用的列分隔符 \& 太多”,有时可能确实是 \& 的个数和列格式不匹配,但多数情况是漏掉了行尾的 \\ 命令。
    • 后者常出现于漏掉了行尾的 \\ 命令而接着使用 \hline 命令画横线的时候。
  • ! LaTeX Error: Lonely \item--perhaps a missing list environment.

  • ! LaTeX Error: Something's wrong--perhaps a missing \item.

    两个错误信息都与列表环境和\item 命令有关。前者意味着在没有使用列表环境的情况下用了 \item;后者则相反,是在列表环境中漏了 \item

  • ! I can't find file `...'.

  • ! LaTeX Error: File `...' not found.

    两个错误都意味着缺少文件。

    • 如果使用\input 或者 \include 命令添加文件,出现上述错误的原因当然是文件不存在或者文件名不对;
    • 如果错误提示里的文件名带 .sty 或者 .cls 扩展名,那么很显然,是因为没有安装所需的宏包或文档类
  • ! LaTeX Error: Missing \begin{document}.

    字面上是缺少 \begin{document},实际上往往是由于在 \begin{document} 之前(导言区)输入了文字或某些命令。

  • ! LaTeX Error: Can be used only in preamble.

    与上一条相反,由于将必须用于导言区的命令在 \begin{document} 之后使用而产生。

  • ! LaTeX Error: \begin{...} on input line ... ended by \end{...}.

    环境首尾不匹配。比如 \begin{enumerate} 用了 \end{itemize} 结尾。或者也可能是由于漏写了 \begin或者 \end 命令。

  • ! LaTeX Error: Option clash for package `...'.

    不同选项重复调用宏包造成冲突。有可能是因为其它宏包内部事先调用了这个宏包,用户再次带选项调用而导致冲突。解决问题的办法是去掉重复调用的宏包。如果宏包允许的话,尽量使用其定义的命令改变设置,减少宏包选项的使用。

  • ! LaTeX Error: Command ... already defined,

    or name \end... illegal ...

    使用 \newcommand\newenvironment 定义已有的命令/环境时产生的错误。如果自己确实作了定义,可考虑用 \renewcommand\renewenvironment 定义;如果是宏包定义的命令产生了这个错误,则属于隐性的宏包冲突。

    相比之前的“Option clash”,隐性宏包冲突是更难以解决的问题,对各种宏包不熟悉的用户,尤其是使用模板的用户而言,往往难以下手。用户可尝试查找引起冲突的宏包的帮助文档。详尽的手册里通常会告知用户这个宏包应当在某个宏包的前面/后面调用,或者不能与某个宏包一起调用。
    如果是模板调用了大量宏包导致冲突,可联系模板的作者解决。

  • ! LaTeX Error: Unknown option `...' for package `...'.

    调用宏包时指定了不能被其识别的选项。此时应该查找宏包的帮助文档来解决问题。

  • ! Package `...' error: ...

    宏包或文档类自定义的错误,由于不正确地使用宏包里的命令而导致。此时应该查找宏包的帮助文档来解决问题。

查找帮助文档

无论是 TeX Live 还是 MiKTeX,都提供了一个命令行模式的程序 texdoc。比如对 fancyhdr 宏包感兴趣,这时在 Windows 命令提示符或者 Linux 终端输入以下命令,则会弹出宏包的帮助文档 fancyhdr.pdf

texdoc fancyhdr

除了宏包的帮助文档外,TEX 发行版还包括了各类有用的文档,有一部分在参考文献中给出。

当然对于初学者,有一个现实而棘手的问题:某个命令到底是 LATEX 自有的,还是哪个宏包提供的?很遗憾地说,除了通过慢慢积累、熟悉较多宏包之外,没有很方便的办法解决这个问题,因为 LATEX 的宏包实在太丰富了。

解决这个问题有几点可行的办法:

  1. 查询一些综述性的资料,如总结所有 LATEX 自带命令的文档、、LATEX 符号大全 等;

  2. 在互联网上搜索自己不清楚的命令;

  3. 在论坛上提问求助有经验的人。

常用宏包简介

文字、公式和符号

宏包 简介
amsmath AMS 数学公式扩展。
mathtools 数学公式扩展宏包,提供了公式编号定制和更多的符号、矩阵等。
amsfonts AMS 扩展符号的基础字体支持。
amssymb amsfonts 基础上将 AMS 扩展符号定义成命令。
bm 提供将数学符号加粗的命令 \bm
unicode-math 使用 Unicode 数学字体。
nicematrix 排版复杂矩阵。
siunitx 以国际单位规范排版物理量的单位。
mhchem 排版化学式和方程式。
tipa 排版国际音标。

排版元素

宏包 简介
ulem 提供排版可断行下划线的命令 \uline 以及其它装饰文字的命令。
endnote 排版尾注。
marginnote 改善的边注排版功能。
multicol 提供将内容自由分栏的 multicols 环境。
multitoc 生成多栏排版的目录。
minitoc 为章节生成独立的小目录。
glossaries 生成词汇表。
verbatim 对原始的 verbatim 环境的改善。提供了命令 \verbatiminput 调用源文件。
fancyvrb 提供了代码排版环境 Verbatim 以及对版式的自定义。
listings 提供了排版关键字高亮的代码环境 lstlisting 以及对版式的自定义。类似宏包有 minted 等。
algorithmic 一个简单的实现算法排版的宏包。如果要生成浮动体的话,需要搭配 algorithm 宏包使用。
algorithm2e 较为复杂的、可定制的算法排版宏包。类似宏包有 algorithmicx 等。
amsthm 定制定理环境。类似宏包包括 theoremntheoremthmtools 等。
mdframed 排版可自动断页的带边框文字段落,提供边框样式的定制功能。
tcolorbox TikZ 为基础提供排版样式丰富的彩色盒子的功能。

图表和浮动体

宏包 简介
array 对表格列格式的扩展。
booktabs 排版三线表。
tabularx 提供 tabularx 环境排版定宽表格,支持自动计算宽度的 X 列格式。
arydshln 支持排版虚线表格线。
colortbl 支持修改表格的行、列、单元格的颜色。
multirow 支持合并多行单元格。
makecell 支持在单元格里排版多行内容(嵌套一个单列的小表格)。
diagbox 排版斜线表头。
longtable 提供排版跨页长表格的 longtable 环境。
ltxtable 为跨页长表格提供 tabularxX 列格式。
tabularray 排版复杂表格(基于 LATEX3 实现)。
graphicx 支持插图。
bmpsize latex+dvipdfmx 命令下支持 BMP/JPG/PNG 等格式的位图。
epstopdf pdflatex 命令下支持 EPS 格式的矢量图。
wrapfig 支持简单的文字在图片周围的绕排。
caption 控制浮动体标题的格式。类似宏包有 keyfloat 等。
subcaption 提供子图表和子标题的排版。类似宏包有 subfiguresubfig 等。
bicaption 生成双语浮动体标题。
float 为浮动体提供不浮动的 H 模式;提供自定义浮动体结构的功能。

修改版式

宏包 简介
geometry 修改页面尺寸、页边距、页眉页脚等参数。
fancyhdr 修改页眉页脚格式,令页眉页脚可以左对齐、居中、右对齐。
titlesec 修改章节标题 \chapter\section 等的格式。
titletoc 修改目录中各条目的格式。类似宏包有 tocloft 等。
tocbibind 支持将目录、参考文献、索引本身写入目录项。
footmisc 修改脚注 \footnote 的格式。
indentfirst 令章节标题后的第一段首行缩进。
enumerate 提供简单的自定义标签格式的 enumerate 环境。
enumitem 修改列表环境 enumerateitemize 等的格式。
lettrine 生成段落首字母大写的效果。

  1. Karl Berry, Jim Hefferon, Vincent Belaiche. LaTeXe: An unofficial reference manual. (texdoc latex2e) ↩︎

  2. Scott Pakin. The Comprehensive LaTeX Symbol List. (texdoc symbols-a4) ↩︎

posted @   Invinc-Z  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示