我想制作一个每次构建时看起来都不同的文档。我以为使用该aux
文件可以很容易地做到这一点;但是,我似乎误解了一些非常基本的东西。对于一个小型概念验证,这里有一个文档,我认为它第二次运行时会产生与第一次不同的结果:
\documentclass{article}
\def\a{never ran}
\begin{document}
\a
\makeatletter\protected@write\@auxout{}{\string\def\string\a{ran}}\makeatother
\end{document}
运行之后pdflatex test
,我可以看到test.pdf
确实包含“从未运行”,并且test.aux
包含:
\relax
\def\a{ran}
但是,pdflatex test
第二次运行不会改变任何文件。为什么不会?我应该进行哪些更改才能使文档ran
在第二次运行时包含内容?
答案1
您需要\gdef
,因为.aux
文件是在组内读取的。至少,我认为这是原因。当然,\gdef
有效。
我更改了命令的名称,以避免覆盖现有命令而导致的复杂情况。一般来说,非常短的宏名称(尤其是单个字母)是不安全和不明智的。至少,您应该确保它们不存在,而不是简单地重新定义它们。
\documentclass{article}
\def\abacus{never ran}
\begin{document}
\abacus
\makeatletter
\protected@write\@auxout{}{\string\gdef\string\abacus{ran}}
\makeatother
\end{document}
答案2
使其成为一个全局定义:
\documentclass{article}
\def\hasruncheck{never ran}
\begin{document}
\hasruncheck
\makeatletter\protected@write\@auxout{}{\string\gdef\string\hasruncheck{ran}}\makeatother
\end{document}