具有可变项目数的逐项列举命令

具有可变项目数的逐项列举命令

我希望创建一个命令,可以给出可变数量的输入,然后它会将它们放入逐项列表中。例如

\myitemize{First item}{Second item}{Third item}

会产生

虽然类似

\myitemize{First item}{Second item}

会产生

我对格式也不挑剔。可以是这样的

\myitemize[First item, second item, third item]{3}

我只是不想手动更改\begin{itemize} \end{itemize}以包含另一行和另一个\item。谢谢!

答案1

第一种方法是在宏采用可变数量的参数,并创建一个表,每个参数占一行。请务必阅读那里的所有评论。特别是,这可能是不是一个很好的标记样式。

第二种方法很容易实现expl3(您甚至不需要指定元素的数量),例如这样:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\seq_new:N \l__ryanj_tmp_seq

\cs_new_protected:Npn \ryanj_output_items:n #1
  {
    \seq_set_from_clist:Nn \l__ryanj_tmp_seq {#1}
    \seq_use:Nn \l__ryanj_tmp_seq { \item }
  }

\NewDocumentCommand \mystrangeitemize { m }
  {
    \begin{itemize}
    \item
    \ryanj_output_items:n {#1}
    \end{itemize}
  }

\ExplSyntaxOff

\begin{document}
  \mystrangeitemize{First item, Second item, Third item,
                    {Item, containing, commas.}}
\end{document}

\mystrangeitemize也可以这样实现:

\NewDocumentCommand \mystrangeitemize { m }
  {
    \begin{itemize}
    \ryanj_output_items:n { {}, #1 }
    \end{itemize}
  }

(添加的空项导致\item输出第一个命令)。

在这两种情况下,如果您希望能够声明包含多个段落的项目(\par标记在的参数中必须是可以接受的\mystrangeitemize),请m+m替换\NewDocumentCommand \mystrangeitemize { m }

截屏

etoolbox也可以\docsvlist用于此目的,并且您还可能会看到有人发布基于的解决方案listofitems。:-)

相关内容