入力の供給
\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
基本的に同じことを行います。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
。(の代わり/
に を使用してください。)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}