Führt beim Versand einen einfachen Befehl aus, abhängig vom Wert eines Boolean

Führt beim Versand einen einfachen Befehl aus, abhängig vom Wert eines Boolean

Ich verwende nur lualatex, aber vielleicht ist dies eine allgemeine LaTeX-Frage. Gehen Sie davon aus, dass TeXlive 2023 oder höher verwendet wird, da keine Abwärtskompatibilität erforderlich ist.

Ich habe mir einige andere Dokumente angesehen atbegshi, aber sie tun nicht, was ich brauche, oder sind viel komplexer als nötig. Ich sehe auch, dass vor nicht allzu langer Zeit jemand eine ähnliche Frage gestellt hat, aber ohne eine nützliche Antwort: Verwenden Sie Shipout-Hooks, um den globalen Status zu manipulieren

\fooSituation: Ich habe zwei Befehle, die ich und aufrufen werde \unfoo. Der \fooBefehl enthält \clearpageam Anfang, sodass ich mir keine Gedanken darüber machen muss, wo \foobeim Setzen erscheint. Der \unfooBefehl endet mit \clearpage.

Wenn eine Seite hat \foo, muss dieselbe Seite haben \unfoo. Wenn der Benutzer nicht schreibt, \unfoobevor die \fooSeite ausgeliefert wird, liegt ein Fehler vor. Ich weiß, wie man eine geeignete Fehlermeldung schreibt, die die Kompilierung anhält. Ich muss den Seiteninhalt nicht speichern, bearbeiten, verwerfen oder anderweitig manipulieren.

Meine Frage: Gibt es eine einfache Möglichkeit, den \shipoutHook (oder etwas Ähnliches) zu verwenden, um dies zu tun? Obwohl atbegshies so aussieht, als ob es möglich sein sollte, passiert mit diesem Paket eine Menge, was mich nervös macht.

MWE:

\documentclass{article} % Compile with lualatex.
\usepackage{fontspec}
\newif\ifusedfoo
\def\foo{\clearpage Hello.\par\usedfootrue}
\def\unfoo{Goodbye.\par\usedfoofalse\clearpage}

% \WhenPageShips{ % This is what I need. I know how to create an error, instead of typeout.
%   \ifusedfoo
%     \typeout{EEEEK. The page with \string\foo\space did not have \string\unfoo.}
%   \fi
% }

\begin{document}
Welcome.\par
\foo
No problem here.\par
\unfoo
\foo % With too many lines on that page, causes problem:
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\par
% Whether or not there is a later \unfoo, does not matter.
Moving right along\par
\clearpage
This is too late.\par
\unfoo
I cannot wait until this far in the document.\par
\end{document}

Außerdem: Ich möchte hierfür keine Datei verwenden aux. Der Code erscheint nicht in komplizierten Elementen (wie Bibliographie, Inhaltsverzeichnis usw.). Nur im Fließtext.

BEARBEITEN: Es wurde klargestellt, dass das Problem schnell und nicht später im Dokument erkannt werden sollte.

EDIT2: Die akzeptierte Lösung funktioniert inmeine konkrete Situationfunktioniert aber in der allgemeinen Situation möglicherweise nicht. Siehe Kommentare.

Antwort1

\documentclass{article} % Compile with lualatex.
\usepackage{fontspec}
\newif\ifusedfoo
\def\foo{\clearpage Hello.\par\usedfootrue}
\def\unfoo{Goodbye.\par\usedfoofalse\clearpage}

\AddToHook{shipout/before}[rallg]{%
% \WhenPageShips{ % This is what I need. I know how to create an error, instead of typeout.
  \ifusedfoo
    \typeout{EEEEK. The page with \string\foo did not have \string\unfoo.}
  \fi
}

\begin{document}
Welcome.\par
\foo
No problem here.\par
\unfoo
\foo % With too many lines on that page, causes problem:
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\
x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\\x\par
% Whether or not there is a later \unfoo, does not matter.
\end{document}

Dadurch wird die Nachricht für die letzten beiden Seiten ausgegeben, da beide ohne vorkommen \unfoo. Wenn Sie das zweite vermeiden möchten, müssen Sie die bedingte Logik entsprechend verwalten.

verwandte Informationen