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

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

Alimentando la entrada

\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 cualquiera de pdflatex, xelatex, o lualatexprovoca un bucle infinito. Bueno, en caso de¿XeLaTeX + Unicode-math entra en un bucle infinito si \nin está definido? puedes usar \notinen lugar de \not\in, pero ¿qué haces si te gusta la forma de \models(en lugar de la de \vDash), quieres una forma negada y quieres llamarlo \nmodels? La forma de \nvDashes diferente, por lo que no es recomendable utilizar ambos \modelsy \nvDashen el mismo documento. Usar (todo) MnSymbols está fuera de discusión: es posible que todavía tenga errores (sabía que los tenía hace unos 10 años y dejé de usarlos entonces), cambia bastantes símbolos y choca con las fuentes NewTX.

Respuesta1

La implementación actual de \nothace esencialmente lo mismo pdflatexque en (Xe|Lua)LaTeX con unicode-math.

Más precisamente, \nottoma el siguiente token, por ejemplo, \fooy primero comprueba si \notfooestá definido; si la prueba tiene éxito, \notfoose utiliza. De lo contrario, la siguiente comprobación es si \nfooestá definido. Nuevamente, si esta prueba tiene éxito, \nfoose utiliza. De lo contrario, LaTeX lo hace \n@tch@r\foo.

Ahora ves por qué se inicia un bucle infinito: \nmodelshace \not\models; ya que \nmodelsse define, se usa, lo cual no \not\models...

Puede evitar el problema solicitando \not( \relaxcon la esperanza de que ni \notrelaxni \nrelaxestén definidos, lo cual es poco probable).

\documentclass{standalone}
\usepackage{iftex}
\iftutex
  \usepackage{unicode-math}
\else
  \usepackage{newtxmath}
\fi

\newcommand{\nmodels}{\not\relax\models}%

\begin{document}

\(\nmodels\)

\(\not\models\)

\end{document}

ingrese la descripción de la imagen aquí

De todos modos, esta no es una manera particularmente buena de negar \models. Comparar con lo siguiente.

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

ingrese la descripción de la imagen aquí

Respuesta2

La definición de \notes volverse demasiado inteligente a la mitad al buscar si existe \nmodelso \notmodelsya existe.

Funciona si cambias el nombre:

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

Esta búsqueda se realiza siempre que se usa el símbolo y la definición de \notno es completamente expandible, por lo que no puede definir el símbolo con \leto \edefy evitar esto.

Sin embargo, podrías crear el símbolo con \ooalignen su lugar. (Usar /con newtxmathen lugar de \mathslash.)

Claramente, unicode-mathahora hay que buscar el prefijo aint.

Actualizar

También puedes llamar \notsin utilizar el nombre \models, evitando la búsqueda. Por ejemplo,

\documentclass{standalone}
\usepackage{iftex}

\usepackage{unicode-math}


\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}

\begin{document}
\( \nmodels \)
\end{document}

información relacionada