提供输入
\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
实现基本相同。pdflatex
unicode-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}