这个问题类似于这个但并不完全相同。
以下“没有做我需要的事情” MWE 来自这个答案。
我还没有找到如何让它发展,比如对不重叠的夫妇进行迭代。
重要的 !用竖线分隔的参数数量始终是奇数。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand \multiapplycouple { m +m }
{ \mbc_multiapply_pair:Nn #1 {#2} }
\cs_new:Npn \mbc_multiapply_pair:Nn #1 #2
{
\__mbc_multiapply_pair:nNw { 0 } #1
| \prg_do_nothing: #2 | \q_recursion_tail | \q_recursion_stop
}
\cs_new:Npn \__mbc_multiapply_pair:nNw #1 #2 | #3 |
{ \__mbc_multiapply_pair:nNww {#1} #2 | #3 | \prg_do_nothing: }
\cs_new:Npn \__mbc_multiapply_pair:nNww #1 #2 | #3 | #4 |
{ \__mbc_multiapply_pair:oofN {#3} {#4} { \int_eval:n {#1+1} } #2 }
\cs_new:Npn \__mbc_multiapply_pair:nnnN #1 #2 #3 #4
{
\quark_if_recursion_tail_stop:n {#2}
\quark_if_recursion_tail_stop:n {#1}
\exp_not:e { \exp_not:N #4 {#3} { \tl_trim_spaces:n {#1} } { \tl_trim_spaces:n {#2} } }
\__mbc_multiapply_pair:nNww {#3} #4 | \prg_do_nothing: #2 | \prg_do_nothing:
}
\cs_generate_variant:Nn \__mbc_multiapply_pair:nnnN { oof }
\ExplSyntaxOff
\newcommand\deco{?}
\begin{document}
\multiapplycouple\deco{ 1 } % [[1]]
\multiapplycouple\deco{ 1 | 2 | 3 } % [[1]] (2-3)
\multiapplycouple\deco{ 1 | 2 | 3 | 4 | 5 } % [[1]] (2-3) (4-5)
\end{document}
答案1
xparse 可以定义许多命令签名,这些命令签名是标准 LaTeX2e 形式的泛化,但在某种程度上,您实际上是在编写解析器,需要降低层次。您可能可以通过将|
分离的列表转换为 l3 序列来实现您想要的效果,但这只是直接解析它
\documentclass{article}
\def\deco#1#2{(#1-#2)}
\def\multiapplycouple#1#2{$\xmultiapplycouple#1#2|\relax|\relax|$}
\def\xmultiapplycouple#1#2|{[[#2]]\xxmultiapplycouple#1}
\def\xxmultiapplycouple#1#2|#3|{%
\ifx\relax#2\else
#1{#2}{#3}%
\expandafter\xxmultiapplycouple\expandafter#1\fi}
\begin{document}
\multiapplycouple\deco{ 1 } % [[1]]
\multiapplycouple\deco{ 1 | 2 | 3 } % [[1]] (2-3)
\multiapplycouple\deco{ 1 | 2 | 3 | 4 | 5 } % [[1]] (2-3) (4-5)
\end{document}