我正在尝试理解 Knuth 的换行算法的基础知识。第 12 章:胶水他的 TeXbook 中有一张类似下面的图。
我的问题是:这些拉伸和收缩是从哪里来的?
答案1
TeXbook 中的示例只有任意值;假设单位为点,可以通过输入来模拟
\def\example{%
\hbox to 5pt{\hrulefill}%
\hskip 9pt plus 3pt minus 1pt
\hbox to 6pt{\hrulefill}%
\hskip 9pt plus 6pt minus 2pt
\hbox to 3pt{\hrulefill}%
\hskip 12pt plus 0pt minus 0pt
\hbox to 8pt{\hrulefill}}
如果您说\hbox{\example}
最终的框宽度将是 5+9+6+9+12+8=52 点。如果您说\hbox to 58pt{\example}
,最终的框宽度确实是 58pt,并且内部的粘连将按照 6/9 的拉伸比率进行拉伸。
如果你说\hbox to 51pt{\example}
,粘合将以 1/3 的收缩率收缩,以得到一个 51pt 宽的框。
当你写一个真正的段落时,粘连是由输入中的空格插入的。粘连量取决于字体:例如,对于 cmr10,每个空格都会插入粘连,相当于说
\hskip 3.33pt plus 1.67pt minus 1.11pt
(但需要考虑空间因素,这可能会在某些地方改变这个数量)。换行算法决定每行从哪里开始和结束,对每行的操作与之前的示例完全类似:目标宽度通常是,\hsize
并且粘合将根据示例中概述的规则进行设置。
cmr10 的值可以在附录 F 第 433 页找到。对于一般字体,可以通过以下命令查看正常空格插入的粘连量:
\skip0 = \fontdimen2\font plus \fontdimen3\font minus \fontdimen3\font
在本上下文中,如\font
指当前字体。\showthe\skip0
您将看到单词间粘合的值。