(unicode-math o newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = stallo
Nutrire l'input
\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 uno qualsiasi di pdflatex, xelatexo lualatexprovoca un ciclo infinito. Bene, in caso di XeLaTeX + unicode-math entra in un ciclo infinito se \ nin è definito? puoi usare al \notinposto di \not\in, ma cosa fai se ti piace la forma di \models(piuttosto che quella di \vDash), ne vuoi una forma negata e vuoi chiamarla \nmodels? La forma di \nvDashè diversa, quindi non è consigliabile utilizzare entrambi \modelse \nvDashnello stesso documento. Usare (l'intero) MnSymbols è fuori questione: potrebbe ancora avere bug (sapevo che aveva circa 10 anni fa e poi ho smesso di usarlo), cambia un bel po 'di simboli e si scontra con i caratteri NewTX.
Risposte
L'attuale implementazione di \notfa essenzialmente la stessa cosa pdflatexin (Xe | Lua) LaTeX con unicode-math.
Più precisamente, \notprende il gettone successivo, diciamo, \fooe prima controlla se \notfooè definito; se il test ha esito positivo, \notfooviene utilizzato. Altrimenti il controllo successivo è se \nfooè definito. Anche in questo caso, se questo test riesce, \nfooviene utilizzato. Altrimenti lo fa LaTeX \n@tch@r\foo.
Ora vedi perché viene avviato un ciclo infinito: \nmodelsdoes \not\models; poiché \nmodelsè definito, viene utilizzato, il che fa \not\models...
Puoi evitare il problema rivolgendoti \nota \relax(sperando che né \notrelaxné \nrelaxsono definiti, il che è improbabile).
\documentclass{standalone}
\usepackage{iftex}
\iftutex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
\newcommand{\nmodels}{\not\relax\models}%
\begin{document}
\(\nmodels\)
\(\not\models\)
\end{document}
Comunque, questo non è un modo particolarmente buono per negare \models. Confronta con quanto segue.
\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 definizione di \notsta diventando troppo intelligente della metà cercando se esiste \nmodelso \notmodelsgià esiste.
Funziona se cambi il 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}
Questa ricerca viene eseguita ogni volta che viene utilizzato il simbolo e la definizione di \notnon è completamente espandibile, quindi non è possibile definire il simbolo con \leto \edefed eludere questo.
Tuttavia, potresti creare il simbolo con \ooalign. (Utilizzare /con newtxmathinvece di \mathslash.)
Chiaramente, unicode-mathora deve cercare il prefisso aint.
Aggiornare
Puoi anche chiamare \notsenza usare il nome \models, impedendo la ricerca. Per esempio,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}