我正在尝试构建一个处理以逗号分隔的元素列表的宏,以便:
\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}