我经常会有很多定义,比如
\newcommand{\R}{\ensuremath{\mathbb{R}}}
替换R
为R,Z,C
等
我可能还会有一堆数学运算符或类别定义,例如
\newcommand{\cC}{\ensuremath{\mathscr{C}}}
我希望有一种可以一次性定义这一切的方法。例如,我可以编写一些函数\bb
,然后直接编写
\bb{Z,R,C,...}
\operators{Hom,Tor,Ext,....}
\category{C,S,H,...}
这样我就可以在文档中使用\Z
for 了。\mathbb{Z}
这种事可能吗?
答案1
etoolbox
的列表解析器\docsvlist
是实现这一目标的理想选择:
\documentclass{article}
\usepackage{amssymb}% http://ctan.org/pkg/amssymb
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\bb}[1]{%
\renewcommand*{\do}[1]{% \do to each item in list
\expandafter\newcommand\csname ##1\endcsname{\ensuremath{\mathbb{##1}}}%
}%
\docsvlist{#1}% Process list
}
\begin{document}
\bb{R,N,Z,Q,C}% Create \mathbb macros
Real: \R, Natural: \N, Integer: \Z, Rational: \Q, Complex: \C
\end{document}
该宏\do
应用于 CSV 列表中的每个条目。
答案2
这是一个可能的解决方案:
\documentclass{article}
\usepackage{amssymb}
\newcommand{\processlist}[3][\relax]{%
\def\listfinish{#1}%
\long\def\listact{#2}%
\processnext#3\listfinish}
\newcommand{\processnext}[1]{%
\ifx\listfinish#1\empty\else\listact{#1}\expandafter\processnext\fi}
\newcommand{\bb}[1]{%
\expandafter\newcommand\csname #1\endcsname{\ensuremath{\mathbb{#1}}}}
\begin{document}
\processlist{\bb}{{R}{N}{Z}{Q}}
Real: \R, Natural: \N, Relative: \Z, Fractional: \Q
\end{document}
答案3
这是一个更抽象(并且更简短)的方法:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% #1 = command to use
% #2 = optional prefix
% #3 = list
\NewDocumentCommand{\createbunch}{ m O{} m }
{
\clist_map_inline:nn { #3 } { \cs_new_protected:cpn { #2 ##1 } { #1 { ##1 } } }
}
\ExplSyntaxOff
\createbunch{\mathbb}{Z,R,C}
\createbunch{\operatorname}{Hom,Tor,Ext}
\createbunch{\mathcal}[c]{C,S,H}
% This is just for showing the meaning of some of the created macros
\makeatletter
\newcommand\Meaning[1]{\texttt{\string#1: \expandafter\strip@prefix\meaning#1}}
\makeatother
\begin{document}
\Meaning\Z
\Meaning\R
\Meaning\Hom
\Meaning\cS
\end{document}