(Unicode-Mathe oder Newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = Stall
Eingabe füttern
\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}
zu einer von pdflatex, xelatexoder lualatexverursacht eine Endlosschleife. Nun, im Fall von XeLaTeX + tritt Unicode-Mathematik in die Endlosschleife ein, wenn \ nin definiert ist? Sie können \notinanstelle von verwenden \not\in, aber was tun Sie, wenn Sie die Form von \models(und nicht die von \vDash) mögen , eine negierte Form davon möchten und es nennen möchten \nmodels? Die Form von \nvDashist unterschiedlich, daher ist es nicht ratsam, beide \modelsund \nvDashdasselbe Dokument zu verwenden. Die Verwendung von (der gesamten) MnSymbols kommt nicht in Frage: Es kann immer noch Fehler geben (ich wusste, dass dies vor etwa 10 Jahren der Fall war und die Verwendung dann eingestellt wurde), einige Symbole ändern und mit NewTX-Schriftarten kollidieren.
Antworten
Die aktuelle Implementierung von \notfunktioniert im Wesentlichen genauso pdflatexwie in (Xe | Lua) LaTeX mit unicode-math.
Genauer gesagt, \notnimmt das nächste Token \foound prüft zuerst, ob \notfooes definiert ist. Wenn der Test erfolgreich ist, \notfoowird verwendet. Ansonsten ist die nächste Prüfung, ob \nfoodefiniert ist. Wenn dieser Test erfolgreich ist, \nfoowird er erneut verwendet. Ansonsten tut LaTeX \n@tch@r\foo.
Jetzt sehen Sie, warum eine Endlosschleife gestartet wird: \nmodelsdoes \not\models; da \nmodelsdefiniert ist, wird es verwendet, was \not\models…
Sie können durch die Anwendung das Problem zu vermeiden , \notum \relax( in der Hoffnung , dass weder \notrelaxnoch \nrelaxdefiniert werden, was unwahrscheinlich ist).
\documentclass{standalone}
\usepackage{iftex}
\iftutex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
\newcommand{\nmodels}{\not\relax\models}%
\begin{document}
\(\nmodels\)
\(\not\models\)
\end{document}
Auf jeden Fall ist dies kein besonders guter Weg, um zu negieren \models. Vergleichen Sie mit den folgenden.
\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}
Die Definition von \notwird um die Hälfte zu klug, wenn nachgeschlagen wird, ob es sie gibt \nmodelsoder \notmodelsbereits.
Es funktioniert, wenn Sie den Namen ändern:
\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}
Diese Suche wird immer dann ausgeführt, wenn das Symbol verwendet wird und die Definition von \notnicht vollständig erweiterbar ist. Sie können das Symbol daher nicht mit \letoder definieren \edefund dies umgehen.
Sie können jedoch \ooalignstattdessen das Symbol mit erstellen . (Verwenden Sie /mit newtxmathanstelle von \mathslash.)
Klar muss unicode-mathjetzt nach dem Präfix gesucht werden aint.
Aktualisieren
Sie können auch anrufen, \notohne den Namen zu verwenden \models, um die Suche zu verhindern. Beispielsweise,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}