我正在考虑一个只有一个参数但长度可变的宏,将参数扩展为枚举。
例如:
\dostuff{a}
扩大至
\begin{enumerate}
\item a.
\end{enumerate}
和
\dostuff{a, b, c}
扩大至
\begin{enumerate}
\item a,
\item b,
\item c.
\end{enumerate}
由于 tex 命令只能处理最多 9 个参数,因此我认为基于一组参数的解决方案不是一个好的解决方案(并且也是一个丑陋的解决方案)。
有没有什么(黑客)方法可以做到这一点?
答案1
使用expl3
(即将推出的 LaTeX 3 ;-))这很容易,通过使用变量\seq
,存储逗号分隔列表并使用以下方式扩展它\seq_map_inline:Nn
由于expl3
目前相当稳定,并且没有使用真正的新功能,因此expl3
即使使用旧版本,以下代码也应该可以工作expl3
(我加载xparse
以使用\NewDocumentCommand
,但\newcommand
也可以这样做)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn%
\seq_new:N \l_local_enum_seq
\newcommand{\storethestuff}[1]{%
\seq_set_from_clist:Nn \l_local_enum_seq {#1}%
}
\newcommand{\dotheenumstuff}{%
\int_zero:N \l_tmpa_int
\seq_map_inline:Nn \l_local_enum_seq {%
\int_incr:N \l_tmpa_int% Increase the counter
\item ##1
% Check whether the list has reached the end -- if so, use '.' instead of ','
\int_compare:nNnTF
{ \l_tmpa_int } < {\seq_count:N \l_local_enum_seq}
{,} {.}
}
}
\ExplSyntaxOff
\NewDocumentCommand{\dostuff}{+m}{%
\storethestuff{#1}%
\begin{enumerate}
\dotheenumstuff%
\end{enumerate}
}
\begin{document}
\dostuff{a,b,c,d,e,f,some more stuff}
\end{document}
旧版本只需一个命令
\documentclass{article}
\usepackage{enumitem}
\usepackage{xparse}
\ExplSyntaxOn%
\seq_new:N \l_local_enum_seq
\NewDocumentCommand{\dostuff}{o+m}{%
\seq_set_from_clist:Nn \l_local_enum_seq {#2}%
\int_zero:N \l_tmpa_int
\IfValueTF{#1}{%
\begin{enumerate}[#1]
}{%
\begin{enumerate}
}
\seq_map_inline:Nn \l_local_enum_seq {%
\int_incr:N \l_tmpa_int
\item ##1
\int_compare:nNnTF { \l_tmpa_int } < {\seq_count:N \l_local_enum_seq} {%
, } {.}
}
\end{enumerate}
}
\ExplSyntaxOff
\begin{document}
\dostuff[label={Something with spaces}]{a,b,c,d,e,f,some more stuff}
\end{document}
答案2
expl3
具有几个特点;在这种情况下,\seq_use:Nn
似乎是最好的选择。
我们从开始开始enumerate
,用逗号(或可选参数中指定的字符)分割参数\item
,然后发出序列的每个元素,并,\item
在它们之间使用。结尾的句点结束作业。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_egreg_enum_seq
\NewDocumentCommand{\dostuff}{O{,}m}
{
\begin{enumerate}
\seq_set_split:Nnn \l_egreg_enum_seq {#1} {#2}
\item
\seq_use:Nn \l_egreg_enum_seq { , \item }
.
\end{enumerate}
}
\ExplSyntaxOff
\begin{document}
\dostuff{a,b,c,d,e,f,some more stuff}
\dostuff[;]{a; b; c; some, stuff}
\end{document}