ブール値に応じて出荷時に簡単なコマンドを実行する

ブール値に応じて出荷時に簡単なコマンドを実行する

私は のみを使用していますlualatexが、これはおそらく一般的な LaTeX の質問です。下位互換性は必要ないため、TeXlive 2023 以降が使用されていると想定します。

および他のドキュメントもいくつか見ましたatbegshiが、必要なことは実行されなかったり、必要以上に複雑だったりします。また、それほど昔ではないですが、同様の質問をした人がいましたが、役に立つ回答はありませんでした。 シップアウトフックを使用してグローバル状態を操作する

\foo状況:とという 2 つのコマンドがあります\unfoo。この\fooコマンドは\clearpageの先頭に含まれているため、タイプセット時に がどこに表示されるかを気にする必要はありません\foo\unfooコマンドは で終わります\clearpage

ページに がある場合\foo、同じページに がなければなりません。ページが送信される前に\unfooユーザーが書き込みに失敗した場合は、エラーになります。適切なエラー メッセージを書き込んでコンパイルを停止する方法はわかっています。ページ コンテンツを保存、編集、破棄、またはその他の方法で操作する必要はありません。\unfoo\foo

質問です。\shipoutフック (または類似のもの) を使用してこれを行う簡単な方法はありますか?atbegshi機能しているように見えますが、そのパッケージでは多くの処理が実行されているため、不安を感じています。

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}

また、このためにファイルを使用するつもりはありませんaux。コードは、複雑なもの (参考文献、目次など) 内には表示されません。実行中のテキスト内だけです。

編集: 問題はドキュメントの後半ではなく、すぐに検出する必要があることを明確にしました。

編集2: 受け入れられた解決策は私の具体的な状況ただし、一般的な状況では機能しない可能性があります。コメントを参照してください。

答え1

\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}

これによって、最後の 2 ページのメッセージは、どちらも なしで発生するため入力されます\unfoo。2 番目のページを回避したい場合は、条件付きロジックを適切に管理する必要があります。

関連情報