自动生成带有符号名称的新命令

自动生成带有符号名称的新命令

作为我之前问题的延伸自动生成新命令,我也想为希腊随机变量生成命令,即:

\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}
  1. \rvepsilon命令不应该有可选参数
  2. 你错过了\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}

相关内容