使用 \newcommand 替换命令中的选项?

使用 \newcommand 替换命令中的选项?

我正在尝试用一个简单的 替换单个选项(例如,width=2mmcolour=greendotted\newcommand。我设想使用诸如\w2\cg或之类的简短选项\qst,只是为了提高打字速度(尤其是使用option=something个位)。

我具体想做的事情是:

\usepackage{todonotes}

\newcommand{\q}{color=green}

\todo[\q]{my text goes here}

我收到一条错误,内容为“包 xkeyval 错误:'color=green' 在 todonotes 系列中未定义”。

现在,该软件包提供了一种替代方法,即将整行完全写出为一个新命令,即:

\newcommand{\q}{\todo[color=green]{my text goes here}}
\newcommand{\q}[1]{\todo[color=green]{#1}}

这并不可怕,但现在我只是好奇如何将一个选项设置为命令,因为我无法在任何地方找到它,而且我确信我将来会想这样做。

更新 看起来我最快的版本是这样做:

\newcommand{\q}[2][]{\todo[color=green, #1]{#1}}

所以我仍然可以正常更改其他选项。

答案1

keyval 解析器做了一些改进不是扩展宏,以便您可以在值中使用它们,而不会在错误的时间扩展它们。

因此,你可以\q在传入之前强制扩展

 \expandafter\todo\expandafter[\q]

但这不太方便,

 \newcommand\q{\todo[color=green]}

可能是最简单的版本。

答案2

您可以定义新的键。

\documentclass{article}
\usepackage{todonotes}

\makeatletter
\newcommand\newtodooption[2]{%
  \define@key{todonotes}{#1}[]{%
    \setkeys{todonotes}{#2}%
  }%
}
\makeatother

\newtodooption{q}{color=green}

\begin{document}

Abc \todo[q]{text goes here}

Abc \todo[color=green]{text goes here}

\end{document}

相关内容