好吧,35 年的编程经验并没有让我学会调试 tex 错误。这很痛苦。我无法创建 MWE,因为重点是能够就地调试。
一切都运行良好,我会编译检查,如果出现任何问题,撤消然后修复。然后突然间,texworks 报告了第 204 行的错误。第 204 行与此无关。然后它崩溃了。当我重新启动时,现在我可以看到它现在显示的是辅助文件的第 203 行。看起来像这样:
ExploringEngineering4.8.aux: 203 Undefined Control Sequence
l.203 \@writfle
{toc}{\contentsline {chapter}{\numberline {58}Lab: SD Card}{...
当我转到导致此错误的源代码行时:
\lab{SD Card}
An SD card is a
这不是第一次\lab
遇到这种情况,所以如果这是实验室的定义,那么它应该早就发生过了。
我需要学习如何调试这些问题而无需删除数千行代码。
答案1
常见错误包含此错误消息的带注释的图像:
您-file-line-error
可以选择文件名:行号在消息的开头,这更有用。
包含错误的行在 TeX 停止抱怨的位置交错。正如 Heiko 在评论中提到的,这提供了一些您可以grep
在源文件中使用的东西(包括您已加载的任何包或类)。
文件出现错误的原因有多种.aux
:
- 构建过程被中断,导致文件损坏。
.aux
在编辑器中查看文件时意外修改了该文件(不太可能,但有可能发生)。- 已经将一个命令写入文件,该命令直到文件在文档开头被读入
.aux
之后才被定义。.aux
- 向文件写入信息的命令
.aux
在写入文件的代码中存在错误,但在文档的该位置未执行。
文件中.aux
包括的任何内容{toc}{\contentsline
通常都是通过 生成的\addcontentsline
,其定义为:
\addtocontents {#1}{\protect \contentsline {#2}{#3}{\thepage }}
定义\addtocontents
为:
\protected@write\@auxout{%
\let\label\@gobble
\let\index\@gobble
\let\glossary\@gobble}%
{\string\@writefile{#1}{#2}}
事实上,你的错误信息的形式是
\@writfle
{toc}{\contentsline {chapter}
表明\lab
没有使用\addcontentsline
(或\addtocontents
)但明确使用\protected@write\@auxout
或某些东西严重扰乱了定义或某些东西在创建文件后\addtocontents
损坏了文件。.aux
\lab
一个快速测试是在有问题的使用之前显示其定义(.aux
首先删除该文件):
\show\lab
\lab{SD Card}
这将像一条错误消息,但记录将显示该命令的定义。(更多信息\show
.) 它是否使用\addcontentsline
?如果是,请添加\show\addtocontents
以检查其通常的定义是否已更改。
答案2
为了调试您的 LaTeX 错误,如果您不知道错误来自哪里,您应该能够创建一个 MWE。
最好的办法是使用分而治之的方法。将代码减半并删除那些部分。正如你所说,这很耗时。
然而,有些工具可以实现这一自动化,Delta-Debug 算法。您必须根据需要调整脚本,这样代码就会减少,并且能够轻松进行调试。