我一直在研究 biblatex,由于我厌倦了损坏的 DOI、URL 和其他电子版链接,我想使用 biblatex 样式来为这些字段实现换行。我从文件开始standard.bbx
,在文章样式中,我替换了
\newunit\newblock
\usebibmacro{doi+eprint+url}
经过
\newline
\usebibmacro{doi+eprint+url}
这是错误的,因为最终参考书目中的 DOI 行开头添加了一个点 (.),并且即使 doi 字段为空,也会添加一个新行。有办法解决这个问题吗?
然后,我想更进一步,为 DOI、URL、EPRINT 各添加一行新行,然后类似这样:
\newline
\usebibmacro{doi}
\newline
\usebibmacro{url}
\newline
\usebibmacro{eprint}
通过替换\newbibmacro*{doi+eprint+url}
、\newbibmacro*{doi}
和\newbibmacro*{eprint}
(\newbibmacro*{url}
复制粘贴 的最后几行standard.bbx
)以及通过替换\usebibmacro{doi+eprint+url}
上面的行,但不幸的是,它不起作用。我很乐意听取您的意见。
答案1
\setunit
是 的替代方案\newunit
,允许您设置标点符号来代替\newunitpunct
(通常是句号加空格)。\newunit
和 的真正妙处\setunit
在于您无需担心生成过多的标点符号,尤其是在缺少某些字段时。
下面的代码定义了一个新的书目宏bbx:parunit
。它发出\setunit
仅在书目中生成换行符的命令。使用选项设置backref=true
,bbx:parunit
还会在第一个换行符之前立即打印反向引用。编辑应用于通用书目宏,biblatex.def
以便该解决方案适用于大多数样式。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{csquotes}
\usepackage[american]{babel}
\usepackage[colorlinks]{hyperref}
\usepackage[style=verbose,backref=true]{biblatex}
\newbibmacro*{bbx:parunit}{%
\ifbibliography
{\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\clearlist{pageref}%
\setunit{\adddot\par\nobreak}}
{}}
\renewbibmacro*{doi+eprint+url}{%
\usebibmacro{bbx:parunit}% Added
\iftoggle{bbx:doi}
{\printfield{doi}}
{}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\iftoggle{bbx:url}
{\usebibmacro{url+urldate}}
{}}
\renewbibmacro*{eprint}{%
\usebibmacro{bbx:parunit}% Added
\iffieldundef{eprinttype}
{\printfield{eprint}}
{\printfield[eprint:\strfield{eprinttype}]{eprint}}}
\renewbibmacro*{url+urldate}{%
\usebibmacro{bbx:parunit}% Added
\printfield{url}%
\iffieldundef{urlyear}
{}
{\setunit*{\addspace}%
\printtext[urldate]{\printurldate}}}
\addbibresource{biblatex-examples.bib}
\begin{document}
\null\vfill\noindent
Filler text.\footcite{bertram,kastenholz,ctan,itzhaki}
\printbibliography
\end{document}
答案2
您不能直接将其包含\newline
在.bbx
文件中,因为它是“文本”,并且不会在biblatex
跟踪器中定位。相反,您需要使用\printtext
宏
\printtext{\newline}%
\usebibmacro{doi}%
\printtext{\newline}%
\usebibmacro{url}%
\printtext{\newline}%
\usebibmacro{eprint}%
我可能会让它更复杂一点,并有条件\iffieldundef
地包含这些新行
\iffieldundef{doi}
{}
{%
\printtext{\newline}%
\usebibmacro{doi}%
}%