Alimentando a 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}
para qualquer um de pdflatex
, xelatex
ou lualatex
causa um loop infinito. Bem, no caso deXeLaTeX + unicode-math entra em loop infinito se \nin estiver definido? você pode usar \notin
em vez de \not\in
, mas o que fazer se gostar da forma de \models
(em vez da de \vDash
), quiser uma forma negada e quiser chamá-la de \nmodels
? A forma \nvDash
é diferente, portanto, não é aconselhável utilizar ambos \models
e \nvDash
no mesmo documento. Usar (todos) MnSymbols está fora de questão: ele ainda pode ter bugs (eu sabia que tinha há cerca de 10 anos e parei de usá-lo naquela época), altera alguns símbolos e entra em conflito com as fontes NewTX.
Responder1
A implementação atual de \not
faz essencialmente o mesmo em pdflatex
(Xe|Lua)LaTeX com unicode-math
.
Mais precisamente, \not
pega o próximo token, digamos \foo
, e primeiro verifica se \notfoo
está definido; se o teste for bem-sucedido, \notfoo
será usado. Caso contrário, a próxima verificação é se \nfoo
está definido. Novamente, se este teste for bem-sucedido, \nfoo
será usado. Caso contrário, o LaTeX faz isso \n@tch@r\foo
.
Agora você vê porque um loop infinito é iniciado: \nmodels
does \not\models
; já que \nmodels
está definido, é usado, o que faz \not\models
…
Você pode evitar o problema aplicando-se \not
a \relax
(esperando que nem \notrelax
estejam \nrelax
definidos, o que é improvável).
\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 qualquer forma, esta não é uma maneira particularmente boa de negar \models
. Compare com o seguinte.
\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}
Responder2
A definição de \not
é ficar muito inteligente pela metade ao verificar se já existe \nmodels
ou \notmodels
não.
Funciona se você alterar o 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}
Essa pesquisa é realizada sempre que o símbolo é usado e a definição de \not
não é totalmente expansível, portanto, você não pode definir o símbolo com \let
ou \edef
e evitar isso.
Você poderia, no entanto, criar o símbolo com \ooalign
. (Use /
com newtxmath
em vez de \mathslash
.)
Claramente, unicode-math
agora é necessário procurar o prefixo aint
.
Atualizar
Você também pode ligar \not
sem usar o nome \models
, evitando a consulta. Por exemplo,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}