是否可以使用 LaTeX(或其他程序)扩展 .tex 文件中的宏并输出扩展的 LaTeX 源?
如果不存在这样的程序:在解释文档之前,LaTeX 宏是否只是作为字符串替换进行处理?如果是这样,编写自己的转换器可能很容易。
编辑:我之所以询问是因为有些期刊不接受带有宏的 LaTeX 投稿。如果能够使用我常用的宏进行开发,并自动转换为“宏扩展”格式进行投稿,那将非常有用。
答案1
如果您只是想了解 LaTeX 如何工作,以及在扩展宏时它做什么,您可以将 \tracingmacros
或\tracingall
放在您的 .tex 文件中,LaTeX 会将扩展过程写入日志文件中。
答案2
对我来说解决方案是http://ctan.org/pkg/de-macro,它包含在 TeX Live 中,如果你正在使用基于 Debian 的 Linux 发行版,那么你可能已经拥有它了
你要做的是:
- 将您的定义放在名为以下内容的文件中,该文件位于
something-private.sty
原始文件所在的同一目录中yourfile.tex
- 评论或删除您的定义
yourfile.tex
- 将命令
\usepackage{something-private}
放入yourfile.tex
- 打开 shell,并进入所在
yourfile.tex
目录 - 在 shell 中执行
de-macro yourfile.tex
将创建一个yourfile-clean.tex
包含所需宏的扩展,如果您需要在定义中更改某些内容,则删除该*-clean.tex
文件并再次运行de-macro
。
答案3
我不知道有哪个软件包可以做到这一点,但我很想有一个。cleveref
软件包中有如下选项:
当提供 poorman 选项时,您的文档将按正常方式处理。但此外,
sed
还会自动编写一个脚本,其中包含将所有命令替换\cref
为它们将生成的 LaTeX 代码的规则,并使用标准\ref
命令生成交叉引用本身。
在我设想的 LaTeX 软件包中,您将拥有一个类似这样的命令,\newmacro
其行为方式与上述相同,\newcommand
只不过作者会确保只发生“合理”的扩展。然后,它可以编写一个辅助文件,使用 Lua 脚本生成文档副本,其中所有宏均由其定义替换。
那么,呃,有谁愿意写它吗?
答案4
一般来说,如果不执行原始命令就无法做到这一点,因为宏很容易依赖于它们。
例如,考虑
\def\foo{\ifdim\ht0>10pt foo\else bar\fi}
\setbox0\vbox{...}
\foo
即使假设...
已完全指定,也\foo
无法扩展,直到设置了框 0。
除了排版和输出标记流之外,可能可以完全模拟 TeX,但我不知道有这样的程序。