内联映射错误?

内联映射错误?

随附的文档创建了一个序列变量,然后使用内联映射将序列号附加到每个项目。内联映射随后输出结果并将其放入标记列表变量中以供将来使用。然后打印该列表变量。

序列号对于即时输出是正确的,但在列表变量中无法重复。这是内联映射函数中的错误,还是我没有理解我的代码?

\documentclass[12pt]{article}
\RequirePackage{expl3}
\RequirePackage{xparse}

\ExplSyntaxOn
\seq_new:N \l_my_seq
\int_new:N \l_my_count
\tl_new:N  \l_my_out
\ExplSyntaxOff

\begin{document}
\noindent
\ExplSyntaxOn

\seq_put_right:Nn \l_my_seq {A}
\seq_put_right:Nn \l_my_seq {B}
\seq_put_right:Nn \l_my_seq {C}
\seq_put_right:Nn \l_my_seq {D}

\int_zero:N \l_my_count                 % Initialize counter
\tl_clear:N \l_my_out                   % Initialize output string

Sequence~Input:~
\seq_map_inline:Nn { \l_my_seq } {      % Loop through items in sequence
    \int_incr:N \l_my_count             % Increment counter
    \int_use:N  \l_my_count -#1~        % Output result (count-item)
    \tl_put_right:Nn \l_my_out {\int_use:N \l_my_count -#1~}  % store result
    }
\\
List~Output:~ \l_my_out                  % Output stored result
\ExplSyntaxOff
\end{document}

本文档产生的输出为:

Sequence Input: 1-A 2-B 3-C 4-D
List Output: 4-A 4-B 4-C 4-D

二者均发挥相似的作用\seq_map_inline:Nn\tl_map_inline:Nn表现出类似的行为。

答案1

没有错误。如果你添加

\tl_show:N \l_my_out

就在\ExplSyntaxOff你看到之前

> \l_my_out=macro:
->\int_use:N \l_my_count -A \int_use:N \l_my_count -B \int_use:N \l_my_count
-C \int_use:N \l_my_count -D .

您没有存储\l_my_out当前值,而只是存储打印当前值的指令。当您使用标记列表时,这是 4。

您可以使用

\tl_put_right:No \l_my_out {\int_use:N \l_my_count -#1~}

因为\int_use:N只需要一个扩展步骤,或者完全扩展,

\tl_put_right:Nx \l_my_out {\int_use:N \l_my_count \exp_not:n {-#1~} }

你可以更好地控制哪些内容可以扩展或不可以扩展。我更喜欢后一种方式。

顺便说一下,变量的推荐名称以变量类型结尾,因此

\seq_new:N \l_my_seq
\int_new:N \l_my_int
\tl_new:N  \l_my_tl

是一个更好的命名法。但名称应该由前缀和描述组成;因此类似于

\seq_new:N \l_roman_storage_seq
\int_new:N \l_roman_step_int
\tl_new:N  \l_roman_out_tl

甚至更好。

答案2

你需要

    \tl_put_right:No \l_my_out {\int_use:N \l_my_count -#1~}  % store result
                   %

o在将参数添加到输出列表之前,会导致参数被扩展,否则您将存储一系列将use使用最终值的命令。

相关内容