为什么 \DeclareMathOperator 必须在序言中?

为什么 \DeclareMathOperator 必须在序言中?

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

另外,\DeclareMathOperatorUnicode 引擎存在一个问题(如果减号是 Unicode 数学字符),这个问题已在lualatex通过加载包来修复lualatex-数学

答案2

我想,回答你的“为什么”这个问题有两个部分。

\@onlypreamble最直接的是,该包的许多设置类型宏都有一个限定符amsmath,以确保它们在序言之外调用时不会起作用。该宏\DeclareMathOperator在文件中定义amsopn.sty,该文件由 加载;请注意中 ca 第 57 行的amsmath.sty指令。\@onlypreamble\DeclareMathOperatoramsopn.sty

你可能会问,为什么要\@onlypreamble加上限定词?我没有参与设计或创作amsmath包的设计或创建,但我认为一个合理的猜测是,创建者坚持 LaTeX2e 格式的精神,它强烈鼓励将内容画面显示内容。后面的事情应该在序言中处理。

为了解决您的相关问题,即各个章节可能需要对同一个运算符类型宏进行不同的定义。为了具体起见,我们假设运算符称为\det。该包的创建者amsmath要么没有设想过像您在此处提出的用例,要么很可能他们认为最好在序言中定义所有可能的变体\det——比如\detA\detB——然后在每章开头\let执行\det或。\detA\detB

相关内容