通过 expl3 按顺序变换元素

通过 expl3 按顺序变换元素

我创建了一个辅助宏,它通过一个接一个地排版来格式化一系列条目(以逗号分隔的列表传递),但在实际条目的顶部有一个从零开始的索引:

\NewDocumentCommand{\image}{ m }{
    \ensuremath{
        \seq_set_from_clist:Nn \l_tmpa_seq { #1 }

        \arraycolsep=0.1em
        \def\arraystretch{0.6}
        \begin{array}[b]{ r \prg_replicate:nn{ \seq_count:N \l_tmpa_seq }{l~} l}
            &
            \int_step_inline:nnn {0}{\seq_count:N \l_tmpa_seq - 1}{ 
                \color{gray}{\scriptscriptstyle{##1}} &
            }
            \\
            {[} & \seq_use:Nnnn \l_tmpa_seq {,&}{,&}{,&} & {]}
        \end{array}
    }
}

这按预期工作。现在我想找到一种方法来防止在使用其他宏时在数学模式下排版元素。我的想法是定义类似这样的内容

\NewDocumentCommand{\sequence}{ m }{
    \seq_set_from_clist:Nn \l_tmpa_seq { #1 }
    \seq_map_inline:Nn \l_tmpa_seq {\textrm{##1}}
    \image{\seq_use:Nnnn \l_tmpa_seq {,}{,}{,}}
}

又名:我的想法是使其\sequence{a,b}表现得就像我写的一样\image{\textrm{a}, \textrm{b}}(后者已经按预期工作)。

但是,首先,它\seq_map_inline不会就地转换序列,而是在处理每个元素后将其输出。此外,\image像这样调用宏会产生错误TeX capacity exceeded- 可能是由于某种无限循环/递归。

我必须如何更改代码才能获得以下行为\sequence

  1. 将传递的列表中的所有元素包装到\textrm{...}
  2. 将转换后的序列作为逗号分隔的列表传递给\image

完整 MWE:

\documentclass{scrartcl}

\usepackage{amsmath}
\usepackage{xcolor}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\image}{ m }{
    \ensuremath{
        \seq_set_from_clist:Nn \l_tmpa_seq { #1 }

        \arraycolsep=0.1em
        \def\arraystretch{0.6}
        \begin{array}[b]{ r \prg_replicate:nn{ \seq_count:N \l_tmpa_seq }{l~} l}
            &
            \int_step_inline:nnn {0}{\seq_count:N \l_tmpa_seq - 1}{ 
                \color{gray}{\scriptscriptstyle{##1}} &
            }
            \\
            {[} & \seq_use:Nnnn \l_tmpa_seq {,&}{,&}{,&} & {]}
        \end{array}
    }
}

\NewDocumentCommand{\sequence}{ m }{
    \seq_set_from_clist:Nn \l_tmpa_seq { #1 }
    \seq_map_inline:Nn \l_tmpa_seq {\textrm{##1}}
    \image{\seq_use:Nnnn \l_tmpa_seq {,}{,}{,}}
}

\ExplSyntaxOff



\begin{document}
    \image{1,2,3,4}

    This is how it should look like: \image{\textrm{a},\textrm{b}}

    And this errors: \sequence{a,b}
\end{document}

答案1

我不会用它array来做这份工作,但是\overset

\documentclass{article}

\usepackage{amsmath}
\usepackage{xcolor}

\ExplSyntaxOn

\NewDocumentCommand{\image}{ O{} m }
 {
  \ensuremath
   {
    \seq_set_from_clist:Nn \l_tmpa_seq { #2 }
    [\,
    \seq_indexed_map_inline:Nn \l_tmpa_seq 
     {
      \int_compare:nF { ##1 = 1 } { , }
      \overset{\mathcolor{gray}{\scriptscriptstyle\int_eval:n { ##1 - 1 }} } { \mathstrut #1{##2} }
     }
    \,]
   }
 }

\ExplSyntaxOff

\begin{document}

\image{1,2,3,4}

\image[\mathrm]{a,b}

\end{document}

在此处输入图片描述

如果您更喜欢\imageand\sequence语法:

\documentclass{article}

\usepackage{amsmath}
\usepackage{xcolor}

\ExplSyntaxOn

\NewDocumentCommand{\image}{ m }
 {
  \ensuremath
   {
    \raven_image_generic:nn { \use:n } { #1 }
   }
 }

\NewDocumentCommand{\sequence}{m}
 {
  \ensuremath
   {
    \raven_image_generic:nn { \mathrm } { #1 }
   }
 }

\cs_new_protected:Nn \raven_image_generic:nn
 {
  \seq_set_from_clist:Nn \l_tmpa_seq { #2 }
  [\,
  \seq_indexed_map_inline:Nn \l_tmpa_seq 
   {
    \int_compare:nF { ##1 = 1 } { , }
    \overset{\mathcolor{gray}{\scriptscriptstyle\int_eval:n { ##1 - 1 }} } { \mathstrut #1{##2} }
   }
  \,]
 }

\ExplSyntaxOff

\begin{document}

\image{1,2,3,4} \image{a,b}

\sequence{a,b}

\end{document}

在此处输入图片描述

相关内容