Internes de \ DeclareMathOperator`

Nov 23 2020

Je pose deux questions ci-dessous, qui sont unifiées dans une troisième méta-question. Grâce au commentaire de @ DavidCarlisle , je me rends compte que mes questions sont telles que la réponse peut dépendre de si elles sont interprétées dans le contexte de MathJax ou de LaTeX + amsmath. Je suis intéressé par les réponses dans les deux contextes.

Je suis constamment à la recherche d'imposer les meilleures pratiques (celles que je reconnais moi-même) au TeX parfois baroque qui surgit chez MO . Souvent , cela implique de changer, par exemple, $Hom(A, B)$en $\operatorname{Hom}(A, B)$, et je laisse souvent une note à un nouvel utilisateur pour l'informer de ses \DeclareMathOperatorfrères et sœurs.

J'ai remarqué sur un message qu'un utilisateur avait repris ce conseil avec une torsion et avait commencé à l'utiliser \DeclareMathOperator\Hom{\operatorname{Hom}}.

Q : Est-ce \DeclareMathOperator\Hom{\operatorname{Hom}}synonyme de \DeclareMathOperator\Hom{Hom}?

J'ai récemment remarqué un autre utilisateur qui utilisait une construction comme \DeclareMathOperator\Set{\mathit{Set}}.

Q : Est-ce \DeclareMathOperator\Set{\mathit{Set}}synonyme de \newcommand\Set{\mathit{Set}}? Si non, est-ce synonyme de \newcommand\Set{\mathop{\mathit{Set}}}?

De toute évidence, il y a une méta-question qui se cache ici, à laquelle je serais en mesure de répondre si j'étais plus à l'aise pour plonger - je suppose que oui - la amsmathsource:

Q : Au niveau du code, pas seulement de la vue d'ensemble "c'est ce que vous voulez pour un nom d'opérateur", que faire \DeclareMathOperatoret que \operatornamefaire?

Réponses

1 egreg Nov 24 2020 at 09:15

Je ne toucherai pas à MathJax, car son modèle est complètement différent de LaTeX.

Première question

Quelque chose comme \DeclareMathOperator{\Hom}{\operatorname{Hom}}bien sûr fonctionne, mais \Homfera deux fois les mêmes choses. Dans amsopn.sty, on trouve

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

En supposant que \fooest indéfini, \DeclareMathOperator{\foo}{???}ne

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

qui est une version abrégée de

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

D'un autre côté, \operatorname{+++}fera

\qopname\newmcodes@ o{+++}

D'où votre \Homferait

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

ce qui semble assez compliqué pour rien: c'est essentiellement la même chose que de faire

\operatorname{\operatorname{Hom}}

chaque fois \Homest utilisé.

Deuxième question

Les définitions

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

fera des choses différentes. Nous pouvons voir les différences avec un exemple simple

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

La réponse à votre première question montre \fooqu'après \DeclareMathOperator{\foo}{foo}équivaut à utiliser \operatorname{foo}, donc la ligne (1) est la même que celle que vous auriez obtenue \DeclareMathOperator{\Set}{\mathit{Set}}.

Sont-ils les mêmes? Non.

Troisième question

À utiliser \operatornamedans le document pour les opérateurs qui apparaissent une ou deux fois. Pour les opérateurs qui sont utilisés plusieurs fois, ajoutez la \DeclareMathOperatorligne appropriée , afin de faciliter la saisie et de réduire l'encombrement.

Addenda

Je vous laisse comme exercice pour trouver les différences entre

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

et

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