`\ DeclareMathOperator`内部

Nov 23 2020

以下に2つの質問をします。これらは、3番目のメタ質問にまとめられています。@DavidCarlisleのコメントのおかげで、私の質問は、MathJaxとLaTeX +のどちらのコンテキストで解釈されるかによって答えが異なる可能性があることを理解していますamsmath。私は両方の文脈での答えに興味があります。

私は常に、MOで発生するバロック式のTeXに(自分で定義した)ベストプラクティスを課そうと常に努めています。多くの場合、これには、たとえば、$Hom(A, B)$への変更が含ま$\operatorname{Hom}(A, B)$れます。新しいユーザーにメモを残して\DeclareMathOperator、兄弟について知らせます。

ある投稿で、ユーザーがひねりを加えてこのアドバイスを受け取り、を使い始めたことに気づきました\DeclareMathOperator\Hom{\operatorname{Hom}}

Q:と\DeclareMathOperator\Hom{\operatorname{Hom}}同義\DeclareMathOperator\Hom{Hom}ですか?

最近、のような構造を使用している別のユーザーに気づきました\DeclareMathOperator\Set{\mathit{Set}}

Q:と\DeclareMathOperator\Set{\mathit{Set}}同義\newcommand\Set{\mathit{Set}}ですか?そうでない場合、それはと同義\newcommand\Set{\mathop{\mathit{Set}}}ですか?

明らかに、ここにはメタ質問が潜んでいます。これは、私がより快適に飛び込むことができれば答えることができるでしょう-おそらくそうです-amsmathソース:

Q:コードのレベルでは、「これは演算子名に必要なものです」という全体像だけでなく、何をし、何\DeclareMathOperator\operatornameしますか?

回答

1 egreg Nov 24 2020 at 09:15

MathJaxのモデルはLaTeXとは完全に異なるため、ここでは触れません。

最初の質問

\DeclareMathOperator{\Hom}{\operatorname{Hom}}もちろんのようなものは機能しますが\Hom、同じことを2回実行します。で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使用されます。

2番目の質問

定義

\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}}

彼らは同じですか?番号。

3番目の質問

\operatornameドキュメント内で1回または2回出現する演算子に使用します。何度も使用される演算子の場合は\DeclareMathOperator、入力を簡単にし、煩雑さを減らすために、適切な行を追加します。

補遺

違いを見つけるための演習としてあなたに任せます

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

そして

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