我注意到 LaTeX 将创建的斜线放置在\not
很奇怪的位置,例如在 中\not\ni
。
使用\centernot
from 包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
去掉反斜杠,只留下控制序列名称。