(unicode-math ou newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = stall
Alimentando a entrada
\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}
para qualquer um de pdflatex, xelatexou lualatexcausa um loop infinito. Bem, no caso de XeLaTeX + unicode-math entra em loop infinito se \ nin é definido? você pode usar em \notinvez de \not\in, mas o que você faz se gosta da forma de \models(em vez de \vDash), quer uma forma negada dela e deseja chamá-la \nmodels? A forma de \nvDashé diferente, portanto, não é aconselhável usar os dois \modelse \nvDashno mesmo documento. Usar (todos) MnSymbols está fora de questão: ele ainda pode ter bugs (eu sabia que tinha há cerca de 10 anos e parei de usá-lo na época), muda alguns símbolos e colide com fontes NewTX.
Respostas
A implementação atual de \notfaz essencialmente o mesmo pdflatexem (Xe | Lua) LaTeX com unicode-math.
Mais precisamente, \notpega o próximo token, digamos \fooe primeiro verifica se \notfooestá definido; se o teste for bem-sucedido, \notfooserá usado. Caso contrário, a próxima verificação é se \nfooestá definido. Novamente, se este teste for bem-sucedido, \nfooserá usado. Caso contrário, o LaTeX o faz \n@tch@r\foo.
Agora você vê por que um loop infinito é iniciado: \nmodelsfaz \not\models; uma vez que \nmodelsé definido, é usado, o que faz \not\models...
Você pode evitar o problema aplicando-se \nota \relax(esperando que nem \notrelaxnem \nrelaxsejam definidos, o que é improvável).
\documentclass{standalone}
\usepackage{iftex}
\iftutex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
\newcommand{\nmodels}{\not\relax\models}%
\begin{document}
\(\nmodels\)
\(\not\models\)
\end{document}
De qualquer forma, essa não é uma maneira particularmente boa de negar \models. Compare com o seguinte.
\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}
A definição de \notestá ficando muito inteligente pela metade ao verificar se existe \nmodelsou \notmodelsjá existe.
Funciona se você alterar o nome:
\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}
Essa pesquisa é realizada sempre que o símbolo é usado e a definição de \notnão é totalmente expansível, portanto, você não pode definir o símbolo com \letou \edefe contornar isso.
Você pode, no entanto, criar o símbolo com \ooalign. (Use /com em newtxmathvez de \mathslash.)
Claramente, unicode-mathagora precisa procurar o prefixo aint.
Atualizar
Você também pode ligar \notsem usar o nome \models, evitando a consulta. Por exemplo,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}