优雅地将地图应用于 clist 的所有项目(LaTeX3)

优雅地将地图应用于 clist 的所有项目(LaTeX3)

我正在尝试申请(编辑:到位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> }

相关内容