作为我之前问题的延伸自动生成新命令,我也想为希腊随机变量生成命令,即:
\usepackage{bm}
\newcommand{\myrv}[1]{\bm{#1}}
\newcommand{\rvepsilon}{\myrv{\epsilon}}
\newcommand{\rvnu}{\myrv{\nu}}
不幸的是,前面问题的答案中的技巧在这种情况下不起作用。例如,当我尝试
\documentclass{article}
\usepackage{bm}
% Notation for Greek random variables
\newcommand{\myrv}[1]{\bm{#1}}
\makeatletter
\newcommand*\defrvar[1]{
\expandafter\newcommand\csname rv#1\endcsname[1][]{\myrv{#1}}}
\newcommand*\defrvars[1]{
\@for\@i:=#1\do{\expandafter\defrvar\expandafter{\@i}}}
\makeatother
\defrvars{epsilon,nu}
\begin{document}
$\rvepsilon = 1$
\end{document}
输出为“埃普西隆=1”,而不是所需的输出“ε= 1”。
有没有办法通过循环列表来自动定义命令{alpha,beta,gamma,...}
?
答案1
你犯了几个错误:
\documentclass{article}
\usepackage{bm}
% Notation for Greek random variables
\newcommand{\myrv}[1]{\bm{#1}}
\makeatletter
\newcommand*\defrvar[1]{%
\expandafter\newcommand\csname rv#1\endcsname{\myrv{\csname #1\endcsname}}}
\newcommand*\defrvars[1]{%
\@for\@i:=#1\do{\expandafter\defrvar\expandafter{\@i}}%
}
\makeatother
\defrvars{epsilon,nu}
\begin{document}
$\rvepsilon = 1$
\end{document}
- 该
\rvepsilon
命令不应该有可选参数 - 你错过了
\csname...\endcsname
,所以\defrvar{epsilon}
定义\rvepsilon
为给予\myrv{epsilon}
;现在它给予\myrv{\csname epsilon\endcsname}
不可避免的expl3
版本:
\documentclass{article}
\usepackage{bm}
\usepackage{xparse}
% Notation for Greek random variables
\NewDocumentCommand{\myrv}{m}{\bm{#1}}
\ExplSyntaxOn
\NewDocumentCommand{\defrvars}{ m }
{
\clist_map_inline:nn { #1 }
{
\cs_new:cpx { rv##1 } { \myrv { \exp_not:c { ##1 } } }
}
}
\ExplSyntaxOff
\defrvars{epsilon,nu}
\begin{document}
$\rvepsilon = 1$
\end{document}