TeXbook 的第 98 页给出了一个段落跟踪开头:
[]\tenrm Mr. Drofnats---or ‘‘R. J.,’’ as he pre-
@\discretionary via @@0 b=0 p=50 d=2600
@@1: line 1.2- t=2600 -> @@0
ferred to be called---was hap-pi-est when
并补充说
以“@@”开头的行表示可行断点,即在没有任何不良率超过容差的情况下可以达到的断点。可行断点按连续编号,从 @@1 开始;段落的开头也被认为是可行的,编号为 @@0。
为什么标记为 @@1 的点是第一个?难道你不能达到“as”和“he”之间的点,而没有任何坏处超出容忍度吗?
答案1
让我们试着计算一下坏处。文本
Mr.~Drofnats---or ``R. J.,'' as
宽度为 125.88911pt,由于 ,我们在此基础上添加了 20pt \parindent
。
是\hsize
469.75499pt,所以我们需要拉伸胶水以填充 343.86588pt,我们有四个胶水团可用,每个胶水团的可拉伸性为 1.66666pt,但最后一个胶水团在逗号后面,因此空间因子为 2.08331pt。因此,总可拉伸量为 7.08329pt,拉伸率为 48.546
然后使用拉伸比的立方的大约 100 倍,即 11440952,来计算不良度;这个数字太高了,所以 TeX 使用 10000,正如规则中所述(第 97 页,第一个双重危险段落;真正的规则略有不同,但想法就在那里)。
如果你试试
\tracingparagraphs=1
\tracingonline=1
\tolerance=10000
\pretolerance=-1
\hyphenpenalty=10000
%\exhyphenpenalty=10000
Mr.~Drofnats---or ``R. J.,'' as
he preferred to be called---% error has been fixed!
was happiest when he was at work
typesetting beautiful documents.
\bye
你会看见
[]\tenrm Mr. Drofnats---
@\discretionary via @@0 b=10000 p=50 d=100012500
@@1: line 1.0- t=100012500 -> @@0
or
@ via @@0 b=10000 p=0 d=100010000
@ via @@1 b=10000 p=0 d=100000000
@@2: line 1.0 t=100010000 -> @@0
``R.
@ via @@0 b=10000 p=0 d=100010000
@ via @@1 b=10000 p=0 d=100000000
@ via @@2 b=10000 p=0 d=100000000
@@3: line 1.0 t=100010000 -> @@0
J.,''
@ via @@0 b=10000 p=0 d=100010000
@ via @@1 b=10000 p=0 d=100000000
@ via @@2 b=10000 p=0 d=100000000
@ via @@3 b=10000 p=0 d=100000000
@@4: line 1.0 t=100010000 -> @@0
as
@ via @@0 b=10000 p=0 d=100010000
@ via @@1 b=10000 p=0 d=100000000
@ via @@2 b=10000 p=0 d=100000000
@ via @@3 b=10000 p=0 d=100000000
@ via @@4 b=10000 p=0 d=100000000
@@5: line 1.0 t=100010000 -> @@0
he
@ via @@0 b=10000 p=0 d=100010000
@ via @@1 b=10000 p=0 d=100000000
@ via @@2 b=10000 p=0 d=100000000
@ via @@3 b=10000 p=0 d=100000000
@ via @@4 b=10000 p=0 d=100000000
@ via @@5 b=10000 p=0 d=100000000
@@6: line 1.0 t=100010000 -> @@0
pre-ferred
(省略剩余部分)。这里,每个空间确实是一个可行的断点,因为容差永远不会超出,因为如果超过此界限,它总是被标准化为 10000。
在段落描摹中,如果线条被拉伸到超过容差,则不考虑可能的断点;如果线条被收缩,则考虑可能的断点,以便在无法实现其他断点序列的情况下,允许使用过满的框来分段。这里的想法是,过满的框是可见的(可能借助\overfullrule
),而未满的框则不太容易发现。
为什么\pretolerance=-1
?因为否则 TeX 会先进行无连字符处理。您可以尝试省略\hyphenpenalty=10000
,这样也会考虑连字符点。但是,通过声明 ,您将获得基本相同的跟踪\pretolerance=10000
。
答案2
不,不是每个断点都能在不超出容差的情况下达到:它们需要太多的拉伸。您可以自己尝试一下:只需插入\break
即可强制断点。
\tracingparagraphs=1
\tracingonline=1
\tracingoutput=1
\showboxbreadth=\maxdimen
\showboxdepth=\maxdimen
Mr.~Drofnats---or ``R. J.,'' as\break
he preferred to be called---%
was happiest when he was at work
typesetting beautiful documents.
\bye
输出将包含:
Underfull \hbox (badness 10000) in paragraph at lines 7--11
[]\tenrm Mr. Drofnats---or ``R. J.,'' as
您可以直观地查看输出:
看看为什么第一行会有太多的坏处。