Wie füge ich Optionen an einen vorhandenen .meta:n l3key an?

Wie füge ich Optionen an einen vorhandenen .meta:n l3key an?

Wenn ich zuvor einen .meta:nSchlüssel mit

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

\kerys_define:nnDann ist es einfach, den Schlüssel durch einen Aufruf mit neuen Optionen durch neue Werte zu ersetzen meta.

Aber was ist, wenn ich die aktuellen Metaoptionen für den Schlüssel anhängen möchte?

MWE

In diesem MWE möchte ich \setstyledie Metaoptionen für ersetzen styleund \setstyle*an die Metaoptionen für anhängen style. Wie kann ich das machen?

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

Antwort1

Ich bin mir nicht sicher, ob es eine offizielle Schnittstelle gibt, aber das Speichern der Schlüssel als Clist scheint zu funktionieren. Ich musste den \showstyleBefehl ändern, da mit der Art, wie ich definiert habe \setstyle, \keys_show:nnnur angezeigt wird

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

was nicht sehr hilfreich ist. Außerdem hätte ich vollkommenes Verständnis, wenn das nicht das ist, was Sie im Sinn hatten ...

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

Ich habe keine Benchmarks durchgeführt, aber es ist möglich, dass die Vorkompilierung einen Geschwindigkeitsvorteil bietet. Sie könnten die Definition von ändern \setstylein

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

verwandte Informationen