(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вызывает бесконечный цикл. Ну, в случаеXeLaTeX + unicode-math входит в бесконечный цикл, если определен \nin? вы можете использовать \notinвместо \not\in, но что делать, если вам нравится форма \models(а не форма \vDash), вы хотите отрицательную форму и хотите назвать ее \nmodels? Форма \nvDashотличается, поэтому не рекомендуется использовать \modelsи \nvDashв одном документе. Использование (всего) MnSymbols исключено: в нем все еще могут быть ошибки (я знал об этом около 10 лет назад и прекратил его использовать), он изменяет довольно много символов и конфликтует со шрифтами NewTX.

решение1

Текущая реализация \notпо сути делает то же самое, pdflatexчто и (Xe|Lua)LaTeX с unicode-math.

Точнее, \notберет следующий токен, скажем, \fooи сначала проверяет, \notfooопределен ли; если тест пройден успешно, \notfooиспользуется. В противном случае следующая проверка — \nfooопределен ли. Опять же, если этот тест пройден успешно, \nfooиспользуется. В противном случае LaTeX делает \n@tch@r\foo.

Теперь вы видите, почему запускается бесконечный цикл: \nmodelsdoes \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помощью . (Используйте /with 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}

Связанный контент