LaTeX花括号不匹配:快速定位的方法
更新于
花括号不匹配时,报错位置往往不准:少了一个右花括号,报错多半指向公式末尾,而真正漏写的地方在前面。快速定位靠两个办法:逐层拆,按花括号分组逐层拆开渲染,找出报错的那一层;括号高亮,在代码编辑器里看每个左花括号配到了哪个右花括号。嵌套分式和指数里套分式是最常见的出事位置。
现象:报错指向哪里
同一种错,在不同地方报出来的文字不一样。在网页和在线预览里,KaTeX 给的是下面两句之一:
| 情况 | 报错原文 | 指向的位置 |
|---|---|---|
| 少一个右花括号 | Expected '}', got 'EOF' at end of input |
公式末尾 |
| 命令参数少右花括号 | Unexpected end of input in a macro argument, expected '}' |
公式末尾 |
| 多一个右花括号 | Expected 'EOF', got '}' at position N |
多出来的那个 |
在整篇文档里编译,多一个右花括号报 Extra }, or forgotten $.;少一个时,TeX 读到 \] 才发现这一组没关上,先在 \] 那一行报 Missing } inserted.(不加载 amsmath 时第一条是 LaTeX Error: Bad math environment delimiter.),后面还有几条,都落在公式结束处或它后面一行,不是漏写的位置。
为什么位置不准
程序读到左花括号,会一直往后找与它配对的右花括号。少写一个时,它把后面所有内容都当成这一组的一部分,直到公式读完才发现缺了,于是报在结尾。公式越长,漏写的位置离报错位置就越远,一条几十个字符的推导,缺口可能在开头第三个命令里。
多写一个时正好相反:公式在正确的地方已经结束,后面又冒出一个右花括号,报错位置就是它,这种情况的位置是准的。所以看到 at end of input,先怀疑少了;看到具体的 position,先怀疑多了。

两个定位办法
办法一:逐层拆。 别从中间把公式切开:那样几乎总会把某一组花括号切断,两半都会报错,连本来正确的公式也一样。要按完整的一组拆,从最里层往外加。 以正态分布密度里的指数为例,下面这行少了一个右花括号:
e^{-\frac{(x-\mu)^2}{2\sigma^2}
- 把指数部分单独拿出来渲染:分式本身能过,说明分式内部没问题。
- 再把
e^{加回去,报错出现,缺的就是指数这一组的右花括号。 - 在末尾补上 },整条重新渲染。
改好后的写法,上标里的平方也包上花括号,读起来更清楚:
e^{-\frac{(x-\mu)^{2}}{2\sigma^{2}}}

办法二:括号高亮。 把源码贴进带括号配对高亮的代码编辑器,光标放在某个左花括号旁,编辑器会标出与它配对的右花括号。从最外层开始逐个检查,配对落点不对的那一组就是问题所在。
根号里套分式的典型错例。 根号一组、分式两组,三组花括号叠在一起,结尾最容易少写或多写一个。少写时是这样:
\sqrt{\frac{x^{2}+1}{x-1}
报错是 Expected '}', got 'EOF' at end of input:分式两组都关上了,缺的是根号那一组。逐层拆时,先单独渲染 \frac{x^{2}+1}{x-1} 能过,再把 \sqrt{ 加回去就报错,缺口就在这一层。补齐后是:
\sqrt{\frac{x^{2}+1}{x-1}}
反过来在末尾多敲一个 },报错是 Expected 'EOF', got '}' at position 27:补齐后的式子共 26 个字符,第 27 个正是那个多余的右花括号。写这类公式时,每关上一组就停下来数一遍。

个数对了,还要看范围

花括号个数相等只是第一步,范围包错了同样不报错:指数只盖住负号、根号只盖住分子,都能正常渲染。补完之后对着排版看每一组盖住了哪些内容,比如上面这条,根号要把整个分式罩在里面。
延伸阅读
- SimpleLaTex:在线写 LaTeX 公式的入门步骤
- KaTeX语法:常用命令速查与常见报错改法
- LaTeX 公式大全:按学科整理的公式源码,可直接复制
- LaTeX反斜杠丢失:复制后的原因与处理
常见问题
- 报错位置不准怎么办?
- 少一个右花括号时,程序要读到公式结尾才发现,报错自然指向末尾。这时别盯着报错位置,改用逐层拆:按完整的一组拆,别从中间切。先把最里层的一组(分式、指数里的内容)单独渲染,能过再往外加一层,加到哪一层开始报错,缺的就是那一层的右花括号。也可以在带括号配对高亮的代码编辑器里,把光标逐个放到左花括号旁,看它配到了哪里。
