(unicode-math or newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = kios

Sep 16 2020

Memberi makan masukan

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

ke salah pdflatex, xelatexatau lualatexpenyebab loop tak terbatas. Nah, dalam kasus XeLaTeX + unicode-math memasuki loop tak terbatas jika \ nin didefinisikan? Anda dapat menggunakan \notinalih-alih \not\in, tetapi apa yang Anda lakukan jika Anda menyukai bentuk \models(bukan dari \vDash), menginginkan bentuk yang dinegasikan, dan ingin menyebutnya \nmodels? Bentuknya \nvDashberbeda-beda, jadi tidak disarankan untuk menggunakan keduanya \modelsdan \nvDashdalam dokumen yang sama. Menggunakan (keseluruhan) MnSymbols tidak perlu dipertanyakan: mungkin masih ada bug (saya tahu itu sudah 10 tahun yang lalu dan kemudian berhenti menggunakannya), mengubah beberapa simbol, dan bentrok dengan font NewTX.

Jawaban

4 egreg Sep 16 2020 at 15:10

Implementasi saat \notini pada dasarnya sama pdflatexseperti di (Xe | Lua) LaTeX dengan unicode-math.

Lebih tepatnya, \notmengambil token berikutnya, katakanlah \foodan cek pertama apakah \notfoosudah ditentukan; jika tes berhasil, \notfoodigunakan. Jika tidak, pemeriksaan berikutnya adalah apakah \nfoosudah ditentukan. Sekali lagi, jika tes ini berhasil, \nfoodigunakan. Jika tidak, LaTeX melakukannya \n@tch@r\foo.

Sekarang Anda melihat mengapa loop tak terbatas dimulai: \nmodelstidak \not\models; karena \nmodelsditentukan, digunakan, yang \not\models…

Anda dapat menghindari masalah ini dengan menerapkan \notke \relax(berharap bahwa baik \notrelaxatau \nrelaxdidefinisikan, yang tidak mungkin).

\documentclass{standalone}
\usepackage{iftex}
\iftutex
  \usepackage{unicode-math}
\else
  \usepackage{newtxmath}
\fi

\newcommand{\nmodels}{\not\relax\models}%

\begin{document}

\(\nmodels\)

\(\not\models\)

\end{document}

Bagaimanapun, ini bukanlah cara yang baik untuk meniadakan \models. Bandingkan dengan berikut ini.

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

4 Davislor Sep 16 2020 at 10:55

Definisi \notmenjadi terlalu pintar setengah dengan mencari tahu apakah sudah ada \nmodelsatau \notmodelssudah.

Ini berfungsi jika Anda mengubah nama:

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

Pencarian ini dilakukan setiap kali simbol digunakan, dan definisi \nottidak dapat diperluas sepenuhnya, jadi Anda tidak dapat menentukan simbol dengan \letatau \edefdan menghindari ini.

Namun, Anda dapat membuat simbol dengan \ooalign. (Gunakan /dengan newtxmathalih - alih \mathslash.)

Jelas, unicode-mathsekarang perlu mencari awalan aint.

Memperbarui

Anda juga dapat menelepon \nottanpa menggunakan nama \models, mencegah pencarian. Sebagai contoh,

\documentclass{standalone}
\usepackage{iftex}

\usepackage{unicode-math}


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

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