在一个.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
,\TestAdd
但pdflatex
产生以下错误:
! Undefined control sequence.
<argument> \LaTeX3 error:
A property list was misused.
有没有办法将prop
s 存储在 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}