LaTeX 中的模板系统

LaTeX 中的模板系统

我需要以自动化方式生成相当多的 LaTeX 文件。我不想使用 Python 或 Elisp 中的任何模板引擎(这两种语言可能我最熟悉);我更喜欢使用 LaTeX 在内部完成这项工作。我需要的是将固定文本(主要包含 LaTeX 命令)输出到文件中,但会有一些“变量”(如标题等),其中的一些数据(可在 TeX 宏中找到)应该被替换。我可以用一些\writes 和很多\noexpands 来做到这一点,但这有点麻烦。有没有(可能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

相关内容