列表中的每个项目都加上引号

列表中的每个项目都加上引号

这看起来是个非常简单的问题,但我找不到任何明显的解决方案。我正在处理一长串的引文,目前我正在手动处理:

 \begin{itemize}
  \item "1st quote here."
  \item "2nd quote here."
\end{itemize}

手动输入引号 '00 次很快就会过时。是否有一个开关可以一次性引用列表中的每个项目?

答案1

您可以创建一个重新定义的命令\item

\documentclass{article}
\let\olditem\item
\newcommand{\StartQuotation}{%
\def\item{\unskip''\olditem``}``%
}
\begin{document}
\begin{itemize}
  \item\StartQuotation 1st quote here.
  \item 2nd quote here.
  \item 3nd quote here.
  \item 4th quote here.''
\end{itemize}
\end{document}

在此处输入图片描述

您仍然可以每个列表添加\StartQuotation一个'',但不能超过这个数量。

答案2

一种优雅的方法是使用正则表达式LaTeX3。这个想法是使用\item命令来分割环境的内容,然后您可以用itemize引号将每个条目括起来来重新创建环境。代码如下:

  \begin{qitemize}
    \item 1st quote here.
    \item 2nd quote here.
  \end{qitemize}

产生所请求的输出:

在此处输入图片描述

代码本身并不长,但如果您不熟悉 LaTeX3 和正则表达式,那么它可能看起来有点神秘。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \l_items_seq
\NewDocumentEnvironment{qitemize}{ +b }{
  % split the environment contents around the \item commands
  \regex_split:nnN { \s*\c{item}\s* } { #1 } \l_items_seq
  \seq_pop_left:NN \l_items_seq \l_items_tl % pop empty first item
  \seq_if_empty:NF \l_items_seq { % check for no items
    \begin{itemize}% create the quoted itemize environment
      \seq_map_inline:Nn \l_items_seq { \item ``##1'' }
    \end{itemize}
  }
}{}
\ExplSyntaxOff

\begin{document}

  \begin{qitemize}
    \item 1st quote here.
    \item 2nd quote here.
  \end{qitemize}

\end{document}

上面我说我将环境的内容围绕\item命令进行拆分,但这只是个小谎言,因为代码实际上是围绕命令\item及其两侧的空格进行拆分的,这就是为什么这两个\s*出现在正则表达式中的原因。这样做是为了避免最终引用每个项目前后的空格。

最后,请注意,环境\item中的命令qitemize不能正确地处理可选参数,例如\item[*] quoted item。只需做一些额外的工作就可以实现。

相关内容