..我的意思不是找出编译失败的原因,而是认真的调试:断点、在运行/编译期间找出给定时刻的变量值、单步执行、检查堆栈(有堆栈吗?)等。我们在调试“真正的”编程语言时认为理所当然的所有事情。由于 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 似乎确实有一种可视化调试命令:
Hans Hagen。TeX 中的可视化调试:简介 (英文)。MAPS 17,1996,151-15。 http://www.ntg.nl/maps/17/24.pdf
Hans Hagen。TeX 中的可视化调试:如何完成 (英文)。MAPS 17,1996,157-174。 http://www.ntg.nl/maps/17/25.pdf
您可以查看 ConTeXt 的\展示化妆ConTeXt 文档中的命令:
我们可以使用 \ruledhbox、\ruledvbox 和 \ruledvtop 来可视化方框,而不是 \hbox、\vbox 和 \vtop。使用 \showmakeup 我们可以自动可视化所有内容,并且可以深入了解 ConTEXt 和 TEX 的功能。
- Hans Hagen,Taco Hoekwater。ConTEXt 参考手册,第 74 页。PRAGMA,2009 年。http://www.tug.org/texlive/Contents/live/texmf-dist/doc/context/manuals/reference/en/contextref.pdf
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 在控制台和 中运行时,它会在您输入命令的位置中断。\ERROR
errorstopmode
但是,这样你就无法动态添加断点了。至少你可以重新定义命令来添加到
\MARK
那里。确定变量的值
在“TeX 提示符”中,键入
?
以查看您可以在那里做什么。特别是,您可以插入一些 TeX 代码来执行。插入例如
\show\var
或\showthe\dimension
等等。请注意,如果你不造成其他错误(在这种情况下
\show
会使 TeX 停止errorstopmode
)TeX 将继续运行。(例如,如果您使用\typeout
或只是重新定义宏/分配给寄存器)在后一种情况下,你可能需要一个
\relax
来实际执行命令。步入/跨过
不幸的是,不支持。
对于 TeX 的一个有限子集,有包裹
unravel
目前。还有
\pausing=1
:引擎会在读取每行时暂停。(这是不是一步步)也可以看看:错误 - 如何在编译期间输出每个源行(数字)(用于调试)? - TeX - LaTeX Stack Exchange
检查堆栈
TeX 实际上没有堆栈。最接近的是
\errorcontextlines
。
然而,这些都不是 GUI。只是还没有人写过。