Если я ранее настроил .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
}
}