(unicode-math lub newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = przeciągnięcie
Karmienie wejścia
\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}
któregokolwiek z pdflatex, xelatexlub lualatexpowoduje nieskończonej pętli. Cóż, w przypadku XeLaTeX + unicode-math wchodzi w nieskończoną pętlę, jeśli zdefiniowano \ nin? możesz użyć \notinzamiast \not\in, ale co zrobić, jeśli podoba ci się kształt \models(a nie kształt \vDash), chcesz mieć jego zanegowaną formę i chcesz to nazwać \nmodels? Forma \nvDashjest inna, dlatego nie zaleca się używania obu \modelsi \nvDashw tym samym dokumencie. Używanie (całości) MnSymbols jest wykluczone: może nadal zawierać błędy (wiedziałem, że ma jakieś 10 lat temu i przestałem go wtedy używać), zmienia sporo symboli i koliduje z czcionkami NewTX.
Odpowiedzi
Obecna implementacja \notrobi zasadniczo to samo, pdflatexco w (Xe | Lua) LaTeX z unicode-math.
Dokładniej, \notpobiera następny token, powiedzmy \fooi najpierw sprawdza, czy \notfoojest zdefiniowany; jeśli test się powiedzie, \notfoojest używany. W przeciwnym razie następnym sprawdzeniem jest, czy \nfoozdefiniowano. Ponownie, jeśli ten test się powiedzie, \nfoojest używany. W przeciwnym razie LaTeX tak \n@tch@r\foo.
Teraz widzisz, dlaczego rozpoczyna się nieskończona pętla: \nmodelsnie \not\models; ponieważ \nmodelsjest zdefiniowane, jest używane, co powoduje \not\models…
Możesz uniknąć problemu, składając wniosek \notdo \relax(mając nadzieję, że ani \notrelaxnie \nrelaxsą zdefiniowane, co jest mało prawdopodobne).
\documentclass{standalone}
\usepackage{iftex}
\iftutex
\usepackage{unicode-math}
\else
\usepackage{newtxmath}
\fi
\newcommand{\nmodels}{\not\relax\models}%
\begin{document}
\(\nmodels\)
\(\not\models\)
\end{document}
W każdym razie nie jest to szczególnie dobry sposób na zaprzeczanie \models. Porównaj z poniższymi.
\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}
Definicja \notstaje się zbyt sprytna o połowę, sprawdzając, czy istnieje \nmodelslub \notmodelsjuż istnieje.
Działa, jeśli zmienisz nazwę:
\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}
To wyszukiwanie jest wykonywane za każdym razem, gdy symbol jest używany, a definicja \notnie jest w pełni rozwijana, więc nie można zdefiniować symbolu za pomocą \letlub \edefi ominąć tego.
Możesz jednak utworzyć symbol za pomocą \ooalign. (Użyj /z newtxmathzamiast \mathslash.)
Oczywiście, unicode-mathteraz trzeba wyszukać przedrostek aint.
Aktualizacja
Możesz także zadzwonić \notbez używania nazwy \models, uniemożliwiając wyszukiwanie. Na przykład,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}