
Angenommen, ich habe einen Befehl \foo
, den ich nur beim nächsten Ausführen von TeX ausführen möchte. Wie erstelle ich einen Befehl, \onceFoo
der dies tut? (Die Ausführung ist auch zulässig, \foo
wenn die aux
Datei kompromittiert wurde.)
Minimales (nicht) funktionierendes Beispiel:
\documentclass{article}
\def\foo{First execution}
\def\onceFoo{This doesn't work.}
\begin{document}
testing: \onceFoo
\end{document}
Die gewünschte Ausgabe ist
testing: First execution
beim ersten Lauf von latex
, und
testing:
bei jedem nachfolgenden Lauf.
Wenn die obige Datei (mit der korrekten Definition von \onceFoo
) mehrmals ausgeführt wurde und die Zeile new testing: \onceFoo
hinzugefügt wird, lautet die gewünschte Ausgabe
testing: new testing: First execution
beim ersten nachfolgenden Lauf und
testing: new testing:
bei allen Läufen danach.
Motivation: Ich möchte einen Befehl erstellen, der bestimmte nützliche Dateien löscht und neu berechnet. Normalerweise sollte dieser Befehl für einen einzigen Durchlauf verwendet werden, um beschädigte Informationen zu entfernen (oder zum Testen); anschließend sollte der Befehl aus der Quelldatei entfernt werden. Einige Benutzer (insbesondere ich) vergessen jedoch wahrscheinlich, den Befehl zu entfernen, da er eigentlich nichts beschädigt – er führt nur zu einem erheblichen Effizienzverlust, da viele Dinge neu berechnet werden müssen. Daher hätte ich gerne eine zweite Version dieses Befehls, die nur den ersten Durchlauf nach dem Hinzufügen betrifft.
Antwort1
\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}
Und das Gleiche gilt für das Zählen der Läufe:
\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}