Elementy wewnętrzne `\ DeclareMathOperator`

Nov 23 2020

Poniżej zadaję dwa pytania, które są ujednolicone w trzecim metapytaniu. Dzięki komentarzowi @ DavidCarlisle zdaję sobie sprawę, że moje pytania są takie, że odpowiedź może zależeć od tego, czy zostaną zinterpretowane w kontekście MathJax, czy LaTeX + amsmath. Interesują mnie odpowiedzi w obu kontekstach.

Nieustannie poluję na to, aby narzucić (co prawda sam sobie zdefiniowałem) najlepsze praktyki w czasami barokowym TeX-ie, który pojawia się w MO . Często wiąże się to ze zmianą, powiedzmy, $Hom(A, B)$na $\operatorname{Hom}(A, B)$i często zostawiam notatkę dla nowego użytkownika, informując go o tym \DeclareMathOperatori rodzeństwie.

Zauważyłem w jednym poście, że użytkownik podchwycił tę radę z niespodzianką i zaczął używać \DeclareMathOperator\Hom{\operatorname{Hom}}.

P : Czy jest \DeclareMathOperator\Hom{\operatorname{Hom}}synonimem \DeclareMathOperator\Hom{Hom}?

Niedawno zauważyłem innego użytkownika, który użył takiej konstrukcji \DeclareMathOperator\Set{\mathit{Set}}.

P : Czy jest \DeclareMathOperator\Set{\mathit{Set}}synonimem \newcommand\Set{\mathit{Set}}? Jeśli nie, to czy jest to równoznaczne z \newcommand\Set{\mathop{\mathit{Set}}}?

Oczywiście czai się tu metapytanie, na które byłbym w stanie odpowiedzieć, gdybym czuł się bardziej komfortowo w - chyba tak - amsmathźródle:

P : Na poziomie kodu, a nie tylko ogólnego obrazu „tego chcesz dla nazwy operatora”, co robić \DeclareMathOperatori co \operatornamerobić?

Odpowiedzi

1 egreg Nov 24 2020 at 09:15

Nie będę dotykał MathJaxa, bo jego model jest zupełnie inny niż LaTeX.

Pierwsze pytanie

Coś jak \DeclareMathOperator{\Hom}{\operatorname{Hom}}oczywiście działa, ale \Homzrobi dwa razy to samo. W amsopn.sty, znajdujemy

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

Zakładając, że \foojest to nieokreślone, \DeclareMathOperator{\foo}{???}robi

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

który jest skróconą wersją

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

Z drugiej strony \operatorname{+++}zrobi

\qopname\newmcodes@ o{+++}

Stąd twój \Homby zrobił

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

co wydaje się dość skomplikowane na darmo: to w zasadzie to samo, co robienie

\operatorname{\operatorname{Hom}}

za każdym razem \Hom.

Drugie Pytanie

Definicje

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

zrobi różne rzeczy. Różnice widać na prostym przykładzie

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

Odpowiedź na twoje pierwsze pytanie pokazuje, że \foopo \DeclareMathOperator{\foo}{foo}jest to samo, co używanie \operatorname{foo}, więc linia (1) jest taka sama, jak otrzymałeś \DeclareMathOperator{\Set}{\mathit{Set}}.

Czy oni są tacy sami? Nie.

Trzecie pytanie

Użyj \operatornamew dokumencie dla operatorów, które pojawiają się raz lub dwa razy. W przypadku operatorów używanych kilka razy dodaj odpowiednią \DeclareMathOperatorlinię, aby ułatwić pisanie i zmniejszyć bałagan.

Uzupełnienie

Zostawiam wam ćwiczenie, aby znaleźć różnice między

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

i

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