假设我刚刚切换到biblatex
。我选择了内置样式(numeric
、、、、)或 CTAN 提供的自定义样式之一,并弄清楚了如何alphabetic
对引文进行排序/压缩。参考书目和文内引文看起来大致符合我的要求,但需要进行调整。我查看了文档authoryear
以获取建议,但有点令人生畏。我该如何开始?为了增加一些重点,以下领域的定制将派上用场:authortitle
verbose
biblatex
抑制特定的 BibTeX 字段(例如
publisher
);特定条目类型的字段格式化(例如,不在引号内的文章标题);
引用后注的格式化(即删除“p.”/“pp.”);
参考书目中的空格和标点符号(例如,使用逗号而不是句号作为单位分隔符);
书目中作者/编辑名字和姓氏的顺序;
书目中某些字段的顺序(例如,交换
location
和publisher
);特定语言的术语(例如,将“参考文献”替换为“引用的作品”)。
最后,假设我想在大量文档中使用我的样式调整:我应该把相关的宏放在哪里?
答案1
首先,我要提醒大家几点。首先,虽然以下大多数技巧也适用于自定义 CTAN 样式,但我的重点是随附的标准样式biblatex
。其次,这些指南适用于简单到中等程度的修改;对于比较棘手的问题,请查看 TeX.sx 上的其他一些问题(或提出您自己的问题)。
介绍
随着 的新版本的biblatex
发布,以前需要重新定义内部宏(或至少在文档中更改设置)的自定义已成为可在序言中设置的包选项。以下是如何进行一些经常要求的调整:
giveninits=true
firstinits
将所有名字和中间名渲染为首字母。(在 v0.8 中引入,在 v3.3 中重命名,在 3.3 之前的版本中称为)isbn=false
将隐藏文件isbn
中包括的任何字段。(它对、和 的.bib
工作方式相同。)(在 v0.9 中引入)url
doi
eprint
dashed=false
(适用于authoryear
、authortitle
和verbose
书目样式)将打印重复的作者/编辑者姓名,而不是用破折号替换它们。(在 v0.9 中引入)maxbibnames=99
将打印参考书目中多作者/编辑作品的完整名称列表,同时截断这些列表以供文内引用。(在 v1.1 中引入)
现在,实际的自定义宏应该放在哪里?由于您不想创建一个完整的自定义样式,我建议使用配置文件。如果可用,则在加载样式后立即biblatex.cfg
读取此文件。(空的)原始文件位于您的 TeX 分发目录中;将副本放在本地 TEXMF 树的类似位置(并更新您的文件数据库),并用我(终于!)要讨论的重新定义填充它。biblatex
/tex/latex/biblatex
附录:您还可以通过配置文件指定序言选项(但不包括参考书目/引用样式或兼容性模块)。将以下内容放入biblatex.cfg
:
\ExecuteBibliographyOptions{<preamble options>}
抑制特定的 BibTeX 字段
对于isbn
& 的朋友,请参阅介绍。通常,biblatex
区分名称列表、文字列表和其他字段,并且必须应用不同的宏来抑制这些字段类别。例如,如果您想要从参考书目中删除translator
、publisher
和pagetotal
字段,请将以下内容添加到 的本地副本中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
对参考书目使用两种不同的名称格式:(default
由numeric
和使用alphabetic
)和sortname
(由authoryear
、authortitle
和使用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 版之前family
是last
,并且在上面given
是。旧名称继续有效,但会产生警告;应使用新名称。first
书目 – 某些字段的顺序
让我们深入研究文件standard.bbx
和<myparentstyle>.bbx
,它们都位于/bbx
您的文件夹的子目录中biblatex
。根据您的问题,您想要交换location
和publisher
字段。假设您在中遇到以下代码片段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
内部黑客攻击等所有内容。以下是一些值得注意的问题(不声称是完整的):
禁止在文章中使用“In:”(赫伯特著)
在首字母之间留出较窄的空格(由 Will Robertson 编写)(v1.3 版本中已过时);
删除作者年份样式中的年份括号(一个答案来自Alan Munn,另一个答案受到egreg的启发);
反向参考编号(作者:奥黛丽)。
最后,这是一个真实的例子修改书目驱动程序。