使用按键连续调用宏会产生意外的输出

使用按键连续调用宏会产生意外的输出

当我使用具有键值(使用 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从未出现过,因此该值实际上不可用。secondparamlog

这是一个解决方法:

\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但可能现实世界的用例更有利于找到一个好的解决方案。

相关内容