如何仅在下次运行时执行命令?

如何仅在下次运行时执行命令?

假设我有一个命令\foo,只想在下次运行 TeX 时执行。我该如何创建执行此操作的命令?(如果文件已被泄露,\onceFoo也允许执行。)\fooaux

最小(非)工作示例:

\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}

相关内容