我正在读一切手册上说:
此包提供了钩子
\EveryShipout
和,\AtNextShipout
其参数在输出例程构造之后\box255
、被\shipout
调用之前执行。
这似乎暗示着它\box255
在某种程度上是特殊的;但我尝试在网上查找它,却发现了很多关于它的信息。
那么,有人可以解释为什么会\box255
如此特殊,并可能指出涉及它的快速阅读或教程吗?
答案1
当 TeX 决定是时候弹出一个页面(因为一个页面已被填满或用户发出了相同效果的命令)时,它会进行一些维护工作,然后将页面的内容打包到盒子寄存器 255 中。
接下来它调用输出例程,它可以做几件事:添加页眉和页脚、增加页码等等。
最简单的输出程序是
\output{\shipout\box255}
除了将页面输出之外,它不会对页面做任何处理。Plain TeX 中的标准输出例程是(简化形式)
\output={\plainoutput}
\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
\advancepageno
\ifnum\outputpenalty>-20000 \else\dosupereject\fi}
\def\pagebody{\vbox to\vsize{\boxmaxdepth=\maxdepth \pagecontents}}
\def\makeheadline{\vbox to 0pt{\vskip-22.5pt
\line{\vbox to8.5pt{}\the\headline}\vss}\nointerlineskip}
\def\makefootline{\baselineskip=24pt \lineskiplimit=0pt
\line{\the\footline}}
\def\dosupereject{\ifnum\insertpenalties>0 % something is being held over
\line{}\kern-\topskip\nobreak\vfill\supereject\fi}
\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
\dimen@=\dp255 \unvbox255
\ifvoid\footins\else % footnote info is present
\vskip\skip\footins \footnoterule \unvbox\footins\fi
\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
\def\footnoterule{\kern-3pt
\hrule width 2truein \kern 2.6pt} % the \hrule is .4pt high
其中 的使用\box255
更为复杂,因为它会跟踪诸如浮动数字和脚注之类的插入内容;\shipout
操作是在另一个框中执行的,而该框又是使用 的内容构建的\box255
。(我甚至没有尝试面对 LaTeX 输出例程,它比这个复杂得多,但事情的意义是一样的。)
这个盒子寄存器由 TeX 自动管理,使用它是相当危险的(如果你的名字不是 Heiko Oberdiek)。
该软件包atbegshi
通过以下方式做了一些技巧重新定义 \shipout
,在其中添加挂钩,以便可以以各种方式调整运出的箱子的内容。
第一组具有此类功能的宏可以在中找到quire.tex
,这是一段非常棒的代码,我相信即使使用 LaTeX 仍然可用;但现在有更简单的方法来实现相同的效果。
% quire.tex: Macros for making booklets, printing double pages, and
% printing outlines and crop marks.
% version: 1.0 release: 19 January 1991
%
% copyright (c) 1991 Marcel R. van der Goot
它使用类似的技巧来制作纸张,即将多组页面打印在同一张纸上,然后进行剪切和折叠。