根据布尔值,在 shipout 时执行简单命令

根据布尔值,在 shipout 时执行简单命令

我只使用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。如果您想避免第二种情况,则需要适当地管理条件逻辑。

相关内容