考虑以下最小值,使用\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}
这将产生输出,
我有兴趣了解如何解释这种行为。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),因此会得到正确排版的段落。