
私は のみを使用しています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 番目のページを回避したい場合は、条件付きロジックを適切に管理する必要があります。