如果可能的话,有人能告诉我如何\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}