我可以使用 expl3 将序列存储在序列中吗

我可以使用 expl3 将序列存储在序列中吗

l3seq各州的文档

LaTeX3 实现了一种“序列”数据类型,其中包含一个有序的条目列表,其中可能包含任何平衡的文本。

但对于许多编程任务来说,能够嵌套诸如序列之类的数据结构将非常方便。如何在 LaTeX3 中处理序列的序列?

答案1

短期答案是:使用嵌套在序列中的标记列表。

\RequirePackage{expl3}
\ExplSyntaxOn
\seq_new:N \l_lines_seq
\cs_new:Npn \jb_wrap:n #1 { \exp_not:n { {#1} } }
\seq_clear:N \l_lines_seq
\seq_set_split:Nnn \l_tmpa_seq { \\ } { a & b \\ c & d }
\seq_map_inline:Nn \l_tmpa_seq
  {
    \seq_set_split:Nnn \l_tmpb_seq { & } {#1} % use ##1 if in def
    \seq_put_right:Nx \l_lines_seq
      { \seq_map_function:NN \l_tmpb_seq \jb_wrap:n }
  }
% Use it, for instance this shows a, b, next, c, d, next on different lines
\seq_map_inline:Nn \l_lines_seq
  {
    \tl_map_inline:nn {#1} { \iow_term:n {##1} }
    \iow_term:n { next }
  }
\stop

该功能\seq_set_map:NNn对于您的某些任务也很有用,但我没有在上面使用它,因为它是expl3最近才添加的。我认为上面的功能都很稳定。


“历史”注释:l3seq几年前重写了该模块,使用了一种内部形式,原则上允许嵌套序列(因为序列项可以是任何东西)。也就是说,序列是以下形式的标记列表变量\__seq_item:n {...} \__seq_item:n {...} ...(不要依赖它,它可能会更改,恕不另行通知)。这意味着可以安全地将序列变量的内容存储为另一个序列变量中的项:

\seq_set_split:Nnn \l_a_seq { , } { a , b , c }
\seq_new:N \l_b_seq
\seq_put_right:NV \l_b_seq \l_a_seq
\seq_show:N \l_b_seq

\seq_map_....通过函数或通过从第二个序列变量中检索项目\seq_get_...将为您提供一个显式的标记列表\__seq_item:n {...} ...,并且没有函数来expl3操作它们。我不得不承认,我直到很久以后才意识到这种不幸的情况。

解决这个问题的一种方法是,我们添加expl3一些需要 -类型序列数据的函数n,既存储到序列变量中(对于任何不可扩展的应用程序来说足够了),也添加我们目前为N-类型提出的所有可扩展函数。

% Extra functions that would be enough for all seq purposes,
% I think. Here '...' denotes `\__seq_item:n ...` material.
\seq_set:Nn <seq> { ... }
\seq_map_function:nN { ... } <func>
\seq_item:nn { ... } { <intexpr> }
\seq_mapthread_function:nnN { ... } { ... } <func>
%
% other useful functions (can be implemented in terms of the above)
%
\seq_if_empty:nTF { ... }
\seq_count:n { ... }

为了保持一致性,必须对属性列表进行类似的操作,添加

% Minimum set of extra functions for props.  Here, `...`
% denotes some `\s__prop <key> \s__prop { <value> }` material.
%
\prop_set:Nn <prop> { ... }
\prop_map_tokens:nn { ... } { <tokens> }
%
% other useful functions (can be implemented in terms of the above)
%
\prop_if_empty:nTF { ... }
\prop_if_in:nnTF { ... } { <key> }
\prop_map_function:nN { ... } <func>
\prop_get:nn { ... } { <key> }

我无法预测我们是否会将那些用于嵌套序列/props 的函数添加到expl3,但我认为我们需要一种方法来嵌套这些必要的数据结构。也许 Joseph Wright 的l3dt方法更好。

答案2

序列的实现方式意味着它们可以在该级别嵌套(嵌套序列将与外部序列不同)。但是,没有可用的接口来存储或恢复整个序列。

\seq_get:NN \l_my_main_seq \l_tmpa_tl % Available
\seq_set:NV \l_my_daughter_seq \l_tmpa_tl % Not available.

类似地,我们还没有可用的函数来执行“第​​二级”映射(映射到存储在aa序列中的每个序列)。

序列建立在标记列表之上,因此您可以使用tl模块中的函数来执行此操作,但这并不真正受到鼓励。

结果是,在说出什么是最好的之前,我希望了解“任务”的细节。团队已经讨论了“嵌套序列”业务,但到目前为止,感觉通常有更好的方法(记住,我们在实现序列时有开销,ETC。在 TeX 中,以及对于可能很重要的复杂结构)。

相关内容