Internal `\ DeclareMathOperator`

Nov 23 2020

Saya mengajukan dua pertanyaan di bawah ini, yang disatukan dalam pertanyaan meta ketiga. Berkat komentar @ DavidCarlisle , saya menyadari bahwa pertanyaan saya sedemikian rupa sehingga jawabannya mungkin bergantung pada apakah mereka ditafsirkan dalam konteks MathJax atau LaTeX + amsmath. Saya tertarik dengan jawaban dalam kedua konteks.

Saya terus-menerus mencari cara untuk memaksakan (saya akui sendiri) praktik terbaik pada TeX barok yang terkadang muncul di MO . Seringkali hal ini melibatkan perubahan, katakanlah, $Hom(A, B)$kepada $\operatorname{Hom}(A, B)$, dan saya sering meninggalkan catatan untuk pengguna baru yang memberi tahu mereka tentang \DeclareMathOperatordan saudara kandung.

Saya perhatikan di satu posting bahwa pengguna telah mengambil saran ini dengan twist, dan mulai menggunakan \DeclareMathOperator\Hom{\operatorname{Hom}}.

T : Apakah \DeclareMathOperator\Hom{\operatorname{Hom}}identik dengan \DeclareMathOperator\Hom{Hom}?

Saya baru-baru ini melihat pengguna lain yang menggunakan konstruksi seperti \DeclareMathOperator\Set{\mathit{Set}}.

T : Apakah \DeclareMathOperator\Set{\mathit{Set}}identik dengan \newcommand\Set{\mathit{Set}}? Jika tidak, apakah itu identik dengan \newcommand\Set{\mathop{\mathit{Set}}}?

Jelas ada pertanyaan meta yang mengintai di sini, yang akan bisa saya jawab jika saya lebih nyaman menyelami — saya kira begitu — amsmathsumber:

T : Pada level kode, bukan hanya gambaran besar "ini yang Anda inginkan untuk nama operator", apa yang harus dilakukan \DeclareMathOperatordan \operatornamedilakukan?

Jawaban

1 egreg Nov 24 2020 at 09:15

Saya tidak akan menyentuh MathJax, karena modelnya sangat berbeda dari LaTeX.

Pertanyaan pertama

Sesuatu seperti \DeclareMathOperator{\Hom}{\operatorname{Hom}}tentu saja berhasil, tetapi \Homakan melakukan dua kali hal yang sama. Di amsopn.sty, kami temukan

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

Dengan asumsi itu \footidak ditentukan, \DeclareMathOperator{\foo}{???}tidak

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

yang merupakan versi singkat dari

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

Di sisi lain, \operatorname{+++}akan berhasil

\qopname\newmcodes@ o{+++}

Karenanya Anda \Homakan melakukannya

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

yang tampaknya cukup rumit untuk apa-apa: pada dasarnya sama dengan melakukan

\operatorname{\operatorname{Hom}}

setiap kali \Homdigunakan.

Pertanyaan kedua

Definisi

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

akan melakukan hal yang berbeda. Kita bisa melihat perbedaannya dengan contoh sederhana

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

Jawaban atas pertanyaan pertama Anda menunjukkan bahwa \foosetelah \DeclareMathOperator{\foo}{foo}sama dengan menggunakan \operatorname{foo}, jadi baris (1) sama dengan yang Anda dapatkan \DeclareMathOperator{\Set}{\mathit{Set}}.

Apakah mereka sama? Tidak.

Pertanyaan ketiga

Gunakan \operatornamedi dokumen untuk operator yang muncul satu atau dua kali. Untuk operator yang digunakan beberapa kali, tambahkan \DeclareMathOperatorbaris yang sesuai , untuk memudahkan pengetikan dan mengurangi kekacauan.

Tambahan

Saya serahkan kepada Anda sebagai latihan untuk menemukan perbedaan antara

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

dan

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