确保二元运算符的宏间距

确保二元运算符的宏间距

我定义一个宏如下:

\newcommand{\abs}[1]{{#1}^{\sharp}}

但我意识到这$a \abs{\sqcup} b$并不完全相同$a \sqcup^\sharp b$:第一个没有在运算符和操作数之间留出足够的空间。

有人知道如何修改宏以使其成为真正的间距二元运算符吗?

答案1

如果你定义

\newcommand\abs[1]{#1^\sharp}

间距将由性质继承#1;所以

\abs{\sqcup}

将作为二元运算符和

\abs{=}

将作为二元关系来间隔。

根据你的定义,你会将{\sqcup}^{\sharp}其视为一个普通符号。

一些细节

当尝试输入时$a+^{\sharp}b^2\showlists$.log文件将报告

### math mode entered at line <line number>
\mathord
.\fam1 a
\mathbin
.\fam0 +
^\fam1 ]
\mathord
.\fam1 b
^\fam0 2

\mathord和行\mathbin表示 TeX 正在分析哪种类型的数学原子。每个原子都有三个字段:(代表.),上标(代表^)和下标(由 代表_)。

由于+被定义为原子,因此报告了这种类型。该原子以从 0 族中取出的\mathbin字符作为核,并以从 1 族中取出的上标作为上标(默认设置中的字体,其中通常为“尖锐”符号所占的槽)。+cmsy10]

如果我们说$a{+}^{\sharp}b\showlists$,答案是

### math mode entered at line <line number>
\mathord
.\fam1 a
\mathord
.\mathbin
..\fam0 +
^\fam1 ]
\mathord
.\fam1 b

子公式周围的括号告诉 TeX 将整个子公式视为一个\mathord原子;这个原子有一个由\mathbin原子形成的核(在内部层,由两个句点表示..),但这只会影响子公式的排版,而不会影响“外部”层。括号内的\mathord原子与之前一样具有上标原子。

这只是排版公式的第一步。当 TeX 确定了它必须排版的所有原子后,它会应用其间距规则;例如,它会在\mathord\mathbin原子之间插入一个中等间距(我将跳过一些微妙之处),但它绝不在两个原子之间插入空格\mathord(当然,除非用户明确指定了这样的空格)。

\sqcup请注意,它与用而不是相同+,因为这个符号也被声明为\mathbin原子。

答案2

您可以使用以下方法强制它成为 bin 原子\mathbin

 \newcommand{\abs}[1]{\mathbin{{#1}^{\sharp}}}

相关内容