与描述的情况类似完成所有这些之后再进行扩张?,我有一个宏看起来像
\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}}
因此要切换两次参数。