Eingabe einspeisen
\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 einem der Werte pdflatex
, xelatex
, oder lualatex
führt zu einer Endlosschleife. Nun, im Fall vonXeLaTeX + Unicode-Mathematik geht in eine Endlosschleife, wenn \nin definiert ist? Sie können \notin
anstelle von verwenden \not\in
, aber was tun Sie, wenn Ihnen die Form von \models
(anstatt der von \vDash
) gefällt, Sie eine negierte Form davon möchten und es nennen möchten \nmodels
? Die Form von \nvDash
ist anders, daher ist es nicht ratsam, sowohl \models
als auch \nvDash
im selben Dokument zu verwenden. Die Verwendung (des gesamten) MnSymbols kommt nicht in Frage: Es kann immer noch Fehler enthalten (ich wusste vor etwa 10 Jahren, dass es welche gibt, und habe es dann nicht mehr verwendet), es ändert sich eine ganze Reihe von Symbolen und es kollidiert mit NewTX-Schriftarten.
Antwort1
Die aktuelle Implementierung von \not
macht im Wesentlichen dasselbe in pdflatex
wie in (Xe|Lua)LaTeX mit unicode-math
.
Genauer gesagt, \not
nimmt das nächste Token, sagen wir, \foo
und prüft zuerst, ob \notfoo
definiert ist; wenn der Test erfolgreich ist, \notfoo
wird verwendet. Andernfalls wird als nächstes geprüft, ob \nfoo
definiert ist. Auch hier gilt: Wenn dieser Test erfolgreich ist, \nfoo
wird verwendet. Andernfalls macht LaTeX \n@tch@r\foo
.
Jetzt sehen Sie, warum eine Endlosschleife gestartet wird: \nmodels
tut \not\models
; da \nmodels
definiert ist, wird es verwendet, was tut \not\models
…
Sie können das Problem vermeiden, indem Sie sich \not
an wenden \relax
(in der Hoffnung, dass weder \notrelax
noch \nrelax
definiert sind, 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}
Dies ist jedoch keine besonders gute Möglichkeit, zu negieren \models
. Vergleichen Sie mit dem 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}
Antwort2
Die Definition von „ \not
zu schlau werden“, indem man nachschlägt, ob „ \nmodels
oder“ \notmodels
bereits vorhanden ist.
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 durchgeführt, wenn das Symbol verwendet wird, und die Definition von \not
ist nicht vollständig erweiterbar. Sie können das Symbol daher nicht mit \let
„oder“ definieren \edef
und dies umgehen.
Sie können das Symbol jedoch \ooalign
stattdessen mit erstellen. (Verwenden Sie /
mit newtxmath
anstelle von \mathslash
.)
Klar, unicode-math
jetzt muss nach dem Präfix gesucht werden aint
.
Aktualisieren
\not
Sie können auch ohne Verwendung des Namens anrufen \models
und so die Suche verhindern. Beispiel:
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}