我如何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}