如何用 \centernot 替换 \not?

如何用 \centernot 替换 \not?

我注意到 LaTeX 将创建的斜线放置在\not很奇怪的位置,例如在 中\not\ni

使用\centernotfrom 包centernot看起来不错,但由于超出此范围的原因,我无法控制源,但仍然想改变输出。

通常,在这种情况下,我会这样做\renewcommand*{\not}{\centernot},但这会导致很多错误,可能是因为内部\centernot使用。\not

有办法实现这个吗?

答案1

你也可以看到一个奇怪的定位\not\in(至少是使用 Computer Modern 字体),从一开始 TeX 就提供了命令\notin。在 LaTeX 中,它与普通 TeX 中的相同,只是命令变得更加强大。你可以在以下位置找到它fontmath.ltx

\DeclareRobustCommand\notin{\mathrel{\m@th\mathpalette\c@ncel\in}}
\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}

但是,\centernot\in无论如何都不是最佳选择。事实上,使用的斜线\notin不是\not,而是一个简单的/

补充命令很容易\notni

\documentclass{article}
\usepackage{centernot} % for the comparison

\makeatletter
\DeclareRobustCommand\notni{\mathrel{\m@th\mathpalette\c@ncel\ni}}
\makeatother

\begin{document}

\begin{tabular}{ll}
Output with \verb|\notni|  & $x\notni X$ \\
Output with \verb|\not\ni| & $x\not\ni X$ \\
Output with \verb|\centernot\ni| & $x\centernot\ni X$
\end{tabular}

\end{document}

在此处输入图片描述

您会发现,即\not使用\centernot结果替换也不是最佳选择。仅供比较,以下是使用in而不是 的同一张表ni

在此处输入图片描述

您可以使用一个老办法(也被使用过)来获得两全其美的效果unicode-math

\documentclass{article}
\usepackage{centernot} % for the comparison

\NewCommandCopy{\standardnot}{\not}

\ExplSyntaxOn

\NewDocumentCommand{\makenot}{mm}
 {
  % #1 = symbol to negate, #2 = replacement
  \exp_args:Nc \NewDocumentCommand{not\cs_to_str:N #1 } {} { #2 }
 }
\RenewDocumentCommand{\not}{m}
 {
  \cs_if_exist:cTF { not\cs_to_str:N #1 }
   {
    \group_begin:
    \cs_set_eq:NN \not \standardnot % to keep centernot happy
    \use:c { not\cs_to_str:N #1 }
    \group_end:
   }
   {
    \standardnot#1
   }
 }

\ExplSyntaxOff

\makeatletter
\makenot{\ni}{\mathrel{\m@th\mathpalette\c@ncel\ni}}
\makeatother

\makenot{\to}{\centernot\to}

\begin{document}

\begin{tabular}{ll}
Output with \verb|\notni|  & $x\notni X$ \\
Output with \verb|\not\ni| & $x\not\ni X$ \\
Output with \verb|\not\to| & $A\not\to B$
\end{tabular}

\end{document}

\makenot{<symbol>}{<replacement>}您决定\not<symbol>应代表什么。使用此代码,\not\ni\notni是等效的。

在此处输入图片描述

这个想法是什么?首先我使用别名\not以便仍然保留原始内容。然后我\not使用参数重新定义,该参数应该是一个控制序列。

假设调用是\not\foo,我检查控制序列是否\notfoo已定义,如果是,则使用它。否则,\not使用标准。

例如,\not\in将转换为\notin开箱即用。我们还可以使用\makenot来定义新\not<symbol>命令。如果我们这样做

\makenot\foo{whatever}

该命令\notfoo将被定义为whatever。在示例代码中,\notni的定义如答案第一部分所建议的那样。而是\notto通过 来定义\makenot\to{\centernot\to}

有一个安全措施,因为 的用法\notfoo被括在\group_begin:和之间\group_end:,因此\not可以将其重新定义为该组内的原始含义,从而使其\centernot令人满意(它\not以其原始含义使用)。

另一种可能的用法是

\makenot{\mid}{\nmid}

这样\not\mid会产生更好的符号\nmid;请注意,无论是\not\mid(使用标准\not)还是\centernot\mid产生好的结果(大大的轻描淡写)。

关键是\cs_to_str:N去掉反斜杠,只留下控制序列名称。

答案2

否定的“包含”字符在 Unicode 中定义为字符编号十六进制 220c“不包含成员”U+220C (∌),并在包中可用,unicode-math\nni可用于 pdflatex 的一些字体,尤其是stix2。使用它,根本不需要在基本符号上放置斜线。

在此处输入图片描述

\documentclass{article}

\usepackage{stix2}

\begin{document}

$ x \in Y \quad Y \ni x$


$ x \notin Y \quad Y \nni x$

\end{document}

相关内容