
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
\foo
Situation: Ich habe zwei Befehle, die ich und aufrufen werde \unfoo
. Der \foo
Befehl enthält \clearpage
am Anfang, sodass ich mir keine Gedanken darüber machen muss, wo \foo
beim Setzen erscheint. Der \unfoo
Befehl endet mit \clearpage
.
Wenn eine Seite hat \foo
, muss dieselbe Seite haben \unfoo
. Wenn der Benutzer nicht schreibt, \unfoo
bevor die \foo
Seite 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 \shipout
Hook (oder etwas Ähnliches) zu verwenden, um dies zu tun? Obwohl atbegshi
es 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.