Como executar um comando somente na próxima execução?

Como executar um comando somente na próxima execução?

Digamos que eu tenha um comando \fooque desejo executar somente na próxima execução do TeX. Como faço para criar um comando \onceFooque faça isso? (Também é permitido executar \foose o auxarquivo tiver sido comprometido.)

Exemplo mínimo (não) funcional:

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

A saída desejada é

testing: First execution

na primeira execução de latex, e

testing:

em cada execução subsequente.

Se o arquivo acima (com a definição correta de \onceFoo) tiver sido executado várias vezes e a linha new testing: \onceFoofor adicionada, a saída desejada será

testing: new testing: First execution

na primeira corrida subsequente, e

testing: new testing:

em todas as corridas seguintes.


Motivação: gostaria de criar um comando que limpe certos arquivos úteis e os recalcule. Normalmente, este comando deve ser usado para uma única execução para remover informações corrompidas (ou para teste); posteriormente, o comando deve ser removido do arquivo fonte. No entanto, é provável que alguns usuários (principalmente eu) se esqueçam de remover o comando, pois na verdade ele não quebra nada - apenas produz uma queda significativa na eficiência, porque muitas coisas devem ser recalculadas. Assim, gostaria de uma segunda versão deste comando que afetasse apenas a primeira execução após sua adição.

Responder1

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

E o mesmo para contar as corridas:

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

informação relacionada