如果我之前已经设置了.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
}
}