# Make sure the spacing of a macro for a binary operator

I define a macro as follows:

\newcommand{\abs}[1]{{#1}^{\sharp}}

But I realize that \$a \abs{\sqcup} b\$ is not exactly same as \$a \sqcup^\sharp b\$: The first one does not leave enough space between the operator and the operands.

Does anyone know how to amend the macro to make it a real binary operator in terms of spacing?

-

If you define

\newcommand\abs[1]{#1^\sharp}

the spacing will be inherited by the nature of #1; so

\abs{\sqcup}

will be spaced as a binary operator and

\abs{=}

will be spaced as a binary relation.

With you definition you get {\sqcup}^{\sharp} that's treated as an ordinary symbol.

## Some detail

When one tries the input \$a+^{\sharp}b^2\showlists\$, the .log file will report

### math mode entered at line <line number>
\mathord
.\fam1 a
\mathbin
.\fam0 +
^\fam1 ]
\mathord
.\fam1 b
^\fam0 2

The \mathord and \mathbin lines tell what type of math atom TeX is analyzing. Every atom has three fields: the nucleus (represented by .), the superscript (represented by ^) and the subscript (represented by _).

Since + is defined to be a \mathbin atom, such type is reported. This atom has as nucleus the character + taken from family 0, and a superscript taken from family 1 (cmsy10 font in the default setting, where the slot usually occupied by ] has the "sharp" symbol).

If instead we say \$a{+}^{\sharp}b\showlists\$, the response is

### math mode entered at line <line number>
\mathord
.\fam1 a
\mathord
.\mathbin
..\fam0 +
^\fam1 ]
\mathord
.\fam1 b

The braces around a subformula tell TeX to treat the whole subformula as a \mathord atom; this atom has a nucleus formed by a \mathbin atom (at an inner level, represented by the two periods ..), but this would have consequences only for the typesetting of the subformula, not with respect to the "outer" level. The braced \mathord atom has a superscript atom as before.

This is only the first step in typesetting a formula. When TeX has determined all the atoms it has to typeset, it applies its rules about spacing; for example it inserts a medium space between \mathord and \mathbin atoms (I'll skip over some subtlety), but it never inserts spaces between two \mathord atoms (unless, of course, such a space has been explicitly specified by the user).

Note that it's the same as with \sqcup instead of +, since also this symbol is declared as a \mathbin atom.

-

You can force it to be a bin atom using \mathbin:

\newcommand{\abs}[1]{\mathbin{{#1}^{\sharp}}}
-