(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어떻게 합니까 ? 의 형식이 다르기 때문에 동일한 문서에서 및 를 모두 사용하는 것은 바람직하지 않습니다. MnSymbols 전체를 사용하는 것은 의문의 여지가 없습니다. 여전히 버그가 있을 수 있으며(약 10년 전에 버그가 있다는 것을 알고 그 당시 사용을 중단했습니다), 꽤 많은 기호가 변경되고 NewTX 글꼴과 충돌할 수 있습니다.\models\vDash\nmodels\nvDash\models\nvDash

답변1

의 현재 구현은 기본적 으로 (Xe|Lua)LaTeX with 와 \not동일합니다 .pdflatexunicode-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}

관련 정보