Internos de `\ DeclareMathOperator`

Nov 23 2020

Eu faço duas perguntas abaixo, que são unificadas em uma terceira metaquestão. Graças ao comentário de @DavidCarlisle , percebo que minhas perguntas são tais que a resposta pode depender se elas são interpretadas no contexto do MathJax ou do LaTeX + amsmath. Estou interessado em respostas em ambos os contextos.

Estou constantemente em busca de impor (minhas reconhecidamente autodefinidas) melhores práticas ao às vezes barroco TeX que surge em MO . Muitas vezes, isso envolve mudar, digamos, $Hom(A, B)$para $\operatorname{Hom}(A, B)$, e muitas vezes deixo um bilhete para um novo usuário avisando-o sobre seus \DeclareMathOperatorirmãos.

Percebi em uma postagem que um usuário pegou esse conselho de maneira diferente e começou a usar \DeclareMathOperator\Hom{\operatorname{Hom}}.

P : É \DeclareMathOperator\Hom{\operatorname{Hom}}sinônimo de \DeclareMathOperator\Hom{Hom}?

Recentemente notei outro usuário que usou uma construção como \DeclareMathOperator\Set{\mathit{Set}}.

P : É \DeclareMathOperator\Set{\mathit{Set}}sinônimo de \newcommand\Set{\mathit{Set}}? Se não, é sinônimo de \newcommand\Set{\mathop{\mathit{Set}}}?

Obviamente, há uma meta-pergunta à espreita aqui, que eu seria capaz de responder se estivesse mais confortável mergulhando - acho que é - a amsmathfonte:

P : No nível do código, não apenas no quadro geral "isso é o que você deseja para o nome de um operador", o que fazer \DeclareMathOperatore \operatornamefazer?

Respostas

1 egreg Nov 24 2020 at 09:15

Não tocarei no MathJax, porque seu modelo é completamente diferente do LaTeX.

Primeira pergunta

Algo como \DeclareMathOperator{\Hom}{\operatorname{Hom}}, naturalmente, funciona, mas \Homvai fazer duas vezes as mesmas coisas. Em amsopn.sty, encontramos

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

Assumindo que \fooé indefinido, \DeclareMathOperator{\foo}{???}faz

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

que é uma versão abreviada de

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

Por outro lado, \operatorname{+++}fará

\qopname\newmcodes@ o{+++}

Portanto, você \Homfaria

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

o que parece bastante complicado para nada: é essencialmente o mesmo que fazer

\operatorname{\operatorname{Hom}}

cada vez \Homé usado.

Segunda questão

As definições

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

fará coisas diferentes. Podemos ver as diferenças com um exemplo simples

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

A resposta à sua primeira pergunta mostra que \foodepois \DeclareMathOperator{\foo}{foo}é o mesmo que usar \operatorname{foo}, então a linha (1) é a mesma que você obteria \DeclareMathOperator{\Set}{\mathit{Set}}.

Eles são os mesmos? Não.

Terceira pergunta

Use \operatornameno documento para operadores que aparecem uma ou duas vezes. Para operadores que são usados ​​várias vezes, adicione a \DeclareMathOperatorlinha apropriada , a fim de facilitar a digitação e reduzir a confusão.

Termo aditivo

Deixo para você como um exercício para encontrar as diferenças entre

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

e

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