在这个问题有人问是否有办法从 TeX 文档中删除用户定义的宏并用适当的原语替换它们。答案似乎是,虽然有些程序对简单的宏执行了此操作,但没有通用的解决方案。
我需要一个不太复杂的功能。我提交的大多数期刊都对用户定义的宏感到满意,但它们都必须包含在文档中才能使其自成体系,如果你加入各种不必要的宏,期刊就会不高兴。这导致手动辨别文件中的哪些宏在特定文档中使用并将它们复制过来的麻烦任务。我想知道是否有任何东西可以自动化这个过程。
这可能要容易得多。我们有一个有限的 \input{blah.tex} 文件列表,这些文件可能包含宏定义,我们只需要决定文档可能需要该宏,即它是从文档中引用的宏中引用的。
因此,假设
1) 没有非用户代码调用未明确传递参数的用户宏。
2) 用户代码不会通过 \csname 样式构造动态引用其他用户宏。
3) 所有用户宏要么在文档本身中,要么在传递给实用程序/包的用户宏文件的有限列表中。
有没有自动列出这些用户宏的方法可能是编译当前文档所必需的。
答案1
我也对类似的东西感兴趣,所以我写了一个简短的 Python 脚本,可用来自 Github 这里。这有点粗糙,但对于合理组织的宏文件(例如,每个 \newcommand 都应出现在行首),它似乎可以实现我们想要的效果。两点注意事项:
我的脚本实际上并没有运行 TeX 来查看使用了哪些宏(尽管纳入 Bruno 的解决方案可能并不太困难);如果它们是从注释部分或类似内容中出现的事件中挑选出来的,我不介意添加一两个额外的宏。
它将必要的用户定义的宏添加到文档的序言中,但可以轻松修改以将其转储到其他地方。
欢迎反馈,改进也欢迎。对于经验丰富的 Pythoner 和 TeXnician 来说,这可能是一个简单的项目,可以让这个项目好上十倍。
答案2
cmdtrack 包将告诉您您使用了哪些宏(以及在哪里使用),以及您没有使用哪些宏。
答案3
下面的代码列出了所有展开的宏,从开始\begin{document}
(我们可以早一点开始,但速度会慢一个数量级)。一旦我们有了这个列表,我们就可以做你想做的事情了。
\AtBeginDocument{\tracingmacros=1}
在文档开头添加。正常编译:日志文件将比平时详细得多。然后我们通过对以下文件运行 TeX(或 LaTeX 等)来解析日志文件:
\documentclass{minimal}
%sets the catcode of charcters in range [#2,#3] (included) to be #1.
\newcommand{\catXrange}[3]{%
\count0=#2\relax %
\loop
\catcode\count0=#1\relax %
\advance\count0 by 1\relax %
\ifnum\count0>#3 \else%
\repeat %
}
\newcommand{\extractcsnames}[1]{%
\gdef\storage{}
\begingroup
\catXrange{12}{0}{255}
\catcode`\^^M=13
\catcode`\ =13
\newwrite\cslistwrite
\immediate\openout\cslistwrite #1.cslist
\input{#1.log}
\immediate\closeout\cslistwrite
\endgroup}
% ===================================================================
% Spaces and newlines are absolutely critical in the following code !
% ===================================================================
\begingroup\catcode`\^^M=13\catcode`\ =13%
\catcode`\/=0\catcode`\\=12%
/gdef #1
\#2 {/immediate/write/cslistwrite{{/string\#2}} }%
/endgroup
% ===================== end critical spacing ========================
\begin{document}
\extractcsnames{filetoparse}
\end{document}
用filetoparse
您的文件替换。这将生成一个文件,filetoparse
其中包含 TeX 在读取文件时扩展的所有宏。对于典型的 60 页文档,这将提供 600000 个命令(显然有很多重复)。
如果有人对下一步有想法......