我目前正在学习如何自定义 BibLaTeX 样式。在浏览文件时,*.bbx
我经常会遇到命令\setunit{...}
和\newunit
。最常见的用法\setunit{...}
似乎是\setunit{\addspace}
,但还有许多其他应用程序。有时\setunit*{...}
也会使用带星号的版本。\newunit
似乎不带参数,也没有带星号的版本。
我正在修改的许多参考书目宏都使用这些命令,所以我真的很想了解它们的作用。我找不到有关它们的任何信息(无论是在这个网站上,还是在 BibLaTeX 文档中,还是通过网络搜索)。由于它们总是一起出现,而且名称相似,我猜这两者之间有某种联系,所以我在一个问题中同时问这两个问题。
答案1
相关章节biblatex
文档§4.7标点和间距和 §4.11.7使用标点符号追踪器。
有了标点符号跟踪器,您不必担心双重标点符号、虚假空格或缺失字段。
要使用标点符号跟踪器,您必须使用\setunit
。而不是像下面这样直接写标点符号命令
\printfield{title}%
\addcomma\space
\printfield{edition}%
\addcomma\space
\printfield{note}%
我们写
\printfield{title}%
\setunit{\addcomma\space}%
\printfield{edition}%
\setunit{\addcomma\space}%
\printfield{note}%
在第一种情况下,biblatex
会立即在标题和版本后打印逗号和空格。但如果没有版本,我们就会剩下
标题、注释
然而,使用\setunit
和标点符号跟踪器,我们得到
标题、注释
这是因为\setunit
实际上并不打印其参数。相反,它将参数放在缓冲区中。在其后的 , \printtext
,\printfield
命令\print...
打印某些内容后,将立即打印缓冲区。在上面的示例中,第一个\setunit
将其参数发送到缓冲区,\printfield{edition}
不执行任何操作,第二个\setunit
将其参数发送出去替换先前的值。然后\prinfield{note}
打印某些内容并biblatex
在打印字段内容之前插入标点符号缓冲区note
。这就是文档biblatex
中所说的对文本/ \print...
(立即写入)和标点符号(仅在必要时打印)的异步处理。
由于缓冲区被后续的\setunit
s 覆盖,因此
\printfield{title}%
\setunit{\addperiod\space}%
\printfield{edition}%
\setunit{\addperiod\space}%
\printfield{note}%
和
\printfield{title}%
\setunit{\addcomma\space}%
\printfield{edition}%
\setunit{\addperiod\space}%
\printfield{note}%
给
标题. 注释
如果该edition
字段为空。
还有一个,只有当它之前的最后一个命令打印了某些内容\setunit*
时,才会将其参数插入缓冲区。所以\print...
\printfield{title}%
\setunit{\addperiod\space}%
\printfield{edition}%
\setunit*{\addcomma\space}%
\printfield{note}%
给出
标题. 注释
如果版本缺失,并且
标题、版本、注释
如果不是这样。
由于标点符号跟踪器仅“看到”通过\print...
命令打印的文本。您不应将硬编码文本直接写入 bibmacro,而应始终将其写入\printtext
。这与 不同\DeclareFieldFormat
,硬编码文本在那里是可以的,但\printtext
在 内\DeclareFieldFormat
甚至可能会使跟踪器感到困惑。
\newunit
在所有意图和目的上都与 相同\setunit{\newunitpunct}
。事实上,令我惊讶的是,它的内部定义并非如此;实际定义处于低得多的级别。因此\newunit
不需要参数。
\newunit
用作分隔\print...
命令的“标准”方式,\setunit
仅用于\newunitpunct
不适用的场合(其中有很多)。
\newblock
类似于\newunit
,但没有 的等价物\setunit
,即没有\setblock
或 类似。它标记一个新块的开始。块大于 标记的单位\newunit
。新块的开始插入\newblockpunct
在标点缓冲区插入的标点符号之后。