产生始终有效的一元加/减符号的好方法是什么?

产生始终有效的一元加/减符号的好方法是什么?

假设我有一个宏某物在数学模式下(例如,更改数学字母表)。此宏,,\somecommand接受一个参数。我可能希望像这样使用,将一个空参数输入其中:\(\somecommand{} +x\)。我还希望之前的加号x是一元运算符。

我发现,加号或减号是一元的还是二元的,虽然在理论上很清楚,但并不总是明显的初次检查时:

\documentclass{article}

\newcommand{\zeroArgCommand}{}
\newcommand{\oneArgCommand}[1]{}

\begin{document}

\noindent
\(                    +x\) \\ % unary:  "+x"
\(\zeroArgCommand     +x\) \\ % unary:  "+x"
\(\zeroArgCommand{}   +x\) \\ % binary: " + x"
\(\oneArgCommand{}    +x\) \\ % unary:  "+x"
\(\oneArgCommand{}{}  +x\) \\ % binary: " + x"

\end{document}

鉴于此,我想知道定义一元加/减号的最佳方法

直觉上我会写\(\somecommand{} {+} x\)\(\somecommand{} {+ x}\),但我想知道专家对一种肯定在所有情况下都有效的方法的看法。

提出这个问题是因为在另一个主题中,一个用户建议定义\unaryplus宏比 更清晰\somecommand {+} x。(我认为该评论者的想法是读者可能不熟悉 的参数数量\somecommand。)


附录:有没有一种好的方法来定义一个宏\genuineunaryplus,它产生一个+,但在上下文中<before>\genuineunaryplus<after>附加为<after>一元运算符,但间距为,<before>就像不\genuineunaryplus存在一样?也就是说,如果之间的间距<B> <A>为长度/类型 L,则表达式将在输出中<B>\genuineunaryplus<A>产生,并且之间的间距与不存在时之间的间距完全相同,即 L?<B> +<A><B>+<B><A>\genuineunaryplus

附录答案思路:大卫·卡莱尔在下面评论概述了该附录的可能答案。

答案1

数学列表的检查发生扩展(和分配之后)。这是一个仅适用于数学模式的额外阶段,它将数学列表转换为水平列表,然后将其排版为普通水平列表。

因此,宏结构和数学间距之间没有真正的联系,左边的东西是否+有参数并不重要,重要的是它扩展为什么(在你的例子中什么都没有),所以你的例子相当于

\noindent
\(                    +x\) \\ % unary:  "+x"
\(     +x\) \\ % unary:  "+x"
\({}   +x\) \\ % binary: " + x"
\(    +x\) \\ % unary:  "+x"
\({}  +x\) \\ % binary: " + x"

并且正如您的评论显示,如果 binop+位于两个 mathord 原子(例如{}或 )之间,则它会获得二进制间距x

您的例子(来自其他地方,\somecommand是一个零参数宏)

\(\somecommand{} {+} x\) 

\({} {+} x\) 

此处{+}构造了一个数学符号,因此没有空格。我认为这可能是不好的标记,这主要与后面的空格有关,{}\somecommand文本模式下习惯性地这样做可以避免丢失空格,但在数学模式下,它通常会产生影响。

\(\somecommand{} {+ x}\)

\({} {+ x}\)

因此,此处的数学列表有两个(而不是三个)数学原子:{}+x。在这个简单情况下,它不会影响间距,但内部表达式是单个原子,因此{+x}(和而不是x)将接受任何上标等,并且由于它是内部列表,因此会抑制换行,并且任何空格都会被强制为其自然宽度(此处再次不相关);基本上,数学节点中{...}是一个框命令,如\hbox{....}

事实上,一元数学符号有两种选择,即 mathord 或 mathop,使用 mathord 很容易获得临时 mathord {+},但明确声明运算符可能更一致。

在此处输入图片描述

1 $a-+b$

2 $a-{+}b$

3 $a-\mathord{+}b$

4 $a-\mathop{+}b$

5 $x+y$

6 $x{+}y$

7 $x\mathord{+}y$

8 $x\mathop{+}y$

从 (1) 中可以看出,如果两个 binop 原子相邻,则第二个原子实际上会变成 mathord,因此您会得到如 (2) 或 (3) 中所示的间距,尽管可以说作为前缀运算符赋予它 mathop 间距(在它的参数之前有一个小的间隙)更一致。

无论哪种方式,如果你不想用奇怪的{}结构和\mathxx原语填充你的文档表达式,只需定义

\unaryplus{{+}}

或者你喜欢的任何版本然后使用

a + \unaryplus b 

一切都会顺利。

相关内容