目前我正在写数学脚本(环理论,PDF)。当我需要一个新的数学运算符时,我会使用\DeclareMathOperator
amsopn 包中的运算符。但是,我注意到在使用 操作时会出现一些奇怪的行为\circ
。例如:
\listfiles
\documentclass[draft]{minimal}
\usepackage{amsopn}
\DeclareMathOperator*{\id}{id}
\begin{document}
$\id\circ g$
$h\circ g$
\end{document}
在第一个版本中,g
在 处非常接近,\circ
而第二个版本似乎正常。这个间距问题仅在我使用 时发生\DeclareMathOperator
。您知道这个问题吗?我该怎么做才能防止它?
文件列表:
minimal.cls 2001/05/25 Standard LaTeX minimal class
amsopn.sty 1999/12/14 v2.01 operator names
amsgen.sty 1999/11/30 v2.0
答案1
如果\id
表示恒等映射,那么它不应该是一个运算符,而是一个普通的符号:
\newcommand{\id}{\mathrm{id}}
还要注意,\DeclareMathOperator*
用于定义取其上下限的运算符(例如\min
和\max
)。
这种行为很容易解释:当我们写的时候,\log -2
我们希望-
不被视为二进制操作符号。对于 TeX,你的\id\circ g
也是一样的:如果垃圾桶原子跟随操作原子,它被转换成一个奥德\DeclareMathOperator
原子。如果只用直立字母来定义某物,那么这是错误的。
答案2
问题的原因在于 TeX 的间距算法存在缺陷。Knuth 只为运算符和大运算符创建了一个类,而实际上需要两个(你希望$\sum -a_i$
减号的行为像一元运算符,但 (和 之$\ln + C$
和\ln
)并非如此C
)。所有二元运算符跟在运算符后面时都会出现问题,例如在 、 等公式$\exp \circ g$
中$\det \otimes \rho$
。
由于您希望\id
(在类似 的公式中$\lambda \id + u$
)在左侧表现为运算符,而在右侧不表现为运算符(因为通常情况下,当\id
有参数时,参数将始终位于括号中,因此右侧不需要任何额外的空格),您可以将其定义为\mathop{}
左侧为类,\mathord
右侧为类。这应该可以解决您遇到的所有间距问题:
\newcommand{\id}{\mathop{}\mathopen{}\mathrm{id}}
一些测试:
供参考,nath 包解决了这个问题(参见文档的第 11 条,第 7 页),但还做了很多您可能不想要的其他事情。