\nopagebreak
和之间有什么区别\penalty
?(除了它们的论据是用不同的尺度来衡量这一显而易见的事实之外。)什么时候应该使用其中一个,什么时候应该使用另一个?
答案1
\nopagebreak
看一下(in )的定义latex.ltx
:
\def\nopagebreak{\@testopt\@no@pgbk4}
\def\@no@pgbk #1[#2]{%
\ifvmode
\penalty #1\@getpen{#2}%
\else
\@bsphack
\vadjust{\penalty #1\@getpen{#2}}%
\@esphack
\fi}
不考虑可选参数,这基本上是说
如果在垂直模式,发出
\penalty\@getpen{#2}
,否则置于\penalty\@getpen{#2}
当前段落当前行之后的垂直模式。
做什么\@getpen
?
\def\@getpen#1{\ifcase #1 \z@ \or \@lowpenalty\or
\@medpenalty \or \@highpenalty
\else \@M \fi}
这基本上是说
如果
#1==0
,返回0
,如果#1==1
,返回,如果,返回\@lowpenalty
,如果#1==2
,返回\@medpenalty
,如果#1==3
,返回\@highpenalty
,如果#1==4
,返回10000
。
等等是如何\@lowpenalty
定义的?它们的定义见于类文件:
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
所以,综合起来,答案是
\penalty
是一个低级命令,它只是插入一个惩罚值放入当前输出列表中,无论当前模式是什么(水平或垂直)。\nopagebreak
是一个用户级命令,它总是添加一个非负惩罚垂直模式刑罚的具体价值被“抽象”为五个层次,即零到 无穷,并且还依赖于使用的文档类别。
答案2
该\penalty
命令是一个 TeX 原语,它将惩罚节点插入到当前列表(例如,一个段落)中,而是\nopagebreak
一个高级 LaTeX 命令,它检查其周围环境(在某种程度上),并根据它是在垂直模式还是水平模式下使用来执行不同的操作。
如果您位于段落中间,那么说的\penalty 10000
是插入指示换行的惩罚,但不会影响分页。相反,\nopagebreak
会插入更多或更少\vadjust{\penalty 10000}
,并且会发挥一些额外的魔力,确保您不会在那个地方出现两个空格。
所以最重要的是,作为用户你\penalty
根本不应该使用,LaTeX 提供更高级的用户命令是有充分理由的。作为软件包的开发人员,如果您知道情况如何,则可以使用惩罚,当然\penalty
直接使用可以减少一点点开销。