我只使用lualatex
,但也许这是一个常见的 LaTeX 问题。假设使用 TeXlive 2023 或更高版本,因为不需要向后兼容。
我查看了atbegshi
其他一些文档,但它们没有满足我的需要,或者比必要的要复杂得多。我还看到,不久前,有人问了一个类似的问题,但没有有用的答案:
使用 shipout hooks 来操纵全局状态
情况:我有两个命令,分别称为\foo
和\unfoo
。该\foo
命令\clearpage
在顶部包含 ,因此我无需担心\foo
排版时出现的位置。该\unfoo
命令以 结束\clearpage
。
如果某个页面有\foo
,那么该页面也必须有\unfoo
。如果用户在页面发布\unfoo
前未能写入\foo
,则会出现错误。我知道如何编写合适的错误消息,停止编译。我不需要存储、编辑、丢弃或以其他方式操作页面内容。
我的问题是:有没有一种简单的方法可以使用钩子\shipout
(或类似的东西)来做到这一点?虽然atbegshi
看起来应该可以,但是这个包有很多事情要做,这让我很紧张。
梅威瑟:
\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
为此使用文件。代码不会出现在任何复杂的东西中(例如参考书目、目录等)。只出现在运行的文本中。
编辑:明确指出应快速发现问题,而不是在文档的后期发现。
EDIT2:接受的解决方案适用于我的具体情况但在一般情况下可能不起作用。见评论。
答案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}
这将输出最后两页的消息,因为两页都没有出现\unfoo
。如果您想避免第二种情况,则需要适当地管理条件逻辑。