我正在写一篇文章,其中顺序关系(例如<
,,)经常作为函数的参数出现,而不是二元运算符(例如)。这经常导致内联公式在顺序关系后换行,\prec
并在下一行的开头留下右括号或逗号(当顺序关系后有另一个参数时)。当然,我想避免这种情况。\ll
$O(P,<)$
我希望有一个比 更灵活的解决方案,\relpenalty=10000
因为我不喜欢它做太多不必要的事情,而且可能会扰乱其他公式的排版方式。我只想禁止在符号 、 以及这些添加了下标或上标的符号后换行<
。\prec
但是\ll
,我找不到调整在特定符号后换行的惩罚的方法。也许,有一种方法可以通过更改\mathcode
所述符号的 来实现这一点,但我不知道这究竟是如何工作的。
更新。需要明确说明的是,我并不想在每次都临时禁止换行,而是想在序言级别禁止换行。此外,如果有办法禁止换行前结束括号和逗号也可以起作用(也许这会更好,尽管它与问题的标题不符,哈哈)。
答案1
这将禁止在每次出现<
、和 后换行,\prec
而\ll
不仅仅是在给定上下文中。\penalty\relpenalty
如果您在其他上下文中遇到换行问题,您可以添加。
\documentclass{article}
\usepackage{amsmath}
% save the necessary commands and codes
\mathchardef\imakhlinless=\mathcode`<
\mathchardef\imakhlinprec=\prec
\mathchardef\imakhlinll=\ll
% define a generic not breaking combination
% accepting subscripts and superscripts before
% issuing \nobreak
\NewDocumentCommand{\nobreaking}{me{^_}}{%
#1\IfValueT{#2}{^{#2}}\IfValueT{#3}{_{#3}}\nobreak
}
% renew the desired commands
\renewcommand{\prec}{\nobreaking\imakhlinprec}
\renewcommand{\ll}{\nobreaking\imakhlinll}
\newcommand{\aliasless}{\nobreaking\imakhlinless}
\begingroup\lccode`~=`< \lowercase{\endgroup\let~}\aliasless
\mathcode`<="8000
\begin{document}
\parbox{0pt}{$O(P,<)$
$O(P,<_1)$
$O(P,\ll)$
$O(P,\prec_1^2)$
}
\end{document}
零宽度\parbox
意味着强制所有可能的换行。
答案2
这部分是受到 barbara beeton 评论的启发。实际上,可以使用\mathcode
来更改 的符号类<
。我在序言中添加了以下内容,它确实起到了作用。
\mathcode`<="013C
\let\relprec\prec
\renewcommand{\prec}{{\relprec}}
\let\relll\ll
\renewcommand{\ll}{{\relll}}
在这里,在最后 4 行中,我简单地重新定义了\prec
mean{\prec}
和\ll
mean {\ll}
,以便在这些命令之后,行会像在 Ord(0 类)符号而不是 Rel(3 类)符号之后那样中断。然而,<
由于显而易见的原因,这种方法不起作用,因此我\mathcode
在第一行将其类更改为 0。013C
第一个数字0
是新类,1
是草书字体(我不能使用通常的 0 系列,因为这会导致<
排版为“¡”,幸运的是,使用草书不会影响“<”的形状),3C
是“<”的字符代码。
当然,也可以使用\mathcode`<="8000
更概念化的方法,就像 egreg 的回答中所做的那样。另外,正如某人在一条已删除的评论中指出的那样,当我实际将它们用作中缀二元运算符时,更改类会弄乱符号周围的间距,尽管我不能说我太介意,因为我总是觉得这些空间太大了。
答案3
另一种方法是我在更新中提到的方法:禁止换行前逗号和右括号。这是通过
\mathchardef\newbracket=\mathcode`)
\mathcode`)="8000
\begingroup
\catcode`) \active
\gdef){\nolinebreak\newbracket}
\endgroup
\mathchardef\newcomma=\mathcode`,
\mathcode`,="8000
\begingroup
\catcode`, \active
\gdef,{\nolinebreak\newcomma}
\endgroup
对我个人而言,此解决方案的优点是它不会给下标带来困难,因为我确实使用_<
and_\prec
但不使用_)
or _,
。 与我的其他答案不同,它还保持间距不变。
当然,正如我指出的那样,这解决了我的问题,但并没有回答标题中的确切问题。此外,我对技术知识的了解远不及在这里发布答案的大多数人,所以如果上述代码有什么不恰当的地方,请告诉我。