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

pdflatexxelatex、 或中的任何一個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

現在你明白為什麼啟動無限循環了:\nmodelsdoes \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不可完全擴展,因此您不能使用\letor定義符號\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}

相關內容