Правильная установка mathrel на отрицательный символ с помощью \NewNegationCommand

Правильная установка mathrel на отрицательный символ с помощью \NewNegationCommand

Определение по умолчанию \not\modelsнеудовлетворительно с точки зрения интервала:

\documentclass{article}
\usepackage{unicode-math}
\begin{document}
$a\models b$

$a\not\models b$
\end{document}

дает

интервал по умолчанию

Я думаю, это потому, что ему не хватает \mathrel: добавление его вручную дает правильный интервал. Конечно, печатать это каждый раз неприемлемо, поэтому я пытаюсь определить , \notmodelsчтобы сделать это.

Я обнаружил, что unicode-math вносит некоторые изменения в старый формат \notи предоставляет \NewNegationCommand.

Однако, возможно, наивный

\documentclass{article}
\usepackage{unicode-math}
\NewNegationCommand\models{\mathrel{\not\models}}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

дает:Превышена емкость TeX, извините [размер семантического гнезда=500]. $a\notmodels

Подозревая бесконечную рекурсию, я попробовал

\documentclass{article}
\usepackage{unicode-math}
\edef\ysnm{\not\models}
\NewNegationCommand\models{\mathrel{\ysnm}}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

но это дает:Отсутствует { вставлено. $a\notmodels, что меня весьма тревожит.

Третья попытка

\documentclass{article}
\usepackage{unicode-math}
\AtBeginDocument{
\newbox\boxnm
\setbox\boxnm=\hbox{$\not\models$}
\NewNegationCommand\models{\mathrel{\copy\boxnm}}
}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

работает…

Но я нахожу это весьма загадочным.

Как мне выбраться из этой ситуации наилучшим образом?

решение1

Отрицание символов — это больно с unicode-math. :-(Но есть выход.:-)

\documentclass{article}
\usepackage{unicode-math}

\Umathchardef\altnot=3 \symsymbols "0338

\NewNegationCommand{\models}{\models\mathrel{\mkern1mu}\altnot\mkern-1mu}

\begin{document}

$a\models b$

$a\not\models b$

$a\notmodels b$

\end{document}

Синтаксис для \NewNegatedCommandэтого:

\NewNegatedCommand{\foo}{<code>}

где \foo— символ отношения, который нужно отрицать. Это определяет как комбинацию, \not\fooтак и команду \notfoo.

Здесь я использую небольшой керн, чтобы избежать конфликта.

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

Кстати, похоже, это ошибка в XeTeX для \mathoverlayaccent, потому что эта комбинация \not\modelsработает в LuaLaTeX (хотя и дает неправильный интервал), которую можно исправить с помощью

\NewNegationCommand{\models}{\mathrel{\notaccent\models}}

но результат не такой удовлетворительный

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

Решение \altnotработает как с XeLaTeX, так и с LuaLaTeX.

решение2

Не спрашивайте почему, но следующее работает (что по сути делает одно расширение вручную):

\documentclass{article}
\usepackage{unicode-math}
\NewNegationCommand{\models}{\mathrel{\not⊧}}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

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