随附的文档创建了一个序列变量,然后使用内联映射将序列号附加到每个项目。内联映射随后输出结果并将其放入标记列表变量中以供将来使用。然后打印该列表变量。
序列号对于即时输出是正确的,但在列表变量中无法重复。这是内联映射函数中的错误,还是我没有理解我的代码?
\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
使用最终值的命令。