我发现宏的定义\linebreak
如下:
\def\linebreak{\@testopt{\@no@lnbk-}4}
\def\@no@lnbk #1[#2]{%
\ifvmode
\@nolnerr
\else
\@tempskipa\lastskip
\unskip
\penalty #1\@getpen{#2}%
\ifdim\@tempskipa>\z@
\hskip\@tempskipa
\ignorespaces
\fi
\fi}
我不明白为什么\linebreak
需要\lastskip
在惩罚项之后保存和恢复它?有人能举几个例子来解释为什么这是必要的吗?
答案1
不可丢弃物品后的胶水是可行的断点。如果\linebreak
仅定义为
\penalty#1
(其中惩罚金额由可选参数决定,\linebreak
如果没有传递参数则由默认值决定)输入如下
hello \linebreak world
hello
如果后面的空格是一个很好的换行点,那么就会忽略惩罚。
对于 来说并不是很重要\linebreak
,但对于\nolinebreak
使用相同\@no@lnbk
内部宏来说却具有决定性作用。
因此,LaTeX 会“转移”它找到的任何\linebreak
胶水\nolinebreak
后惩罚;这样的胶水永远不会成为一个可行的断点,因为它前面有一个可丢弃的惩罚物品。
\pagebreak
还要注意,和使用相同的内部宏\nopagebreak
;机制完全相同。