我需要以自动化方式生成相当多的 LaTeX 文件。我不想使用 Python 或 Elisp 中的任何模板引擎(这两种语言可能我最熟悉);我更喜欢使用 LaTeX 在内部完成这项工作。我需要的是将固定文本(主要包含 LaTeX 命令)输出到文件中,但会有一些“变量”(如标题等),其中的一些数据(可在 TeX 宏中找到)应该被替换。我可以用一些\write
s 和很多\noexpand
s 来做到这一点,但这有点麻烦。有没有(可能verbatim
类似的)软件包可以做到这一点?如果在发货期间进行书写,则可以获得加分,这样\thepage
可以扩展到正确的(当前)页码。
答案1
肯定有可以执行此操作的软件包,但我有一些代码可以生成符号索引,该索引将写入文件,然后包含在文档末尾。为此,我使用了以下宏电子书:
\def\\{\let\stoken= } \\
\long\def\unexpandedwrite#1#2#3{\def\finwrite{\write#1}%
{\aftergroup\finwrite\aftergroup{\sanitize#2\endsanity}%
\ifx#3\relax\else#3\fi}}
\def\sanitize{\futurelet\next\sanswitch}
\def\sanswitch{\ifx\next\endsanity
\else\ifcat\noexpand\next\stoken\aftergroup\space\let\next=\eat
\else\ifcat\noexpand\next\bgroup\aftergroup{\let\next=\eat
\else\ifcat\noexpand\next\egroup\aftergroup}\let\next=\eat
\else\let\next=\copytoken\fi\fi\fi\fi \next}
\def\eat{\afterassignment\sanitize \let\next= }
\long\def\copytoken#1{\ifcat\noexpand#1\relax\aftergroup\noexpand
\else\ifcat\noexpand#1\noexpand~\aftergroup\noexpand\fi\fi
\aftergroup#1\sanitize}
\def\endsanity\endsanity{}
要使用此功能,您首先需要打开一个文件
\newwrite\myWonderfulFile
\immediate\openout\myWonderfulFile=\jobname.wonder
然后你的宏就可以使用写入你的文件
\unexpandedwrite\myWonderfulFile{stuff to write}
有时,我发现我还需要这样的东西:
\write\myWonderfulFile{\thechapter.\thesection}
当然你也可以使用\immediate\write\myWonderfulFile
。
最后,在将文件放回文档之前,你应该发出
\immediate\closeout\myWonderfulFile