从定义中解析 xkeyval 键

从定义中解析 xkeyval 键

我如何xkeyvalue从定义中解析?代码

\documentclass{article}
\usepackage{xkeyval}

\define@key{mykeys}{foo}[foo-default]{\def\x{Key 'foo' does nothing}}
\define@key{mykeys}{bar}[bar-default]{}
\def\KEYS{foo,bar=key}

\begin{document}
\setkeys{mykeys}{\KEYS}
\end{document}

失败,因为foo,bar=key不被识别为两个键,而只被识别为一个键。换句话说,xkeyval不识别键foo和之间的逗号bar=key。我怎样才能让 xkeyval 正确识别逗号?

答案1

\setkeys没有扩展它的第二个参数,但是错误消息却扩展了,所以有时令人费解。

您可以定义一个\setkeysexpanded命令:

\newcommand{\setkeysexpanded}[2]{%
  \expandafter\setkeysexpandedaux\expandafter{#2}{#1}}
\newcommand{\setkeysexpandedaux}[2]{%
  \setkeys{#2}{#1}}

然后

\setkeysexpanded{mykeys}{\KEYS}

将工作。

双重参数切换是为了方便使用\expandafter

答案2

请接受 egreg 的回答。另一种方法是定义一个特殊键set list,然后使用它来设置键值列表:

\documentclass{article}
\usepackage{xkeyval}
\makeatletter
\define@key{mykeys}{set list}{%
  \edef\reserved@a{\noexpand\XKV@setkeys[]{\unexpanded\expandafter{#1}}}%
  \reserved@a
}
\define@key{mykeys}{foo}[foo-default]{%
  \edef\x{Key 'foo' with value '\detokenize{#1}' does nothing}%
}
\define@key{mykeys}{bar}[bar-default]{%
  \edef\x{Key 'bar' with value '\detokenize{#1}' does nothing}%
}
\def\kvlist{foo,bar=bar-value}
\setkeys{mykeys}{set list=\kvlist}
\makeatother
\begin{document}
x
\end{document} 

相关内容