如何扩展用 \csname...\endcsname 定义的参数?

如何扩展用 \csname...\endcsname 定义的参数?

与描述的情况类似完成所有这些之后再进行扩张?,我有一个宏看起来像

\somecommand{Some Argument}{\secondarg}.

\secondarg在 中使用之前,我还需要扩展参数\somecommand。解决方案是etextools

\usepackage{etextools}
\expandnext{\somecommand{Some Argument}}{\secondarg},

由 Martin Scharrer 提出的,对我来说很好。

然而,我的问题是,\secondarg我没有将构造定义为

\expandafter\newcommand\csname secondarg\the\value{mycounter}\endcsname{Second argument 1}.

如果我只是用 替换\secondarg\csname secondarg\the\value{mycounter}\endcsname结果看起来好像参数没有扩展。有没有一种简单的方法可以正确地扩展它,也许可以通过用 重写示例etextools

答案1

代替

\expandafter

经过

\expandafter\expandafter\expandafter

(通常需要 2^n-1\expandafter才能得到某个值n


为了将这三个\expandafter放在正确的位置,你可以这样做:

\newcounter{mycounter}


\def\somecommand#1#2{%
\def\a{#1}%
\def\b{#2}%
\show\a
\show\b}

\expandafter\def\csname secondarg\the\value{mycounter}\endcsname{hello}

\def\myexp#1#2#3{%
\toks0{#1{#2}}%
\the\toks0\expandafter\expandafter\expandafter{#3}}

\myexp
\somecommand{Some Argument}{\csname secondarg\the\value{mycounter}\endcsname}

\stop

产生

> \a=macro:
->Some Argument.
\somecommand ...>\def \a {#1}\def \b {#2}\show \a 
                                                  \show \b 
l.17 ... secondarg\the\value{mycounter}\endcsname}

? 
> \b=macro:
->hello.

表明hello已作为参数传递。


或者对于评论中要求的修改版本:

\newcounter{mycounter}
\newcounter{anothercounter}
\setcounter{anothercounter}{42}


\def\somecommand#1#2{%
\def\a{#1}%
\def\b{#2}%
\show\a
\show\b}

\expandafter\def\csname secondarg\the\value{mycounter}\endcsname{hello}

\def\myexp#1#2#3{%
\toks0\expandafter\expandafter\expandafter{#3}%
\edef\tmp{\noexpand#1{#2}{\the\toks0}}%
\tmp}

\myexp
\somecommand{eq\the\value{anothercounter}}{\csname secondarg\the\value{mycounter}\endcsname}

\stop

完全膨胀#2并膨胀#3两次,产生

> \a=macro:
->eq42.
\somecommand ...>\def \a {#1}\def \b {#2}\show \a 
                                                  \show \b 
l.20 ... secondarg\the\value{mycounter}\endcsname}

? 
> \b=macro:
->hello.

答案2

最好的办法是使用切换参数定义宏。如果这不可行,因为这需要对文档进行大量更改,那么请使用间接策略:

\let\originalsomecommand\somecommand
\renewcommand\somecommand[2]{%
  \expandafter\somecommandaux\expandafter{#2}{#1}%
}
\newcommand\somecommandaux{\originalsomecommand{#2}{#1}}

因此要切换两次参数。

相关内容