Внутреннее устройство `\ DeclareMathOperator`
Я задаю два вопроса ниже, которые объединены в третий мета-вопрос. Благодаря комментарию @ 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делать?
Ответы
Я не буду касаться 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}}