我定义一个宏如下:
\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}}}