(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両方を使用することはお勧めできません。 MnSymbols (の全体) を使うのは論外です。まだバグがある可能性があり (10 年ほど前にバグがあることは知っていたのですが、それ以降は使用しなくなりました)、かなりの数の記号が変更され、NewTX フォントと衝突します。\models\nvDash

答え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。(の代わり/に を使用してください。)newtxmath\mathslash

明らかに、unicode-math接頭辞を検索する必要がありますaint

アップデート

\not名前を使わずに呼び出して\models、検索を防ぐこともできます。たとえば、

\documentclass{standalone}
\usepackage{iftex}

\usepackage{unicode-math}


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

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

関連情報