\setunit 和 \newunit 起什么作用?

\setunit 和 \newunit 起什么作用?

我目前正在学习如何自定义 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...(立即写入)和标点符号(仅在必要时打印)的异步处理。

由于缓冲区被后续的\setunits 覆盖,因此

\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在标点缓冲区插入的标点符号之后。

相关内容