下面的示例并未产生我期望的输出:
\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
可以使一切按预期工作。
[从他对这个问题的评论来看,这个答案的功劳完全属于约瑟夫赖特。]