\foreach 与 \newcommand 如何一起使用?

\foreach 与 \newcommand 如何一起使用?

我想要做的是\newcommand用 a来缩短它\foreach,因为这只是我将要使用的一小部分。

\newcommand{\CC}{{\mathbb C}} % the set of complex numbers
\newcommand{\NN}{{\mathbb N}} % the set of natural numbers
\newcommand{\QQ}{{\mathbb Q}} % the set of rational numbers
\newcommand{\ZZ}{{\mathbb Z}} % the set of integer numbers
\newcommand{\DD}{{\mathbb D}} % the unit disk
\newcommand{\RR}{{\mathbb R}} % the set of real numbers
\newcommand{\TT}{{\mathbb T}} % the unit circle (the one dimensional torus)

我尝试了这个,但它给出了一个错误,说命令\x已经定义。有什么建议吗?

\usepackage{amssymb}
\usepackage{pgffor}
\foreach \x in {C,N,Q,Z,D,R,T}
{
\newcommand{\x\x}{{\matbb{\x}}}

};

答案1

你需要扩展并让 LaTeX 知道你指的是控制序列

\documentclass{article}
\usepackage{amssymb}
\usepackage{pgffor}
\foreach \x in {C,N,Q,Z,D,R,T}{\expandafter\xdef\csname\x\x\endcsname{\noexpand\mathbb{\x}}}
\begin{document}
\foreach \x in {C,N,Q,Z,D,R,T}{$\csname\x\x\endcsname$}
\end{document}

在此处输入图片描述

答案2

为您提供更好的服务expl3

\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\makeabbrev}{mmm}
 {
  \yoruk_makeabbrev:nnn { #1 } { #2 } { #3 }
 }

\cs_new_protected:Npn \yoruk_makeabbrev:nnn #1 #2 #3
 {
  \clist_map_inline:nn { #3 }
   {
    \cs_new_protected:cpn { #2 } { #1 { ##1 } }
   }
 }
\ExplSyntaxOff

\makeabbrev{\mathbb}{#1#1}{C,N,Q,Z,D,R,T}

\makeabbrev{\mathcal}{c#1}{A,B,C}

\begin{document}

$\CC\DD\TT\cA\cB\cC$

\end{document}

第一个参数\makeabbrev是要使用的数学字母表,第二个参数是一个模板,其中#1代表在检查第三个参数给出的列表中的字母时的当前项目。

在此处输入图片描述

因此,在第一个调用中我们定义\CC代表等等\mathbb{C},在第二个调用中我们定义\cA\cB\cC代表\mathcal{A}等等。


为什么你的尝试没有成功?原因有三。

  1. 中的每个循环\foreach都是按组进行的,因此\newcommand其中的一个会被立即遗忘

  2. 即使在开始工作之前的第一个循环中\x\x被替换,也是非法的。CC\newcommand\newcommand{CC}

  3. 即使你解决了前两个问题,你仍然会定义\newcommand{\CC}{\mathbb{\x}}因为\newcommand永远不会扩展它的第二个参数。

相关内容