在回答我最近的帖子“tl
使用 扫描变量到序列中时保留空格\seq_set_split
”时,Enrico Gregorio 定义\__rn_add:n
为 调用\tl_map_function
。在试验\tl_map_
和\seq_map_function
时,我发现定义具有多个参数的此类函数的可能性会很有用;例如,\__rn_add:nN
可能#1
对tl 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
}
}