新命令对象列表

新命令对象列表

我经常会有很多定义,比如

\newcommand{\R}{\ensuremath{\mathbb{R}}}

替换RR,Z,C

我可能还会有一堆数学运算符或类别定义,例如

\newcommand{\cC}{\ensuremath{\mathscr{C}}}

我希望有一种可以一次性定义这一切的方法。例如,我可以编写一些函数\bb,然后直接编写

\bb{Z,R,C,...}

\operators{Hom,Tor,Ext,....}

\category{C,S,H,...}

这样我就可以在文档中使用\Zfor 了。\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}

在此处输入图片描述

相关内容