expl3 - 迭代不重叠的对并对每个项目应用宏

expl3 - 迭代不重叠的对并对每个项目应用宏

这个问题类似于这个但并不完全相同。

以下“没有做我需要的事情” 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}

相关内容