这个问题在某种程度上是对上一个问题的回答(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 页)。