我通常将其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>
并在尝试将非斜线覆盖在顶部之前使用这些命令 - 这使得它们更加独立于字体。我知道的是pxfonts
和lms
日记类。调整这些相当简单。这里有一些代码可以做到这一点(我似乎没有 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\)
有人可能会在最后三行添加一些其他定义,但完整的等价表将会非常庞大。