假设我有一个宏某物在数学模式下(例如,更改数学字母表)。此宏,,\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
一切都会顺利。