禁止在内联数学中的特定符号后换行吗?

禁止在内联数学中的特定符号后换行吗?

我正在写一篇文章,其中顺序关系(例如<,,)经常作为函数的参数出现,而不是二元运算符(例如)。这经常导致内联公式在顺序关系后换行,\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 行中,我简单地重新定义了\precmean{\prec}\llmean {\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 _,。 与我的其他答案不同,它还保持间距不变。

当然,正如我指出的那样,这解决了我的问题,但并没有回答标题中的确切问题。此外,我对技术知识的了解远不及在这里发布答案的大多数人,所以如果上述代码有什么不恰当的地方,请告诉我。

相关内容