Внутреннее устройство `\ DeclareMathOperator`

Nov 23 2020

Я задаю два вопроса ниже, которые объединены в третий мета-вопрос. Благодаря комментарию @ DavidCarlisle , я понимаю, что мои вопросы таковы, что ответ может зависеть от того, интерпретируются ли они в контексте MathJax или LaTeX + amsmath. Меня интересуют ответы в обоих контекстах.

Я постоянно стремлюсь навязать (по общему признанию, самоопределение) лучшие практики на иногда барочном TeX, который возникает в MO . Часто это связано с изменением, скажем, $Hom(A, B)$на $\operatorname{Hom}(A, B)$, и я часто оставляю заметку для нового пользователя, сообщая ему \DeclareMathOperatorи братьям и сестрам.

В одном посте я заметил, что пользователь усвоил этот совет с изюминкой и начал его использовать \DeclareMathOperator\Hom{\operatorname{Hom}}.

Q : Это \DeclareMathOperator\Hom{\operatorname{Hom}}синоним \DeclareMathOperator\Hom{Hom}?

Недавно я заметил другого пользователя, который использовал конструкцию вроде \DeclareMathOperator\Set{\mathit{Set}}.

Q : Это \DeclareMathOperator\Set{\mathit{Set}}синоним \newcommand\Set{\mathit{Set}}? Если нет, то является ли это синонимом \newcommand\Set{\mathop{\mathit{Set}}}?

Очевидно, здесь скрывается мета-вопрос, на который я мог бы ответить, если бы мне было удобнее погрузиться - я думаю, это так - в amsmathисточник:

В : На уровне кода, а не только на общей картине «это то, что вы хотите для имени оператора», что делать \DeclareMathOperatorи что \operatornameделать?

Ответы

1 egreg Nov 24 2020 at 09:15

Я не буду касаться MathJax, потому что его модель полностью отличается от LaTeX.

Первый вопрос

Что-то вроде \DeclareMathOperator{\Hom}{\operatorname{Hom}}конечно работает, но \Homбудет делать дважды одно и то же. В amsopn.styмы находим

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

Если предположить , что \fooне определено, \DeclareMathOperator{\foo}{???}делает

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

что является сокращенной версией

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

С другой стороны, \operatorname{+++}подойдет

\qopname\newmcodes@ o{+++}

Следовательно, вы \Homбы сделали

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

что кажется довольно сложным зря: по сути, это то же самое, что и выполнение

\operatorname{\operatorname{Hom}}

каждый раз \Homиспользуется.

Второй вопрос

Определения

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

буду делать разные вещи. Мы можем увидеть различия на простом примере

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

Ответ на ваш первый вопрос показывает, что \fooafter \DeclareMathOperator{\foo}{foo}- это то же самое, что и using \operatorname{foo}, поэтому строка (1) такая же, как и у вас \DeclareMathOperator{\Set}{\mathit{Set}}.

Они одинаковы? Нет.

Третий вопрос

Используйте \operatornameв документе для операторов, которые появляются один или два раза. Для операторов, которые используются несколько раз, добавьте соответствующую \DeclareMathOperatorстроку, чтобы упростить ввод и уменьшить беспорядок.

Дополнение

Я оставляю вам в качестве упражнения найти различия между

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

и

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