\nopagebreak 和 \penalty

\nopagebreak 和 \penalty

\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直接使用可以减少一点点开销。

相关内容