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

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

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, xelatexou lualatexcausa um loop infinito. Bem, no caso deXeLaTeX + unicode-math entra em loop infinito se \nin estiver definido? você pode usar \notinem 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 \modelse \nvDashno 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 \notfaz essencialmente o mesmo em pdflatex(Xe|Lua)LaTeX com unicode-math.

Mais precisamente, \notpega o próximo token, digamos \foo, e primeiro verifica se \notfooestá definido; se o teste for bem-sucedido, \notfooserá usado. Caso contrário, a próxima verificação é se \nfooestá definido. Novamente, se este teste for bem-sucedido, \nfooserá usado. Caso contrário, o LaTeX faz isso \n@tch@r\foo.

Agora você vê porque um loop infinito é iniciado: \nmodelsdoes \not\models; já que \nmodelsestá definido, é usado, o que faz \not\models

Você pode evitar o problema aplicando-se \nota \relax(esperando que nem \notrelaxestejam \nrelaxdefinidos, 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}

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

Responder2

A definição de \noté ficar muito inteligente pela metade ao verificar se já existe \nmodelsou \notmodelsnã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 \notnão é totalmente expansível, portanto, você não pode definir o símbolo com \letou \edefe evitar isso.

Você poderia, no entanto, criar o símbolo com \ooalign. (Use /com newtxmathem vez de \mathslash.)

Claramente, unicode-mathagora é necessário procurar o prefixo aint.

Atualizar

Você também pode ligar \notsem 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}

informação relacionada