Wie führt man einen Befehl erst beim nächsten Lauf aus?

Wie führt man einen Befehl erst beim nächsten Lauf aus?

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, \onceFooder dies tut? (Die Ausführung ist auch zulässig, \foowenn die auxDatei 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: \onceFoohinzugefü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}

verwandte Informationen