逗号分隔列表环境

逗号分隔列表环境

这个问题在某种程度上是对上一个问题的回答(https://tex.stackexchange.com/a/11587/13522)。

我想创建一个列表环境(类似于 itemize 和 enumerate),使得列表环境的输出是一个逗号分隔的列表。

例如以下输入:

\begin{commalist}
    \item Item A
    \item Item B
    \item Item C
\end{commalist}

应该产生以下输出:

Item A, Item B and Item C.

此外,如果能够指定使用逗号代替最后的 and (这样输出就是 ),那就太好了Item A, Item B, Item C.

答案1

\documentclass{article}
\usepackage[inline]{enumitem}
\newlist{commalist}{description*}{4}
\setlist[commalist]{itemjoin={{,}},itemjoin*={{, and}},afterlabel=\unskip{{~}}}

\begin{document}
\begin{commalist}
    \item Item A
    \item Item B
    \item Item C
\end{commalist}
\end{document}

在此处输入图片描述

如果and之前不应该有逗号,则在设置中将其删除。

答案2

解决方案如下expl3

\documentclass{article}
\usepackage{xparse,environ,xspace}

\ExplSyntaxOn
\NewEnviron{commalist}[1][\space]{\spence_comma_list:V \BODY #1}
\seq_new:N \l_spence_items_seq
\cs_new_protected:Npn \spence_comma_list:n #1
 {
  \seq_set_split:Nnn \l_spence_items_seq { \item } { #1 }
  \seq_pop_left:NN \l_spence_items_seq \l_tmpa_tl % we have an empty element at the beginning
  \seq_use:Nnnn \l_spence_items_seq { ~ and ~ } { , ~ } { , ~ and ~ }
 }
\cs_generate_variant:Nn \spence_comma_list:n { V }
\ExplSyntaxOff

\begin{document}
Here is a comma list
\begin{commalist}
\item Item A
\item Item B
\item Item C
\end{commalist}
and another
\begin{commalist}
\item Item A
\item Item B
\end{commalist}
and another
\begin{commalist}
\item Item A
\end{commalist}
which ends the game.
Another one to see that a period can follow
\begin{commalist}[.]
\item Item A
\item Item B
\item Item C
\end{commalist}
\end{document}

列表后的标点符号应事先作为可选参数指定,因为\NewEnviron它会努力吞噬后面的空格\end{commalist}


添加之前的代码\seq_use:Nnnn如下,只是为了欣赏新方法的优雅。感谢 Bruno 提供它。

\ExplSyntaxOn
\NewEnviron{commalist}[1][\space]{\spence_comma_list:V \BODY#1}
\cs_new_protected:Npn \spence_comma_list:n #1
 {
  \seq_set_split:Nnn \l_spence_items_seq { \item } { #1 }
  \seq_pop_left:NN \l_spence_items_seq \l_tmpa_tl % we have an empty element at the beginning
  \seq_pop_right:NN \l_spence_items_seq \l_spence_lastitem_tl
  \seq_if_empty:NTF \l_spence_items_seq
   {
    \tl_use:N \l_spence_lastitem_tl
   }
   {
    \spence_andify:
   }
 }
\cs_new_protected:Npn \spence_andify:
 {
  \seq_pop_right:NN \l_spence_items_seq \l_spence_lastbutoneitem_tl
  \seq_map_inline:Nn \l_spence_items_seq { ##1,~ }
  \tl_use:N \l_spence_lastbutoneitem_tl
  \c_space_token and ~ 
  \tl_use:N \l_spence_lastitem_tl
 }
\cs_generate_variant:Nn \spence_comma_list:n { V }
\tl_new:N \l_spence_lastbutoneitem_tl
\tl_new:N \l_spence_lastitem_tl
\seq_new:N \l_spence_items_seq
\ExplSyntaxOff

答案3

该软件包enumitem可能会提供解决方案。使用inline-list。请参阅手册中的第 4 节,尤其是使用设置列表的可能性itemjoin(请参阅第 9 页)。

相关内容