\nolinebreak 在 ConTeXt 或普通 TeX 中的对应内容是什么?

\nolinebreak 在 ConTeXt 或普通 TeX 中的对应内容是什么?

如果将命令\nolinebreak[4]放在两个字符之间,则应防止在该位置出现换行符。此命令似乎未在 ConTeXt 中定义。ConTeXt 中是否有与此命令等效的命令,或者是否有与 ConTeXt 兼容的纯 TeX 命令?

答案1

在纯 TeX 中,有\nobreak,相当于\penalty 10000。在 ConTeXt 中,它们是相同的(在文件中定义spac-ver.mkiv)。

答案2

LaTeX 中的定义\nolinebreak是,跳过细节,

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

如果在垂直模式下发现,第一个条件会发出错误\nolinebreak。在水平模式下,它会存储最后一次跳过(如果没有,则存储值为零)并将其删除(如果存在)。然后发出 10000 的惩罚并恢复跳过。

\@tempskipa例如,只需使用临时跳过寄存器代替即可\skip8。如果您需要完整的语法,\nolinebreak[<number>]则必须使用更复杂的语法。

\catcode`@=11
\def\nolinebreak{\futurelet\next\nolinebreak@a}
\def\nolinebreak@a{%
  \ifx\next[\expandafter\nolinebreak@b\else\nolinebreak@b[4]\fi}
\def\nolinebreak@b[#1]{%
  \ifvmode\else
    \skip8=\lastskip\unskip
    \penalty\ifcase#1 0 \or 2500 \or 5000 \or 7500 \or \@M\fi % change values at will
    \ifdim\skip8>\z@\hskip\skip8 \fi
    \ignorespaces
  \fi}
\catcode`@=12

诀窍在于,如果胶合遵循惩罚,则它无法用于换行。例如,Plain TeX 定义~

\def~{\penalty\@M \ }

(其中\@M代表 10000)。

相关内容