(unicode-math o newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = puesto
Alimentando la 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}
a cualquiera de pdflatex, xelatexo lualatexprovoca un bucle infinito. Bueno, en el caso de XeLaTeX + unicode-math entra en un bucle infinito si \ nin está definido? puedes usar en \notinlugar de \not\in, pero ¿qué haces si te gusta la forma de \models(en lugar de la de \vDash), quieres una forma negada y quieres llamarlo \nmodels? La forma de \nvDashes diferente, así, no es recomendable utilizar tanto \modelsy \nvDashen el mismo documento. Usar (la totalidad de) MnSymbols está fuera de discusión: todavía puede tener errores (sabía que tenía hace unos 10 años y dejé de usarlo entonces), cambia bastantes símbolos y choca con las fuentes NewTX.
Respuestas
La implementación actual de \nothace esencialmente lo mismo pdflatexen (Xe | Lua) LaTeX con unicode-math.
Más precisamente, \nottoma el siguiente token, digamos \fooy primero verifica si \notfooestá definido; si la prueba tiene éxito, \notfoose utiliza. De lo contrario, la siguiente comprobación es si \nfooestá definido. Nuevamente, si esta prueba tiene éxito, \nfoose utiliza. De lo contrario, LaTeX lo hace \n@tch@r\foo.
Ahora ve por qué se inicia un bucle infinito: \nmodelsdoes \not\models; ya que \nmodelsse define, se usa, lo que hace \not\models...
Puede evitar el problema solicitando \nota \relax(esperando que ni \notrelaxni \nrelaxestén definidos, lo cual es poco probable).
\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 todos modos, esta no es una forma particularmente buena de negar \models. Compare con lo siguiente.
\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}
La definición de \notes volverse demasiado inteligente a la mitad al buscar si existe \nmodelso \notmodelsya existe.
Funciona si cambia el nombre:
\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}
Esta búsqueda se realiza siempre que se usa el símbolo, y la definición de \notno es completamente expandible, por lo que no puede definir el símbolo con \leto \edefy eludir esto.
Sin embargo, podría crear el símbolo con \ooalign. (Use /con en newtxmathlugar de \mathslash).
Claramente, unicode-mathahora necesita buscar el prefijo aint.
Actualizar
También puede llamar \notsin usar el nombre \models, evitando la búsqueda. Por ejemplo,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}