数学装饰品能知道其内容的“类型”吗?

数学装饰品能知道其内容的“类型”吗?

我所说的“数学装饰品”是指\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 中,这样做都可以。

相关内容