
Considere $a \triangleright b$
y $a \overline{\triangleright} b$
. Se comportan completamente diferentes en términos de espaciado:
¿Por qué? ¿Cómo arreglo eso?
Respuesta1
El comando \triangleright
es el llamado operador binario. LaTeX trata estos operadores binarios de manera que se establece un pequeño espacio horizontal antes y después de ellos. Lo que sucedió aquí es que envolvió este comando en algún otro comando que oculta esta característica. Puedes ver el mismo efecto si lo intentas $a+b{+}c$
.
Por lo tanto, tendrás que volver a convertir tu construcción en un operador binario envolviéndola en el comando \mathbin
:
% arara: pdflatex
\documentclass{article}
\newcommand*{\oltriangleright}{\mathbin{\overline\triangleright}}
\begin{document}
$a \triangleright b$ and $a \oltriangleright b$
\end{document}
¿Qué significa este símbolo? Si tiene alguna referencia, puede recomendarla a Unicode.
Respuesta2
Cada objeto en la composición tipográfica matemática tiene una de las clases: 0=Ord, 1=Op, 2=Bin, 3=Rel, 4=Open, 5=Close, 6=Punct. Esta clase influye en los espacios horizontales (insertados automáticamente entre objetos). Los objetos elementales en la composición tipográfica matemática suelen declararse mediante \mathchardef
primitivos (para secuencias de control) o \mathcode
(para códigos nativos). Los \mathode
de a
y b
se declaran como clase Ord y el triángulo derecho se declara como
\mathchardef\triangleright="212E
lo que significa clase=2=Bin, familia=1, código de fuente=2E. La más importante (por ahora) es la clase Bin. La secuencia a\triangleright b
es "Ord Bin Ord" y esto influye en los espacios horizontales derechos. Las cosas son más complicadas, pero aquí se muestra el principio básico.
Ahora, lo más importante es el hecho de que las llaves (como {\triangleright}
) u otras construcciones (como \overline{\triangleright}
) crean el objeto compuesto en la clase Ord. Entonces, en nuestro ejemplo tenemos Ord Ord Ord
y esto no inserta espacios entre ellos. Pero hay primitivas de reescritura de clases \mathord
, \mathop
, \mathbin
, \mathrel
, \mathopen
y que generan el objeto de una clase determinada. Entonces\mathclose
\mathpunct
a \mathbin{\overline{\triangleright}} b
da la secuencia "Ord Bin Ord" y esto influye en el espaciado correcto.
Respuesta3
Puede obtener el espaciado correcto utilizando una versión modificada \overline
que utiliza la misma infraestructura que \overset
:
\documentclass{article}
\usepackage{amsmath,amssymb}
\makeatletter
\DeclareRobustCommand{\coverline}[1]{% clever overline
\binrel@{#1}\binrel@@{\overline{#1}}%
}
\makeatother
\begin{document}
$a\coverline{<}b$
$a<b$
$a\coverline{\triangleright} b$
$a\triangleright b$
\end{document}
La instrucción \binrel@
determina si el argumento es una operación binaria o un símbolo de relación y lo establece \binrel@@
en significar \mathbin
o \mathrel
en consecuencia; si no se puede determinar el tipo, se establece en \mathord
.