hbox
我目前正在将一个用纯 TeX 编写的旧类更新为 LaTeX(主要是为了易读性),并且我将和的组合更改为具有所有可选参数的vbox
单一类。parbox
问题是这个类很聪明,当框中的文本溢出时,它会尝试将其排版为两列而不是一列。它使用旧的/方法\ifnum\badness=1000000
可以做到这一点,但使用该方法会失败。hbox
vbox
parbox
有没有什么方法可以测试的垂直不良程度parbox
?
平均能量损失
\documentclass{article}
\usepackage{blindtext}
\begin{document}
% New code
\noindent\parbox[c][3cm][t]{\linewidth}{
\blindtext
} %parbox
\ifnum\badness=1000000\relax \vspace{3em} THE PREVIOUS BOX HAS BECOME OVERFULLxs\fi%
\vspace{5cm}
\makeatletter
% Old code
\noindent\vbox to 3cm{\hbox{
\parbox{\linewidth}{
\blindtext
} % parbox
}% hbox
\vfill}% vbox
\ifnum\badness=1000000\relax \vspace{3em} THE PREVIOUS BOX HAS BECOME OVERFULL\fi%
\makeatother
\end{document}
答案1
有两个问题,第一个问题是 parbox 不会过满,因为它填充了\vss
可以无限收缩的填充物。因此,您需要对其进行修改,\vfil
以便胶水可以拉伸但不会收缩到零以下。然后,下一个问题是,过满的盒子在 parbox 处理中隐藏了一点,因此您需要保存此时的不良情况以供以后测试:
\documentclass{article}
\usepackage{blindtext}
\makeatletter
\long\def\@iiiparbox#1#2[#3]#4#5{%
\leavevmode
\@pboxswfalse
\setlength\@tempdima{#4}%
\@begin@tempboxa\vbox{\hsize\@tempdima\@parboxrestore#5\@@par}%
\ifx\relax#2\else
\setlength\@tempdimb{#2}%
\edef\@parboxto{to\the\@tempdimb}%
\fi
\if#1b\vbox
\else\if #1t\vtop
\else\ifmmode\vcenter
\else\@pboxswtrue $\vcenter
\fi\fi\fi
\@parboxto{\let\hss\vfil\let\unhbox\unvbox
\csname bm@#3\endcsname}%
\xdef\parboxbadness{\the\badness}%
\if@pboxsw \m@th$\fi
\@end@tempboxa}
\makeatother
\begin{document}
% New code
\noindent\parbox[c][3cm][t]{\linewidth}{
\blindtext
} %parbox
\ifnum\parboxbadness=1000000\relax
\vspace{5em} THE PREVIOUS BOX HAS BECOME OVERFULL\fi%
\vspace{5cm}
\makeatletter
% Old code
\vbox to 3cm{\hbox{%
\parbox{\linewidth}{
\blindtext
} % parbox
}% hbox
\vfill}% vbox
\ifnum\badness=1000000\relax \vspace{3em} THE PREVIOUS BOX HAS BECOME OVERFULL\fi%
\makeatother
\end{document}
如果你想限制重新定义的范围,那么最简单的方法就是替换
\long\def\@iiiparbox#1#2[#3]#4#5{%
经过
\def\standardparbox{\let\@iiiparbox\orig@iiiparbox}
\def\measuringparbox{\let\@iiiparbox\my@iiiparbox}
\let\orig@iiiparbox\@iiiparbox
\long\def\my@iiiparbox#1#2[#3]#4#5{%
在上面,您可以使用 \measuringparbox
和\standardparbox
来本地切换行为\parbox
。