是否有一种方法/现有的工具来处理 LaTeX 源文档,使得对于给定的宏定义列表(使用\newcommand
),对这些宏的调用将被其扩展版本替换?
想象中的工作流程:
<program> source.tex macros.tex > output.tex
在哪里
source.tex:
\documentclass{article}
\newcommand\Rbb{\mathbb{R}}
\newcommand\Cbb{\mathbb{C}}
\newcommand\jb[1]{\langle #1\rangle}
\begin{document}
On $\Rbb$ we define $\jb{x} = \sqrt{1 + x^2}$, while on $\Cbb$ we
define $\jb{x} = \sqrt{1 + |x|^2}$ where the square root is taken
for the real numbers.
\end{document}
macros.tex:
\newcommand\Rbb{\mathbb{R}}
\newcommand\Cbb{\mathbb{C}}
\newcommand\jb[1]{\langle #1\rangle}
期望的输出是:
output.tex:
\documentclass{article}
\newcommand\Rbb{\mathbb{R}}
\newcommand\Cbb{\mathbb{C}}
\newcommand\jb[1]{\langle #1\rangle}
\begin{document}
On $\mathbb{R}$ we define $\langle x\rangle = \sqrt{1 + x^2}$, while on $\mathbb{C}$ we
define $\langle x\rangle = \sqrt{1 + |x|^2}$ where the square root is taken
for the real numbers.
\end{document}
动机有时,我和我的合作者在我们通常使用的宏的个人列表中会有一些冲突的项目。为了让自己的工作更轻松,我想使用我的个人宏来准备编辑,以加快打字速度。但在合并之前,我想展平所有此类宏,这样它们就不会与我的合著者使用的宏冲突。
答案1
根据 Torbjørn T. 和 cfr 的建议,我更深入地研究了这个de-macro
软件包。它在一定程度上是有效的。以下是注意事项:
与文档建议的 不同,我安装的版本创建了数据库文件
<filename>
而不是<filename>.db
。但是显然它测试了<filename>.db
作为定义数据库的名称。因此,在当前版本中,它将在每次运行时从头开始重新创建定义数据库。对于小文档,这不是问题。对于较大的文档,应该将数据库复制(而不是移动!)到 以<filename>.db
利用任何潜在的加速。仍有一些错误需要解决。偶尔,它会通过
}
在代码中插入虚假内容来破坏前导码。我还没有找到原因或触发/MWE。我尝试过的小型测试用例在这方面都运行良好。非常重要:正如文档所示,所有要交换的定义必须位于以 结尾的单独包中
-private.sty
。在主.tex
文件中必须使用该包。同样重要的是:程序处理
\newcommand
和\renewcommand
,但不处理带星号的变体\newcommand*
(尽管我认为这可以通过在 Python 代码中稍微修改正则表达式来解决)。这就是为什么我的第一次尝试失败了。(我总是使用自从我了解到这是最佳实践以来,加星标的版本。同样重要的是:删除星号后,程序会抛出错误。我最终发现这是因为我习惯写成
\newcommand\cmdname{<replacement}
。\newcommand{\cmdname}{<replacement>}
额外的括号对于解析很重要!最后,让我非常失望的是,这个节目无法处理可选参数。
\newcommand{\cmdname}[2]{blah #1 blah #2}
工作正常,但\newcommand{\cmdname}[2][nothing]{blah #1 blah #2}
引发异常。
我可以通过重写宏定义(您记得,无论如何,它将在最后被丢弃,这是本次练习的重点)来轻松修复/解决星号和括号的问题,不使用星号并添加额外的括号。
然而,可选参数处理的问题目前使该程序对我来说不太有用。我现在可以通过将可选和非可选命令拆分为两个单独的命令来解决这个问题。也许,如果我将来有时间,在弄清楚原始 python 脚本的逻辑后,我会考虑添加对它的支持。