Configurando corretamente o mathrel no símbolo negado com \NewNegationCommand

Configurando corretamente o mathrel no símbolo negado com \NewNegationCommand

A definição padrão de \not\modelsnão é satisfatória em relação ao espaçamento:

\documentclass{article}
\usepackage{unicode-math}
\begin{document}
$a\models b$

$a\not\models b$
\end{document}

espaçamento padrão

Acho que é porque falta um \mathrel: adicioná-lo manualmente dá um espaçamento correto. É claro que digitar isso todas as vezes não é aceitável, então estou tentando definir um método \notmodelspara fazer isso.

Descobri que o unicode-math faz algumas alterações no antigo \note fornece um arquivo \NewNegationCommand.

No entanto, o talvez ingênuo

\documentclass{article}
\usepackage{unicode-math}
\NewNegationCommand\models{\mathrel{\not\models}}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

dá:Capacidade do TeX excedida, desculpe [tamanho do ninho semântico = 500]. $a\notmodels

Suspeitando de uma recursão sem fim, tentei

\documentclass{article}
\usepackage{unicode-math}
\edef\ysnm{\not\models}
\NewNegationCommand\models{\mathrel{\ysnm}}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

mas dá:Faltando { inserido. $a\notmodels, o que considero bastante perturbador.

Terceira tentativa

\documentclass{article}
\usepackage{unicode-math}
\AtBeginDocument{
\newbox\boxnm
\setbox\boxnm=\hbox{$\not\models$}
\NewNegationCommand\models{\mathrel{\copy\boxnm}}
}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

funciona…

Mas acho isso muito intrigante.

Como posso sair disso de uma maneira melhor?

Responder1

Negar símbolos é uma dor de cabeça unicode-math. :-(Mas há uma saída.:-)

\documentclass{article}
\usepackage{unicode-math}

\Umathchardef\altnot=3 \symsymbols "0338

\NewNegationCommand{\models}{\models\mathrel{\mkern1mu}\altnot\mkern-1mu}

\begin{document}

$a\models b$

$a\not\models b$

$a\notmodels b$

\end{document}

A sintaxe para \NewNegatedCommandé

\NewNegatedCommand{\foo}{<code>}

onde \fooestá o símbolo da relação a ser negado. Isso define a combinação \not\fooe o comando \notfoo.

Aqui eu uso um pequeno kern para evitar o choque.

insira a descrição da imagem aqui

A propósito, isso parece ser um bug no XeTeX for \mathoverlayaccent, porque a combinação \not\modelsfunciona em LuaLaTeX (embora dando espaçamento errado), o que poderia ser curado com

\NewNegationCommand{\models}{\mathrel{\notaccent\models}}

mas o resultado não é tão satisfatório

insira a descrição da imagem aqui

A solução \altnotfunciona com XeLaTeX e LuaLaTeX.

Responder2

Não pergunte por que, mas o seguinte funciona (que basicamente faz uma expansão manualmente):

\documentclass{article}
\usepackage{unicode-math}
\NewNegationCommand{\models}{\mathrel{\not⊧}}
\begin{document}
$a\models b$

$a\notmodels b$
\end{document}

informação relacionada