如何避免与 \vsplit 结合使用时 vbox 未满?

如何避免与 \vsplit 结合使用时 vbox 未满?

在以下示例中,我使用命令\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 \vboxTeX 执行 时会收到以下消息\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 操作的有效断点。如果采用此断点,则余数框寄存器为空。

相关内容