自动枚举生成的新命令

自动枚举生成的新命令

我正在考虑一个只有一个参数但长度可变的宏,将参数扩展为枚举。


例如:

  \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}

在此处输入图片描述

相关内容