![f68e16f2a85ebc3866cc4e014f20885d.png](https://i-blog.csdnimg.cn/blog_migrate/9710795da98ee86a681db1446ad0ebbc.jpeg)
Latex 的简单报错的梳理
「Latex」是非常好用的排版工具,可以让我们免于各种格式对齐的烦恼,而仅仅「专注于我们的内容」。
此外,我们也可以套用别人的「模板」来进行排版,例如杂志投稿、毕业论文排版、竞赛论文排版等等。
不过,在套用模板的时候常常会出现很多令新手很茫然、乃至于无奈而恼火的错误。
要解决这样的错误,我们首先就是要学会读懂当排版发生问题时的「报错的内容」。
本文我来总结一些在 Latex 编译运行时候经常会遇到的「简单错误」。
因为对 Latex,我也仅仅是视作工具,浅尝辄止,因此本文不治疑难杂症,而是分享最简单的错误以及「发生错误的机理」。
这种简单的内容「有必要」做一个分享吗?
我想是有的。
对于新手来说,Latex 的编译就是一个黑盒子。因此首先要破除的就是,“一旦报错就完了”,“我肯定搞不定”的思想。
Latex 也是有逻辑的,就算它报错也是有逻辑的。只有掌握了最基本的概念,遇到问题时才不会慌乱,才会带着关键的信息去搜索引擎中寻找答案。
错误信息去哪看?
在 Latex 编辑器中排版时,控制台(console)会输出一些排版的信息。我以 Mac 上的 Texshop 为例,就是下面这个图,其中有 5 个要素
![a34daea63d3cb7347829ff9376ebbbc4.png](https://i-blog.csdnimg.cn/blog_migrate/a4f61d9fc52848c5aebf27f94a0f213a.png)
- 「数字 1」:
mytest console
指出这是mytest.tex
排版的控制台 - 「数字 2」:转到错误-点击之后会跳转到 Latex 认为错误发生的地方
- 「数字 3」:删除 Aux 文件。Aux 文件是排版的辅助文件,后面有例子说明这一项的功能
- 「数字 4」:报错信息
- 「数字 5」:错误原文
「值得说明」的一点是:
- 如果你是正文中的笔误,跳转错误一般会跳到发生错误的附近。但如果你是配置问题,一般跳转不出来。
后文我们截图就仅仅针对错误信息的部分。
常见的错误
下面列举一些常见的错误,我会贴上报错的信息,分析报错的原因,以及最后解决的方法。在每个案例中,我都会重复这一个过程。
重复定义的错误
![0a89e2ef728b6cdd9039c03abea95481.png](https://i-blog.csdnimg.cn/blog_migrate/4fc1ad78e7c109e5dfe7fafed16be7e7.png)
这句话中信息量很大,包括:
./mytest.tex:29
:包括了 tex 文件的名称,相对路径,以及错误的行号-第 29 行- Latex Error:这是一个 Latex 错误
Command \rm already defined
:错误原因
这个错误是因为我使用了下面的命令
\newcommand{\rm}{\textrm{div}}
本来,newcommand 命令可以帮助我们在 Latex 中定义简写。
但是,因为 \rm
是 「Latex 系统自带」的命令,你再用这个名字的话,Latex 就不买账了,类似的,这里用 \div
也是不行的。
此外,如果你定义了两遍
\newcommand{\R}{\mathbb{R}}
\newcommand{\R}{\mathbb{R}}
也是会报错的。
你会说,我又不傻,怎么会一句话写两遍呢?没错。
但也许你的内容是 Ctrl+C、Ctrl+V 过来的,那还是有出现这种错误的情况的。
公式中出现了空行
![c162fbd1417fab40c048d38a8ab237ae.png](https://i-blog.csdnimg.cn/blog_migrate/a407efb70843d133258a96c19efb5a7d.png)
根据报错信息
- 第 77 行有问题
- Latex 说缺少
$
下面给出错误的原文
\begin{equation}
f
\end{equation}
错误原因是在 equation 环境中有空行。
重复的 labels
在 Latex 中我们可以使用 \label{mylabel}
和 \ref{mylabel}
来建立公式的引用。
但是在使用了 CMS 的模板之后,如果你使用了重复的标签,比如
\section{Preliminaries}\label{Sec.2}
\section{Numerical Tests}\label{Sec.2}
就会出现问题。报错内容为
![d151cb6aed9721536f391ffeecacc181.png](https://i-blog.csdnimg.cn/blog_migrate/20ba8e1d5ed33301ad4ba4916e8ca7ce.png)
仔细看看,我们可以注意到之前的区别。
- 错误不是出在
./mytest.tex
中,而是出现在./mytest.aux
文件中。
上面说了, .aux
文件是排版的辅助文件,会随着你点击排版一并运行出来的一堆文件中的一个。
![00bb6124b73371cad8fb420b1b63588f.png](https://i-blog.csdnimg.cn/blog_migrate/56d6787e396c3d9e5b08752f80418da4.png)
问题来了
既然错误不是出现在 .tex
文件中,那你在 .tex
中再怎么修改都是无济于事。
这时候我们就要使用在控制台界面中的 「删除 Aux 文件」 的功能了。
只有先在 .tex
中修改正确,然后删除辅助文件(Aux)再次运行才能成功。
想起来,如果新手遇到了这样的问题,不知道要删除 Aux 文件,真是头大,而且火大。
定理环境
在 Latex 中,要使用定理环境的话,我们需要先定义定理环境
\newtheorem{theorem}{Theorem}
这里第一个花括号中的 theorem
是我们的环境的名称。因此我们在使用的时候
\begin{theorem}
\end{theorem}
如果我们事先没有使用 \newtheorem
来申明环境,或者我们的申明是这样的
\newtheorem{thm}{Theorem}
那么我们在使用 \begin{theorem}
时就会出现下面的错误
![0cb34b8057cf261eb18f5bbd3f893c9d.png](https://i-blog.csdnimg.cn/blog_migrate/159799c933c4ad3a1b83c280f19d55d3.png)
Latex 会告诉我们找不到「theorem环境」。
这种错误容易发生在新手对定理环境的熟悉和理解不足之时。
https://www.overleaf.com/learn/latex/theorems_and_proofs
耐心阅读一下上面的文档,就可以明白
- 如何让定理按章节编号
- 让引理接着定理编号
- 让推论单独跟随定理编号
中文字体
在 Texlive 中,使用中文已经非常方便。直接使用 XeLatex 对应的模板就可以。
照旧使用 article,而不用 CTEX,即
\documentclass[12pt]{article}
需要导入如下的 package
\usepackage{xeCJK}
\usepackage{fontspec}
然后设定 CJK 的中文字体,例如楷体
\setCJKmainfont{Kai}
问题是,Latex 怎么能理解我所理解的字体呢?
如果我们把 Kai
更换成 kai
,就会报错,错误信息是
![0242c2c900fdf44a33c8435c61c10f3e.png](https://i-blog.csdnimg.cn/blog_migrate/64146a5c102cee0c2383e19e6f7dc15e.png)
它会告诉我们 kai
这个字体找不到。
公式错误
上面说的大多都是模板以及配置上的错误,这些错误相对来说更难处理。
此外就是我们在输入的时候发生的错误
- 标注环境的花括号没有配对
- 基本的 align、array 语法不熟悉
等等。
这里也举一个例子——大括号的公式
$$
\left\{
\begin{aligned}
& a+b = c\\
& c+d = a
\end{aligned}
\right.
$$
这是一段新手「特别想用」,但往往「记不住、记糊涂」的代码
- 「最外层」是行间公式
$$ ... $$
- 左侧括号和右侧没有括号,分别是
\left
和\right
- 括号需要用
\
转义 - 内侧是
aligned
环境而不是align
下面给出一个错误的示范,我们来看看报错是什么样的,错误的代码为
\begin{align}
\left\{
& a+b = c\\
& c+d = e
\end{align}
![594f94fcf487beba1b943680b77dddf6.png](https://i-blog.csdnimg.cn/blog_migrate/07783d5c4362839382e09143da82c90d.png)
这里我「多截取」了几句控制台的输出,这样免得有些读者觉得错误信息就在输出的最后一句,并不是如此。
可以看到,它提示我们可能是少了 \right.
,我们加上之后,依然报这个错误。
这个时候我们就需要反思,以及回顾一下,这个花括号的结构是怎样写的。
小总结
相对来说,在编辑公式时候发现的问题会好处理一些。这是因为
- 模板错误一般发生在你打开了别人的文档,或者你「复制粘贴一大段」。因此你不容易进行「错误的定位」。
- 编辑公式的时候一般写了一句话你就要编译一下。因此你很容易就知道是哪个「细微的动作」发生了错误。
比如你知道你的大括号的公式写的不对,你根本就不必纠结怎么改正.
直接删掉,然后百度一个正确的大括号的写法不就 ok 了吗?
但从这里也可以看出,在运行「别人的文档」的时候,如果出了问题,而你又看不太懂报错的话,也是可以「一部分一部分粘贴」别人的文档,看看究竟是哪一小步会出现问题。
这就是「控制变量」来「定位出错误」的思想了。
从没见过的错误
虽然上面列举了不少错误的种类,但列举完是不可能的,甚至很多错误其实并不具有代表性。所以,感谢你能坚持读到这。
我想强调的是什么呢?是
- 找到报错的信息
- 分析报错的原因
- 寻求解决的方法
这个「过程」。
虽然我们都会遇到没有见过的错误,但是我们有「搜索引擎」。
但搜索引擎并不是万能的,也「不是智能」的,你只有拿着合适的钥匙才能找到正确的答案。而这个钥匙就是控制台输出中的「报错信息」,以及你对他的理解。
顺便说一句,上面的个别例子中的报错信息非常含混。报错位置甚至就是文档的第一行。这很容易就能「让新手从入门到放弃」。
所以本次分享的一个用意也是希望新手能迈开这一步,这样后面我们对 Latex 的报错就不会那么恐惧啦~