教我调试

教我调试

好吧,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以检查其通常的定义是否已更改。

如果之前的实例\lab运行正常,那么这次和上次之间可能出了问题,所以尝试建起来或者砍伐\lab前一个和这个之间的位。

答案2

为了调试您的 LaTeX 错误,如果您不知道错误来自哪里,您应该能够创建一个 MWE。

最好的办法是使用分而治之的方法。将代码减半并删除那些部分。正如你所说,这很耗时。

然而,有些工具可以实现这一自动化,Delta-Debug 算法。您必须根据需要调整脚本,这样代码就会减少,并且能够轻松进行调试。

相关内容