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 个\DeclareTextCompositeCommand
just in实例t1enc.def
和许多其他实例.def
。您会用那段荒谬的代码替换它们吗?我本可以提到\DeclareMathSymbol
它的定义更长,并且用于为数学符号命令分配含义数百次。
当然不是!而且\DeclareMathOperator
是同样的道理:为了正确地定义一个代表操作员的命令,需要做几件事,因此amsmath
提供了一个抽象,使用户无需了解与他们无关的内部细节。你不需要研究微波炉的工作原理来获得它:你可以去商店购买它。
类似地,\pgfmathsetmacro
是一种抽象,允许用户使用命令来定义具有记录属性的控制序列。PGF 的维护者知道实现的细节,就像制造商知道微波炉的设计一样。