我最近声明了很多数学运算符,例如\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}