我正在尝试申请(编辑:到位1,2,3
) 一个简单的映射,通过将每个项目加 1来映射列表2,3,4
。但是,我找不到比为此定义一个新列表更优雅的方法。这段代码可以改进吗?
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\clist_clear_new:N \l_blenderpoint_clist % Will be used to contain the list to sort
\clist_set:Nx \l_blenderpoint_clist {1,2,3}
My ~ list ~ is ~
\l_blenderpoint_clist
\\
\clist_clear_new:N \l_blenderpoint_clist_two % Will be used to contain the list to sort
\clist_map_inline:Nn \l_blenderpoint_clist {
\clist_put_right:Nx \l_blenderpoint_clist_two {\int_eval:n{#1+1}}
}
\clist_set:Nx \l_blenderpoint_clist \l_blenderpoint_clist_two
My ~ list ~ is ~
\l_blenderpoint_clist
\ExplSyntaxOff
\end{document}
答案1
\documentclass{article}
\ExplSyntaxOn
\let\foo\clist_map_inline:nn
\ExplSyntaxOff
\begin{document}
\foo{1,2,3}{\inteval{#1+1},}
\end{document}
更新问题后,保存回列表:
\documentclass{article}
\ExplSyntaxOn
\clist_new:N\l_blenderpoint_clist
\clist_set:Nn\l_blenderpoint_clist{1,2,3}
\clist_show:N\l_blenderpoint_clist
\cs_new:Npn\l_add:n#1{\int_eval:n{#1+1},}
\clist_set:Nx\l_blenderpoint_clist{\clist_map_function:NN\l_blenderpoint_clist\l_add:n}
\clist_show:N\l_blenderpoint_clist
\ExplSyntaxOff
\begin{document}
日志:
The comma list \l_blenderpoint_clist contains the items (without outer
braces):
> {1}
> {2}
> {3}.
<recently read> }
l.8 \clist_show:N\l_blenderpoint_clist
?
The comma list \l_blenderpoint_clist contains the items (without outer
braces):
> {2}
> {3}
> {4}.
<recently read> }
l.11 \clist_show:N\l_blenderpoint_clist
?
答案2
这是我在类似情况下使用过几次的技巧。我们定义一个核心函数,将一个映射应用于一个 clist 并将其存储到另一个 clist 中,并将 clist 作为n
类型参数传入。因此,它具有参数说明符,NnN
其中第一个N
是新 clist,n
是原始 clist,最后一个N
是要应用的映射函数。然后我们用说明符定义它的变体,NVN
以便我们可以传递一个 clist多变的作为第二个参数。最后,我们定义一个包装器,它使用相同的clist 用于第一个和第二个参数。
实际上,我们将同一个 clist 传递给核心函数,但一次是按引用传递,一次是按值传递。这会复制 clist,并允许我们在读取它的同时对其进行赋值。从程序员的角度来看,复制全部由 LaTeX3 扩展例程处理,因此是隐藏的。
请注意,这仅适用于可以按值传递的类型,例如 clist(秘密的标记列表)、标记列表、整数和其他一些类型。我认为它不能轻易地与更复杂的对象(如 prop 或 seq)配合使用(我相信你可以让它工作,但它可能对这些对象的存储方式很敏感)。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/685230/86}
\ExplSyntaxOn
\cs_new_protected_nopar:Npn \apply_map_to_clist:NnN #1#2#3
{
\clist_clear:N #1
\clist_map_inline:nn {#2}
{
\clist_put_right:Nx #1 {#3 {##1}}
}
}
\cs_generate_variant:Nn \apply_map_to_clist:NnN {NVN}
\cs_new_protected_nopar:Npn \apply_map_to_clist:NN #1#2
{
\apply_map_to_clist:NVN #1#1#2
}
\clist_clear_new:N \l_blenderpoint_clist
\clist_set:Nx \l_blenderpoint_clist {1,2,3}
\clist_show:N \l_blenderpoint_clist
\cs_new_nopar:Npn \add_one:n #1 {\int_eval:n {#1+1}}
\apply_map_to_clist:NN \l_blenderpoint_clist \add_one:n
\clist_show:N \l_blenderpoint_clist
\ExplSyntaxOff
\begin{document}
\end{document}
这会在终端上产生以下内容:
The comma list \l_blenderpoint_clist contains the items (without outer
braces):
> {1}
> {2}
> {3}.
<recently read> }
l.21 \clist_show:N \l_blenderpoint_clist
The comma list \l_blenderpoint_clist contains the items (without outer
braces):
> {2}
> {3}
> {4}.
<recently read> }
l.25 \clist_show:N \l_blenderpoint_clist
请注意,在此实现中,map 函数必须是可扩展的。我确信有办法解决这个问题,比如说,如果 map 函数分配了某个变量,然后将其存储在 clist 中。
答案3
使用临时列表。
\documentclass{article}
\ExplSyntaxOn
\clist_new:N \l__tborachangeclist_temp_clist % temporary
\cs_new_protected:Nn \tbora_changeclist:Nn
{
\clist_clear:N \l__tborachangeclist_temp_clist
\clist_map_inline:Nn #1
{
\clist_put_right:Nx \l__tborachangeclist_temp_clist { #2 }
}
\clist_set_eq:NN #1 \l__tborachangeclist_temp_clist
}
%%% test
\clist_new:N \l_tbora_list_clist
\clist_set:Nn \l_tbora_list_clist { 1, 2, 3 }
\tbora_changeclist:Nn \l_tbora_list_clist { \int_eval:n { #1 + 1 } }
\clist_show:N \l_tbora_list_clist
\tbora_changeclist:Nn \l_tbora_list_clist { -#1- }
\clist_show:N \l_tbora_list_clist
\ExplSyntaxOff
\stop
控制台将显示
The comma list \l_tbora_list_clist contains the items (without outer braces):
> {1}
> {2}
> {3}.
<recently read> }
l.22 \clist_show:N \l_tbora_list_clist
?
The comma list \l_tbora_list_clist contains the items (without outer braces):
> {2}
> {3}
> {4}.
<recently read> }
l.26 \clist_show:N \l_tbora_list_clist
?
The comma list \l_tbora_list_clist contains the items (without outer braces):
> {-2-}
> {-3-}
> {-4-}.
<recently read> }
您可能想要使用序列而不是列表:前一种变量类型更加灵活。
\seq_set_from_clist:Nn \l_tmpa_seq { 1, 2, 3 }
\seq_show:N \l_tmpa_seq
\seq_set_map_x:NNn \l_tmpa_seq \l_tmpa_seq { \int_eval:n { #1 + 1 } }
\seq_show:N \l_tmpa_seq
\seq_set_map:NNn \l_tmpa_seq \l_tmpa_seq { -#1- }
\seq_show:N \l_tmpa_seq
将输出
The sequence \l_tmpa_seq contains the items (without outer braces):
> {1}
> {2}
> {3}.
<recently read> }
l.6 \seq_show:N \l_tmpa_seq
?
The sequence \l_tmpa_seq contains the items (without outer braces):
> {2}
> {3}
> {4}.
<recently read> }
l.9 \seq_show:N \l_tmpa_seq
?
The sequence \l_tmpa_seq contains the items (without outer braces):
> {-2-}
> {-3-}
> {-4-}.
<recently read> }