垂直过满 parbox 测试

垂直过满 parbox 测试

hbox我目前正在将一个用纯 TeX 编写的旧类更新为 LaTeX(主要是为了易读性),并且我将和的组合更改为具有所有可选参数的vbox单一类。parbox

问题是这个类很聪明,当框中的文本溢出时,它会尝试将其排版为两列而不是一列。它使用旧的/方法\ifnum\badness=1000000可以做到这一点,但使用该方法会失败。hboxvboxparbox

有没有什么方法可以测试的垂直不良程度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}

垂直溢出 parbox 示例

答案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

相关内容