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