自定义 biblatex 样式的指南

自定义 biblatex 样式的指南

假设我刚刚切换到biblatex。我选择了内置样式(numeric、、、、)或 CTAN 提供的自定义样式之一,并弄清楚了如何alphabetic对引文进行排序/压缩。参考书目和文内引文看起来大致符合我的要求,但需要进行调整。我查看了文档authoryear以获取建议,但有点令人生畏。我该如何开始?为了增加一些重点,以下领域的定制将派上用场:authortitleverbosebiblatex

  • 抑制特定的 BibTeX 字段(例如publisher);

  • 特定条目类型的字段格式化(例如,不在引号内的文章标题);

  • 引用后注的格式化(即删除“p.”/“pp.”);

  • 参考书目中的空格和标点符号(例如,使用逗号而不是句号作为单位分隔符);

  • 书目中作者/编辑名字和姓氏的顺序;

  • 书目中某些字段的顺序(例如,交换locationpublisher);

  • 特定语言的术语(例如,将“参考文献”替换为“引用的作品”)。

最后,假设我想在大量文档中使用我的样式调整:我应该把相关的宏放在哪里?

答案1

首先,我要提醒大家几点。首先,虽然以下大多数技巧也适用于自定义 CTAN 样式,但我的重点是随附的标准样式biblatex。其次,这些指南适用于简单到中等程度的修改;对于比较棘手的问题,请查看 TeX.sx 上的其他一些问题(或提出您自己的问题)。

介绍

随着 的新版本的biblatex发布,以前需要重新定义内部宏(或至少在文档中更改设置)的自定义已成为可在序言中设置的包选项。以下是如何进行一些经常要求的调整:

  • giveninits=truefirstinits将所有名字和中间名渲染为首字母。(在 v0.8 中引入,在 v3.3 中重命名,在 3.3 之前的版本中称为)

  • isbn=false将隐藏文件isbn中包括的任何字段。(它对、和 的.bib工作方式相同。)(在 v0.9 中引入)urldoieprint

  • dashed=false(适用于authoryearauthortitleverbose书目样式)将打印重复的作者/编辑者姓名,而不是用破折号替换它们。(在 v0.9 中引入)

  • maxbibnames=99将打印参考书目中多作者/编辑作品的完整名称列表,同时截断这些列表以供文内引用。(在 v1.1 中引入)

现在,实际的自定义宏应该放在哪里?由于您不想创建一个完整的自定义样式,我建议使用配置文件。如果可用,则在加载样式后立即biblatex.cfg读取此文件。(空的)原始文件位于您的 TeX 分发目录中;将副本放在本地 TEXMF 树的类似位置(并更新您的文件数据库),并用我(终于!)要讨论的重新定义填充它。biblatex/tex/latex/biblatex

附录:您还可以通过配置文件指定序言选项(但不包括参考书目/引用样式或兼容性模块)。将以下内容放入biblatex.cfg

\ExecuteBibliographyOptions{<preamble options>}

抑制特定的 BibTeX 字段

对于isbn& 的朋友,请参阅介绍。通常,biblatex区分名称列表、文字列表和其他字段,并且必须应用不同的宏来抑制这些字段类别。例如,如果您想要从参考书目中删除translatorpublisherpagetotal字段,请将以下内容添加到 的本地副本中biblatex.cfg

\AtEveryBibitem{%
  \clearname{translator}%
  \clearlist{publisher}%
  \clearfield{pagetotal}%
}

请参阅手册第 2.2.1 和 2.2.2 节biblatex,了解字段及其所属类别的完整列表。若要隐藏文内引用的特定字段(例如,在使用样式时verbose),请使用\AtEveryCitekey而不是\AtEveryBibitem

字段的格式化(以及引文注解的格式化)

作为一般规则,请检查文件的“字段格式”部分biblatex.def(位置:见上文)。关于您问题中给出的示例,请查找以下内容:

\DeclareFieldFormat
  [article,inbook,incollection,inproceedings,patent,thesis,unpublished]
  {title}{\mkbibquote{#1\isdot}}

这意味着对于@article(以及许多其他条目类型),title字段放在引号内。(#1代表字段的值,\isdot避免使用双标点符号。)在本地 中biblatex.cfg,将最后一部分从 更改为{\mkbibquote{#1\isdot}}{#1\isdot}然后就可以设置参考书目了。如果您的“父”样式将标题打印为文内引用的一部分,则必须citetitle以相同的方式修改字段。

对于引用后记的格式,适用与上述相同的原则,因此我只会发布针对您实际问题的解决方案。;-)

\DeclareFieldFormat{postnote}{#1}% no postnote prefix in "normal" citation commands
\DeclareFieldFormat{multipostnote}{#1}% no postnote prefix in "multicite" commands
\DeclareFieldFormat{pages}{#1}% no prefix for the `pages` field in the bibliography

参考书目——间距和标点符号

手册的第 3.10.1 节“通用 [格式化] 命令和钩子”提供了基础知识,而“格式化命令”部分biblatex.def包含实际的宏。关于您的示例问题(如何用逗号替换单位分隔符句点?),

\newcommand*{\newunitpunct}{\addperiod\space}

需要重新定义\renewcommand为(使用!)

\renewcommand*{\newunitpunct}{\addcomma\space}

书目 – 名字和姓氏的顺序

随附的标准样式biblatex对参考书目使用两种不同的名称格式:(defaultnumeric和使用alphabetic)和sortname(由authoryearauthortitle和使用verbose)。(文内引用是第三种名称格式的领域labelname。)这些名称格式反过来利用辅助宏,例如

  • family-given/given-family:多作者著作中第一作者打印为“姓氏-名字”,后续作者打印为“名字-姓氏”;

  • family-given:所有作者都以“姓氏-名字”的形式打印;

  • given-family: 你猜到了。

要将名称格式(例如,authortitle参考书目样式(默认family-given/given-family))更改为family-given,请应用以下命令:

\DeclareNameAlias{sortname}{family-given}

这些名称格式在 3.3 版中被重命名,请参阅Biblatex 3.3 名称格式,在 3.3 版之前familylast,并且在上面given是。旧名称继续有效,但会产生警告;应使用新名称。first

书目 – 某些字段的顺序

让我们深入研究文件standard.bbx<myparentstyle>.bbx,它们都位于/bbx您的文件夹的子目录中biblatex。根据您的问题,您想要交换locationpublisher字段。假设您在中遇到以下代码片段standard.bbx

\DeclareBibliographyDriver{book}{%
  \printnames{author}%
  \newunit\newblock
  \printfield{title}%
  \newunit\newblock
  \printlist{publisher}%
  \newunit
  \printlist{location}%
  \newunit
  \printfield{year}%
  \finentry}

将此定义复制粘贴到您的本地副本biblatex.cfg并交换相应的代码行应该是小菜一碟,对吧?错了!虽然上面显示的“参考书目驱动程序”是功能性的(示例取自手册第 4.2.3 节),但实际的驱动程序要复杂得多。它们经常使用宏来打印特定的名称列表、文字列表或字段,并且的宏定义standard.bbx可以通过 进行修改<myparentstyle>.bbx。假设您的父样式是authortitle,跟踪驱动程序和宏将产生以下定义:

\newbibmacro*{publisher+location+date}{%
  \printlist{location}%
  \iflistundef{publisher}
    {\setunit*{\addcomma\space}}
    {\setunit*{\addcolon\space}}%
  \printlist{publisher}%
  \setunit*{\addcomma\space}%
  \usebibmacro{date}%
  \newunit}

请注意\iflistundef,宏将打印逗号或冒号,具体取决于publisher列表是否已定义。(\setunit*如果最后一个打印命令确实打印了任何内容,则宏将仅打印其参数。)可能的重新定义 - 以及您的问题的答案 - 将是

\renewbibmacro*{publisher+location+date}{%
  \printlist{publisher}%
  \setunit*{\addcomma\space}%
  \printlist{location}%
  \setunit*{\addcomma\space}%
  \usebibmacro{date}%
  \newunit}

顺便说一句,重新定义publisher+location+date将(并且为了保持一致性应该)影响除此之外的其他条目类型@book

特定语言术语

要更改这些,您需要修改手册第 4.9.2 节中列出的“本地化键”。对于您的示例问题,以下代码可以解决问题:

\DefineBibliographyStrings{english}{%
  references = {Works Cited},
}

(实际上,每个本地化键都分配有一个长形式和一个短形式。但是,biblatex.cfg无法单独覆盖这两个表达式。)

后记

TeX.sx 提供了很多关于自定义的问题/答案biblatex,解决方案涵盖了从简单可爱的宏重新定义到大胆的biblatex内部黑客攻击等所有内容。以下是一些值得注意的问题(不声称是完整的):

最后,这是一个真实的例子修改书目驱动程序

相关内容