`\ DeclareMathOperator` Interna

Nov 23 2020

Ich stelle unten zwei Fragen, die in einer dritten Meta-Frage zusammengefasst sind. Dank des Kommentars von @ DavidCarlisle stelle ich fest, dass meine Fragen so sind, dass die Antwort davon abhängen kann, ob sie im Kontext von MathJax oder von LaTeX + interpretiert werden amsmath. Ich interessiere mich für Antworten in beiden Kontexten.

Ich bin ständig auf der Suche nach (zugegebenermaßen selbst definierten) Best Practices für das manchmal barocke TeX, das bei MO auftaucht . Eine Menge Zeit ändert dies mit, sagen wir, $Hom(A, B)$zu $\operatorname{Hom}(A, B)$, und ich lasse oft eine Notiz für einen neuen Benutzer sie wissen zu lassen \DeclareMathOperatorund Geschwister.

In einem Beitrag bemerkte ich, dass ein Benutzer diesen Rat mit einer Wendung aufgegriffen und mit der Verwendung begonnen hatte \DeclareMathOperator\Hom{\operatorname{Hom}}.

F : Ist \DeclareMathOperator\Hom{\operatorname{Hom}}gleichbedeutend mit \DeclareMathOperator\Hom{Hom}?

Ich habe kürzlich einen anderen Benutzer bemerkt, der eine Konstruktion wie verwendet hat \DeclareMathOperator\Set{\mathit{Set}}.

F : Ist \DeclareMathOperator\Set{\mathit{Set}}gleichbedeutend mit \newcommand\Set{\mathit{Set}}? Wenn nicht, ist es dann auch \newcommand\Set{\mathop{\mathit{Set}}}?

Offensichtlich lauert hier eine Meta-Frage, die ich beantworten könnte, wenn ich mich wohler fühlen würde - ich denke, es ist - die amsmathQuelle:

F : Auf der Codeebene, nicht nur das Gesamtbild "Dies ist, was Sie für einen Operatornamen wollen", was tun \DeclareMathOperatorund \operatornametun?

Antworten

1 egreg Nov 24 2020 at 09:15

Ich werde MathJax nicht berühren, da sich sein Modell völlig von LaTeX unterscheidet.

Erste Frage

So etwas \DeclareMathOperator{\Hom}{\operatorname{Hom}}funktioniert natürlich, macht aber \Homdoppelt so viel. In amsopn.styfinden wir

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

Unter der Annahme , dass \foonicht definiert ist, \DeclareMathOperator{\foo}{???}tut

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

Das ist eine verkürzte Version von

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

Auf der anderen Seite \operatorname{+++}wird tun

\qopname\newmcodes@ o{+++}

Daher \Homwürden Sie tun

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

Das scheint umsonst ziemlich kompliziert zu sein: Es ist im Wesentlichen dasselbe wie zu tun

\operatorname{\operatorname{Hom}}

jedes Mal \Homwird verwendet.

Zweite Frage

Die Definitionen

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

wird verschiedene Dinge tun. Wir können die Unterschiede anhand eines einfachen Beispiels erkennen

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

Die Antwort auf Ihre erste Frage zeigt , dass \foonach \DeclareMathOperator{\foo}{foo}dem gleichen wie unter Verwendung ist \operatorname{foo}, so Leitung (1) ist das gleiche , wie Sie von bekommen \DeclareMathOperator{\Set}{\mathit{Set}}.

Sind sie gleich? Nein.

Dritte Frage

Verwenden Sie \operatornameim Dokument für Operatoren, die ein- oder zweimal vorkommen. Fügen Sie für Bediener, die mehrmals verwendet werden, die entsprechende \DeclareMathOperatorZeile hinzu, um die Eingabe zu vereinfachen und die Unordnung zu verringern.

Nachtrag

Ich überlasse es Ihnen als Übung, die Unterschiede zwischen herauszufinden

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

und

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