是否可以将序列(l3seq)作为属性列表(l3prop)中的值?

是否可以将序列(l3seq)作为属性列表(l3prop)中的值?

这与expl3:是否可以将属性列表(l3prop)作为属性列表中的值?

相反,我想要的是

\pushmetadata{author}{author1}
\pushmetadata{author}{author2}
\pushmetadata{title}{title1}
\pushmetadata{title}{title2}
...

\getmetadata{author}{1}

取回序列中的值。

同时,还有一种迭代/获取某些序列的方法。

答案1

可以放入seqprop但由于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}

相关内容