这看起来是个非常简单的问题,但我找不到任何明显的解决方案。我正在处理一长串的引文,目前我正在手动处理:
\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
。只需做一些额外的工作就可以实现。