Почему \overline портит интервал?

Почему \overline портит интервал?

Рассмотрим $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(для собственных кодов). \mathodeof 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.

введите описание изображения здесь

Связанный контент