我的 LaTeX 文档的序言通常包含很多行\DeclareMathOperator
说明,例如
\DeclareMathOperator{\Rep}{Rep}
\DeclareMathOperator{\Tet}{Tet}
\DeclareMathOperator{\Maps}{Maps}
\DeclareMathOperator{\Diff}{Diff}
有什么好方法地图列表上的一些宏,这样当我添加新的数学运算符时,我可以更简洁地完成此操作,并减少复制和粘贴?
答案1
使用以下功能更新解决方案电子工具箱它实质上实现了“ \MapCommand
”并将其命名为\forcsvlist
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\newcommand{\DeclareMyOperator}[1]{%
\expandafter\DeclareMathOperator\csname #1\endcsname{#1}
}
\newcommand{\DeclareMathOperators}{\forcsvlist{\DeclareMyOperator}}
\DeclareMathOperators{Rep,Tet,Maps,Diff}
\begin{document}
Operators: $\Rep, \Tet, \Maps, \Diff$
\end{document}
“由于历史原因”,我在下面保留我原来的答案。
结合 Grigory 和 Andrew 之前的回答,我能够提出以下更简洁的实现,它还提供了一个不错的用户界面。
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\def\ops@declare#1{%
\expandafter\DeclareMathOperator\csname #1\endcsname{#1}
}
\def\ops@scan#1,{%
\ifx#1\relax
\let\ops@next\relax
\else
\ops@declare{#1}\let\ops@next\ops@scan
\fi\ops@next
}
\newcommand{\DeclareMathOperators}[1]{\ops@scan#1,\relax,}
\makeatother
\DeclareMathOperators{Rep,Tet,Maps,Diff}
\begin{document}
Operators: $\Rep, \Tet, \Maps, \Diff$
\end{document}
答案2
有几种方法可以使用不同软件包的不同编程工具来实现这一点。以下是使用 LaTeX2e 内核命令\@for
映射逗号分隔列表的示例:
\makeatletter
\newcommand\MakeMathOperators[1]{%
\@for\@ii:=#1\do{%
\expandafter\DeclareMathOperator\@ii
}%
}
\makeatother
\MakeMathOperators{
\rep {Rep} ,
\tet {Tet} ,
\maps {Maps}
}
答案3
结合先前的答案与那些相关问题浏览某件事的列表我想出了以下解决方案,使用etoolbox
2.0(2010-08-21)或更高版本。
\newcommand{\define}[4]{\expandafter#1\csname#3#4\endcsname{#2{#4}}}
\forcsvlist{\define{\DeclareMathOperator}{}{}}{Rep, Tet, Maps, Diff}
\forcsvlist{\define{\newcommand}{\mathcal}{c}}{A,B,C,D,E,F,G,H,I,J,K}
最后一行定义\cA
为\mathcal{A}
列表中所有字母。
如果想要不同的列表分隔符,例如;
,可以使用\DeclareListParser*{\formylist}{;}
,然后替换\forcvslist
为\formylist
。
答案4
以下是 Kevin Walker 的 LaTeX 序言中的一个解决方案:
% tricky way to iterate macros over a list
\def\semicolon{;}
\def\applytolist#1{
\expandafter\def\csname multi#1\endcsname##1{
\def\multiack{##1}\ifx\multiack\semicolon
\def\next{\relax}
\else
\csname #1\endcsname{##1}
\def\next{\csname multi#1\endcsname}
\fi
\next}
\csname multi#1\endcsname}
% \DeclareMathOperator{\pr}{pr} etc.
\def\declaremathop#1{\expandafter\DeclareMathOperator\csname #1\endcsname{#1}}
\applytolist{declaremathop}{pr}{im}{gl}{ev}{coinv}{tr}{rot}{Eq}{obj}{mor}{ob}{Rep}{Tet}{cat}{Maps}{Diff}{Homeo}{sign}{supp}{Nbd}{res}{rad};