我们可以轻松找到包中定义的所有命令、标记等等吗?

我们可以轻松找到包中定义的所有命令、标记等等吗?

这是如何找出宏定义的位置?(和在哪里可以找到命令/环境是如何定义的?如何通过命令名找到包名?)并受到以下事实的启发:cleveref + enumerate + tikz-qtree 错误结果是两个包之间的名称冲突。

我可以看到使用一个脚本来获取一个包(例如一些我使用 TeX 的一个变体(TeX 的变体)并生成其定义的所有内容的列表,比较其中两个列表将有助于查找命名空间冲突。

第一个问题:有这样的脚本吗?

如果答案是“否”,那么编写这样的脚本应该不太难;关键是要弄清楚事物的定义位置。

第二个问题:什么是主要的分配任务的方式有哪些?

(请注意,这可能很容易特定于所用的 TeX 风格。)之所以有“main”这个词,是因为这种脚本的目的不是成为必要和充分测试,但快速测试可以消除明显的可能性。特别是,执行类似操作的包作者\let\mydef\def \mydef\something{else}可能知识渊博,他们知道命名空间冲突的可能性,并知道如何避免它们。但\expandafter\def\csname s()mewe1rd c()mm@nd\endcsname可能应该允许。

答案1

我不认为有这样的脚本存在。我所知道的最接近的脚本是(la)texdef这是我最近发布的。它显示了命令行上(一个)宏的定义。包和类可以作为选项提供。如果您怀疑一个宏名被两个包使用,它允许您检查它是否被两个包定义。我计划添加一些选项来使用我的包检测定义的源文件,filehook正如 Leo Liu 在他的回答中演示的那样如何找出宏定义的位置?

它还可以扩展或分叉以产生您想要的输出。我不会走解析 TeX 代码的路线,而是通过脚本创建一个 TeX 文件(就像这样(la)texdef做一样)并重新定义\def和朋友来打印宏名称。类似于:

\let\origdef\def
\origdef\def#1{%
  \message{DEF: #1^^J}%
  \origdef#1%
}
% Same for \edef, \gdef, \xdef and \let
\documentclass{$CLASS}
\usepackage{$PACKAGE}
\begin{document}
\end{document}

然后,脚本可以格式化输出,排序并呈现给用户。添加一个自动比较两个包定义的宏的选项也不会太复杂。


另一个想法是使用\tracingassigns并解析输出。它可能更简单、更精确。


更新 2011/04/03

我现在修改了提到的latexdef脚本包含用于列出给定包的命令序列(宏)的选项。(缩短的)定义可以显示在旁边:

  --list, -l           : List user level command sequences of the given packages.
  --list-defs, -L      : List user level command sequences and their shorten definitions of the given packages.
  --list-all, -ll      : List all command sequences of the given packages.
  --list-defs-all, -LL : List all command sequences and their shorten definitions of the given packages.

因此latexdef -p <package> -l将列出所有用户级宏(不包括@或空格)。我将其作为 v1.3 上传到 CTAN,它应该很快就会可用。

答案2

第一个问题: 我想不是

第二个问题:您给出了一些示例,但有些宏可以由 xkeyval 和宏等包定义\define@cmdkey。还有其他包的工作方式与 xkeyval 相同。使用的方法是,\csname ...\endcsname但宏的名称有时是用前缀和后缀构建的;这不容易追踪

相关内容