将未知密钥存储在 l3keys 中

将未知密钥存储在 l3keys 中

有什么好方法可以保存钥匙expl3 中的unknownkey-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}

MWE output showing the \l_keys_key_tl variable printing the same thing twice

答案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}

enter image description here

答案2

您可以使用扩展(Nx)来扩展键,然后\exp_not对于未知的控制序列进行阻止扩展()。

正如@egreg 在评论中提到的那样,您可能想要\exp_not:n { \f{#1} }而不是\exp_not:N,因为它不会扩展#1(当前使用的会扩展)。

expand

\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}

相关内容