当 \blockcquote 以列表结尾时,如何避免将引用放在新行上?

当 \blockcquote 以列表结尾时,如何避免将引用放在新行上?

什么时候csquotes\blockquotedisplaycquote列表结尾,引用放在列表后的下一行,而不是直接放在最后一个列表项之后。可以强制csquotes将引用直接放在最后一个列表项之后吗?

下面的例子可以说明该问题:

\documentclass{article}

\usepackage{biblatex}
\usepackage{csquotes}
\usepackage{filecontents}

\begin{filecontents*}{database.bib}
@book{texbook,
  author    = {Donald E. Knuth},
  title     = {The {{\TeX}book}},
  publisher = {Addison-Wesley},
  date      = {1984}
  }
\end{filecontents*}

\bibliography{database.bib}

\begin{document}

% Bad placement of citation
\blockcquote{texbook}{%
  Some cited text:
  \begin{itemize}
  \item item 1
  \item item 2
  \end{itemize}%
}

% Bad placement of citation
\begin{displaycquote}{texbook}
  Some cited text:
  \begin{itemize}
  \item item 1
  \item item 2
  \end{itemize}
\end{displaycquote}

% Correct placement of citation
\begin{quote}
  Some cited text:
  \begin{itemize}
  \item item 1
  \item item 2 \cite{texbook}
  \end{itemize}
\end{quote}

\end{document}

以下是示例的输出。请注意,第一个和第二个引用的位置不正确,而第三个引用的位置正确。

示例输出

答案1

您可以在本地制作itemize(和其他显示列表环境)提前查看它们是否位于引用构造的末尾,如果是,则执行 cite 并在本地禁用 cite 命令,以便在显示后csquotes执行命令时它不执行任何操作。\cite

在此处输入图片描述

\documentclass{article}

\usepackage{biblatex}
\usepackage{csquotes}
\usepackage{filecontents}

\begin{filecontents*}{database.bib}
@book{texbook,
  author    = {Donald E. Knuth},
  title     = {The {{\TeX}book}},
  publisher = {Addison-Wesley},
  date      = {1984}
  }
\end{filecontents*}
\makeatletter
\let\oldbcq\blockcquote
\let\oldendlist\endlist
\def\csq@@z{\csq@z{\csq@z}}
\def\csq@@@z{\end{displaycquote}}
\long\def\cqendlist#1\fi#2\fi#3#4{%
\def\z{#3{#4}}%
\ifx\z\csq@@@z\let\z\csq@@z\fi
\ifx\z\csq@@z
\ifhmode\unskip\fi
\leavevmode
\space \zcsqcite
\gdef\cs@next{\let\csq@cite\@gobble}%
\else
\global\let\cs@next\relax
\fi
\oldendlist#1\fi#2\fi#3{#4}%
\cs@next
}
\enditemize
\let\csq@z\relax
\def\blockcquote#1#2{\begingroup
\def\zcsqcite{\csq@cite{#1}}%
\let\enditemize\cqendlist
\oldbcq{#1}{#2\csq@z\csq@z}\endgroup}

\let\olddcq\displaycquote
\def\displaycquote#1{%
\def\zcsqcite{\csq@cite{#1}}%
\let\enditemize\cqendlist
\olddcq{#1}}

\let\oldedcq\enddisplaycquote
\def\enddisplaycquote{%
\cs@next
\oldedcq}

\makeatother
\bibliography{database.bib}

\begin{document}



% Bad placement of citation
\blockcquote{texbook}{%
  Some cited text:
  \begin{itemize}
  \item item 1
  \item item 2
  \end{itemize}}%


%\tracingall
% Bad placement of citation
\begin{displaycquote}{texbook}
  Some cited text:
  \begin{itemize}
  \item item 1
  \item item 2
  \end{itemize}
\end{displaycquote}

% Correct placement of citation
\begin{quote}
  Some cited text:
  \begin{itemize}
  \item item 1
  \item item 2 \cite{texbook}
  \end{itemize}
\end{quote}

\end{document}

答案2

我遇到过类似的问题,下面是我解决问题的方法:

问题 :

我已经定义了个人引用命令,结合引用,使之与\blockquote或者\displaycquote

\newcommand{\kb}[3]{\begin{quote} \begin{singlespace} \smaller \og {\itshape  #3} \fg \nolinebreak
\cite[#1]{#2} \end{singlespace} \end{quote}}

但当它以逐项列举环境,我遇到了和你一样的问题:\引用信息已在新行上。

我的解决方案:

我选择将命令分成两部分:

  • 引用命令没有引文参考 (\kd)
  • 最后 \item行,带参考的文本(\kf)

因此我们有:

\newcommand{\kd}[1]{\begin{quote} \begin{singlespace} \smaller \og {\itshape  #1} \end{singlespace} \end{quote}}
\newcommand{\kf}[3]{#3 \emph{\fg (\cite[#1]{#2})}}

因此,在我的文档中,我是这样写的:

\kd{Les hirondelles
\begin{itemize}
\item bonjour bonjour
\item les hirondelles
\item \kf{200}{BROUDIC1995}{ya d'la joie}
\end{itemize}
}

而且它确实有效。至少在图形上是如此,因为我认为程序知道只有“ya d'la joie”与引用相关,而实际上它是整个文本。无论如何,它显示了正确的东西。

相关内容