\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]
为惩罚值0
、4
惩罚值 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。)