Xelatex 数学怪异 - 未对齐 \not

Xelatex 数学怪异 - 未对齐 \not

我通常将其xelatex用于我的文档,并且以下代码片段通常适用于我的数学:

\usepackage{fontspec}
\usepackage{unicode-math}
\setmathfont{Asana Math}

但我最近发现了一个奇怪的问题xelatex,不管有没有数学。我试图排版表达式

$A \not\subset B$

并且\not符号未对齐(而不是划掉符号)\subset。我以为问题出在 Asana Math 上,然后删除了它,但情况变得更糟 - 符号\subset完全消失了。这是编译以下 MWE 的结果:

\documentclass{article}
\usepackage{fontspec}
\usepackage{unicode-math}
\begin{document}
$A \subset B$ 
\setmathfont{Asana Math}
$A \not\subset B$
\end{document}

在此处输入图片描述

这里可能发生什么事?

答案1

正如 morbusg 在他的评论中指出的那样,应该使用\nsubset这个字形。这不仅使字符看起来正确,还意味着间距是正确的。

有一些包和类定义了\not命令,用于查看是否存在命令\n<whatever>\not<whatever>并在尝试将非斜线覆盖在顶部之前使用这些命令 - 这使得它们更加独立于字体。我知道的是pxfontslms日记类。调整这些相当简单。这里有一些代码可以做到这一点(我似乎没有 Asana Math,所以我用 STIX 进行了测试)。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/47224/86}
\usepackage{fontspec}
\usepackage{unicode-math}
\setmathfont{xits-math.otf}

\makeatletter

\@namedef{not=}{\ne}
\@namedef{not>}{\ngtr}
\@namedef{not<}{\nless}

\let\oldnot=\not

\DeclareRobustCommand*{\not}[1]{%
  \begingroup \escapechar\m@ne\xdef\@gtempa{not\string#1}\endgroup
  \@ifundefined{\@gtempa}%
     {\not@n@{#1}}%
     {\@nameuse{\@gtempa}}}
\def\not@n@#1{%
  \begingroup \escapechar\m@ne\xdef\@gtempa{n\string#1}\endgroup
  \@ifundefined{\@gtempa}%
     {\neg #1}%
     {\@nameuse{\@gtempa}}}



\makeatother

\begin{document}
\(A \subset B\)
\(A \not\subset B\)
\(A \not B\)
\(A \not= B\)

\(A \subset B\)
\(A \oldnot\subset B\)
\(A \oldnot B\)
\(A \oldnot= B\)
\end{document}

\oldnot是为了进行比较。这是结果,特别注意间距:

智力适中,不指挥

答案2

可能包含以下内容的 LaTeX3 实现unicode-math

\ExplSyntaxOn
\tl_new:N \l_not_token_name_tl
\cs_new:Npn \not_newnot:N #1
  {
   \tl_set:Nx \l_not_token_name_tl { \token_to_str:N #1 }
   \tl_if_empty:xF { \tl_tail:V \l_not_token_name_tl }
     { \tl_set:Nx \l_not_token_name_tl { \tl_tail:V \l_not_token_name_tl } }
   \cs_if_exist:cTF { n \l_not_token_name_tl }
     { \use:c { n \l_not_token_name_tl } }
     {
      \cs_if_exist:cTF { not \l_not_token_name_tl }
        { \use:c { not \l_not_token_name_tl } }
        { \neg \l_not_token_name_tl } % or error?
     }
  }
\cs_set_eq:NN \not \not_newnot:N
% Common negated symbols
\cs_new:cpn { not= } { \neq } % not \let, as the meaning is changed later
\cs_new:cpn { not< } { \nless }
\cs_new:cpn { not> } { \ngtr }
\ExplSyntaxOff

它基本上和安德鲁的一样。但是,如果有人说,例如,

\(A \not⊂ B\)

有人可能会在最后三行添加一些其他定义,但完整的等价表将会非常庞大​​。

相关内容