¿Cómo ejecutar un comando solo en la siguiente ejecución?

¿Cómo ejecutar un comando solo en la siguiente ejecución?

Digamos que tengo un comando \fooque quiero ejecutar sólo en la próxima ejecución de TeX. ¿Cómo creo un comando \onceFooque haga esto? (También está permitido ejecutar \foosi el auxarchivo ha sido comprometido).

Ejemplo mínimo (no) funcional:

\documentclass{article}
\def\foo{First execution}
\def\onceFoo{This doesn't work.}
\begin{document}
testing: \onceFoo
\end{document}

La salida deseada es

testing: First execution

en la primera ejecución de latex, y

testing:

en cada ejecución posterior.

Si el archivo anterior (con la definición correcta de \onceFoo) se ha ejecutado varias veces y new testing: \onceFoose agrega la línea, entonces el resultado deseado es

testing: new testing: First execution

en la primera ejecución posterior, y

testing: new testing:

en todas las carreras posteriores.


Motivación: Me gustaría crear un comando que borre ciertos archivos útiles y los vuelva a calcular. Normalmente, este comando debe usarse en una sola ejecución para eliminar información corrupta (o para realizar pruebas); luego, el comando debe eliminarse del archivo fuente. Sin embargo, es probable que algunos usuarios (notablemente yo) olviden eliminar el comando, ya que en realidad no rompe nada; sólo produce una caída significativa en la eficiencia, porque muchas cosas deben recalcularse. Por lo tanto, me gustaría una segunda versión de este comando que afecte solo a la primera ejecución después de agregarlo.

Respuesta1

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

Y lo mismo para contar las carreras:

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

información relacionada