在 `\tl_map_` 和 `\seq_map_function` 中调用的 `function` 是否可以用多个参数定义?

在 `\tl_map_` 和 `\seq_map_function` 中调用的 `function` 是否可以用多个参数定义?

在回答我最近的帖子“tl使用 扫描变量到序列中时保留空格\seq_set_split”时,Enrico Gregorio 定义\__rn_add:n为 调用\tl_map_function。在试验\tl_map_\seq_map_function时,我发现定义具有多个参数的此类函数的可能性会很有用;例如,\__rn_add:nN可能#1tl item和指定要将项目添加到#2哪个变量。我假设和的版本旨在定义一般用途的流程,而版本提供了最大的灵活性,但需要为每个和重新编写,还是我在这里完全偏离了主题? _seq_function\tl_map\seq_map_inline\tl_map_\seq_map_inline

\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{xparse}

\ExplSyntaxOn
\tl_new:N \l_rn_auxOne_tl
\tl_new:N \l_rn_auxTwo_tl
\seq_new:N \l_rn_auxOne_seq
\seq_new:N \l_rn_auxTwo_seq

\NewDocumentCommand\myScanText{m}
 {
  \tl_set:Nn \l_rn_auxOne_tl {#1}
  \seq_clear:N \l_rn_auxOne_seq
  % split at spaces
  \seq_set_split:Nnn \l_rn_auxTwo_seq {~} { #1 }
  % the first item is special, pop it out and split it
  \seq_pop_left:NN \l_rn_auxTwo_seq \l_rn_auxTwo_tl
  \tl_map_function:NN \l_rn_auxTwo_tl \__rn_add:n
  % now do the other items, reinserting the space before them
  \seq_map_inline:Nn \l_rn_auxTwo_seq
   {
    \__rn_add:n { ~ }
    \tl_map_function:nN { ##1 } \__rn_add:n
   }
  % print the data
  \textbf{tl~variable:}~\tl_use:N \l_rn_auxOne_tl\\
  \textbf{seq~variable:}~\seq_use:Nn \l_rn_auxOne_seq {,}
 }
\cs_new_protected:Nn \__rn_add:n
 {
  \seq_put_right:Nn \l_rn_auxOne_seq { #1 }
 }
\ExplSyntaxOff
%-----------------------
\begin{document}

\setlength{\parindent}{0pt} % just for the example

\myScanText{The quick brown fox jumps over the lazy dog.}

\end{document}

答案1

如果你需要某一点的可扩展性,你可以这样做

\cs_set:Npn \__rn_add:n #1 { \rn_macro_with_two_args:nN { #1 } \l_rn_addto_seq }
% ^ this before where you can, and then  v this in an expandable context
\tl_map_function:NN \l_rn_auxii_tl \__rn_add:n

但如果您不需要可扩展性,您可以随时使用内联版本:

\seq_map_inline:Nn \l_rn_auxii_seq
 {
  \__rn_add:n { ~ }
  \tl_map_inline:nn { ##1 }
   {
    \rn_macro_with_two_args:nN { ###1 } \l_rn_addto_seq
   }
 }

相关内容