在我的学术写作中,我必须使用出版商和位置字段来引用期刊文章。
梅威瑟:
\documentclass[ngerman]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{
babel,
csquotes
}
\usepackage[
backend = biber,
sortlocale = auto,
sorting = nty,
style = authoryear-comp
]{biblatex}
\DeclareFieldFormat[article]{publisher}{#1}
\DeclareFieldFormat[article]{location}{#1}
\DeclareBibliographyDriver{article}
{
\newunit\newblock
\printlist{publisher}
\newunit\newblock
\printlist{location}
}
\begin{filecontents}{\jobname.bib}
@article{
Sur,
author = {Surname, Name},
title = {Title},
journaltitle = {Journaltitle},
year = {2000},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
Test \autocite[1]{Sur}.
\printbibliography
\end{document}
但这会破坏参考书目。我认为这些\Declare
行覆盖了article
类型。正确的方法是什么?
答案1
为什么问题中的 MWE 的线条不起作用?
第一点是示例.bib
条目实际上没有publisher
或location
字段,自然我们无法从中获取发布者或位置。
第二点实际上更微妙,涉及https://github.com/plk/biblatex/issues/586。由于\DeclareBibliographyDriver
宏的实现,其两个参数之间不能有任何空格。因此必须按如下方式使用
\DeclareBibliographyDriver{article}{%
...
}
第三,也是最重要的一点,确实会覆盖驱动程序的当前定义(正如您所假设的),因此使用您指示打印的\DeclareBibliographyDriver
问题中的定义biblatex
仅有的@article
s 在参考书目中的出版商和位置。这不是您想要的。相反,您必须将新行插入驱动程序,同时保留其余部分,或者重新定义整个驱动程序。驱动程序通常由对不同 bibmacros 和\print...
命令的许多调用组成。您可以在以下位置找到标准样式的定义standard.bbx
。
什么才是正确的方法?
由于驱动程序的定义通常非常复杂且很长,因此修补它们通常比重写它们更容易。xpatch
包使得这一点变得非常容易。因此,您可以使用\xpatchbibmacro
将驱动程序的特定位替换为另一个位(这将包括对要添加的宏的新调用)。请参阅有效地将同一补丁应用于多个 bibdrivers和使用 biblatex/biber 将发布者添加到在线源?有关如何使用\xpatchbibdriver
和Biblatex 的 bibmacros、参考书目驱动程序、格式 - 修补或重新定义?关于修补与重新定义的一般性讨论。
在此特别的在这种情况下,直接修改 bibmacro 实际上要容易一些(通常是可能的,但一般不要指望这一点)。
\renewbibmacro*{journal+issuetitle}{%
\usebibmacro{journal}%
\setunit*{\addperiod\space}%
\usebibmacro{publisher+location+date}%
\setunit*{\addcomma\space}%
\iffieldundef{series}
{}
{\newunit
\printfield{series}%
\setunit{\addcomma\space}}%
\usebibmacro{volume+number+eid}%
\setunit{\addspace}%
\usebibmacro{issue}%
\newunit}
其中包括出版商、地点和日期,紧接着journaltitle
。该设置符合 B.4.2 节中表 B.4 的要求连载作品ISO 690:2010(E) (第三版,2010-06-15)
关于 ISO 690 的几点评论
请允许我在这里添加一些有关 ISO 690 的评论。
规范的文本允许相当大的回旋余地 - 要么明确地提及其他选项,要么隐含地根本不提及某件事。一个明确的例子是参考书目中姓名的顺序。姓名列表中只有第一个姓名需要按“姓氏,名字”顺序(即family-given
用语biblatex
),第二个和后续姓名可以按“自然顺序”记录 - 但它们不必如此(至少这是我对“可能”的理解)。隐含地,规范没有指定姓名之间的分隔符/定界符,即使示例始终在姓氏前使用“and”(带牛津逗号),并在所有其他姓名前使用逗号。
此外,ISO 网站上公开发布的摘要状态
ISO 690:2010 并未规定参考文献或引文的具体格式。ISO 690:2010 中使用的示例并未规定格式和标点符号。
随后在 §4.4 中,该标准强调整个文档中使用的标点符号方案“纯粹是说明性的”,并不是标准的一部分。
现在还不清楚这里“样式”的定义到底是什么,但我本以为某些决定(例如名称全部大写,甚至标题格式)不属于标准。标准中没有说名称全部大写,某些标题使用斜体,这只是通过示例传达的。
一些示例甚至不一致,例如 §5.4.1 中的这些示例(也与 §§5.2.1、5.3.1 进行比较时):其中一个示例在姓氏和名字首字母之间没有逗号,而其他所有示例都这样做;另一个示例没有将“公司”名称全部大写,而其他所有示例都这样做。
该标准严格定义了引用的元素及其给出的顺序。此外,它还给出了一些关于如何显示这些元素的指导。
因此,当您获得 ISO 690 的二手资料时,这些资料通常会在实际标准之上添加自己的解释。此外,我还了解到,该标准的一些本地翻译(DIN ISO 690、ČSN ISO 690)也增加了额外的要求或使解释更加严格和狭窄。
有一种biblatex
风格biblatex-iso690
它遵循了捷克对该规范的(更严格的)解释。
publisher
并且location
对于@article
s
据我所知,主流参考文献格式(APA、Chicago、MLA)均不要求在参考文献中注明出版商或所在地@article
。biblatex
数据模型甚至不考虑参考文献的这两个字段@article
。
甚至 ISO 也不太确定它们。虽然 B.4.2 节中的表 B.4 列出了必需的出版商和位置(如上所述),但 C.6 和 C.7 中的示例都没有列出这两个字段。值得一提的是,我发现的大多数 ISO 690 二手资料也忽略了文章的出版商和位置。
\documentclass[ngerman]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{babel,csquotes}
\usepackage[
backend = biber,
style = authoryear-comp
]{biblatex}
\renewbibmacro*{journal+issuetitle}{%
\usebibmacro{journal}%
\setunit*{\addperiod\space}%
\usebibmacro{publisher+location+date}%
\setunit*{\addcomma\space}%
\iffieldundef{series}
{}
{\newunit
\printfield{series}%
\setunit{\addcomma\space}}%
\usebibmacro{volume+number+eid}%
\setunit{\addspace}%
\usebibmacro{issue}%
\newunit}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{sur,
author = {Surname, Name},
title = {Title},
journaltitle = {Journaltitle},
year = {2000},
location = {Ort},
publisher = {Verlag},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
Lorem \autocite[1]{sur} ipsum \autocite{sigfridsson}.
\printbibliography
\end{document}
请注意,使用及其驱动样式,按名称-标题-年份 ( )style=authoryear
排序毫无意义,这更自然,也是默认设置。此外,ISO 690 规定按时间顺序排序。sorting=nty
sortingy=nyt