我所说的“数学装饰品”是指\widehat
(来自 ams)及其同类的东西。也许以下内容最能说明我的意思:
重现代码:
\documentclass{standalone}
\usepackage{amsmath}
\begin{document}
\begin{gather*}
A \widehat{\otimes} B \\
A \otimes B \\
A \mathbin{\widehat{\otimes}} B
\end{gather*}
\end{document}
是否有可能让\widehat
(和其他人)“知道”他们输入的类型?我所说的“类型”是指参数是关系、运算符、字母数字字符还是……还有其他类型?它会将自己设置为相应的类型。因此,在我上面的例子中,\widehat{\otimes}
会导致\mathbin{\widehat{\otimes}}
而\widehat{A}
会导致\mathalpha{\widehat{A}}
。
我意识到存在一个潜在的问题,即输入可能有很多字符,但对于单个字符来说它应该是相当安全的(并且\widehat
如果不同意的话,可以向增强提供一个可选参数来覆盖其选择)。
(我刚刚注意到这一点,因为在投影仪演示中,我想在幻灯片上给一个角色添加一顶帽子,但出现了相当明显的间距跳跃。最后,我的过渡命令看起来像这样:
\alt<3->{\mathbin{\widehat{\otimes}}}{\vphantom{\widehat{\otimes}}\otimes}
如果不介意间距的话,可以写\only<3->{\widehat}\otimes
.)
答案1
我们可以利用 ambsy 使用的宏:
\documentclass[a4paper]{article}
\usepackage{amsbsy}
\makeatletter
\DeclareRobustCommand{\iwidehat}[1]{
\begingroup
\math@atom{#1}{\widehat{#1}}
\endgroup}
\makeatother
\begin{document}
$a\otimes b_{a\otimes b}$
$a\iwidehat\otimes b_{a\iwidehat\otimes b}$
\end{document}
包 bm 使用类似的方法来区分更多类型;这个宏只识别关系和操作,其余部分则被视为普通符号。
解释
定义如下\math@atom
:
\def\math@atom#1#2{\binrel@{#1}\binrel@@{#2}}
第一个宏\binrel@
进行测量并设置的含义\binrel@@
;因为这是在组中使用,所以\binrel@@
在组结束时会恢复的原始含义。
\let\binrel@@\relax
\def\binrel@#1{\begingroup
\setboxz@h{\thinmuskip0mu
\medmuskip\m@ne mu\thickmuskip\@ne mu
\setbox\tw@\hbox{$#1\m@th$}\kern-\wd\tw@
${}#1{}\m@th$}%
\edef\@tempa{\endgroup\let\noexpand\binrel@@
\ifdim\wdz@<\z@ \mathbin
\else\ifdim\wdz@>\z@ \mathrel
\else \relax\fi\fi}%
\@tempa
}
以下是它的作用\binrel@
。首先,它打开一个组,并用 0 \thinmuskip
、负数\medmuskip
和正数设置框 0。\thickmuskip
在框中,它将框 2 设置为简单参数(\m@th
用于避免插入 kern \mathsurround
)。然后,它后退框 2 的宽度,并在(空的)普通原子之前和之后设置参数。
情况 1:#1
是普通符号或运算符。
框 0 的宽度将为零。
情况2:#1
是运算符号,和之间, 和 之间会
\medmuskip
插入粘连,所以框0的宽度为负数。{}
#1
#1
{}
情况 3:#1
是关系符号。和之间,以及和之间
\thickmuskip
会插入粘连,因此框 0 的宽度将为正值。{}
#1
#1
{}
最后的诀窍是
\edef\@tempa{\endgroup<test>}\@tempa
\let\binrel@@\relax
在情况 1、\let\binrel@@\mathbin
情况 2 和\let\binrel@@\mathrel
情况 3 中,这样做都可以。