如果我有一个使用 的列表itemize
,我希望自动\item
以分号(除了最后一项之外的所有项目)或句号(最后一项)结束每个项目。
例如:
\begin{itemize}
\item One
\item Two
\item Three
\end{itemize}
应显示为
- 一;
- 二;
- 三。
有什么方法可以实现这一点吗?我四处寻找,但并没有找到任何东西。我能找到的最接近的方法是这,但这似乎是一个花哨的自定义列表,而不是香草列表itemize
。
答案1
我不确定这样做是否是个好主意,也许你应该为此使用不同的环境。以下修补程序\item
在每个itemize
环境中都添加了一个分号,然后\enditemize
宏更改为添加一个点。您不能再itemize
使用这种简单的方法嵌套环境。总而言之,我认为这造成的问题比解决的问题还多……
\documentclass[]{article}
\usepackage{etoolbox}
\AtBeginEnvironment{itemize}
{%
\def\itemizepunctuation{\def\itemizepunctuation{\ifhmode\unskip\fi;}}%
\pretocmd\item{\itemizepunctuation}{}{}%
\pretocmd\enditemize{\ifhmode\unskip\fi.}{}{}%
}
\newenvironment{punctitemize}
{%
\itemize
\def\itemizepunctuation{\def\itemizepunctuation{\ifhmode\unskip\fi;}}%
\pretocmd\item{\itemizepunctuation}{}{}%
\pretocmd\enditemize{\ifhmode\unskip\fi.}{}{}%
}
{%
\enditemize
}
\begin{document}
\begin{itemize}
\item One
\item Two
\item Three
\end{itemize}
\begin{punctitemize}
\item One
\item Two
\item Three
\end{punctitemize}
\end{document}
编辑:添加了环境方法,但仍然不支持嵌套。
答案2
您可以使用xparse
,吸收全部内容并在 处将其拆分\item
;然后在项目之间添加分号(以及删除的\item
)。
处理过程很复杂,因为项目之间的空行会在分号或最后一个句号前引入一个虚假的段落,所以我们需要删除\par
每个项目末尾的空格和标记。
因此,在处分裂获得的序列\item
被映射到“纯化”它。
我添加了enumitem
最大的灵活性。
\documentclass{article}
\usepackage{xparse}
\usepackage{enumitem}
\ExplSyntaxOn
\NewDocumentEnvironment{autoitemize}{O{} +b}
{
\begin{itemize}[#1]
\marcel_autoitemize:n { #2 }
\end{itemize}
}{}
\seq_new:N \l__marcel_autoitemize_items_seq
\seq_new:N \l__marcel_autoitemize_items_nopar_seq
\tl_new:N \l__marcel_autoitemize_item_tl
\cs_new_protected:Nn \marcel_autoitemize:n
{
% split the contents at \item; this also removes blanks at either end
\seq_set_split:Nnn \l__marcel_autoitemize_items_seq { \item } { #1 }
% remove the first (empty) item
\seq_pop_left:NN \l__marcel_autoitemize_items_seq \l_tmpa_tl
% we need to remove trailing \par tokens
\seq_clear:N \l__marcel_autoitemize_items_nopar_seq
\seq_map_function:NN \l__marcel_autoitemize_items_seq \__marcel_autoitemize_purify:n
% start the first item
\item
% use the sequence, putting a semicolon and \item between items
\seq_use:Nn \l__marcel_autoitemize_items_nopar_seq { ; \item }
% end up with a period
.
}
\cs_new_protected:Nn \__marcel_autoitemize_purify:n
{
\tl_set:Nn \l__marcel_autoitemize_item_tl { #1 }
\regex_replace_once:nnN { \s* \c{par}* \Z } { } \l__marcel_autoitemize_item_tl
\seq_put_right:NV \l__marcel_autoitemize_items_nopar_seq \l__marcel_autoitemize_item_tl
}
\ExplSyntaxOff
\begin{document}
\begin{autoitemize}
\item One
\item Two
\item Three
\end{autoitemize}
\begin{autoitemize}[label=--]
\item One
\item Two
\item Three
\end{autoitemize}
\end{document}
答案3
由于有了新的(2021)钩子系统,您已经完成了:
\AddToHook{env/itemize/end}{.}
副作用:点前有一个空格。不知道如何删除它。
如果您已完整安装 texlive,请参阅 /texlive/2021/texmf-dist/doc/latex/base/lthooks-doc.pdf 以查看手册。