这与expl3:是否可以将属性列表(l3prop)作为属性列表中的值?
相反,我想要的是
\pushmetadata{author}{author1}
\pushmetadata{author}{author2}
\pushmetadata{title}{title1}
\pushmetadata{title}{title2}
...
和
\getmetadata{author}{1}
取回序列中的值。
同时,还有一种迭代/获取某些序列的方法。
答案1
可以放入seq
,prop
但由于expl3
容器的性质,如果从属性列表中取出序列并对其进行修改,则更改不会反映在属性列表中存储的原始序列上。但是,仍然可以用更新的版本覆盖属性列表中的整个序列。但可以想象,这会带来巨大的开销。
一个聪明的设计是使用命令名称作为“属性列表”,其中 LaTeX 为您进行键值关联。示例如下:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \__get_seq_name:n #1 {
g__meta_#1_seq
}
\newcommand{\pushmetadata}[2]{
\seq_if_exist:cF {\__get_seq_name:n {#1}} {
\seq_new:c {\__get_seq_name:n {#1}}
}
\seq_gput_right:cn {\__get_seq_name:n {#1}} {#2}
}
\newcommand{\getmetadata}[2]{
\seq_item:cn {\__get_seq_name:n {#1}} {#2}
}
\ExplSyntaxOff
\pushmetadata{author}{John Doe}
\pushmetadata{author}{Doe Jane}
\pushmetadata{title}{title1}
\pushmetadata{title}{title2}
\par\getmetadata{author}{1}
\par\getmetadata{author}{2}
\par\getmetadata{title}{1}
\par\getmetadata{title}{2}
\end{document}