![基于关键词的正文中的多种引用样式(biblatex)](https://linux22.com/image/249474/%E5%9F%BA%E4%BA%8E%E5%85%B3%E9%94%AE%E8%AF%8D%E7%9A%84%E6%AD%A3%E6%96%87%E4%B8%AD%E7%9A%84%E5%A4%9A%E7%A7%8D%E5%BC%95%E7%94%A8%E6%A0%B7%E5%BC%8F%EF%BC%88biblatex%EF%BC%89.png)
我已经寻找了一段时间,但我无法使用 biblatex 的多种引用样式,具体取决于 .bib 文件中包含的不同关键字。
我已经使用关键词对我的参考书目进行排序,使用\printbibliography[keyword=primary]
和\printbibliography[notkeyword=primary]
。
我也想以同样的方式在论文文本中区分主要来源和次要来源。我的目标是只\autocite
在正文中使用。根据参考文献的关键字(=主要或非主要),我希望我的主要来源自动出现在脚注中(精确使用\footfullcite
),而我的次要来源以传统的作者年份样式出现在正文中。
有没有办法在序言中这样定义它?也许使用类别?
答案1
简短的回答:这目前根本不可能。biblatex
不支持在一个文档中采用多种样式。biblatex 2.0
即将推出的功能将支持多种排序方案,但目前就是这样。
也许功能要求是有序的。
答案2
我不反对已经给出并被接受的答案,但我认为这是可能的(尽管有点笨拙),如果人们假设人们真正想做的就是,如问题所问,允许 充当\autocite
与\footfullcite
主要来源的关系,以及\parencite
与次要来源的关系。换句话说,他实际上并不是要求两种完全不同的引用样式,而只是要求使用变体(\footfullcite
vs \parencite
),这完全适合作者-年份系统,该系统将由 自动选择\autocite
。
有人可能会认为这很容易。但困难在于:当用 声明的引用命令\DeclareCiteCommand
启动时,它会执行一些预编码。但这不能用于决定是否将引用放在脚注或括号中,因为那时人们无法“看到”数据,只有在执行引用的循环代码时数据才可用,到那时已经太晚了!我想到的解决办法是定义一个新命令,而不是使用(正确的)方法\DeclareCiteCommand
,该方法首先运行一种“虚拟”引用,只检查引用数据,然后将其参数重新泵入或\parencite
(\footfullcite
出于这个目的,因为我对可选参数很在行,所以我使用了xparse
)。
有几个坏的就目前情况而言,这方面存在一些问题。首先,它避开了声明引用命令的正确接口,这对 autocite 来说是个问题。其次,它在标点符号或间距方面不够聪明:\footcite
需要关闭引用前的空格,并将标点移到后面,使其位于前面。\parencite
真的需要尊重它前面的空格,并移动至少一些前面的标点,使其位于后面。由于修订版不移动标点符号,用户有时仍然需要知道引用的是主要数据还是次要数据,以便准确定位。这时人们会问:为什么不直接把整个事情都明确地做呢?最后,知道如何处理包含主要和次要文献的单个引用确实是一个问题。我怀疑最好的解决方案是把它放在脚注中,但要用满的仅引用主要文献和短的引用二级文献。实际上,这可以通过重新定义来实现\footcite
,但就目前而言,我还没有这样做。
我敢说我的方法很糟糕,如果我理解了\DeclareCiteCommand
内部工作原理,也许可以找到一种方法,让该precode
部分至少查看第一个引用并做出相应的决定。如果可以做到这一点,那么就不需要绕过声明引用命令的正确方法,尽管我认为其他一些问题仍然相当困难。
\documentclass{article}
\begin{filecontents}{\jobname.bib}
@book{primary,
author = {Ancient, Albert},
title = {A Primary Source},
date = {1556},
keywords = {primary},
publisher = {Vetus Libris Emptor},
location = {Leiden},
}
@book{secondary,
author = {Modern, Mark},
title = {A Secondary Work},
date = {2012},
keywords= {secondary},
publisher = {Recentissima Societas},
location = {New York},
}
\end{filecontents}
\usepackage[backend=biber, style=authoryear]{biblatex}
\usepackage{xparse}
\makeatletter
\newtoggle{filtered@primary}\togglefalse{filtered@primary}
\DeclareDocumentCommand \filterandcite { o o m }{%
\filteredcite{#3}%
\IfNoValueTF{#2}
{\IfNoValueTF{#1}
{\iftoggle{filtered@primary}
{\unspace\footfullcite{#3}}
{\space\parencite{#3}}}
{\iftoggle{filtered@primary}
{\footfullcite[#1]{#3}}
{\space\parencite[#1]{#3}}}}
{\iftoggle{filtered@primary}
{\footfullcite[#1][#2]{#3}}
{\space\parencite[#1][#2]{#3}}}}
\DeclareCiteCommand{filteredcite}
{\unspace}
{\ifkeyword{primary}
{\global\toggletrue{filtered@primary}}
{\global\togglefalse{filtered@primary}}}
{}
\makeatother
\renewcommand*\autocite\filterandcite
\addbibresource{\jobname.bib}
\begin{document}
It is possible to have a system which will use keywords to decide
whether to put a source in a footnote wil a full citation, if it is
primary,\autocite{primary} or in the text with a label if it is
secondary\autocite{secondary}.
However: it's not a very robust system, because (a) it doesn't move
punctuation intelligently---so you still need to keep track in your
own mind of what is in the citation.\autocite{secondary} (A more
intelligent system would move that full stop past the citation.) And,
because it is redefining \verb|\autocite| outside \texttt{Biblatex}'s
dedicated mechanisms, it doesn't play well with \verb|\autocites|: as
can be seen here \autocites[10]{primary}[11]{secondary}. Finally---and
unavoidably---it's liable to `do the wrong thing' if an automatic
citation contains both primary and secondary
sources\autocite{primary,secondary} (though it's not clear exactly
what would be the `right thing' in these circumstances).
\printbibliography[title={Primary Sources}, keyword=primary]
\printbibliography[title={Secondary Sources}, keyword=secondary]
\end{document}