将 l3prop 存储在 l3seq 中

将 l3prop 存储在 l3seq 中

在一个.sty文件中,我定义以下内容:

\seq_new:N \g__test_seq

\NewDocumentCommand \TestAdd {m}
  {
    \prop_clear_new:N \l__test_prop
    \prop_set_from_keyval:Nn \l__test_prop
      {
        key1 = {#1},
        % other keys omitted
      }
    \seq_gpush:Nn \g__test_seq
      { \l__test_prop }
  }

\NewDocumentCommand \TestPrintAll {}
{
  \seq_map_inline:Nn \g__test_seq
    {
      \tl_clear_new:N \l__key_tl
      \par \prop_get:NnNTF {##1} {key1} \l__key_tl
        { \l__key_tl }
        { fallback }
    }
}

然后,在我的文档中,我按如下方式使用它们:

\TestAdd{a}
\TestAdd{b}

\TestPrintAll{}

但是,pdflatex输出b两次,我希望它输出a然后b

我尝试使用\seq_gpush:NV\TestAddpdflatex产生以下错误:

! Undefined control sequence.
<argument> \LaTeX3 error: 
                A property list was misused.

有没有办法将props 存储在 a 内部seq,然后对它们进行迭代?

答案1

这需要实施细节,因此很可能不是“正确”的方法。

更好的方法是将输入存储在key=value内部seq,然后使用它。这样您就不会使用任何实现细节,而只需使用记录的接口:

\documentclass[]{article}

\ExplSyntaxOn
\seq_new:N \g__Vary_test_seq
\prop_new:N \l__Vary_test_prop
\tl_new:N \l__Vary_key_tl

\NewDocumentCommand \TestAdd {m}
  {
    \seq_gpush:Nn \g__Vary_test_seq
      {
        key1 = {#1},
        % other keys omitted
      }
  }

\NewDocumentCommand \TestPrintAll {}
{
  \seq_map_inline:Nn \g__Vary_test_seq
    {
      \prop_set_from_keyval:Nn \l__Vary_test_prop {##1}
      \par \prop_get:NnNTF \l__Vary_test_prop {key1} \l__Vary_key_tl
        { \l__Vary_key_tl }
        { fallback }
    }
}
\ExplSyntaxOff

\TestAdd{a}
\TestAdd{b}

\begin{document}
\TestPrintAll{}
\end{document}

相关内容