(unicode-math ou newtxmath) + \ newcommand {\ nmodels} {\ not \ models} + $\not\models$ = décrochage

Sep 16 2020

Nourrir l'entrée

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

à l'un des pdflatex, xelatexou lualatexprovoque une boucle infinie. Eh bien, dans le cas de XeLaTeX + unicode-math entre en boucle infinie si \ nin est défini? vous pouvez utiliser à la \notinplace de \not\in, mais que faites-vous si vous aimez la forme de \models(plutôt que celle de \vDash), voulez une forme niée de celle-ci et voulez l'appeler \nmodels? La forme de \nvDashest différente, il est donc déconseillé d'utiliser les deux \modelset \nvDashdans le même document. Utiliser (l'ensemble de) MnSymbols est hors de question: il peut encore avoir des bugs (je savais qu'il y avait environ 10 ans et j'ai arrêté de l'utiliser à ce moment-là), change pas mal de symboles et se heurte aux polices NewTX.

Réponses

4 egreg Sep 16 2020 at 15:10

L'implémentation actuelle de \notfait essentiellement la même chose dans pdflatexque dans (Xe | Lua) LaTeX avec unicode-math.

Plus précisément, \notprend le jeton suivant, disons \fooet vérifie d'abord s'il \notfooest défini; si le test réussit, \notfooest utilisé. Sinon, le prochain contrôle est de savoir si \nfooest défini. Encore une fois, si ce test réussit, \nfooest utilisé. Sinon, LaTeX le fait \n@tch@r\foo.

Vous voyez maintenant pourquoi une boucle infinie est lancée: \nmodelsfait \not\models; puisqu'elle \nmodelsest définie, elle est utilisée, ce qui fait \not\models…

Vous pouvez éviter le problème en appliquant \notà \relax(en espérant que ni \notrelaxni ne \nrelaxsont définis, ce qui est peu probable).

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

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

\begin{document}

\(\nmodels\)

\(\not\models\)

\end{document}

Quoi qu'il en soit, ce n'est pas un moyen particulièrement efficace de nier \models. Comparez avec ce qui suit.

\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

La définition de \notdevient trop intelligente de moitié en recherchant si \nmodelsou \notmodelsdéjà existe.

Cela fonctionne si vous changez le nom:

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

Cette recherche est effectuée chaque fois que le symbole est utilisé et la définition de \notn'est pas entièrement extensible, vous ne pouvez donc pas définir le symbole avec \letou \edefet éviter cela.

Vous pouvez cependant créer le symbole avec à la \ooalignplace. (Utilisez /avec newtxmathau lieu de \mathslash.)

De toute évidence, unicode-mathil faut maintenant rechercher le préfixe aint.

Mise à jour

Vous pouvez également appeler \notsans utiliser le nom \models, ce qui empêche la recherche. Par exemple,

\documentclass{standalone}
\usepackage{iftex}

\usepackage{unicode-math}


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

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