使用 \NewNegationCommand 正确设置否定符号上的 mathrel

使用 \NewNegationCommand 正确设置否定符号上的 mathrel

对于间距 ,的默认定义\not\models不令人满意:

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

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

给出

default spacing

我认为这是因为它缺少一个\mathrel:手动添加它可以得到正确的间距。当然每次都输入这个是不可接受的,所以我尝试定义一个\notmodels来做到这一点。

我发现 unicode-math 对旧的做了一些改变\not并提供了一个\NewNegationCommand

然而,也许有些天真

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

$a\notmodels b$
\end{document}

得到:TeX 容量超出,抱歉 [语义嵌套大小=500]。$a\notmodels

由于怀疑存在无休止的递归,我尝试了

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

$a\notmodels b$
\end{document}

但它给出了:缺少 { 插入。$a\notmodels,我发现这非常令人不安。

第三次尝试

\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}

作品…

但我发现这很令人费解。

我怎样才能更好地摆脱这种困境?

答案1

使用 来否定符号是一件痛苦的事unicode-math:-(不过有办法。:-)

\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}

语法\NewNegatedCommand

\NewNegatedCommand{\foo}{<code>}

其中\foo是需要否定的关系符号。这定义了组合\not\foo和命令\notfoo

在这里我使用了较小的字距以避免冲突。

enter image description here

顺便说一句,这似乎是 XeTeX 中的一个错误\mathoverlayaccent,因为该组合\not\models在 LuaLaTeX 中有效(尽管给出了错误的间距),可以使用

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

但结果并不令人满意

enter image description here

该解决方案\altnot适用于 XeLaTeX 和 LuaLaTeX。

答案2

不要问为什么,但以下有效(基本上手动进行一次扩展):

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

$a\notmodels b$
\end{document}

相关内容