结合 `map` 和 `use` expl3 宏

结合 `map` 和 `use` expl3 宏

我正在尝试构建一个处理以逗号分隔的元素列表的宏,以便:

\MapAndUse{a,b,c}

将产生:

预期的

我的第一直觉是使用expl3组合依次\seq_map*处理每个元素(这里,包裹​​在括号中)然后围绕标记\seq_use*组织它们。--

但这并没有按预期发挥作用:

\documentclass{standalone}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\MapAndUse}{ m }{%
    \seq_set_from_clist:Nn \l_raw_seq {#1}
    \seq_map_variable:NNn \l_raw_seq \i {(\i)}
    % \seq_show:N \l_raw_seq
    \seq_use:Nn \l_raw_seq {\ --\ }
}

\ExplSyntaxOff

\begin{document}

\MapAndUse{a,b,c}

\end{document}

由于它产生:

意外

据我了解:

  • 来自文档\seq_map_*宏直接扩展到输入流。
  • 来自\seq_show:N \l_raw_seq:序列实际上不受\seq_map命令的影响(元素未被括号括起来)
The sequence \l_raw_seq contains the items (without outer braces):
>  {a}
>  {b}
>  {c}.

\seq_map*如何在不将每个元素推送到输入流的情况 下“就地”处理它们?

天真的尝试:

  • \seq_set_from_clist:Nx \l_processed_seq {\seq_map_variable:NNn \l_raw_seq \i {,(\i)}}:不符合编译要求文档:这个Nx变体不存在,并且\seq_map*不能通过这种方式扩展为另一个“变量”。
  • \Use{\Map{a,b,c}}\Map{a,b,c}采用两阶段处理:由于仍未扩展,因此无法按预期工作。

我是否遗漏了有关expl3逻辑的某些内容?
是否可以通过这种方式处理逗号分隔的输入?
是否有其他替代方案或解决方法?

答案1

您可以使用两个序列;首先应用映射来获取“装饰”项目,然后使用它们。

\documentclass{article}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\seq_new:N \l__iagolito_in_seq
\seq_new:N \l__iagolito_out_seq

\NewDocumentCommand{\MapAndUse}{ m }
 {
  \seq_set_from_clist:Nn \l__iagolito_in_seq { #1 }
  \seq_set_map:NNn \l__iagolito_out_seq \l__iagolito_in_seq { (\exp_not:n { ##1 }) }
  \seq_use:Nn \l__iagolito_out_seq {~--~}
}

\ExplSyntaxOff

\begin{document}

\MapAndUse{a,b,c}

\end{document}

扩展版本,您可以在其中指定如何装饰物品以及在它们之间使用什么:

\documentclass{article}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\seq_new:N \l__iagolito_in_seq
\seq_new:N \l__iagolito_out_seq

\NewDocumentCommand{\MapAndUse}{ mmm }
 {
  \cs_set_protected:Nn \__iagolito_mapanduse:n { #2 }
  \seq_set_from_clist:Nn \l__iagolito_in_seq { #1 }
  \seq_set_map:NNn \l__iagolito_out_seq \l__iagolito_in_seq
   {
    \__iagolito_mapanduse:n { \exp_not:n { ##1 } }
   }
  \seq_use:Nn \l__iagolito_out_seq { #3 }
}

\ExplSyntaxOff

\begin{document}

\MapAndUse{a,b,c}{(#1)}{ -- }

\end{document}

在此处输入图片描述

相关内容