(unicode-math o newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = stallo

Sep 16 2020

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

4 egreg Sep 16 2020 at 15:10

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é \notrelax\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}

4 Davislor Sep 16 2020 at 10:55

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}