我想要做的是\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}
等等。
为什么你的尝试没有成功?原因有三。
中的每个循环
\foreach
都是按组进行的,因此\newcommand
其中的一个会被立即遗忘即使在开始工作之前的第一个循环中
\x\x
被替换,也是非法的。CC
\newcommand
\newcommand{CC}
即使你解决了前两个问题,你仍然会定义
\newcommand{\CC}{\mathbb{\x}}
因为\newcommand
永远不会扩展它的第二个参数。