使用 \seq_item 时停止整数扩展

使用 \seq_item 时停止整数扩展

我有两个序列:\l_words_seq包含:{ dans, [DP, la, maison, ]foc } 和 \l_glosses_seq包含:{ in, the, house }。我想创建另一个序列,\l_final_seq 将匹配正则表达式\l_glosses_seq的项目插入到相应的位置。结果应该是 { in, [DP, the, house, ]foc }\l_words_seq^(\[(DP|NP)|\]\w* )

\int_new:N \l_counter_glosses_int

\seq_const_from_clist:Nn \l_words_seq {dans, [DP, la, maison, ]foc}
\seq_const_from_clist:Nn \l_glosses_seq {in, the, house}

\seq_new:N \l_final_seq

\int_zero:N \l_counter_glosses_int

\seq_map_inline:Nn \l_words_seq  {
    \regex_match:nnTF {^(\[(DP|NP)|\]\w* )} { #1 } 
    { \seq_put_right:Nn \l_final_seq {#1} }             
    {
        \int_incr:N  \l_counter_glosses_int 
        \seq_put_right:No \l_final_seq { \seq_item:Nn  \l_glosses_seq  {\int_use:N \l_counter_glosses_int}} 
    }
}

\seq_map_inline:Nn \l_final_seq  {  #1~ }

但我的结果是

house [DP house house ]foc

我该如何修复这个问题?我试过了\seq_put_right:No,但它只在我附加整数时有效,而不是附加与该整数对应的项。

答案1

解决方案是使用\seq_put_right:Ne(或Nx)来完全展开插入的项目,然后再将其添加到序列中。

o类型执行单一扩展,当您尝试通过本身存储在变量中的索引从序列中获取项目时,这还不够。

使用e类型(或x类型)将扩展项目,包括整数值,这将为您提供预期的结果。

\documentclass{article}

\begin{document}
\ExplSyntaxOn
\int_new:N \l_mymodule_glosses_int

\seq_const_from_clist:Nn \l_mymodule_words_seq {dans, [DP, la, maison, ]foc}
\seq_const_from_clist:Nn \l_mymodule_glosses_seq {in, the, house}

\seq_new:N \l_mymodule_final_seq

\int_zero:N \l_mymodule_glosses_int

\seq_map_inline:Nn \l_mymodule_words_seq  {
    \regex_match:nnTF {^(\[(DP|NP)|\]\w*)} { #1 } 
    { \seq_put_right:Nn \l_mymodule_final_seq {#1} }             
    {
        \int_incr:N  \l_mymodule_glosses_int 
        \seq_put_right:Ne \l_mymodule_final_seq { \seq_item:Nn  \l_mymodule_glosses_seq  {\l_mymodule_glosses_int}}
    }
}

\seq_use:Nn \l_mymodule_final_seq { ~ }
\ExplSyntaxOff
\end{document}

我已经用内联映射代替了最后一部分\seq_use:Nn


或者,您可以使用\seq_pop:NN将值从序列弹出到标记列表。然后,o类型扩展(或V,优于o)将很好地扩展标记列表变量。

\seq_pop:NN \l_mymodule_glosses_seq \l_tmpa_tl
\seq_put_right:NV \l_mymodule_final_seq \l_tmpa_tl

相关内容