什么时候csquotes
并\blockquote
以displaycquote
列表结尾,引用放在列表后的下一行,而不是直接放在最后一个列表项之后。可以强制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”与引用相关,而实际上它是整个文本。无论如何,它显示了正确的东西。