LaTeX 调试策略和括号不匹配

LaTeX 调试策略和括号不匹配

推荐使用什么方法来追踪 LaTeX 中的括号不匹配?我有一个很大的beamer演示文稿,但这同样适用于我做过的任何其他 LaTeX 工作。

在其他计算机语言中,我使用漂亮的打印机来突出显示不匹配的地方,但我似乎找不到用于 LaTeX 代码本身的漂亮打印机,而不是 LaTeX 内部的其他语言。

我的下一个想法是开始注释掉大部分源代码,直到问题被解决。

还可以使用哪些其他策略?

答案1

日志文件通常会提供一些帮助。例如,如果你启动一个环境而不结束它,那么你会得到

! LaTeX Error: \begin{quote} on input line 16 ended by \end{document}.

如果它没有告诉您组应该在哪儿结束,那么它会告诉您组从哪儿开始。

如果有不匹配的{ }对,则取决于它们是用于分组还是参数分隔。

在前一种情况下,你会得到

(\end occurred inside a group at level 1)

这告诉你有些事情不好,如果你在文档开头放了

\tracinggroups=1

你还可以获得

### simple group (level 1) entered at line 16 ({)
### bottom level

它会告诉你在哪里{

如果它是参数匹配,即没有,\textbf{那么}您会得到:

Runaway argument?
{ \par aa bb xx cc \par \par \par \par 4 $\hat {\hat {\mathcal {A}}} \ETC.
! File ended while scanning use of \textbf .

它会给你一些上下文,但没有行号,尽管如果你有如上设置的跟踪组,那么很容易猜到,因为你会被告知在错误发生之前进入或离开的最后一个组,在这种情况下,日志显示

{leaving math shift group (level 1) entered at line 14}
)
Runaway argument?

因此,不难发现第 16 行的错误,因为第 14 行没有问题,而第 15 行(在本例中)是空的。

答案2

\include到目前为止,答案都解决了单文件作业中的问题。如果使用或处理多个文件,事情会变得更加复杂。\input当发生这种情况时,有报告称 (\end occurred inside a group at level 1),如果给出了行号,您就不知道该行在哪个文件中。

我使用 emacs,并利用可以请求how-many文件这一功能。首先,获取包含的文件列表。然后,逐个进入。询问how many {然后how-many }。如果计数不匹配,则您可能已找到问题文件。如果幸运的话,您的警告中包含行号,因此请使用它。如果不是,请转到文件的中间位置(最好在“干净”的位置,例如段落或分节符)重复该how-many咒语。这通常足以很好地定位问题,以便用眼睛检查文本。

要检查的另一件事是匹配\begin{和的数量\end{——左括号很重要,因为有些用户定义了他们自己的\beginxxx命令,而您可能不想检查这些命令,至少在第一次检查时不想。

或者,使用在问题文件的各个点插入的方法,\end{document}直到警告消失,然后目测中间的文本是否存在问题。(也有效,虽然它是一个原始的,而不是一个 latex 命令。这实际上比搜索d 或文件\endinput更有用,因为它只影响特定的文件。)\end{document}\include\input

另一种方法是注释掉\include\input语句,从最后一个开始;当警告消失时,您就找到了问题文件,然后可以使用该文件中的其他策略之一。

(几天前,我在一本 15 章的书上使用了“多少”方法,不到 10 分钟就发现了问题;它曾是在第 3 章,所以我很幸运。)

答案3

我遇到了类似的问题并想检查所有的对,但却迷失了方向。

l.129 \input{chap_models/main.
I suspect you have forgotten a }', causing me..

所以我用python编写了一个小脚本: https://github.com/sacherus/latex_tools/blob/master/para_parser.py

主要内容:

\begin{document}
Lorem ipsum.
Don't bother %{}}
Don't bother2 \{
\enddocument}

跑步: $ ./para_parser.py -i main_simple.tex

输出: Input file is main_simple.tex Found redundant parenthesis in ('}', 5)

因此第 5 行有多余的括号。

答案4

我认为最好的武器是好的文本编辑器,以及你对如何使用它的一些了解。例如,TextMate 有 tab 触发器。所以我可以输入 begin + Tab,它会自动创建 begin 和 end,并允许我输入环境。这已经解决了许多错误。同样,对于括号不匹配,在许多情况下,好的文本编辑器会根据您正在处理的 TeX 代码类型更改语法突出显示。我在公式中使用大多数括号,因此如果我忘记关闭花括号,TextMate 会通过“错误着色”后续代码来指示这一点。

第二件事是良好的代码格式:不要随意编写代码,使用缩进和 % 作为额外的视觉辅助。例如,我在所有环境的开头和结尾都使用 %,这样可以更轻松地在我的代码中找到它。

第三,定义合理数量的命令。例如,如果您总是输入 \mathcal{H} 来表示希尔伯特空间,则 \Hil 不仅速度更快,而且可以完全避免花括号的问题。

相关内容