如何最好地调试 LaTeX?

如何最好地调试 LaTeX?

..我的意思不是找出编译失败的原因,而是认真的调试:断点、在运行/编译期间找出给定时刻的变量值、单步执行、检查堆栈(有堆栈吗?)等。我们在调试“真正的”编程语言时认为理所当然的所有事情。由于 TeX 是“图灵完备的”,我希望能够真正看到内部发生了什么。

我猜想调试器的 GUI 界面要求太高了,但如果它存在的话,我很乐意听听。

答案1

trace 包将加载 TeX 在运行的特定部分所做的所有事情。这样做的问题是,你可以得到一个很多非常快速地获取信息。选择性地使用跟踪可以深入了解问题。在较低级别,TeX 提供各种跟踪设置(跟踪包会使用它们)。可以只设置其中一些值,让 TeX 记录其正在执行的某些部分,例如仅记录分配。通常,跟踪包就足够了。

对于检查变量,\wlog宏是最简单的方法,尽管如果您只想知道一件事,您可以简单地将\show或放在正确的位置。\showthe

我经常做的一件事(尤其是无限循环)就是在代码中插入一个未定义的控制序列(我使用\MARK)。这将导致 TeX 出现错误并停止运行,因此我可以看到我所做的事情。虽然不是很优雅,但对我来说很管用。

TeX 写入日志的方式可能意味着您会陷入无限循环,无法将您想要的所有数据添加到日志中。在这种情况下,可以使用\@@end(由 LaTeX 重命名的 TeX 基元\end)的战略布局来强制结束运行。

我不确定图形调试器是如何工作的,但我实际上只用 TeX 编程,所以我习惯于我概述的方法。我从未遇到过。

答案2

图形调试器可以像其他语言一样工作,您可以设置断点(位置或条件)、跳过和进入命令(命令是源中的所有内容,当然包括字母)、查看堆栈(如果 TeX 中存在这样的东西..)检查变量等。

在我看来,这很有道理,你不是第一个想到这一点的人。不幸的是,之前为 TeX 引入此类工具的项目似乎已经停止了:

  • Lutz Birkhahn。Tdb:X11 TEX 调试器。第八届欧洲 TEX 会议论文集,1994 年 9 月 26-30 日,波兰格但斯克,第 91-95 页。

可以找到一份小报告这里,第 27 页:

Lutz Birkhahn 讨论了他为 TEX 开发调试工具的工作,并介绍了 Tdb,这是 TEX 的一个扩展,它提供了 Tk/Tcl X11 工具包的接口。这使他能够设置一个图形用户界面,允许人们设置断点、分步执行以及查看宏定义和变量的值。

不过 ConTeXt 似乎确实有一种可视化调试命令:

您可以查看 ConTeXt 的\展示化妆ConTeXt 文档中的命令:

我们可以使用 \ruledhbox、\ruledvbox 和 \ruledvtop 来可视化方框,而不是 \hbox、\vbox 和 \vtop。使用 \showmakeup 我们可以自动可视化所有内容,并且可以深入了解 ConTEXt 和 TEX 的功能。

ConTeXt wiki 中也有介绍:http://wiki.contextgarden.net/Visual_Debugging

在此过程中的每个点您都应该能够查看输出,这可能是最困难的部分:可以查看生成的部分 dvi 或 pdf 吗?

那么 synctex 怎么样?http://www.river-valley.zeeba.tv/direct-and-reverse-synchronization-with-synctex/

答案3

此答案仅涉及“严重调试”(OP 在问题中提到的操作)。有关调试编译错误的一般提示,请参阅 编译 - 如何有效地追踪 LaTeX 错误? - TeX - LaTeX Stack Exchange


TeX 已经支持其中的一些。

  • 断点:只需在要中断的位置添加\MARK(或\error、或 或任何会导致 TeX 出错的字符)。当 TeX 在控制台和 中运行时,它会在您输入命令的位置中断。\ERRORerrorstopmode

    但是,这样你就无法动态添加断点了。至少你可以重新定义命令来添加到\MARK那里。

  • 确定变量的值

    在“TeX 提示符”中,键入?以查看您可以在那里做什么。特别是,您可以插入一些 TeX 代码来执行。

    插入例如\show\var\showthe\dimension等等。

    请注意,如果你不造成其他错误(在这种情况下\show会使 TeX 停止errorstopmode)TeX 将继续运行。(例如,如果您使用\typeout或只是重新定义宏/分配给寄存器)

    在后一种情况下,你可能需要一个\relax来实际执行命令

  • 步入/跨过

    不幸的是,不支持。

    对于 TeX 的一个有限子集,有包裹unravel目前。

    还有\pausing=1:引擎会在读取每行时暂停。(这是不是一步步)

    也可以看看:错误 - 如何在编译期间输出每个源行(数字)(用于调试)? - TeX - LaTeX Stack Exchange

  • 检查堆栈

    TeX 实际上没有堆栈。最接近的是\errorcontextlines


然而,这些都不是 GUI。只是还没有人写过。

相关内容