(unicode-math lub newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = przeciągnięcie

Sep 16 2020

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

4 egreg Sep 16 2020 at 15:10

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}

4 Davislor Sep 16 2020 at 10:55

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}