当我使用具有键值(使用 package 定义keycommand
)的宏进行两次连续调用时,我没有得到预期的结果。
看下面的代码,宏使用键secondparam\firstmacro
进行调用\secondmacro
。我得到的结果是:
是的,我期望的结果显然是:
这是我的“天真”代码:
\documentclass{letter}
\usepackage{keycommand}
\newkeycommand{\firstmacro}[firstparam]{
\secondmacro[secondparam=\commandkey{firstparam}]}
\newkeycommand{\secondmacro}[secondparam]{
The value is \commandkey{secondparam}}
\begin{document}
\secondmacro[secondparam=316] (called with \texttt{\textbackslash secondmacro})
\firstmacro[firstparam=316] (called with \texttt{\textbackslash firstmacro})
\end{document}
(如果您不仅能提供解决方案,还能解释为什么会发生这种情况,那就太好了!:)
答案1
我不确定原因,但使用\tracingmacros
显示在文件中316
从未出现过,因此该值实际上不可用。secondparam
log
这是一个解决方法:
\documentclass{letter}
\usepackage{keycommand}
\newkeycommand{\firstmacro}[firstparam]{%
\edef\ckfirstparam{\commandkey{firstparam}}%
\secondmacro[secondparam=\ckfirstparam]%
}
\newkeycommand{\secondmacro}[secondparam]{%
The value is \commandkey{secondparam}%
}
\begin{document}
\secondmacro[secondparam=316] (called with \texttt{\textbackslash secondmacro})
%\tracingmacros=1
\firstmacro[firstparam=316] (called with \texttt{\textbackslash firstmacro})
%\tracingmacros=0
\end{document}
对于一般文本,作为的值firstparam
,使用\protected@edef
,而不是\edef
。
例如,有更好的方法来应对采用键值参数的命令,expl3
但可能现实世界的用例更有利于找到一个好的解决方案。