![从 l3prop 键展开列表](https://linux22.com/image/470216/%E4%BB%8E%20l3prop%20%E9%94%AE%E5%B1%95%E5%BC%80%E5%88%97%E8%A1%A8.png)
我有一个键,它以逗号分隔的列表作为其值,其中的条目来自属性列表的键。我希望“默认”(未指定值)将键应用于属性列表的每个键。我不知道如何将属性键转换为可以传递给的扩展列表\clist_map_inline:nn
。这是一个最小的非工作示例:
\documentclass{article}
\ExplSyntaxOn
\prop_new:N \g_mymodule_prop
\prop_set_from_keyval:Nn \g_mymodule_prop
{ A=1, B=2, C=3, D=4 }
\keys_define:nn { mymodule }
{
print .code:n =
{
\clist_map_inline:nn { #1 }
{ \prop_item:Nn \g_mymodule_prop { ##1 } \par }
},
print .default:n = { } % What to put here?
}
\ExplSyntaxOff
\begin{document}
\SetKeys[mymodule]{print={A,C}}
\SetKeys[mymodule]{print}
\end{document}
就像是
print .default:n = { \prop_map_inline:Nn \g_mymodule_prop { ##1, } }
不起作用,因为\clist_map_inline:nn
将其视为单项列表,并且当然没有具有该名称的属性键。我也尝试过使用on
和en
变体,\clist_map_inline:nn
但\prop_map_inline:Nn
不能扩展(我认为),所以这也不起作用。
有没有办法按照我的方法做到这一点?如果没有,是否有办法为不依赖于最初提供的密钥的“默认”版本提供完全独立的代码.code:n
?
答案1
我打算映射属性列表以创建一个 clist 来像在非默认情况下一样使用,但是由于您正在映射 prop 列表,因此您也可以直接使用值而不是收集键:
\documentclass{article}
\ExplSyntaxOn
\prop_new:N \g_mymodule_prop
\prop_set_from_keyval:Nn \g_mymodule_prop
{ A=1, B=2, C=3, D=4 }
\keys_define:nn { mymodule }
{
print .code:n =
{
%\showtokens{#1}
\clist_if_empty:nTF { #1 }
{ \prop_map_inline:Nn \g_mymodule_prop {##2\par} }
{ \clist_map_inline:nn { #1 } {\prop_item:Nn \g_mymodule_prop { ##1 } \par }}
},
% print .default:n = { } % What to put here?
}
\ExplSyntaxOff
\begin{document}
\SetKeys[mymodule]{print={A,C}}
\bigskip
\SetKeys[mymodule]{print}
\end{document}