`\DeclareMathOperator` 内部原理

`\DeclareMathOperator` 内部原理

我在下面提出了两个问题,这些问题统一在第三个元问题中。感谢@DavidCarlisle评论,我意识到我的问题是这样的,答案可能取决于它们是在 MathJax 还是 LaTeX+ 的上下文中解释的amsmath。我对这两种情况下的答案都感兴趣。

我经常在寻找(我承认是自己定义的)最佳实践,以解决在。很多时候,这涉及到改变,比如说,$Hom(A, B)$$\operatorname{Hom}(A, B)$,而且我经常给新用户留个便条,让他们知道\DeclareMathOperator和兄弟姐妹。

我在一篇帖子上注意到,一位用户采纳了这个建议,并进行了一番改动,开始使用\DeclareMathOperator\Hom{\operatorname{Hom}}

:是\DeclareMathOperator\Hom{\operatorname{Hom}}同义词吗\DeclareMathOperator\Hom{Hom}

我最近注意到另一个用户使用了类似的构造\DeclareMathOperator\Set{\mathit{Set}}

: 是\DeclareMathOperator\Set{\mathit{Set}}同义词 吗\newcommand\Set{\mathit{Set}}?如果不是 ,那么它是否是 同义词\newcommand\Set{\mathop{\mathit{Set}}}

显然,这里隐藏着一个元问题,如果我能更深入地探究来源,我就能回答这个问题——我想是的amsmath

:在代码层面上,不仅仅是大局“这就是你想要的运算符名称”,做什么\DeclareMathOperator\operatorname做什么?

答案1

我不会碰 MathJax,因为它的模型与 LaTeX 完全不同。

第一个问题

类似的东西\DeclareMathOperator{\Hom}{\operatorname{Hom}}当然可以工作,但\Hom会做两倍相同的事情。在中amsopn.sty,我们发现

\DeclareRobustCommand{\operatorname}{%
  \@ifstar{\qopname\newmcodes@ m}%
          {\qopname\newmcodes@ o}}%
\DeclareRobustCommand{\qopname}[3]{%
  \mathop{#1\kern\z@\operator@font#3}%
  \csname n#2limits@\endcsname}
\newcommand{\DeclareMathOperator}{%
  \@ifstar{\@declmathop m}{\@declmathop o}}
\long\def\@declmathop#1#2#3{%
  \@ifdefinable{#2}{%
    \DeclareRobustCommand{#2}{\qopname\newmcodes@#1{#3}}}}

假设\foo未定义\DeclareMathOperator{\foo}{???}

\DeclareRobustCommand{\foo}{\qopname\newmcodes@ o{???}}

这是

\DeclareRobustCommand{\foo}{\operatorname{???}}

另一方面,\operatorname{+++}会做

\qopname\newmcodes@ o{+++}

因此你\Hom

\qopname\newmcodes@ o{\qopname\newmcodes@ o{Hom}}

这看起来很复杂:它本质上等同于

\operatorname{\operatorname{Hom}}

每次\Hom使用。

第二个问题

定义

\DeclareMathOperator\Set{\mathit{Set}}
\newcommand\Set{\mathit{Set}}
\newcommand\Set{\mathop{\mathit{Set}}}

会做不同的事情。我们可以通过一个简单的例子来看到差异

\documentclass[twocolumn]{article}
\usepackage{amsmath}

\begin{document}
\begin{gather}
x \operatorname{\mathit{Set}}_2 y\\
x \mathit{Set}_2 y \\
x \mathop{\mathit{Set}}_2 y
\end{gather}
\end{document}

第一个问题的答案表明,\fooafter\DeclareMathOperator{\foo}{foo}与使用 相同\operatorname{foo},因此行 (1) 与从 获得的结果相同\DeclareMathOperator{\Set}{\mathit{Set}}

在此处输入图片描述

它们是一样的吗?不一样。

第三个问题

在文档中,使用\operatorname只出现一两次的运算符。对于多次使用的运算符,请添加相应的\DeclareMathOperator行,以简化输入并减少混乱。

附录

我留给你们一个练习,找出

\DeclareMathOperator*{\tlim}{t-lim}

\newcommand{\tlim}{\mathop{t-lim}}

相关内容