(unicode-math или newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = стойло
Кормление ввода
\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.
Ответы
Текущая реализация \notделает то же самое, pdflatexчто и в (Xe | Lua) LaTeX с unicode-math.
Точнее, \notберет следующий токен, скажем, \fooи сначала проверяет, \notfooопределен ли он; если проверка прошла успешно, \notfooиспользуется. В противном случае следующая проверка \nfoo- определено ли . Опять же, если этот тест прошел успешно, \nfooиспользуется. В противном случае это делает LaTeX \n@tch@r\foo.
Теперь вы понимаете, почему запускается бесконечный цикл: \nmodelsdoes \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}
Определение \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. (Используйте /с 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}