饋送輸入
\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
does \not\models
;既然\nmodels
被定義了,就被使用,這\not\models
......
\not
您可以透過應用to 來避免此問題\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
or定義符號\edef
並迴避它。
但是,您可以使用以下命令建立符號\ooalign
。 (使用/
withnewtxmath
代替\mathslash
。)
顯然,unicode-math
現在需要搜尋前綴aint
。
更新
您也可以\not
不使用 name 進行調用\models
,從而防止查找。例如,
\documentclass{standalone}
\usepackage{iftex}
\usepackage{unicode-math}
\newcommand\nmodels{\mathrel{\not\symbol{"22A7}}}
\begin{document}
\( \nmodels \)
\end{document}