有什么好方法可以保存钥匙expl3 中的unknown
key-val?我可以得到\l_keys_key_tl
,但它在扩展之前就被覆盖了。我想我需要在存储它时扩展它,但我很难做到这一点,特别是因为我还不想扩展这个值。另外,我希望得到多个未知数,顺序很重要,所以 l3prop 不合适。
以下是 MWE:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\seq_new:N \l_mymod_seq
\keys_define:nn { mymod } {
a .tl_set:N = \tmpa, % some keys are treated special
% others are grouped with unknowns
b .code:n = \seq_put_right:Nn \l_mymod_seq {(B~is~\f{#1})},
unknown .code:n = \seq_put_right:Nn \l_mymod_seq {(unknown~{\l_keys_key_tl}~is~\f{#1})},
}
\newcommand\setkeys[1]{\keys_set:nn { mymod } { #1 }}
\newcommand\printkeys{\seq_use:Nn \l_mymod_seq {,~}}
\ExplSyntaxOff
\begin{document}
\setkeys{a=5,b=6,c=7,d=8}
\newcommand\f[1]{\textbf{#1}}
A is \f{\tmpa}
\renewcommand\f[1]{\textit{#1}}
\printkeys
\end{document}
答案1
您可以使用自定义函数及其变体来避免代码重复。下面\mymod_store:Vn
与\mymod_store:nn
,但第一个参数应为标记列表变量(其他数据类型也可以适用),其价值传递给主宏。
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\seq_new:N \l_mymod_keyvalue_seq
\keys_define:nn { mymod }
{
% some keys are special
a .tl_set:N = \valueofa,
% others are grouped with unknowns
b .code:n = \mymod_store:nn {B} {#1},
unknown .code:n = \mymod_store:Vn \l_keys_key_tl {#1},
}
\cs_new_protected:Nn \mymod_store:nn
{
\seq_put_right:Nn \l_mymod_keyvalue_seq {(#1~is~\f{#2})}
}
\cs_generate_variant:Nn \mymod_store:nn { V }
\NewDocumentCommand{\setkeys}{m}
{
\keys_set:nn { mymod } { #1 }
}
\NewExpandableDocumentCommand\printkeys{}
{
\seq_use:Nn \l_mymod_keyvalue_seq {,~}
}
\ExplSyntaxOff
\newcommand\f[1]{\textbf{#1}}
\begin{document}
\setkeys{a=5,b=6,c=7,d=8}
A is \f{\valueofa}
\renewcommand\f[1]{\textit{#1}}
\printkeys
\end{document}
答案2
您可以使用扩展(Nx
)来扩展键,然后\exp_not
对于未知的控制序列进行阻止扩展()。
正如@egreg 在评论中提到的那样,您可能想要\exp_not:n { \f{#1} }
而不是\exp_not:N
,因为它不会扩展#1
(当前使用的会扩展)。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\seq_new:N \l_mymod_seq
\keys_define:nn { mymod } {
a .tl_set:N = \tmpa, % some keys are treated special
% others are grouped with unknowns
b .code:n = \seq_put_right:Nn \l_mymod_seq {(B~is~\f{#1})},
unknown .code:n = \seq_put_right:Nx \l_mymod_seq {(unknown~\l_keys_key_tl\ is~\exp_not:N \f{#1})},
}
\newcommand\setkeys[1]{\keys_set:nn { mymod } { #1 }}
\newcommand\printkeys{\seq_use:Nn \l_mymod_seq {,~}}
\ExplSyntaxOff
\begin{document}
\setkeys{a=5,b=6,c=7,d=8}
\newcommand\f[1]{\textbf{#1}}
A is \f{\tmpa}
\renewcommand\f[1]{\textit{#1}}
\printkeys
\end{document}