\DeclareMathOperator 和 \operatorname 与 \def 系列和 \pgfmathsetmacro 有何不同?

\DeclareMathOperator 和 \operatorname 与 \def 系列和 \pgfmathsetmacro 有何不同?

LaTeX 有很多相似但又不同的创建新宏/命令/函数的方法,这让人很困惑。\DeclareMathOperator\operatorname其他常见的定义命令有何不同?

答案1

\operatorname根本不是一个定义,\operatorname{log}本质上是\mathop{\mathrm{log}} (省略了一些细节)

\DeclareMathOperator\mylog{log}本质上\def\mylog{\operatorname{log}}

提供 LaTeX 名称可提供更一致的语法,确保细节不是省略(例如,\operatorname{S}位于基线上,但\mathop{\mathrm{S}}会像\sum垂直居中一样)它也可以利用 LaTeX 语法进行相关定义,例如星号形式(在这种情况下\DeclareMathOperator*用于控制)\limits

答案2

许多为控制序列分配含义的其他方法,但\operatorname不在其中。

  • \def \gdef \edef \xdef以及\let(但要小心使用)
  • \newcommand \renewcommand \providecommand
  • \DeclareRobustCommand
  • \NewCommandCopy \RenewCommandCopy
  • \newlength \newsavebox(和别的\new...
  • \DeclareMathSymbol和朋友 (查看fontmath.ltx)
  • \DeclareTextCommand和朋友 (查看fonttext.ltx)

  • \newenvironment \newtheorem
  • \newcounter

间接定义控制序列。所有这些都是原语或在 LaTeX 内核中定义的。

包可能会引入定义控制序列的新方法。一种情况是amsmath(实际上amsopn)提供\DeclareMathOperator

为什么这么丰富?因为人们想避免不必要的代码重复。如果你仔细研究,t1enc.def你会发现\DeclareTextAccent\DeclareTextCommand和的几个实例\DeclareTextCompositeCommand。当然,每次调用时都可以用较低级别的代码替换它们,但是……

% latex.ltx, line 7345:
\def\DeclareTextCompositeCommand#1#2#3#4{%
  \expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname
  \ifx\reserved@a\relax
   \DeclareTextCommand#1{#2}{%
     \@latex@error{\string#1 undeclared in encoding #2}\@eha}%
   \@latex@info{Composite with undeclared \string#1 in encoding #2}%
   \expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname
  \fi
  \expandafter\expandafter\expandafter\ifx
  \expandafter\@car\reserved@a\relax\relax\@nil \@text@composite \else
      \edef\reserved@b##1{%
         \def\expandafter\noexpand
            \csname#2\string#1\endcsname####1{%
            \noexpand\@text@composite
               \expandafter\noexpand\csname#2\string#1\endcsname
               ####1\noexpand\@empty\noexpand\@text@composite
               {##1}}}%
      \expandafter\reserved@b\expandafter{\reserved@a{##1}}%
   \fi
   \expandafter\def\csname\expandafter\string\csname
      #2\endcsname\string#1-\string#3\@empty\endcsname{#4}%
  }

输出编码文件中有 12 个\DeclareTextCompositeCommandjust in实例t1enc.def和许多其他实例.def。您会用那段荒谬的代码替换它们吗?我本可以提到\DeclareMathSymbol它的定义更长,并且用于为数学符号命令分配含义数百次。

当然不是!而且\DeclareMathOperator是同样的道理:为了正确地定义一个代表操作员的命令,需要做几件事,因此amsmath提供了一个抽象,使用户无需了解与他们无关的内部细节。你不需要研究微波炉的工作原理来获得它:你可以去商店购买它。

类似地,\pgfmathsetmacro是一种抽象,允许用户使用命令来定义具有记录属性的控制序列。PGF 的维护者知道实现的细节,就像制造商知道微波炉的设计一样。

相关内容