我如何调试 pgfkeys?

我如何调试 pgfkeys?

我相信如果你正在读这个问题,你已经知道我对 的热爱pgfkeys。然而,这绝对是不可能的调试:\tracingmacros完全是一团糟,每个键都会扩展到数十个复杂的内部宏。我希望能够像调试使用手动构建的程序一样调试它\def:观察键吸收它们的参数,扩展它们的值或执行它们的代码,然后继续下一个键。我不关心如何定义\pgfk@try或定义什么,只关心它查找一个键并找到或找不到它,并采取相应的行动。

目前,我通过恐吓进行调试:\tracingmacros=1大量滚动加上一些模式识别来消除重复的宏噪音。希望有某种方式强制pgfkeys产生更好的输出是奢望;这需要作者手动编写一个有选择地填充的调用堆栈。不过,我想知道是否有其他熟悉这个包的人可以告诉我如何他们弄清楚他们的钥匙出了什么问题。

有关的:如何最好地调试 LaTeX?(由 Yossi Farjoun 提出;并非巧合的是,这个问题实际上也是他提出的,来自最近的一次聊天对话。)

答案1

我编写了一个用于跟踪的软件包的草稿pgfkeys。我已经尽可能多地测试了它,它似乎既能工作又有用,但我不愿意在进行测试运行之前在 CTAN 上发布它。因此,我目前只在自己的网站上提供它(不再可用)。它(目前)仅由一个.sty文件组成,顶部有一个注释块,描述它的工作原理。

我会非常感激你们的任何评论,所以我将开设第二个答案 (CW) 来征求功能请求和报告错误。也许这很自私,但我希望通过这个答案获得声誉。

答案2

我将在聊天室回复以下问题跟踪-pgfkeys

功能请求

  • (由 Andrew Stacey 添加)有时我希望看到正在传递的值。作为第一种情况,当使用某个键时,/.store in我想知道存储在哪个位置。

  • (安德鲁·斯泰西再次发言)我希望能够跟进特别的密钥或密钥系列。查看此包的输出,有很多事情在发生!通常,我只是对追踪某个部件的工作原理感兴趣。

漏洞

  • 在详细模式下使用定义的未知处理程序(在未知密钥的路径中)处理未知密钥会产生错误。

以下是 M(N)WE:

\documentclass{article}

\usepackage{pgfkeys}
\usepackage[silent]{trace-pgfkeys}

\begin{document}

\pgfkeys{/bla/.unknown/.code=blabla}
\pgfkeystracelevel{verbose}
\pgfkeys{/bla/nonexisting}

\end{document}

我调查了一下,找到了错误的原因。在 的第二个补丁中\pgfkeys@unknown,消息\expandafter\unexpanded\expandafter{\meaning\pgfkeys@code}%引入了一个,它成为了的\expandafter第一个。因此,进一步的补丁就在这里进行。解决方案是用 替换有问题的消息。patch 命令的完整代码如下:\expandafter\pgfkeys@unknown\pgfkeys@unknown\expandonce{\meaning\pgfkeys@code}%

\trace@patchcmd@tpgfk\verbose@tpgfk\pgfkeys@unknown{\expandafter}{%
 Unknown handler code:\\%
 \expandonce{\meaning\pgfkeys@code}%
}

相关内容