biblatex
当相关条目在括号内开始时,我遇到了问题。
\begrelateddelim
插入到相关条目的第一个字段之后,因为在这种情况下它不包含在相关条目的开头。
author
因此,以下 MWE在相关条目后面放置一个分号。即,
[1] 作者1.标题1. 2017 (作者2;标题2。 2018 年)。
期望的输出是:
[1] 作者1.标题1. 2017 (作者2.标题2。 2018 年)。
平均能量损失
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{book1,
author = {Author1},
title = {Title1},
volume = {2},
date = {2017},
related = {book2}
}
@book{book2,
author = {Author2},
title = {Title2},
date = {2018}
}
\end{filecontents}
\usepackage{biblatex}
\addbibresource{\jobname.bib}
\renewcommand*{\begrelateddelim}{\addsemicolon\space}
\DeclareBibliographyDriver{book}{%
\usebibmacro{begentry}%
\printnames{author}%
\newunit
\printfield{title}%
\newunit
\printdate
\setunit{\addspace}%
\iftoggle{bbx:related}
{\togglefalse{bbx:related}%
\printtext[parens]{%
\usebibmacro{related:init}%
\usebibmacro{related}}}
{}%
\usebibmacro{finentry}}
\begin{document}
\nocite{book1}
\printbibliography
\end{document}
答案1
我建议您使用字段格式related
或related:<relatedtype>
。另外,我将其重新定义\begrelateddelim
为,\addspace
因为我看不出分号应该在这里的哪个位置输入等式。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{book1,
author = {Author1},
title = {Title1},
volume = {2},
date = {2017},
related = {book2}
}
@book{book2,
author = {Author2},
title = {Title2},
date = {2018}
}
\end{filecontents}
\usepackage{biblatex}
\addbibresource{\jobname.bib}
\renewcommand*{\begrelateddelim}{\addspace}
\DeclareFieldFormat{related}{\mkbibparens{#1}}
\DeclareBibliographyDriver{book}{%
\usebibmacro{begentry}%
\printnames{author}%
\newunit
\printfield{title}%
\newunit
\printdate
\newunit\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
\usebibmacro{finentry}}
\begin{document}
\nocite{book1}
\printbibliography
\end{document}
您会发现该related
块与标准驱动程序中的形式完全相同,并且\togglefalse{bbx:related}
不再需要。
那么问题是什么呢?
主要是由于
\printtext[parens]{%
\usebibmacro{related:init}%
\usebibmacro{related}}
内部\usebibmacro{related}
还调用(我们用或\printtext
定义其格式的那个)。此外,在启动 之前,还在 printunit 中设置。所以我们最终得到\DeclareFieldFormat{related}{\mkbibparens{#1}}
\DeclareFieldFormat{related:<relatedtype>}{\mkbibparens{#1}}
\usebibmacro{related}
\begrelateddelim
\printtext
\printtext[parens]{%
\printunit{\begrelateddelim}%
\printtext[related]{%
...
}%
}%
由于两个语句之间没有打印任何内容\printtext
,因此标点符号缓冲区保留到第二个语句中\printtext
。您可以使用以下命令看到相同的效果
\printtext[parens]{%
\printunit{\addperiod\space}%
\printtext[related]{%
\printtext{foo}%
\setunit{\addcomma\space}%
\printtext{goo}}}%
第一个\printtext[parens]
打印并刷新它之前的标点符号跟踪器。然后\addperiod\space
使用 添加到跟踪器\printunit
。现在\printtext[related]
打印,但对于标点符号跟踪器,它之前没有打印任何内容。因此,\addperiod\space
仍然存在,甚至会覆盖\addcomma\space
后者。
注意
\printtext[parens]{%
\usebibmacro{related:init}%
\usebibmacro{related}}
还有一个问题:它根本不检查是否有related
条目。因此,在这种情况下,它会打印空括号(引用book2
以查看问题)。只有当被打印为的相关条目时,\togglefalse{bbx:related}
才能解决这个问题,但如果它本身被打印,则无法解决这个问题。已经内置了避免这种情况所需的检查。book2
book2
\usebibmacro{related}