
Digamos que tengo un comando \foo
que quiero ejecutar sólo en la próxima ejecución de TeX. ¿Cómo creo un comando \onceFoo
que haga esto? (También está permitido ejecutar \foo
si el aux
archivo 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: \onceFoo
se 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}