\DeclareMathOperator
要求放在序言中的理由是什么?
为什么不允许用户将运算符定义的范围限制在特定的章节或环境中,例如\newcommand
?
答案1
在这种情况下 ,与这个问题提出的问题\DeclareMathOperator
相反:LaTeX
为什么 LaTeX 将 \DeclareMathSymbol 和 \DeclareSymbolFont 设为仅有前言?,为用户提供了一种简单的可能性来规避only-preamble
限制:那就是使用\operatorname
或\operatornamewithlimits
命令,也是由提供的amsmath
(或者更准确地说,amsopn
其中\DeclareMathOperator
定义并仅在前言中提供)。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\texttt{\textbackslash COS has meaning: \meaning\COS}
\texttt{\textbackslash cos has meaning: \meaning\cos}
\begin{large}
\newcommand{\COS}{\operatorname{COS}}
In this environment the math operator \verb|\COS| is defined: $\COS(x)=\cos(x)$.
\texttt{\textbackslash COS has meaning: \meaning\COS}
\end{large}
\texttt{\textbackslash COS now has meaning: \meaning\COS}
\end{document}
另外,\DeclareMathOperator
Unicode 引擎存在一个问题(如果减号是 Unicode 数学字符),这个问题已在lualatex
通过加载包来修复lualatex-数学
答案2
我想,回答你的“为什么”这个问题有两个部分。
\@onlypreamble
最直接的是,该包的许多设置类型宏都有一个限定符amsmath
,以确保它们在序言之外调用时不会起作用。该宏\DeclareMathOperator
在文件中定义amsopn.sty
,该文件由 加载;请注意中 ca 第 57 行的amsmath.sty
指令。\@onlypreamble\DeclareMathOperator
amsopn.sty
你可能会问,为什么要\@onlypreamble
加上限定词?我没有参与设计或创作amsmath
包的设计或创建,但我认为一个合理的猜测是,创建者坚持 LaTeX2e 格式的精神,它强烈鼓励将内容从画面显示内容。后面的事情应该在序言中处理。
为了解决您的相关问题,即各个章节可能需要对同一个运算符类型宏进行不同的定义。为了具体起见,我们假设运算符称为\det
。该包的创建者amsmath
要么没有设想过像您在此处提出的用例,要么很可能他们认为最好在序言中定义所有可能的变体\det
——比如\detA
和\detB
——然后在每章开头\let
执行\det
或。\detA
\detB