Nội bộ `\ DeclareMathOperator`

Nov 23 2020

Tôi hỏi hai câu hỏi dưới đây, được thống nhất trong câu hỏi meta thứ ba. Nhờ nhận xét của @ DavidCarlisle , tôi nhận ra rằng các câu hỏi của tôi đến mức câu trả lời có thể phụ thuộc vào việc chúng được diễn giải trong ngữ cảnh của MathJax hay LaTeX + amsmath. Tôi quan tâm đến câu trả lời trong cả hai ngữ cảnh.

Tôi không ngừng tìm kiếm để áp dụng các phương pháp hay nhất (được thừa nhận là do tôi tự xác định) cho TeX đôi khi baroque xuất hiện ở MO . Rất nhiều lần này liên quan đến việc thay đổi, chẳng hạn, $Hom(A, B)$để $\operatorname{Hom}(A, B)$, và tôi thường để lại một ghi chú cho người dùng mới cho họ biết về \DeclareMathOperatorvà anh chị em.

Tôi nhận thấy trên một bài đăng rằng một người dùng đã chọn lời khuyên này với một sự thay đổi và bắt đầu sử dụng \DeclareMathOperator\Hom{\operatorname{Hom}}.

Q : Đồng \DeclareMathOperator\Hom{\operatorname{Hom}}nghĩa với \DeclareMathOperator\Hom{Hom}?

Gần đây tôi đã nhận thấy một người dùng khác đã sử dụng một công trình như thế nào \DeclareMathOperator\Set{\mathit{Set}}.

Q : Đồng \DeclareMathOperator\Set{\mathit{Set}}nghĩa với \newcommand\Set{\mathit{Set}}? Nếu không, thì nó có đồng nghĩa với \newcommand\Set{\mathop{\mathit{Set}}}?

Rõ ràng là có một câu hỏi meta ẩn ở đây, mà tôi sẽ có thể trả lời nếu tôi cảm thấy thoải mái hơn khi đi sâu vào — tôi đoán là như vậy — amsmathnguồn:

Q : Ở cấp độ mã, không chỉ là bức tranh lớn "đây là những gì bạn muốn cho một tên nhà điều hành", làm gì \DeclareMathOperator\operatornamelàm gì?

Trả lời

1 egreg Nov 24 2020 at 09:15

Tôi sẽ không đụng đến MathJax, vì mô hình của nó hoàn toàn khác với LaTeX.

Câu hỏi đầu tiên

Một cái gì đó giống như \DeclareMathOperator{\Hom}{\operatorname{Hom}}tất nhiên hoạt động, nhưng \Homsẽ làm hai lần những điều tương tự. Trong amsopn.sty, chúng tôi tìm thấy

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

Giả sử \foolà undefined, \DeclareMathOperator{\foo}{???}không

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

là phiên bản rút gọn của

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

Mặt khác, \operatorname{+++}sẽ làm

\qopname\newmcodes@ o{+++}

Do đó bạn \Homsẽ làm

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

điều này có vẻ khá phức tạp vì không có gì: về cơ bản nó giống như làm

\operatorname{\operatorname{Hom}}

mỗi lần \Homđược sử dụng.

Câu hỏi thứ hai

Các định nghĩa

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

sẽ làm những điều khác nhau. Chúng ta có thể thấy sự khác biệt bằng một ví dụ đơn giản

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

Câu trả lời cho câu hỏi đầu tiên của bạn cho thấy rằng \fooafter \DeclareMathOperator{\foo}{foo}cũng giống như cách sử dụng \operatorname{foo}, vì vậy dòng (1) giống như bạn nhận được từ đó \DeclareMathOperator{\Set}{\mathit{Set}}.

Chúng có giống nhau không? Không.

Câu hỏi thứ ba

Sử dụng \operatornametrong tài liệu cho các toán tử xuất hiện một hoặc hai lần. Đối với các toán tử được sử dụng nhiều lần, hãy thêm \DeclareMathOperatordòng thích hợp để dễ nhập và giảm lộn xộn.

Phụ lục

Tôi để lại cho bạn như một bài tập để tìm ra sự khác biệt giữa

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

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