(unicode-math 或 newtxmath)+ \newcommand{\nmodels}{\not\models} + $\not\models$ = 失速

(unicode-math 或 newtxmath)+ \newcommand{\nmodels}{\not\models} + $\not\models$ = 失速

提供输入

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

pdflatex至、xelatex或中的任意一项lualatex都会导致无限循环。那么,如果如果定义了 \nin,XeLaTeX + unicode-math 是否会进入无限循环? 您可以使用\notin代替\not\in,但是如果您喜欢 的形状\models(而不是 的形状\vDash),想要它的否定形式,并想将其称为 ,该怎么办\nmodels? 的形式\nvDash不同,因此,不建议在同一文档中同时使用\models\nvDash。使用(整个)MnSymbols 是不可能的:它可能仍然有错误(我知道它 10 年前有一些,然后停止使用它),更改了相当多的符号,并且与 NewTX 字体冲突。

答案1

的当前实现与 (Xe|Lua)LaTeX 中的\not实现基本相同。pdflatexunicode-math

更准确地说,\not取下一个标记,比如说\foo,首先检查是否\notfoo定义;如果测试成功,\notfoo则使用。否则,下一个检查是是否\nfoo定义。同样,如果这个测试成功,\nfoo则使用。否则 LaTeX 会执行\n@tch@r\foo

现在您知道为什么会启动无限循环了:\nmodels确实\not\models;由于\nmodels已定义,因此会使用它,从而执行\not\models...

\not您可以通过应用来避免此问题\relax(希望都没有\notrelax定义\nrelax,但这不太可能)。

\documentclass{standalone}
\usepackage{iftex}
\iftutex
  \usepackage{unicode-math}
\else
  \usepackage{newtxmath}
\fi

\newcommand{\nmodels}{\not\relax\models}%

\begin{document}

\(\nmodels\)

\(\not\models\)

\end{document}

在此处输入图片描述

无论如何,这不是一个特别好的否定方法\models。与以下内容进行比较。

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

在此处输入图片描述

答案2

的定义\not是通过查找\nmodels或是否\notmodels已经存在而变得聪明起来的。

如果你更改名称,它就会起作用:

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

只要使用该符号就会执行此查找,并且的定义\not不是完全可扩展的,因此您无法使用\let或定义该符号\edef并回避这一点。

但是,您也可以用 创建符号\ooalign。(使用/withnewtxmath代替\mathslash。)

显然,unicode-math现在需要搜索前缀aint

更新

您也可以\not在不使用名称的情况下进行调用\models,从而阻止查找。例如,

\documentclass{standalone}
\usepackage{iftex}

\usepackage{unicode-math}


\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}

\begin{document}
\( \nmodels \)
\end{document}

相关内容