以下代码产生了(对我来说)意想不到的结果,我想知道我哪里出错了。代码如下:
\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
是使用in
或In
后跟可断开的空格而不是 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}