我创建了一个辅助宏,它通过一个接一个地排版来格式化一系列条目(以逗号分隔的列表传递),但在实际条目的顶部有一个从零开始的索引:
\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
:
- 将传递的列表中的所有元素包装到
\textrm{...}
- 将转换后的序列作为逗号分隔的列表传递给
\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}
如果您更喜欢\image
and\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}