为什么 \linebreak 失败?

为什么 \linebreak 失败?

考虑以下最小值,使用\linebreak

\documentclass{article}
\begin{document}
It is impossible to say how first the idea entered
my brain, but, once conceived, it haunted me day
and night. \linebreak

Object there was none. 

\tt\meaning\linebreak
\end{document} 

这将产生输出,

enter image description here

我有兴趣了解如何解释这种行为。LaTeX2e 在这方面有缺陷吗?

编辑

根据答案中的建议,我再次查看了 TeXBook,发现该行为嵌入在 TeX 的算法中,引用:

问题在本章前面的某个段落中,作者习惯\break在特定位置强制换行;结果,该段落的第三行实际上被分隔开。请解释为什么所有额外的空间都进入了第三行,而不是均匀分布在前三行中。

回答均匀分布额外的空间会导致三行最差(10000)。最好只有一行差行,而不是三行,因为当行真的很糟糕时,TeX 不会区分差行的程度。在这个特定情况下,容差 \tolerance是 200,所以 TeX 没有尝试任何会拉伸前两行的换行符;但即使容差被提高到 10000,最佳设置也只会有一行未满。如果您真的想均匀分布空间,您可以使用 \spaceskip增加单词之间的可拉伸量来实现。

当然,我把问题命名为 a 是错误的,failing并向 LaTeX 团队和 Knuth 致歉。但是,我仍然觉得该算法在这种极端情况下还有改进的空间,或者至少\linebreak可以给出一个更好的语义名称\maybebreak

答案1

\linebreak[<value>]
终止当前行并将其格式化为同样的方式作为上一行。如果该行是对齐的,则该行也将是对齐的。可选参数<value>采用 0 到 4 之间的整数值(含 0 和 4)来指定换行的紧急程度;4 表示必须发生。

顺便说一下:具有与垂直调整\linebreak相同的行为。\pagebreak

答案2

答案如下texdef -t latex linebreak

\linebreak:
macro:->\@testopt {\@no@lnbk -}4

\@no@lnbk:
macro:#1[#2]->\ifvmode \@nolnerr \else \@tempskipa \lastskip \unskip
\penalty #1\@getpen {#2}\ifdim \@tempskipa >\z@ \hskip \@tempskipa
\ignorespaces \fi \fi 

的默认参数\linebreak是 4;然后代码与 相同\nolinebreak(不添加-)。它所做的是保存\lastskip,删除它,然后应用由 计算的惩罚\@getpen(在它前面添加一个减号)。然后将删除的粘连再次放入段落中。

做什么\@getpen

\@getpen:
macro:#1->\ifcase #1 \z@ \or \@lowpenalty \or \@medpenalty \or \@highpenalty \else \@M \fi 

参数应为 0 至 4(含)之间的整数。如果参数为 4,则返回 10000。

因此,在最后一个 的情况下\linebreak,TeX 会认为这\penalty-10000是强制换行。像往常一样,它倾向于将结果的坏处累积在一行中(在 TeX 书中查找“really spaced out”)。请注意,您得到的段落在换行后有一个空行,并且您得到“Underfull \hbox” 消息(就像你通常\break\break在 Plain TeX 中得到的那样)。

如果您说\linebreak[3](或更少),则不会强制换行,而只是鼓励换行(\@highpenalty标准设置中为 301),因此会得到正确排版的段落。

相关内容