Knuth 的换行算法

Knuth 的换行算法

我正在尝试理解 Knuth 的换行算法的基础知识。第 12 章:胶水他的 TeXbook 中有一张类似下面的图。

我的问题是:这些拉伸和收缩是从哪里来的?

TeXbook 第 12 章中的图

答案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您将看到单词间粘合的值。

相关内容