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

Sep 16 2020

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, xelatexo lualatexprovoca un bucle infinito. Bueno, en el caso de XeLaTeX + unicode-math entra en un bucle infinito si \ nin está definido? puedes usar en \notinlugar 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, así, no es recomendable utilizar tanto \modelsy \nvDashen el mismo documento. Usar (la totalidad de) MnSymbols está fuera de discusión: todavía puede tener errores (sabía que tenía hace unos 10 años y dejé de usarlo entonces), cambia bastantes símbolos y choca con las fuentes NewTX.

Respuestas

4 egreg Sep 16 2020 at 15:10

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

Más precisamente, \nottoma el siguiente token, digamos \fooy primero verifica 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 ve por qué se inicia un bucle infinito: \nmodelsdoes \not\models; ya que \nmodelsse define, se usa, lo que hace \not\models...

Puede evitar el problema solicitando \nota \relax(esperando 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}

De todos modos, esta no es una forma particularmente buena de negar \models. Compare 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}

4 Davislor Sep 16 2020 at 10:55

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

Funciona si cambia 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 eludir esto.

Sin embargo, podría crear el símbolo con \ooalign. (Use /con en newtxmathlugar de \mathslash).

Claramente, unicode-mathahora necesita buscar el prefijo aint.

Actualizar

También puede llamar \notsin usar 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}