\nobreak 和 \nolinebreak 之间有什么区别?

\nobreak 和 \nolinebreak 之间有什么区别?

\nobreak和有什么区别\nolinebreak

我注意到 TeX.SE 中的很多解决方案都使用前者,但我认为后者是 LaTeX,而前者是纯 TeX。而且 LaTeX 宏通常是更基本的 TeX 等效物的更充实的版本。哪种更适合哪种情况?

答案1

\nobreak在纯 TeX 中定义为(在 LaTeX 中也有相同的定义),如下所示

\penalty \@M

这是\penalty 10000一个极其糟糕的断点(如果是水平模式,则为一行;如果是垂直模式,则为一页)。

\nolinebreak是一个 LaTeX 命令,用于测试它是否处于水平模式,如果不是,则给出错误消息,然后可以给出 5 个不同的惩罚值之一,给出不同强度的提示\nolinebreak[0]...\nolinebreak[4] 4是默认值,给出\@M与相同的提示\nobreak。为值 0-4 插入的实际惩罚由类文件设置。

值分别[0]为惩罚值04惩罚值 10000 和 1-3,由以下人员设置(在article课堂上):

\@lowpenalty   51
\@medpenalty  151
\@highpenalty 301

还有一些代码可以修复空白,以便

a \nolinebreak[0] b
a\nolinebreak[0] b
a \nolinebreak[0]b

如果没有发生中断,则每个 a 和 b 之间都会有且只有一个单词的空格。

因此,通常情况下,这两个命令执行相同的操作。LaTeX 命令需要更多时间,并且由于可选参数测试,它曾经脆弱的(自 2019 年起,它在 LaTeX 版本中非常强大)。因此,由于大多数 LaTeX2e 类文件使用您通常会看到的\nobreak或甚至仅\penalty\@M在类文件中看到的相当低级的代码,但在文档中,最好通常使用 LaTeX 形式进行额外的错误检查和与类设置的标准惩罚提示级别的接口。

答案2

这个\nobreak命令在 LaTeX 手册和“LaTeX Companion”中都没有记录。它的含义只是\penalty10000让它在水平和垂直模式下都很有用,但这种普遍性让它有点危险。

的意思\nolinebreak是“检查是否有可选参数,如果没有,则使用\@no@lnbk参数 4 调用内部宏”,这意味着

\ifvmode
  \@nolnerr
\else
  \@tempskipa\lastskip
  \unskip
  \penalty\@M
  \ifdim\@tempskipa >\z@
    \hskip\@tempskipa\ignorespaces
  \fi
\fi

它检查我们是否处于水平模式,并进行一些处理:如果 \nolinebreak前面有一个空格(正常的单词间空格或明确的\hspace),则将其删除,发出惩罚并重新插入空格。

一个坏习惯(我承认我有这个习惯)是,在确信命令能完成正确任务时使用较短的命令。例如,

$a=\nobreak b$

比 更快,$a=\nolinebreak b$因为不需要执行检查,也不需要移动空间。

您还可以\nobreak在 之后找到\par,这意味着之后的垂直空格\par\nobreak永远不会用于分页符。

当然,在这种情况下最好使用\par\nopagebreak。但是,唉,坏习惯占了上风。使用\nopagebreak

(我保证我将来会更加精通 LaTeX。)

相关内容