假设我有 2 个 plist 序列:
(
{
1 => 2,
3 => 4
},
{
5 => 6,
hello => 8
}
)
我正在遍历该序列,并且只想输出包含键“hello”的 plist。我创建了以下代码:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
%sequence definition
\clist_new:N\l_my_clist
%plist1 definition
\prop_new:N \prop_list_a
\prop_put:Nnn \prop_list_a {1}{2}
\prop_put:Nnn \prop_list_a {3}{4}
%plist2 definition
\prop_new:N \prop_list_b
\prop_put:Nnn \prop_list_b {5}{6}
\prop_put:Nnn \prop_list_b {hello}{8}
%putting plists to sequence
\clist_set:Nn \l_my_clist {\prop_list_a, \prop_list_b}
%output loop
\clist_map_inline:Nn \l_my_clist
{
\prop_get:NnNTF #1 {hello} \var
{
\prop_map_inline:Nn #1
{
[##1] ~[##2]\\
}
}
}
\ExplSyntaxOff
\end{document}
它输出的是:
- 为什么会出现逗号?
- 如何摆脱它?
- 如何使用
\var
?\prop_get:NnNTF
它的设计目的是什么?
答案1
\prop_get:NnNTF
您在代码中使用了错误分支,但并未给出错误分支,因此产生了奇怪的效果。您似乎想要类似
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
%plist1 definition
\prop_new:N \l_list_a_prop
\prop_put:Nnn \l_list_a_prop { 1 } { 2 }
\prop_put:Nnn \l_list_a_prop { 3 } { 4 }
%plist2 definition
\prop_new:N \l_list_b_prop
\prop_put:Nnn \l_list_b_prop { 5 } { 6 }
\prop_put:Nnn \l_list_b_prop { hello } { 8 }
%putting plists to sequence
\seq_new:N \l_my_seq
\seq_push:Nn \l_my_seq { \l_list_a_prop }
\seq_push:Nn \l_my_seq { \l_list_b_prop }
\seq_map_inline:Nn \l_my_seq
{
\prop_get:NnNT #1 { hello } \l_tmpa_tl
{
\prop_map_inline:Nn #1 { [ ##1 ] ~ [ ##2 ] \\ }
}
}
\ExplSyntaxOff
\end{document}
(我已经整理了变量名并使用了序列而不是逗号列表:后者实际上主要用于“用户级”输入。)
其理念\prop_get:NnN(TF)
是恢复价值与相关钥匙并将其存储在 token 列表中。然后你可以使用它:
\prop_put:Nnn \l_tmpa_prop { foo } { bar }
\prop_get:NnNTF \l_my_prop { foo } \l_tmpa_tl
{
% \l_tmpa_tl is set to 'bar' and can be used, for example:
\tl_use:N \l_tmpa_tl
}
{
% \l_tmpa_tl is not in a defined state
}