在我的参考书目样式中,我添加了一个触发器来改变biblatex
参考书目反向引用机制,以引用边距(“页眉”)中的段落编号而不是页面。
\def\blx@addbackref@i#1{%
\ifbacktracker
\blx@leavevmode
\if@filesw
\protected@write\@mainaux{}{\string\abx@aux@backref
{\the\c@instcount}{#1}{\the\c@refsection}%
{\ifbool{bbx:runner}%
{\therunner}%
{\thepage}}%
{\noexpand\the\c@page}}%
\fi
\fi%
}
\therunner
jurabook
使用类中的宏添加到段落中
\newcommand*{\rn}[2][]{%
\if@dorunners%
\stepcounter{runner}%
#2\marginpar%
[\hfill{\small\sffamily\therunner}\hspace*{\jb@runnersspace@length}]%
{\hspace*{\jb@runnersspace@length}{\small\sffamily\therunner}\hfill}%
\protected@edef\@currentlabel{\therunner}%
\else%
#2
\fi% do NOT delete the percentage sign
\ifthenelse{\equal{#1}{\@empty}}%
{}% nix
%else
{\label{#1}}%
}
由于运行器机制是我需要的 jurabook 类中的唯一功能,因此我将该宏复制到我的序言中,而不是使用整个类。
如果我现在将biblatex
选项 runner 设置为 true,从而切换bbx:runner
到 true,则参考书目中显示的反向参考编号将显示文档边距中显示的段落编号,而不是每个引用条目的页码。
但是,如果我点击数字,链接会将我带到与数字对应的页面,而不是与数字对应的段落。这意味着我有一个条目在第 6 页的第 10 段中被引用,参考书目中显示的数字将是 10。但是,点击该数字会将我带到第 10 页。
有人知道我需要如何调整反向引用机制以使该段落成为参考书目hyperref
中显示的数字的目标biblatex
吗?
答案1
收集和设置反向引用中的页码列表需要进行大量的工作。解决此问题的一个简单方法是通过 使参考书目pageref
宏设置的页面超链接指向运行器\hypertarget
。
下面的文档说明了这种方法。我严格遵循了你提供的代码,但你可能更喜欢设置段落编号的其他方法.\hypertarget
链接到其第二个参数的基线,对于跑步者来说太低了。我已经适应了这篇文章中的解决方案提升链接。
\documentclass[twoside]{report}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
\usepackage[backref]{biblatex}
\usepackage[colorlinks]{hyperref}
\usepackage{lipsum}
\newtoggle{bbx:runner}
\toggletrue{bbx:runner}
\iftoggle{bbx:runner}
{\DefineBibliographyStrings{german}{%
backrefpage = {siehe Rn\adddot},
backrefpages = {siehe Rn\adddot}}}
{}
\newcounter{runner}
\renewcommand{\therunner}{%
\iftoggle{bbx:runner}{\arabic{runner}}{\thepage}}
\newlength{\runnersep}
\setlength{\runnersep}{0.5em}
\makeatletter
\patchcmd{\blx@addbackref@i}{\thepage}{\therunner}{}{}
\patchcmd{\blx@addbackref@i}{\c@page}{\c@runner}{}{}
\newcommand{\backreftarget}[1]{%
\Hy@raisedlink{\hypertarget{page.#1}{}}\small#1}
\newcommand*{\rn}[2][]{%
\iftoggle{bbx:runner}
{\stepcounter{runner}#2%
\marginpar%
[\hfill{\backreftarget{\therunner}}\hspace*{\runnersep}]%
{\hspace*{\runnersep}{\backreftarget{\therunner}}\hfill}}
{\setcounter{runner}{\value{page}}#2}%
\protected@edef\@currentlabel{\therunner}%
\ifblank{#1}{}{\phantomsection\label{#1}}}
\makeatother
\newcommand*{\rnref}[1]{%
\iftoggle{bbx:runner}{Rn.~\ref{#1}}{S.~\ref{#1}}}
\addbibresource{biblatex-examples.bib}
\begin{document}
\rn{Filler} text \parencite{ctan,markey}. \lipsum[1] \vfill
\rn{Filler} text \parencite{companion}. See \rnref{run}. \lipsum[2]
\chapter{Titel}
\rn{Filler} text \parencite{companion,markey}. \lipsum[3]
\chapter{Titel}
\rn[run]{Filler} text \parencite{companion,markey}. \lipsum[4]
\printbibliography
\end{document}
这是结果文档中的参考书目。
注释掉\toggletrue{bbx:runner}
反向引用的页码。
答案2
我想在 Audrey 的解决方案中添加一个小细节。令我烦恼的是,在我实现代码后,我会收到hyperref
类似这样的警告
具有相同标识符(名称{page.19})的目的地已被使用
我认为这是页码机制已经设置了同名目标所致。因此我更改了
\newcommand{\backreftarget}[1]{%
\Hy@raisedlink{\hypertarget{page.#1}{}}\small#1}
到
\newcommand{\backreftarget}[1]{%
{\Hy@raisedlink{\hypertarget{runner.#1}{}}}\small#1}
并添加了另一个\iftoggle{bbx:runner}
测试来更改格式中\hyperlink{page.
的每个实例,以及在中定义的参考书目宏。这些编辑可以轻松使用\hyperlink{runner.
pageref
pageref:comp
pageref:dump
biblatex.def
egreg 的扩展补丁etoolbox
命令。
\makeatletter
\def\act@on@bibmacro#1#2{%
\expandafter#1\csname abx@macro@\detokenize{#2}\endcsname}
\def\patchbibmacro{\act@on@bibmacro\patchcmd}
\def\act@on@listformat#1#2{%
\expandafter#1\csname abx@lfd@*@\detokenize{#2}\endcsname}
\def\patchlistformat{\act@on@listformat\patchcmd}
\iftoggle{bbx:runner}
{\patchlistformat{pageref}{page.}{runner.}{}{}%
\patchbibmacro{pageref:comp}{page.}{runner.}{}{}%
\patchbibmacro{pageref:comp}{page.}{runner.}{}{}%
\blx@tempcnta\z@%
\loop\ifnum\blx@tempcnta<10
\patchbibmacro{pageref:dump}{page.}{runner.}{}{}%
\advance\blx@tempcnta\@ne
\repeat}
{}
\makeatother