如果将命令\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)。