关于 TeXbook 练习 14.31 的问题

关于 TeXbook 练习 14.31 的问题

下面的示例使用了\signedTeXbook 第 106 页的宏:

\tracingonline=1
\tracingparagraphs=1
\def\signed #1 (#2){{\unskip\nobreak\hfil\penalty50
  \hskip2em\hbox{}\nobreak\hfil\sl#1\/ \rm(#2)
  \parfillskip=0pt \finalhyphendemerits=0 \par}}
\hsize 3.0in \noindent
But sometimes an extra line must be added. \signed N. Bourbaki (Paris)
\bye

追踪显示:

@firstpass
\tenrm But sometimes an extra line must be added. 
@\penalty via @@0 b=0 p=50 d=2600
@@1: line 1.2 t=2600 -> @@0
 [] \tensl N. 
@ via @@0 b=96 p=0 d=11236
@ via @@1 b=0 p=0 d=100
@@2: line 2.2 t=2700 -> @@1
@@3: line 1.3 t=11236 -> @@0
Bourbaki
@\kern via @@1 b=0 p=0 d=100
@@4: line 2.2 t=2700 -> @@1
 \tenrm (Paris)
@\par via @@1 b=0 p=-10000 d=100
@@5: line 2.2- t=2700 -> @@1

当空的水平盒子被移除时,跟踪显示

@firstpass
\tenrm But sometimes an extra line must be added. 
@\penalty via @@0 b=0 p=50 d=2600
@@1: line 1.2 t=2600 -> @@0
  \tensl N. 
@ via @@0 b=96 p=0 d=11236
@@2: line 1.3 t=11236 -> @@0

然后第一次传递失败。为什么?

答案1

胶水和罚球都是可以丢弃的,所以没有盒子,整个

\nobreak\hfil\penalty50\hskip2em\nobreak\hfil

序列可丢弃

如果断行发生在 p50 处,那么就会出现N Bourbarki (Paris)在第二行,因此拉伸两个单词空格来填充该行会产生不良影响”

但实际上它在 N 之后休息,因为那是惩罚 0,在这种情况下足以补偿Bourbarki (Paris)只有一个单词空间可以延伸,因此由此产生的更多糟糕但在休息时没有惩罚。

相反,\hbox{}是不可丢弃的,因此如果在惩罚 50 处中断,则 2em 粘连将被丢弃,并且 最终\hbox{}出现在下一行的开头,粘连会扩展以将文本向右对齐。(这基本上是latex 中\hspace和之间的区别)\hspace*

相关内容