expl3 宏可扩展地迭代列表并对每对项目应用一个宏

expl3 宏可扩展地迭代列表并对每对项目应用一个宏

如果可能的话,有人能告诉我如何\applycouple使用来扩展以下宏()吗?expl3

这个问题类似于我的这篇文章

\documentclass{article}

\newcounter{applycoupleposition}
\newcommand\applycouplemacro{}

% #1 : macro to apply
% #2 : multi-args
\newcommand\applycouple[2]{
    \setcounter{applycoupleposition}{0}
    \renewcommand\applycouplemacro{#1}
    \applycouplerecu#2|\nil
    \renewcommand\applycouplemacro{}
}


\def\applycouplerecu#1|#2|#3\nil{
    \stepcounter{applycoupleposition}
    \applycouplemacro{#1}{#2}
    \if\relax\detokenize{#3}\relax\else
        \applycouplerecu#2|#3\nil
    \fi
}

\newcommand\decocouple[2]{%
    (#1)[#2]%
}

\newcommand\multiapplycouple[1]{%
    \applycouple{\decocouple}{#1}
} 

\begin{document}

\multiapplycouple{1|12|123|1234}

\end{document}

答案1

与我对您的另一个问题的回答中的实现非常相似,但是这个实现需要两个参数,因此我们需要添加两个\q_recursion_tail。此外,还使用另一个中间宏\prg_do_nothing:在第二个项目中插入一个,以避免丢失空格和括号。

在此处输入图片描述

\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\decocouple[3]{Item #1: (#2)[#3]\quad}

\begin{document}
\multiapplycouple\decocouple{ 1 | 12 | 123 | 1234 }
\end{document}

相关内容