在以下示例中,我使用命令\vsplit
。我不明白为什么\vsplit
会产生overfull \vbox
\documentclass{article}
\parindent0pt
\def\exampletext{Text Text Text Text Text Text Text Text Text Text Text Text
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text }
\fboxsep=0pt
\fboxrule=1pt
\hfuzz=\maxdimen
\begin{document}
\setbox1=\vbox{
\hsize=8cm
\bfseries\huge\exampletext}
\boxmaxdepth0pt
\setbox0\vsplit1to2cm
\setbox0=\vbox{\unvbox0}
\fbox{\box0}
\fbox{\box1}
\end{document}
我曾经在这个例子中\hfuzz=\maxdimen
避免过。overfull hbox
答案1
Underfull \vbox
TeX 执行 时会收到以下消息\vsplit
:它想要构建\vbox to 2cm
,但它必须使用不会生成 2 厘米高框的断点。您正确地执行了\setbox0=\vbox{\unvbox0}
,但已生成了未满框。
\def\silencewarning{\edef\currentvbadness{\the\vbadness}%
\vbadness=10000 \afterassignment\restorevbadness}
\def\restorevbadness{\vbadness=\currentvbadness\relax}
...
\silencewarning
\setbox0\vsplit1to2cm
...
这将告诉 TeX 不要对未满的框发出警告,而是执行与之前相同的计算。如果您的计算是在组中执行的,则设置\vbadness
为 10000(或\@M
,相同)并忘记它。
注意:盒子寄存器 1、3、5、7 和 9 仅用于全局分配。但并非每个包都符合此建议。
答案2
它的结果应该是underfull vbox
而不是overfull
一个。TeX by topic 对 有如下评论\vsplit
:
\vsplit 8位数到dimen的提取结果是一个具有以下属性的盒子。
高度等于指定的尺寸;TEX 将通过原始框寄存器(必须包含垂直框)来查找最佳断点。这可能会导致框未满。...
如果我理解正确,这意味着 TeX 比2cm
您指定的更早中断,从而导致出现underfull vbox
。您必须使用精确的x
行高才能不收到underfull vbox
警告。例如,如果我们使用\ht1
而不是2cm
作为 dimen,则不会生成任何警告。因为,再次根据 TeX by topic:
原始框的底部始终是 \vsplit 操作的有效断点。如果采用此断点,则余数框寄存器为空。