如何将选项附加到现有的 .meta:n l3key?

如何将选项附加到现有的 .meta:n l3key?

如果我之前已经设置了.meta:n密钥

\keys_define:nn { module } { key .meta:n = { … } }

\kerys_define:nn然后通过调用新选项很容易用新值替换键meta

但是如果我想将键附加到当前的元选项中该怎么办?

平均能量损失

在此 MWE 中,我想\setstyle替换 的元选项style并将\setstyle*其附加到 的元选项style。我该怎么做?

\documentclass{article}
\ExplSyntaxOn
\keys_define:nn { dcp }
  { 
    keya .tl_set:N = \l__dcp_keya_tl ,
    keyb .tl_set:N = \l__dcp_keyb_tl ,
    keyc .tl_set:N = \l__dcp_keyc_tl ,
    style .choice:
  }
\NewDocumentCommand \setstyle { s m }
  {
    \bool_if:NTF #1
      {
        % how can I append to style?
      }
      {
        % set style
        \keys_define:nn { dcp } { style .meta:n = {#2} }
      }
  }
\NewDocumentCommand \showstyle { }
  {
    \keys_show:nn { dcp } { style }
  }
\ExplSyntaxOff
\setstyle{keya=x,keyb=y}
\begin{document}
\showstyle
\setstyle{keya=x,keyb=yy}
\showstyle
\setstyle*{keyc=z}
\showstyle
\end{document}

答案1

不确定是否有官方界面,但将密钥存储为 clist 似乎可行。我不得不更改命令,\showstyle因为按照我定义的方式\setstyle\keys_show:nn只会显示

>  code  =>  \keys_set:nV {dcp}\l_dcp_style_clist

这没什么帮助。另外,如果这不是你想要的,我完全理解...

\documentclass{article}
\ExplSyntaxOn
\keys_define:nn { dcp }
  { 
    keya .tl_set:N = \l__dcp_keya_tl ,
    keyb .tl_set:N = \l__dcp_keyb_tl ,
    keyc .tl_set:N = \l__dcp_keyc_tl ,
    %style .choice:
  }
\clist_new:N \l_dcp_style_clist
\NewDocumentCommand \setstyle { s m }
  {
    \bool_if:NTF #1
      {
        % append to style
        \clist_put_right:Nn \l_dcp_style_clist { #2 }
      }
      {
        % set style
        \clist_set:Nn \l_dcp_style_clist { #2 }
      }
    \keys_define:nn { dcp }
      {
        style .code:n = \keys_set:nV { dcp } \l_dcp_style_clist
      }
  }
\NewDocumentCommand \showstyle { }
  {
    \keys_set:nn { dcp } { style }
    \l__dcp_keya_tl
    \l__dcp_keyb_tl
    \l__dcp_keyc_tl
  }
\ExplSyntaxOff

\begin{document}

\setstyle{keya=x,keyb=y}

\showstyle

\setstyle{keya=x,keyb=yy}

\showstyle

\setstyle*{keyc=z}

\showstyle

\end{document}

我没有进行过基准测试,但预编译可能会带来一些速度上的好处;你可以将定义更改\setstyle

\cs_generate_variant:Nn \keys_precompile:nnN { nV }
\NewDocumentCommand \setstyle { s m }
  {
    \bool_if:NTF #1
      {
        % append to style
        \clist_put_right:Nn \l_dcp_style_clist { #2 }
      }
      {
        % set style
        \clist_set:Nn \l_dcp_style_clist { #2 }
      }
    \keys_precompile:nVN { dcp } \l_dcp_style_clist \l_dcp_stylekeys_tl
    \keys_define:nn { dcp }
      {
        style .code:n = \l_dcp_stylekeys_tl
      }
  }

相关内容