自动使用适当的标点符号(分号、句号)结束列表项

自动使用适当的标点符号(分号、句号)结束列表项

如果我有一个使用 的列表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 以查看手册。

相关内容