作为我的后续老问题“如何在输出格式中打印参考书目条目的内部ID以引用文件?”我还有一个问题:
我确实使用backref=true
biblatex,并且由于风格原因,我显然希望将其打印在条目的最后。
例如这里有一个例子:
% !TeX program = lualatex
% !TeX encoding = UTF-8
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=numeric,
sortcites=true,
sorting=none,
defernumbers=true,
%maxcitenames=3,
minbibnames=3, % cite up to three authors in bib
backref=true,
backend=biber]{biblatex}
\begin{filecontents}{mybib2.bib}
@article{test,
author={Awesome person},
title={How to be awesome in 5 easy steps.},
date = {2020-06-23},
journaltitle = {{Stackexchange Human Personalities}},
note = {Note is here},
addendum = {Addendum is here.},
url = {https://tex.stackexchange.com/}
}
\end{filecontents}
% special entry declaration STARTS HERE
\DeclareFieldFormat{entrykey}{Internal entry: \texttt{#1}}
\renewbibmacro*{finentry}{\newunit\newblock\printfield{entrykey}\finentry}
% special entry declaration ENDS HERE
\addbibresource{biblatex-examples.bib}
\addbibresource{mybib2.bib}
\begin{document}
\autocite{sigfridsson,worman,geer,nussbaum}
\cite{test}
\newpage
\printbibliography
\end{document}
效果很好(预计另一个问题),但实际问题是“引文在第 1 页”打印在最后 - 是的,我知道finentry
这很明显,但我搜索了 biblatex 文档,找不到其他可以覆盖的条目,例如nearlyfinentry
或finentry-1
或任何可能被调用的条目。这就是我想要的。当然,最好的是,如果我可以将其定义为相对于某个条目,即“在 backref 之前”(在我的情况下可能)或“在附录之后”(在我的情况下也非常有用)或“在显示的倒数第二个条目之前插入”或“在 url 字段之后”等。我想你明白我的意思了。
这里显示输出:
我基本上想要的是显示我的(此处用蓝色下划线表示)条目前红色的反向引用条目。
答案1
最终,字段在书目中的打印顺序由书目驱动程序和驱动程序调用的书目宏控制。
finentry
是一个特殊的 bibmacro,在每个书目驱动程序结束时执行。没有类似的命令finentry-1
。也没有接口来指定“在字段 X 和 Y 之间打印此字段”。您需要查看有问题的书目驱动程序并找出最佳处理方法。
一般有两种方法
- 修改现有的 bibmacro 以打印新字段。
- 添加一个新的 bibmacro 以将您的新字段打印到驱动程序。
如果可能的话,方法 1 通常需要的代码要少得多。方法 2 始终有效,但可能涉及大量代码(因为您必须复制并粘贴整个驱动程序以添加两行代码,或者因为您需要为每个驱动程序打补丁xpatch
)。
如果您想在标准样式中的 backref 之前打印一些内容,您可以将相关代码添加到addendum+pubstate
宏中,所有标准样式驱动程序都使用该宏。
\documentclass[british]{article}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=numeric,
sortcites=true,
sorting=none,
defernumbers=true,
%maxcitenames=3,
minbibnames=3, % cite up to three authors in bib
backref=true,
backend=biber]{biblatex}
\DeclareFieldFormat{entrykey}{Internal entry: \texttt{#1}}
\renewbibmacro*{addendum+pubstate}{%
\printfield{addendum}%
\newunit\newblock
\printfield{pubstate}
\newunit\newblock
\printfield{entrykey}}
\begin{filecontents}{\jobname.bib}
@article{test,
author = {Awesome person},
title = {How to be awesome in 5 easy steps.},
date = {2020-06-23},
journaltitle = {{Stackexchange Human Personalities}},
note = {Note is here},
addendum = {Addendum is here.},
url = {https://tex.stackexchange.com/}
}
\end{filecontents}
\addbibresource{biblatex-examples.bib}
\addbibresource{\jobname.bib}
\begin{document}
Lorem~\autocite{sigfridsson,worman,geer,nussbaum}
ipsum~\autocite{test}
\printbibliography
\end{document}
只是为了看看你如何处理这类事情,这是@article
来自standard.bbx
\DeclareBibliographyDriver{article}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/translator+others}%
\setunit{\printdelim{nametitledelim}}\newblock
\usebibmacro{title}%
\newunit
\printlist{language}%
\newunit\newblock
\usebibmacro{byauthor}%
\newunit\newblock
\usebibmacro{bytranslator+others}%
\newunit\newblock
\printfield{version}%
\newunit\newblock
\usebibmacro{in:}%
\usebibmacro{journal+issuetitle}%
\newunit
\usebibmacro{byeditor+others}%
\newunit
\usebibmacro{note+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
{\printfield{issn}}
{}%
\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}}
backref 由pageref
bibmacro 打印,因此您需要在调用该宏之前插入新字段。addendum+pubstate
在这里是一个显而易见的选择,因为它是之前调用的最后一个 bibmacro pageref
。
在解决问题之前,addendum+pubstate
您应该仔细检查addendum+pubstate
所有需要修改的驱动程序(即所有驱动程序)中是否在相同的位置使用。
然后你查找的定义addendum+pubstate
,即
\newbibmacro*{addendum+pubstate}{%
\printfield{addendum}%
\newunit\newblock
\printfield{pubstate}}
我们上面所做的修改自然由此而来。