Execute um comando simples no envio, dependendo do valor de um booleano

Execute um comando simples no envio, dependendo do valor de um booleano

Eu uso apenas lualatex, mas talvez esta seja uma questão geral do LaTeX. Suponha que o TeXlive 2023 ou posterior seja usado, pois não há necessidade de compatibilidade com versões anteriores.

Eu olhei atbegshialguns outros documentos, mas eles não fazem o que preciso ou são muito mais complexos do que o necessário. Vejo também que, não muito tempo atrás, alguém fez uma pergunta semelhante, mas sem uma resposta útil: Use ganchos de envio para manipular o estado global

Situação: tenho dois comandos, que irei chamar \fooe \unfoo. O \foocomando inclui \clearpagena parte superior, então não preciso me preocupar com onde \fooaparece quando digitado. O \unfoocomando termina com \clearpage.

Se uma página tiver \foo, então a mesma página deverá ter \unfoo. Se o usuário não conseguir escrever \unfooantes do \fooenvio da página, será um erro. Eu sei como escrever uma mensagem de erro adequada, interrompendo a compilação. Não preciso armazenar, editar, descartar ou manipular o conteúdo da página.

Minha pergunta: Existe uma maneira simples de usar o \shipoutgancho (ou algo semelhante) para fazer isso? Embora atbegshipareça que deveria ser capaz, há muita coisa acontecendo com esse pacote, o que me deixa nervoso.

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}

Além disso: não desejo usar um auxarquivo para isso. O código não aparece em nada complicado (como bibliografia, índice, etc.). Apenas dentro do texto corrido.

EDITAR: deixou claro que o problema deve ser detectado rapidamente, e não posteriormente no documento.

EDIT2: A solução aceita funciona emminha situação específicamas pode não funcionar na situação geral. Ver comentários.

Responder1

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

Isso digita a mensagem para as duas páginas finais, já que ambas ocorrem sem \unfoo. Se quiser evitar o segundo, você precisará gerenciar a lógica condicional de maneira adequada.

informação relacionada