expl3 输出 plist 序列

expl3 输出 plist 序列

假设我有 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}

它输出的是:

在此处输入图片描述

  1. 为什么会出现逗号?
  2. 如何摆脱它?
  3. 如何使用\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
  }

相关内容