该amsmath
包保存了\mathcode
减号和等号的原始值,随后在提供可扩展箭头的宏中使用保存的值(例如, \leftarrowfill@
)。事实上,在第 893-900 行amsmath.sty
我们读到
\mathchardef\std@minus\mathcode`\-\relax
\mathchardef\std@equal\mathcode`\=\relax
\AtBeginDocument{%
\mathchardef\std@minus\mathcode`\-\relax
\mathchardef\std@equal\mathcode`\=\relax
}
\ams@def\relbar{\mathrel{\mathpalette\mathsm@sh\std@minus}}
\ams@def\Relbar{\mathrel\std@equal}
为什么会这样?软件包作者在这里试图避免什么问题?
答案1
diffs-m.txt 包含注释
---将 \relbar 改为使用 \std@minus---否则 \underleftrightarrow 在 \DeclareMathOperator 定义中运行不佳。
尝试一下就会发现问题:
\documentclass[12pt]{article}%
\usepackage{amsmath}
\DeclareMathOperator{\test}{\underleftrightarrow{test}}
\begin{document}
\[\test\]
\makeatletter
\def\relbar{\mathrel{\mathpalette\mathsm@sh-}}
\[\test\]
\end{document}
答案2
文件中的评论amsmath.dtx
如下:
构造这些箭头填充时使用的减号被破坏,以便箭头上方的上标不会太高。这主要影响
\xleftarrow
和\xrightarrow
箭头。
由于此文件已被处理成pdf文件并包含在tex live中,您可以通过请求来查看详细信息texdoc amsmath.pdf
。
这种设置隐含的意思是,计算机现代中的减号与加号具有相同的高度,除非进行调整,否则这肯定会影响上标的定位。
虽然没有明确注释,但等号被用作双杆箭的延长器。