
Рассмотрим $a \triangleright b$
и $a \overline{\triangleright} b$
. Они ведут себя совершенно по-разному с точки зрения интервала:
Почему? Как это исправить?
решение1
Команда \triangleright
представляет собой так называемый бинарный оператор. LaTeX обрабатывает эти бинарные операторы таким образом, что перед ними и после них устанавливается небольшой горизонтальный пробел. Здесь произошло то, что вы обернули эту команду в какую-то другую команду, которая скрывает эту функцию. Вы можете увидеть тот же эффект, если просто попробуете $a+b{+}c$
.
Поэтому вам придется снова сделать вашу конструкцию бинарным оператором, заключив ее в команду \mathbin
:
% arara: pdflatex
\documentclass{article}
\newcommand*{\oltriangleright}{\mathbin{\overline\triangleright}}
\begin{document}
$a \triangleright b$ and $a \oltriangleright b$
\end{document}
Что означает этот символ? Если у вас есть ссылка, вы можете порекомендовать его unicode.
решение2
Каждый объект в математическом наборе имеет один из классов: 0=Ord, 1=Op, 2=Bin, 3=Rel, 4=Open, 5=Close, 6=Punct. Этот класс влияет на горизонтальные пробелы (автоматически вставляемые между объектами). Элементарные объекты в математическом наборе обычно объявляются примитивными \mathchardef
(для управляющих последовательностей) или \mathcode
(для собственных кодов). \mathode
of a
и b
объявляются как класс Ord, а triangleright объявляется как
\mathchardef\triangleright="212E
что означает class=2=Bin, family=1, fontcode=2E. Самым важным (на данный момент) является класс Bin. Последовательность a\triangleright b
— «Ord Bin Ord», и это влияет на правые горизонтальные пространства. Все сложнее, но основной принцип показан здесь.
Теперь самое важное то, что фигурные скобки (типа {\triangleright}
) или другие конструкции (типа \overline{\triangleright}
) создают составной объект в классе Ord. Итак, у нас есть Ord Ord Ord
в нашем примере и это не вставляет пробелы между ними. Но есть примитивы перетипизации классов \mathord
, \mathop
, \mathbin
, \mathrel
, \mathopen
, \mathclose
и \mathpunct
которые генерируют объект данного класса. Итак
a \mathbin{\overline{\triangleright}} b
дает последовательность «Ord Bin Ord», и это влияет на правильный интервал.
решение3
Вы можете получить правильный интервал, используя модифицированную версию, \overline
которая использует ту же инфраструктуру, что и \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}
Инструкция \binrel@
определяет, является ли аргумент бинарной операцией или символом отношения, и устанавливает \binrel@@
значение \mathbin
или \mathrel
соответственно; если тип определить невозможно, устанавливается значение \mathord
.