остановить расширение целого числа при использовании \seq_item

остановить расширение целого числа при использовании \seq_item

У меня есть две последовательности: \l_words_seqсодержащая: { dans, [DP, la, maison, ]foc } и \l_glosses_seqсодержащая: { in, the, house }. Я хотел бы создать еще одну последовательность, \l_final_seq которая \l_glosses_seqвставляет элементы из \l_words_seqсопоставления с регулярным выражением ^(\[(DP|NP)|\]\w* )в соответствующие позиции. Результат должен быть { in, [DP, the, house, ]foc }

\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выполняет одно расширение, чего недостаточно, когда вы пытаетесь получить элемент из последовательности по индексу, который сам хранится в переменной.

Использование etype (или xtype) расширит элемент, включая целочисленное значение, что даст вам ожидаемые результаты.

\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

Связанный контент