Elementy wewnętrzne `\ DeclareMathOperator`
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 \DeclareMathOperator
i 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ć \DeclareMathOperator
i co \operatorname
robić?
Odpowiedzi
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 \Hom
zrobi 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 \foo
jest 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 \Hom
by 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 \foo
po \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 \operatorname
w dokumencie dla operatorów, które pojawiają się raz lub dwa razy. W przypadku operatorów używanych kilka razy dodaj odpowiednią \DeclareMathOperator
linię, 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}}