\linebreak 中的 \unskip 和 \hskip

\linebreak 中的 \unskip 和 \hskip

我发现宏的定义\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;机制完全相同。

相关内容