当作者字段为空时,请勿在 authortitle-comp 中的 prenote 后添加冒号

当作者字段为空时,请勿在 authortitle-comp 中的 prenote 后添加冒号

先发制人说明:这不是重复的BibTeX 中的作者字段为空


我遇到了一件奇怪的事情作者标题引用格式,如果作者字段在书目记录中为空,冒号仍会在预注领域和标题字段,就像在脚注 2 中一样,我期望其行为与脚注 1 中相同:

脚注 1 和 2 都应包含“Vgl.”,而脚注 2 中不包含冒号

这是一个最小工作示例(不要介意变音符号和诸如此类的东西):

\documentclass[12pt,paper=a4]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[style=authortitle-comp,backend=biber]{biblatex}

\begin{filecontents*}{bibliography.bib}
@Incollection{poppe,
    Title = {Die Verwandlung},
    Author = {Sandra Poppe},
    Booktitle = {Kafka-Handbuch},
    Booksubtitle = {Leben -- Werk -- Wirkung},
    Editor = {Manfred Engel and Bernd Auerochs},
    Address = {Stuttgart},
    Publisher = {Metzler},
    Year = {2010},
    Pages = {164--174}
}

@Incollection{kindlerbio,
    Title = {Kafka, Franz -- Biogramm},
    Booktitle = {Kindlers Literatur Lexikon in 18 Bänden},
    Publisher = {Metzler},
    Year = {2009},
    Address = {Stuttgart},
    Edition = {3., völlig neu bearb. Aufl.},
    Url = {http://www.munzinger.de/document/22000340100},
    Urldate = {2014-07-11}
}
\end{filecontents*}

\bibliography{bibliography.bib}

\begin{document}
Some text,\footfullcite[Vgl.][]{poppe} and some other text as well.\footfullcite[Vgl.][]{kindlerbio}
\end{document}

我一直在使用 biblatex.cfg 文件中的一些附加规范来根据我的部门希望我们格式化参考书目的方式来调整内容,参见http://pastebin.com/1uZs4vtw(基于德国研究的 authortitle-icomp 的这些修改由 J. 'Mach' Wust 编写)。如果没有该文件,生成的内容将与预期一致,只是作者姓名后面有一个句号而不是冒号,进一步的测试表明,下面这一行是罪魁祸首(这是建议的更改,例如在使用 biblatex、字母表的作者后使用冒号 (:) 代替句号 (.)(也许原作者是从那里复制来的,我不知道):

\renewcommand{\labelnamepunct}{\addcolon\addspace}

如果是这样,那么这一行该如何修改才能避免出现我遇到的问题?将这一行改为

\renewcommand{\nametitledelim}{\addcolon\addspace}

似乎没有任何效果。

答案1

问题似乎出在biblatex的标点符号跟踪器上。由于是sauthor的必填字段,因此可以在某种程度上期望它有一个必填字段。(事实上,这不是最好的主意,尤其是因为在标准样式中是 的别名,而条目并不总是有可以轻松找到的作者。)@incollectionbiblatex@incollection@inreference@inreference

因此,我们必须处理标点符号跟踪器并告诉它不要打印任何冒号,这可以通过两种方式完成:

使用\nopunct

我们可以将prenote字段重新格式化为

\DeclareFieldFormat{prenote}{#1\isdot\nopunct}

这将始终\nopunct在字段后添加,因此会抑制prenote字段后面可能直接出现的任何标点符号(在某些情况下是多余的冒号;在大多数情况下它什么也不做。)

使用\printunit而不是\setunit

prenote用于\setunit打印\prenotedelim- 预注和引文之间的分隔符 - 默认情况下,这是一个空格。我们可以修改宏以改用\printunit

\renewbibmacro*{prenote}{%
  \iffieldundef{prenote}
    {}
    {\printfield{prenote}%
     \printunit{\prenotedelim}}}

biblatex采用这种高度复杂的标点符号跟踪机制,以确保不会打印多余的标点符号。如果使用正确的标点符号命令\setunit和朋友,标点符号不会立即打印,而只是存储在“缓冲区”中,并在下次需要时打印 -biblatex在打印字段之前插入标点符号。

后续的\setunits 会互相覆盖,因此\setunit{A}\setunit{B}\setunit{C}A放入缓冲区,然后B用 和覆盖它C;因此,如果下次调用标点符号(并且没有其他命令改变缓冲区),则会打印“C”。

\printunit标点符号不会被后续的标点符号命令覆盖,而是持久存在于缓冲单元中,并通过特殊命令进行打印或重置。

这里的问题是,\prenotedelim直到下一个命令打印任何内容时,才会真正打印,在有问题的情况下,该命令打印了字段title,此时标点符号缓冲区已被覆盖,导致\labelnamepunct打印biblatex冒号。在无问题的情况下,下一个打印内容的命令是宏author- 此时缓冲区中没有插入任何新标点符号,因此\prenotedelim按预期打印。

您可以在biblatex手动的§4.11.7使用标点符号追踪器,第 238-242 页和第 4.7.1 节块和单元标点符号,第 197 页起

如果我们不重新定义 ,则不会出现此问题\labelnamepunct。默认情况下,它与 相同\newunitpunct,而 又默认为\addperiod\space。这种方法biblatex很聪明,可以避免使用双句号/点,它将“Vgl.”末尾的“.”视为缩写点(感谢标准定义\DeclareFieldFormat{prenote}{#1\isdot}),因此它不会打印“Vgl..”,而是“Vgl.” - 它会隐藏 插入的句号\setunit;但是可以使用点冒号构造,因此使用冒号我们得到“Vgl.:”,并且不会隐藏冒号。

平均能量损失

我觉得\printunit在这种情况下使用是更合适的解决方案,选择您最喜欢的。

\documentclass[12pt,paper=a4]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[style=authortitle-comp,backend=biber]{biblatex}

\begin{filecontents*}{\jobname.bib}
@Incollection{poppe,
    Title = {Die Verwandlung},
    Author = {Sandra Poppe},
    Booktitle = {Kafka-Handbuch},
    Booksubtitle = {Leben -- Werk -- Wirkung},
    Editor = {Manfred Engel and Bernd Auerochs},
    Address = {Stuttgart},
    Publisher = {Metzler},
    Year = {2010},
    Pages = {164--174}
}

@inreference{kindlerbio,
    Title = {Kafka, Franz -- Biogramm},
    Booktitle = {Kindlers Literatur Lexikon in 18 Bänden},
    Publisher = {Metzler},
    Year = {2009},
    Address = {Stuttgart},
    Edition = {3., völlig neu bearb. Aufl.},
    Url = {http://www.munzinger.de/document/22000340100},
    Urldate = {2014-07-11}
}
\end{filecontents*}

\addbibresource{\jobname.bib}

\renewcommand{\labelnamepunct}{\addcolon\addspace}

\renewbibmacro*{prenote}{%
  \iffieldundef{prenote}
    {}
    {\printfield{prenote}%
     \printunit{\prenotedelim}}}

\begin{document}
Some text,\footfullcite[Vgl.][]{poppe} and some other text as well.\footfullcite[Vgl.][]{kindlerbio}

\printbibliography
\end{document}

在此处输入图片描述

相关内容