Si previamente he configurado una .meta:n
clave con
\keys_define:nn { module } { key .meta:n = { … } }
entonces es fácil reemplazar la clave con nuevos valores llamando \kerys_define:nn
con nuevas meta
opciones.
Pero, ¿qué pasa si quiero agregar la clave a las metaopciones actuales?
MWE
En este MWE, quiero \setstyle
reemplazar las metaopciones de style
y \setstyle*
agregarlas a las metaopciones de style
. ¿Cómo puedo hacer esto?
\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}
Respuesta1
No estoy seguro de si existe una interfaz oficial, pero almacenar las claves como una lista parece funcionar. Tuve que cambiar el \showstyle
comando porque con la forma que lo he definido \setstyle
, \keys_show:nn
solo muestra
> code => \keys_set:nV {dcp}\l_dcp_style_clist
lo cual no es de mucha ayuda. Además, lo entendería perfectamente si esto no es lo que tenías en mente...
\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}
No he realizado una evaluación comparativa, pero es posible que la precompilación ofrezca algún beneficio de velocidad; podrías cambiar la definición de \setstyle
a
\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
}
}