为每个大写单词声明一个数学运算符?

为每个大写单词声明一个数学运算符?

我最近声明了很多数学运算符,例如\DeclareMathOperator{\Hom}{Hom}, \DeclareMathOperator{\End}{End}等。这有点烦人,而且似乎是可以自动化的:我真正想要的是让每个大写单词都具有这种行为,例如,如果我\Foo在文档中输入内容,我希望将其解释为数学运算符,而无需事先指定。有没有简单的方法可以做到这一点?

答案1

此类循环的示例:\DeclareMathOperators获取以逗号分隔的数学运算符名称列表(不带反斜杠),并将其转换为数学运算符命令。列表中的空格和空条目将被删除。

\usepackage{amsmath}

\makeatletter
\newcommand*{\DeclareMathOperators}[1]{%
  \@for\@tmp:=#1\do{%
    % remove spaces
    \edef\@tmp{%
      \@firstofone{\expandafter\zap@space\@tmp} \@empty
    }%
    \ifx\@tmp\@empty
    \else
      % declare math operator
      \expandafter\DeclareMathOperator
      \csname\@tmp\expandafter\endcsname\expandafter{\@tmp}%
      % \wlog prints into the .log file
      % or \typeout can be used for console output                      
      \wlog{* Math operator "\@backslashchar \@tmp" defined.}%
    \fi
  }%
}
\makeatother

\DeclareMathOperators{
  End,
  Foo,
  Hom,
}

答案2

你是指这样的吗?没有比在一个循环中定义所有使用的术语更接近你想要的结果了。

\documentclass{article}

\usepackage{amsmath}

\makeatletter
\@for \op:={Dom,Hom}\do{
  \@ifundefined{\op}{
    \edef\DMOtemp{\noexpand\DeclareMathOperator{\csname\op\endcsname}{\op}}
    \DMOtemp
  }{}
}
\makeatother

\begin{document}

\[ \Dom A \neq \Hom B \]

\end{document}

我们使用 LaTeX 的,\@for因为pgffor会进行分组,从而将定义设为本地定义,因此它不起作用。对于列表的每个元素,我们将定义准备为\DMOtemp->\DeclareMathOperator{\Dom}{Dom},然后执行它。是相当必要的,因为如果我们想\@ifundefined重新定义某些东西,它会产生不良后果(被重新定义的东西会在 行执行,\edef整个事情可能会失败)。另一方面,未定义 就留在那里,这是非常正确的。\csname blabla\endcsname\blabla\blabla

答案3

下面是一些如何定义以逗号分隔的数学运算符列表的示例:

\documentclass[12pt]{minimal}

\usepackage{amsmath,etoolbox}

\newcommand{\DeclareMathOp}[1]{
    \csgdef{#1}{\operatorname{#1}}
}

\newcommand{\DeclareMathOps}[1]{
    \forcsvlist{\DeclareMathOp}{#1}
}

\DeclareMathOp{HULL}
\DeclareMathOps{OPA,OPB,OPC}

\begin{document}
$\HULL\OPA\OPB$
\end{document}

相关内容