Подача входных данных
\RequirePackage{ifthen}
\RequirePackage{ifxetex,ifluatex}
\newif\ifxetexorluatex
\ifxetex
\xetexorluatextrue
\else
\ifluatex
\xetexorluatextrue
\else
\xetexorluatexfalse
\fi
\fi
\documentclass{standalone}
\ifxetexorluatex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
\newcommand{\nmodels}{\not\models}%%% or \providecommand, or \providecommand* instead of \newcommand; the effect is the same.
\begin{document}
\(\nmodels\) %%% or \(\not\models\); the effect is the same.
\end{document}
к любому из pdflatex
, xelatex
, или lualatex
вызывает бесконечный цикл. Ну, в случаеXeLaTeX + unicode-math входит в бесконечный цикл, если определен \nin? вы можете использовать \notin
вместо \not\in
, но что делать, если вам нравится форма \models
(а не форма \vDash
), вы хотите отрицательную форму и хотите назвать ее \nmodels
? Форма \nvDash
отличается, поэтому не рекомендуется использовать \models
и \nvDash
в одном документе. Использование (всего) MnSymbols исключено: в нем все еще могут быть ошибки (я знал об этом около 10 лет назад и прекратил его использовать), он изменяет довольно много символов и конфликтует со шрифтами NewTX.
решение1
Текущая реализация \not
по сути делает то же самое, pdflatex
что и (Xe|Lua)LaTeX с unicode-math
.
Точнее, \not
берет следующий токен, скажем, \foo
и сначала проверяет, \notfoo
определен ли; если тест пройден успешно, \notfoo
используется. В противном случае следующая проверка — \nfoo
определен ли. Опять же, если этот тест пройден успешно, \nfoo
используется. В противном случае LaTeX делает \n@tch@r\foo
.
Теперь вы видите, почему запускается бесконечный цикл: \nmodels
does \not\models
; поскольку \nmodels
определен, он используется, что делает \not\models
…
Вы можете избежать этой проблемы, обратившись \not
к \relax
(надеясь, что ни то \notrelax
, ни другое не \nrelax
определены, что маловероятно).
\documentclass{standalone}
\usepackage{iftex}
\iftutex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
\newcommand{\nmodels}{\not\relax\models}%
\begin{document}
\(\nmodels\)
\(\not\models\)
\end{document}
В любом случае, это не очень хороший способ отрицания \models
. Сравните со следующим.
\documentclass[border=4]{standalone}
\usepackage{iftex}
\iftutex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
\usepackage{centernot}
\newcommand{\nmodels}{\centernot\models}%
\begin{document}
\(\nmodels\)
\(\not\models\)
\end{document}
решение2
Определение — \not
это перемудрить, выясняя, существуют ли уже \nmodels
или .\notmodels
Это сработает, если вы измените имя:
\documentclass{standalone}
\usepackage{iftex}
\iftutex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
%\newcommand{\aintmodel}%
%{\mathrel{\ooalign{\(\models\)\cr\hidewidth\(\mathslash\)\hidewidth}}}
\newcommand\aintmodel{\not\models}
\begin{document}
\( \aintmodel \)
\end{document}
Этот поиск выполняется всякий раз, когда используется символ, а определение \not
не является полностью расширяемым, поэтому вы не можете определить символ с помощью \let
или \edef
и обойти это.
Однако вместо этого вы можете создать символ с \ooalign
помощью . (Используйте /
with newtxmath
вместо \mathslash
.)
Очевидно, unicode-math
теперь нужно искать префикс aint
.
Обновлять
Вы также можете позвонить, \not
не используя имя \models
, предотвращая поиск. Например,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}