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}
  1. 把指数部分单独拿出来渲染:分式本身能过,说明分式内部没问题。
  2. 再把 e^{ 加回去,报错出现,缺的就是指数这一组的右花括号。
  3. 在末尾补上 },整条重新渲染。

改好后的写法,上标里的平方也包上花括号,读起来更清楚:

e^{-\frac{(x-\mu)^{2}}{2\sigma^{2}}}

补齐花括号后的e的指数,及单独放大的指数部分

办法二:括号高亮。 把源码贴进带括号配对高亮的代码编辑器,光标放在某个左花括号旁,编辑器会标出与它配对的右花括号。从最外层开始逐个检查,配对落点不对的那一组就是问题所在。

根号里套分式的典型错例。 根号一组、分式两组,三组花括号叠在一起,结尾最容易少写或多写一个。少写时是这样:

\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 个正是那个多余的右花括号。写这类公式时,每关上一组就停下来数一遍。

逐层拆开定位花括号的四步

个数对了,还要看范围

根号下:x 减 1 分之 x 的平方加 1

花括号个数相等只是第一步,范围包错了同样不报错:指数只盖住负号、根号只盖住分子,都能正常渲染。补完之后对着排版看每一组盖住了哪些内容,比如上面这条,根号要把整个分式罩在里面。

延伸阅读

常见问题

报错位置不准怎么办?
少一个右花括号时,程序要读到公式结尾才发现,报错自然指向末尾。这时别盯着报错位置,改用逐层拆:按完整的一组拆,别从中间切。先把最里层的一组(分式、指数里的内容)单独渲染,能过再往外加一层,加到哪一层开始报错,缺的就是那一层的右花括号。也可以在带括号配对高亮的代码编辑器里,把光标逐个放到左花括号旁,看它配到了哪里。