Wenn ich zuvor einen .meta:n
Schlüssel mit
\keys_define:nn { module } { key .meta:n = { … } }
\kerys_define:nn
Dann 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 \setstyle
die Metaoptionen für ersetzen style
und \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 \showstyle
Befehl ändern, da mit der Art, wie ich definiert habe \setstyle
, \keys_show:nn
nur 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 \setstyle
in
\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
}
}