基于关键词的正文中的多种引用样式(biblatex)

基于关键词的正文中的多种引用样式(biblatex)

我已经寻找了一段时间,但我无法使用 biblatex 的多种引用样式,具体取决于 .bib 文件中包含的不同关键字。

我已经使用关键词对我的参考书目进行排序,使用\printbibliography[keyword=primary]\printbibliography[notkeyword=primary]

我也想以同样的方式在论文文本中区分主要来源和次要来源。我的目标是只\autocite在正文中使用。根据参考文献的关键字(=主要或非主要),我希望我的主要来源自动出现在脚注中(精确使用\footfullcite),而我的次要来源以传统的作者年份样式出现在正文中。

有没有办法在序言中这样定义它?也许使用类别?

答案1

简短的回答:这目前根本不可能。biblatex不支持在一个文档中采用多种样式。biblatex 2.0即将推出的功能将支持多种排序方案,但目前就是这样。

也许功能要求是有序的。

答案2

我不反对已经给出并被接受的答案,但我认为这是可能的(尽管有点笨拙),如果人们假设人们真正想做的就是,如问题所问,允许 充当\autocite\footfullcite主要来源的关系,以及\parencite与次要来源的关系。换句话说,他实际上并不是要求两种完全不同的引用样式,而只是要求使用变体(\footfullcitevs \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}

相关内容