![如何获取有效命令列表?](https://linux22.com/image/324705/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E6%9C%89%E6%95%88%E5%91%BD%E4%BB%A4%E5%88%97%E8%A1%A8%EF%BC%9F.png)
我想根据所使用的包动态创建在特定文件中有效的 LaTeX 命令列表,以便我可以使用它们来完成代码。
LaTeX 是否提供了一种方法来检查命令是否是命令(除了尝试编译之外),或者更好的是,用于获取包中的命令列表?对于我的目的,我不在乎它们必须采用什么样的参数等(尽管如果它们必须在之后进行某些括号排列,那可能是相关的)。它是他们是否在数学模式下工作以及是否在数学模式下工作非常重要。
除此之外,是否有一种简单的方法来解析 TeX 文件和包以获取所有使用的包和其中的所有命令?
答案1
不,这是不可能的。除了标准\def
(和变体)或\newcommand
和之外,软件包还可以通过多种方式定义命令\DeclareRobustCommand
。例如,考虑\DeclareMathSymbol
或\DeclareTextCommand
(但即使在 LaTeX 内核中也有其他方法)。
举几个例子,algpseudocode
使用\algdef
和\algnewcommand
;其他包有自己的方法。它们甚至可以根据用户输入动态定义命令。其他命令可能有“有限的生命”(想想 的单元名称siunitx
)和不同的语法,具体取决于调用它们的位置。
该列表还应排除所有内部命令和其他用作临时宏名的命令(例如\temp
\next
或)。\do
至于语法,请考虑例如memoir
重新定义\chapter
和其他分段命令二可选参数,而不是一个。其他包可能会定义*
现有命令的变体,为了发现这一点,您需要分析定义本身:基本上,如果\foo
已定义并且包想要添加*
变体,我们会发现类似
\let\org@foo\foo
\renewcommand{\foo}{\@ifstar\foo@star\org@foo}
\newcommand{\foo@star}{...<whatever>...}
它们定义的包和命令的数量非常庞大。真的。仅对用户加载的包进行词法分析就意味着要遵循所有\RequirePackage
被调用的包。也许其中一些只是有条件地加载。更不用说命令可能在包输入的其他文件中定义,所以您还应该遵循\input
类似的命令。
祝你好运。;-)