平均能量损失

平均能量损失

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

我建议您使用字段格式relatedrelated:<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}才能解决这个问题,但如果它本身被打印,则无法解决这个问题。已经内置了避免这种情况所需的检查。book2book2\usebibmacro{related}

相关内容