biblatex 中 @inbook 条目的 in:, \intitlepunct 正确使用

biblatex 中 @inbook 条目的 in:, \intitlepunct 正确使用

以下代码产生了(对我来说)意想不到的结果,我想知道我哪里出错了。代码如下:

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@bookinbook{robber-early-years,
  crossref  =   {robber-robberies},
  title     =   {Robbing Trains: The Early Years},
  pages     =   {33-245}}
@inbook{robber-greatest,
  crossref  =   {robber-robberies},
  title     =   {My Greatest Robbery Yet},
  pages     =   {456--468}}
@book{robber-robberies,
  author    =   {Robber, Great Train},
  title     =   {A Robber's Life},
  year      =   2014,
  publisher =   {Fictitious Emporium Ltd.},
  address   =   {Somewhere}}
\end{filecontents}
\usepackage{biblatex}
\makeatletter
  \renewcommand*{\intitlepunct}{\addspace}
  % http://tex.stackexchange.com/a/10686/39222
  \renewbibmacro{in:}{%
    \ifentrytype{article}{}{\printtext{\bibstring{in}\intitlepunct}}}
\makeatother
\bibliography{\jobname.bib}

\begin{document}

\autocites{robber-early-years}{robber-greatest}

\printbibliography

\end{document}

bibmacro in:我期望这对于使用和不属于类型的条目类型的作用@article是使用inIn后跟可断开的空格而不是 in或者In后面跟着冒号等等。但是,我也得到了一个句号,我不明白为什么:

参考书目中出现意外的句号

我可以通过重新定义条目类型来避免这种情况@inbook

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@bookinbook{robber-early-years,
  crossref  =   {robber-robberies},
  title     =   {Robbing Trains: The Early Years},
  pages     =   {33-245}}
@inbook{robber-greatest,
  crossref  =   {robber-robberies},
  title     =   {My Greatest Robbery Yet},
  pages     =   {456--468}}
@book{robber-robberies,
  author    =   {Robber, Great Train},
  title     =   {A Robber's Life},
  year      =   2014,
  publisher =   {Fictitious Emporium Ltd.},
  address   =   {Somewhere}}
\end{filecontents}
\usepackage{biblatex}
\makeatletter
  \renewcommand*{\intitlepunct}{\addspace}
  % http://tex.stackexchange.com/a/10686/39222
  \renewbibmacro{in:}{%
    \ifentrytype{article}{}{\printtext{\bibstring{in}\intitlepunct}}}
\makeatother
\bibliography{\jobname.bib}
\makeatletter
\DeclareBibliographyDriver{inbook}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{in:}%
%   \usebibmacro{bybookauthor}%
%   \newunit\newblock
  \usebibmacro{maintitle+booktitle}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \printfield{edition}%
  \newunit
  \iffieldundef{maintitle}
    {\printfield{volume}%
     \printfield{part}}
    {}%
  \newunit
  \printfield{volumes}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \usebibmacro{publisher+location+date}%
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{isbn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \newunit\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \usebibmacro{finentry}}
\makeatother

\begin{document}

\autocites{robber-early-years}{robber-greatest}

\printbibliography

\end{document}

被黑的书目减少了不必要的句号

但这肯定不是最好的方法。 的驱动程序@inbook试图使用书籍作者和作者,这让我感到很奇怪。据我所知,@inbook@bookinbook正是针对整体作者也是不同部分作者的情况。@bookinbook手册中提到的一个例子是作者的文集。但在这种情况下,您不会期望有一位不同的作者,在布局条目时两次包含作者似乎很愚蠢。

这让我认为我从根本上误解了这里的某些内容——要么是关于命令的工作方式,要么是关于这些条目类型的预期用途。

如果我坚持使用 的标准定义in:,就不会出现虚假的句号,但当然会得到我想要去掉的冒号。(在我看来,这对于非冠词条目来说尤其愚蠢,而且in对于冠词条目来说完全没有必要,因此消除冒号似乎是一个不错的选择。代码中的注释是针对我从中获取代码的问题,但我无法让它“正确”工作。)

有人能解释一下如何正确地做到这一点以及如何使用它们吗?

答案1

虽然我不能保证我理解了,但我认为使用 会使\addspace标点符号跟踪器感到困惑。因为跟踪器发现没有打印相关标点符号,所以当下一个\newunit出现时(紧接着bybookauthor没有打印任何内容),它会后退,删除您的空格,然后插入\newunitpunct

\intitlepunct您可以通过定义为来解决这个问题\addspace\nopunct,我思考在这种情况下应该是安全的。

答案2

biblatex有一个标点符号跟踪器和一个标点符号缓冲区,\newunit\setunit命令将相应的标点符号插入缓冲区,它不会立即打印标点符号,随后\setunits覆盖缓冲区。

因此,\addspace缓冲区中的 会被\newunit以下bybookauthor宏覆盖。幸运的是,biblatex开发人员在某个时候遇到了这个概念的问题,并决定添加\printunit\printunit插入一个在缓冲区中持久存在的标点符号,即不能被其他 覆盖\setunits

如果我们将\printunit命令添加到重新定义in:

\renewbibmacro{in:}{%
  \ifentrytype{article}{}{\printtext{\bibstring{in}\printunit{\intitlepunct}}}}

输出应该与预期一致。(我不知道为什么这不是默认设置,毕竟“in:”总是被打印出来,而且人们希望它后面跟着在 中定义的正确标点符号\intitlepunct。)

该问题似乎仅发生在\intitlepunct设置为\addspace或的情况下\space,其他任何\add命令都可以正常工作\printunit

biblatex您可以在§4.7 中阅读更多关于标点符号的奇妙世界标点和间距,第 189 页biblatex文档

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@bookinbook{robber-early-years,
  crossref  =   {robber-robberies},
  title     =   {Robbing Trains: The Early Years},
  pages     =   {33-245}}
@inbook{robber-greatest,
  crossref  =   {robber-robberies},
  title     =   {My Greatest Robbery Yet},
  pages     =   {456--468}}
@book{robber-robberies,
  author    =   {Robber, Great Train},
  title     =   {A Robber's Life},
  year      =   2014,
  publisher =   {Fictitious Emporium Ltd.},
  address   =   {Somewhere}}
\end{filecontents*}
\usepackage{biblatex}

\renewcommand*{\intitlepunct}{\addspace}
\renewbibmacro{in:}{%
  \ifentrytype{article}{}{\printtext{\bibstring{in}\printunit{\intitlepunct}}}}

\addbibresource{\jobname.bib}

\begin{document}
  \autocites{robber-early-years}{robber-greatest}
  \printbibliography
\end{document}

在此处输入图片描述

相关内容