
Определение по умолчанию \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}