shipout 中的字体(和强大的命令)会发生什么情况?

shipout 中的字体(和强大的命令)会发生什么情况?

下面的示例并未产生我期望的输出:

\documentclass{article}

\let\origshipout\shipout
\def\shipout{\origshipout\vbox{
  %\normalsize
  \emph{hello}}\origshipout}

\begin{document}
This should appear on \emph{page two}.
\end{document}

运行时,会生成一个包含文本“hello”的背面页面,以及一个包含“这应该出现在第二页”的正面页面 - 这样就很好了。

然而,我也希望强调“hello”,但它却出现在与正面页面相同的(?)直立面上。在实际问题案例中,这是一个简化,我还看到了难以解释但大致一致的数学字体问题。如果我取消注释\normalsize,那么反面页面将包含“1012hello”,我认为这是将\@xpt \@xiipt扩展\normalsize\@setfontsize \normalsize \@xpt \@xiipt ...

(真实案例使用了“everyshi”包;它既没有修复问题也没有导致问题)

所以我很困惑:看着latex.ltx,我看不到\output或中的任何相关内容\@outputpage\@outputpage宏本身使用\normalsize(意味着它没有因为某种原因被禁用);我看不到\@setfontsize任何时候禁用的东西;插入\normalfont/\reset@font并不能神奇地让事情变得更好。事实上我看不到任何事物显然与字体有关,\output或者\@outputpage——大概在那里那里有些不明显的东西。

对应的纯文本文档:

\let\origshipout\shipout
\def\shipout{\origshipout\vbox{{\it hello}}\origshipout}
This should appear on {\it page two}.
\bye

按预期工作(所以我没有发疯)。

我错过了什么?

答案1

诸如 之类的命令\emph是“强健”命令,这意味着它们的定义方式包括对 的调用。这样,这些命令就可以在“移动参数”(例如节名)中使用时继续存在。这种保护是通过在 LaTeX 代码中的各个点\protect对 进行战术重新定义来实现的。\protect

在文本的正常运行中,\protect就是\relax— 不需要保护。然而,在问题的上下文中,\protect\noexpand,这导致\emph简单地扩展为\relax,这恰恰导致了所描述的行为。

理解了这一点后,解决方案就显而易见了,并且\let\protect\relax在重新定义中添加\shipout可以使一切按预期工作。

[从他对这个问题的评论来看,这个答案的功劳完全属于约瑟夫赖特。]

相关内容