
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 atbegshi
alguns 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 \foo
e \unfoo
. O \foo
comando inclui \clearpage
na parte superior, então não preciso me preocupar com onde \foo
aparece quando digitado. O \unfoo
comando 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 \unfoo
antes do \foo
envio 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 \shipout
gancho (ou algo semelhante) para fazer isso? Embora atbegshi
pareç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 aux
arquivo 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.