Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I want a particular spacing behavior for a custom operator. I can produce the desired spacing by setting math classes (\mathord and so forth), but I have to do it on a case-by-case basis since no single math class works for all situations. Is there a more automatic solution?

In my document, the operator $(A\smalltriangleright B)$ means "coerce from A to B". It's a prefix operator and it takes subscripts in some situations.

  • When an operator is applied to an argument, there should be some space between operator and argument. Either mathbin space or mathrel space would be acceptable.

  • When operators are composed using the function composition operator \circ, they should act as ordinary symbols with \circ playing the role of binary operator.

I haven't been able to get a single definition of the operator that has the right spacing in both situations:

\documentclass{article}
\usepackage{amsmath}
\usepackage{mathabx}

\newcommand{\coerceSub}[3]{(\mathord{#1}\smalltriangleright\mathord{#2})_{#3}}

\begin{document}

In an operator application, the ``mathrel'' version looks better.
\begin{gather}
  % OK                                                                          
  \mathrel{\coerceSub uv1} x \\
  % Not OK: no space between operator and operand                               
  \coerceSub uv1 x
\end{gather}

In an operator composition, the plain version looks better.
\begin{gather}
  % Not OK: no space between \circ and c                                        
  \mathrel{\coerceSub vw1} \circ c \\
  % OK                                                                          
  \coerceSub vw1 \circ c
\end{gather}

\end{document}
share|improve this question
    
You should use \mathop for operators (\mathrel is for relations and expects infix placement). –  Andrey Vihrov Mar 1 '12 at 19:24
    
@AndreyVihrov, problem OP has is that \mathop converts a following \mathbin into a \mathord so loses the spacing. Hence I suggested \mathinner in my answer, even though it isn't really an inner operation. –  David Carlisle Mar 1 '12 at 19:29
add comment

1 Answer

up vote 7 down vote accepted

I didn't have the fonts so I changed the operator, but I think \mathinner does what you want here, puts some space before an ord, and doesn't stop a bin atom having bin spacing,

Top version in each of these:

enter image description here

\documentclass{article}
\usepackage{amsmath,amssymb}

\newcommand{\coerceSub}[3]{(\mathord{#1}{\smallfrown}\mathord{#2})_{#3}}

\begin{document}

In an operator application, the ``mathrel'' version looks better.
\begin{gather}
  % OK                                                                          
  \mathinner{\coerceSub uv1} x \\
  \mathrel{\coerceSub uv1} x \\
  % Not OK: no space between operator and operand                               
  \coerceSub uv1 x
\end{gather}

In an operator composition, the plain version looks better.
\begin{gather}
  \mathinner{\coerceSub uw1} \circ c \\
  % Not OK: no space between \circ and c                                        
  \mathrel{\coerceSub vw1} \circ c \\
  % OK                                                                          
  \coerceSub vw1 \circ c
\end{gather}

\end{document}
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.