这是如何找出宏定义的位置?(和在哪里可以找到命令/环境是如何定义的?和如何通过命令名找到包名?)并受到以下事实的启发: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
但宏的名称有时是用前缀和后缀构建的;这不容易追踪