The inspection of the math list happens after expansion (and after assignments). It is an extra stage just applicable to math mode that converts the math list into a horizontal list that is then typeset as a normal horizontal list.
So there is no real connection between the macro structure and the math spacing, It does not matter whether the thing to the left of the +
has arguments or not, it just matters what it expands to (nothing in your example) so your example is equivalent to
\noindent
\( +x\) \\ % unary: "+x"
\( +x\) \\ % unary: "+x"
\({} +x\) \\ % binary: " + x"
\( +x\) \\ % unary: "+x"
\({} +x\) \\ % binary: " + x"
and as your comments show a binop like +
gets binary spacing if it is between two mathord atoms such as {}
or x
.
Your example (from elsewhere, with \somecommand
being a zero-argument macro)
\(\somecommand{} {+} x\)
is
\({} {+} x\)
Here the {+}
construct makes a mathord so you get no spacing. My comment that this was probably bad markup was mainly related to the trailing {}
after \somecommand
it is OK to do that habitually in text mode to avoid dropping spaces but in math mode it's usually has an effect.
\(\somecommand{} {+ x}\)
is
\({} {+ x}\)
so here the math list has two, not three, mathord atoms: {}
and +x
. In this simple case it doesn't affect the spacing, but the inner expression is a single atom, so {+x}
(and not x
) would take any superscripts etc, and as it is an inner list linebreaking is suppressed and any white space is forced to its natural width (again not relevant here); basically in math node {...}
is a box command like \hbox{....}
.
There are in fact two choices for a unary math sign, a mathord or a mathop, it's easy to get an ad hoc mathord by using {+}
but it is probably more consistent to declare the operators explicitly.
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$
As you see from (1) if two binop atoms are adjacent the second one effectively turns into a mathord so you get the spacing as in (2) or (3) although arguably as a prefix operator giving it mathop spacing (with a small gap before its argument) is more consistent.
either way you don't want to be filling you document expressions with weird {}
constructs and \mathxx
primitives, just define
\unaryplus{{+}}
or whatever version you like and then use
a + \unaryplus b
and it will all work out OK.
I'm not convinced this is a good idea but you could do something like
\documentclass{article}
\usepackage{amsmath}
\renewcommand\sb[1]{_\text{$#1$}}
\begin{document}
\[
\sum_{i = 1}^{n} a_{i}
\]
\[
\sum\sb{i = 1}^{n} a_{i}
\]
\end{document}
Here I've redefined the standard command \sb
which by default does the same as _
, you could go further and redefine _
but history shows that if you do that usually you end up breaking something.
Best Answer
Need to add additional
{}
which emulate a binary operator as TeX thinks there is something on either side of the+
: