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 lualatex
provoca un bucle infinito. Bueno, en caso de¿XeLaTeX + Unicode-math entra en un bucle infinito si \nin está definido? puedes usar \notin
en 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 \nvDash
es diferente, por lo que no es recomendable utilizar ambos \models
y \nvDash
en 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 \not
hace esencialmente lo mismo pdflatex
que en (Xe|Lua)LaTeX con unicode-math
.
Más precisamente, \not
toma el siguiente token, por ejemplo, \foo
y primero comprueba si \notfoo
está definido; si la prueba tiene éxito, \notfoo
se utiliza. De lo contrario, la siguiente comprobación es si \nfoo
está definido. Nuevamente, si esta prueba tiene éxito, \nfoo
se utiliza. De lo contrario, LaTeX lo hace \n@tch@r\foo
.
Ahora ves por qué se inicia un bucle infinito: \nmodels
hace \not\models
; ya que \nmodels
se define, se usa, lo cual no \not\models
...
Puede evitar el problema solicitando \not
( \relax
con la esperanza de que ni \notrelax
ni \nrelax
esté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 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}
Respuesta2
La definición de \not
es volverse demasiado inteligente a la mitad al buscar si existe \nmodels
o \notmodels
ya 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 \not
no es completamente expandible, por lo que no puede definir el símbolo con \let
o \edef
y evitar esto.
Sin embargo, podrías crear el símbolo con \ooalign
en su lugar. (Usar /
con newtxmath
en lugar de \mathslash
.)
Claramente, unicode-math
ahora hay que buscar el prefijo aint
.
Actualizar
También puedes llamar \not
sin 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}