如何知道 TeX 中“胶水”的收缩极限?

如何知道 TeX 中“胶水”的收缩极限?

第 69 页TeXbook,有一张图: 在此处输入图片描述

第 70 页TeXbook,是说

粘连永远不会收缩超过其规定的收缩率。例如,我们插图中的第一个粘连团永远不会变得比 8 个单位宽,并且 TEX 永远不会收缩给定的水平列表以使其总宽度小于 49 个单位。

这里作者如何计算收缩极限?

答案1

收缩以单位指定,如果你去\setlength\baselineskip{15pt minus 2pt}那么收缩是 2pt 并且最小尺寸是13pt它也可以是无限的filfillfilll单位,\vss例如是缩写\vskip 0pt plus 1fil minus 1fil

答案2

以下是一个例子:

\def\ruleA{\vrule height1pt width45pt depth0pt}
\def\ruleB{\vrule height1pt width30pt depth0pt}
\noindent
\vrule height1pt width100pt depth0pt\par
\hbox to 100pt{\ruleA\hskip 20pt plus 4pt minus 15pt\ruleA} % case 1
\hbox to 100pt{\ruleA\hskip 20pt plus 4pt minus 10pt\ruleA} % case 2
\hbox to 100pt{\ruleA\hskip 20pt plus 4pt minus 3pt \ruleA} % case 3
\hbox to 100pt{\ruleB\hskip 20pt plus 4pt minus 3pt \ruleB} % case 4

\bye

在此处输入图片描述

我定义了两条规则(一条宽度为 45pt,另一条宽度为 30pt)。然后我使用胶水将两条规则放在一个宽度为 100pt 的水平框中。

  • 在情况 1-3 中,两个规则的总宽度为 90pt,因此粘合应该收缩 10pt,因为它的自然宽度是 20pt。

    • 情况 1 和情况 2 可以做到这一点,因为它们的收缩率分别为 15pt、10pt。但是
    • 情况 3 不是,粘合的最小宽度为 20pt-3pt = 17pt(因此Overfull \hbox (7.0pt too wide) detected at line 7会发出警告。)
  • 在情况 4 中,粘连是20pt plus 4pt minus 3pt,这并不意味着粘连的最大宽度是 24pt。事实上,只要粘连具有正的拉伸分量,它就可以任意拉伸。正如您在屏幕截图中看到的那样,最后一个粘连的宽度是 100pt-30pt*2 = 40pt(拉伸量为 20pt > 4pt)。这种情况会发出警告Underfull \hbox (badness 10000)

答案3

第一团胶水的尺寸是space 9 stretch 3 shrink 1,所以它能达到的最窄尺寸是 9 − 1 = 8。(您可能认为最宽尺寸是 9 + 3 = 12,但您引用部分后面第 70 页的文字解释说这实际上并非如此,它可以延伸得更宽。)

将所有宽度和空格加在一起,我们得到 5 + 9 + 6 + 9 + 3 + 12 + 8 = 52 作为自然宽度;但如果我们也包括收缩,那么我们得到 5 + (9 − 1) + 6 + (9 − 2) + 3 + (12 − 0) + 8 = 49 作为它能得到的最窄宽度。

这就是 52、8 和 49 的计算方法。(其他数字都是从帽子里抽出来的。)

答案4

在此处输入图片描述

下面的代码可以让你直观地了解正在发生的事情。将胶水想象成弹簧是有益的,它可以扩展或收缩以将一组框排列在其他框中。在下图中,它们由空白表示。你可以观察到,当线宽为 35 毫米且 TeX 正在构建时,一个段落box4被放到第二行上。在 49 毫米时它刚好适合。该图是通过将框插入表格来呈现的。尝试更改值。要手动计算所有胶水,请将正值和负值加在一起,以获得可拉伸性或可收缩性。

\documentclass{article}
\usepackage{array,xcolor}
\fboxsep=0pt\fboxrule=0pt
\NewDocumentCommand\Fbox{m m}
{
 \colorbox{cyan}{\hbox to#1{box$_#2$\strut}}
}
\parindent0pt
\setlength\arraycolsep{0pt}
\long\def\maketable#1{\par\leavevmode
\begin{tabular}{l|@{}p{#1}@{}|@{}}
#1 &\Fbox{14mm}{1}\hskip\skipa  
\Fbox{15mm}{2}\hskip\skipb  
\Fbox{8mm}{3}\hskip
\skipc \Fbox{8mm}{4}
\end{tabular}
\smallskip
}
% set the skips
\newskip \skipa
\newskip \skipb
\newskip \skipc
\skipa=0mm plus 3mm minus 1mm
\skipb=0mm plus6mm minus 2mm
\skipc=0mm plus0mm minus 0mm
\begin{document}
%make the tables
\maketable{35mm}
\maketable{49mm}
\maketable{52mm}
\maketable{55mm}
\end{document}

相关内容