本问题中提到\box255
的仅适用于页面构建器剪切的 MVL 最新块的容器。现在的问题是:我在某处读到
\setbox0=\vbox to \vsize{\unvbox255}
即使\box0
与 的高度相同,也会产生一个未满框错误\box255
。明显的补救措施似乎是
\setbox0=\vbox to \vsize{\unvbox255\vfill}
不能解决问题:它可能会给出一个过满的盒子。为什么\box255
不报告欠满和过满的情况?TeX Book 第 400 页简单地说,在这种情况下没有报告任何内容。这只是为了过早弹出页面吗?
答案1
TeX 假设页面生成器在框 255 中打包的材料会由输出例程进一步处理,然后才最终被运出(通过\shipout
)或返回到主垂直画廊。
因此,如果假设输出例程无论如何都会拆箱并附加运行的页眉和页脚等,那么在此时发出箱子未满或过满的警告是没有意义的。因为在此过程中您会再次收到这些警告。
此外,Don Knuth 在第 400 页给出了 TeX 在这一点上保持沉默的原因:
有时输出例程需要知道为什么调用它,因此存在与程序其余部分进行信息通信的问题。 \TeX\ 提供常规 |\mark| 操作,但标记并不总是能提供正确的线索。然后是 ^|\outputpenalty|,可以对其进行测试以查看断点处发生了哪些惩罚;任何 $-10000$、$-10001$、$-10002$ 或更低的惩罚都会迫使输出例程采取行动,因此可以使用不同的惩罚值来传递不同的消息。\(当输出例程将材料放回贡献列表时,它不需要在断点处恢复惩罚。)\ 如果输出是由一个非常负的 / |\outputpenalty| 值强制的,则输出例程可以使用 |\vbox{\unvcopy255}| 来发现页面到目前为止的实际满度。当 |\box255| 时,不会报告未满和过满的框被打包供输出例程使用,因此如果您想传递信号,过早弹出页面没有任何坏处。
例如,这就是 LaTeX 一直使用来管理浮动材料的方法,否则会导致大量虚假警告。
关于您重新装箱 255 号箱子时甚至可能收到“箱子过满”消息的事实:在少数情况下,当之前没有合法的分页符时,255 号箱子实际上可能包含超过其标称高度的内容。此外,不应忘记重新装箱涉及参数,\boxmaxdepth
并且根据它们的设置,最终大小可能会有所不同。
答案2
这里的 box255 没有什么不同,您可以看到与普通盒子类似的效果。
\setbox2\vbox{\hbox{}}
\ht2=\vsize
\setbox0=\vbox to \vsize{\copy2}
\setbox0=\vbox to \vsize{\unvbox2}
\bye
以上产生
$ pdftex ufb
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011/Cygwin)
restricted \write18 enabled.
entering extended mode
(./ufb.tex
Underfull \vbox (badness 10000) detected at line 7
)
(see the transcript file for additional information)
No pages of output.
Transcript written on ufb.log.
请注意,复制盒子不会生成 underfull 消息,而拆箱则会生成 underfull 消息,因为这样会使用(0 大小)内容,但人工调整的\vsize
盒子高度会在拆箱过程中丢失。装箱 255 时输出例程的行为类似,如果您拆箱 255,则会获得其内容的自然高度,而这可能不是\vsize
。