
Digamos que eu tenha um comando \foo
que desejo executar somente na próxima execução do TeX. Como faço para criar um comando \onceFoo
que faça isso? (Também é permitido executar \foo
se o aux
arquivo 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: \onceFoo
for 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}