假设我有一个命令\foo
,只想在下次运行 TeX 时执行。我该如何创建执行此操作的命令?(如果文件已被泄露,\onceFoo
也允许执行。)\foo
aux
最小(非)工作示例:
\documentclass{article}
\def\foo{First execution}
\def\onceFoo{This doesn't work.}
\begin{document}
testing: \onceFoo
\end{document}
期望的输出是
testing: First execution
在第一次运行中latex
,并且
testing:
在每次后续运行中。
如果上述文件(具有正确的定义\onceFoo
)已运行多次,并且new testing: \onceFoo
添加了该行,则所需的输出是
testing: new testing: First execution
在第一次后续运行中,并且
testing: new testing:
此后的所有运行中。
动机:我想创建一个命令,清除某些有用的文件并重新计算它们。通常,此命令应用于单次运行以删除损坏的信息(或用于测试);之后,应从源文件中删除该命令。但是,一些用户(尤其是我)可能会忘记删除该命令,因为它实际上不会破坏任何东西——它只会导致效率显著下降,因为必须重新计算许多东西。因此,我想要这个命令的第二个版本,它只影响添加后的第一次运行。
答案1
\documentclass{article}
\def\foo{First execution}
\newif\ifFirstRun
\makeatletter
\AtBeginDocument{%
\ifx\FirstRunTest\@undefined
\FirstRuntrue
\else
\FirstRunfalse
\fi
\write\@auxout{\string\gdef\string\FirstRunTest{}}}
\makeatother
\begin{document}
testing: \ifFirstRun\foo\fi
\end{document}
计数运行次数也是一样:
\documentclass{minimal}
\def\foo{First execution}
\makeatletter
\AtBeginDocument{%
\ifx\runNo\@undefined
\newcount\runNo \runNo=1
\else
\advance\runNo by \@ne
\fi
\write\@auxout{%
\string\newcount\string\runNo ^^J
\string\global\runNo=\the\runNo}}
\makeatother
\begin{document}
testing: \ifnum\the\runNo=1\foo\else Run no \the\runNo\fi
\end{document}