我有一个相当大且复杂的文档,其中包含多个参考文献单元和重复引用。默认情况下,所有引用都以参考文献在参考书目中的第一次出现为目标,这会导致文档流程出现尴尬的跳跃,并让潜在读者感到厌烦。
不幸的是,这个问题及其答案对我来说不起作用,因为 bibunits 本质上是section*
,所以没有可用的标准 LaTeX 计数器来消除它们的歧义。bibunits 是\phantomsection
,但我不知道如何利用这个事实。subfiles
如果这有助于设置某些东西,bibunits 也包含在内。
此外,提出的解决方案在这个老问题及其答案中对我来说还不够,因为natbib
's\citep
被大量使用并且没有被那里的宏覆盖。
我还可以做些什么?
答案1
这是答案的完全重写。我找到了一个至少对我的项目有效的解决方案。这绝对不是一个通用的解决方案(它不处理与 revtex、harvard 或 chicago 的兼容性),而是通过对 进行深入研究实现的hyperref.sty
。为了消除 bibunits 的歧义,计数器的值\the\@bibunitauxcnt
被插入到引用的目标中。
%hyperbu.sty
\ProvidesPackage{hyperbu}[2021/10/28 1.0 (JKn)]
%
% Makes Hyperlinks of citations and bibliographies local to bibunits
%
\RequirePackage{natbib}
\RequirePackage{bibunits}
\RequirePackage{hyperref}
\def\hyper@natlinkstart#1{%
\Hy@backout{#1}%
\hyper@linkstart{cite}{cite.\the\@bibunitauxcnt.#1}%
\def\hyper@nat@current{#1}%
}
\def\hyper@natlinkend{%
\hyper@linkend
}
\def\hyper@natlinkbreak#1#2{%
\hyper@linkend#1\hyper@linkstart{cite}{cite.\the\@bibunitauxcnt.#2}%
}
\def\hyper@natanchorstart#1{%
\Hy@raisedlink{\hyper@anchorstart{cite.\the\@bibunitauxcnt.#1}}%
}\def\hyper@natanchorstart#1{%
\Hy@raisedlink{\hyper@anchorstart{cite.\the\@bibunitauxcnt.#1}}%
}
\def\hyper@natanchorend{\hyper@anchorend}
\ltx@IfUndefined{NAT@parse}{%
\providecommand*\@extra@binfo{}%
\providecommand*\@extra@b@citeb{}%
\def\bibcite#1#2{%
\@newl@bel{b}{#1\@extra@binfo}{%
\hyper@@link[cite]{}{cite.\the\@bibunitauxcnt.#1 \@extra@b@citeb}{#2}%
}%
}%
\gdef\@extra@binfo{}%
\let\Hy@bibcite\bibcite
\begingroup
\@ifundefined{bbl@cite@choice}{}{%
\g@addto@macro\bbl@cite@choice{%
\let\bibcite\Hy@bibcite
}%
}%
\endgroup
\providecommand*{\@BIBLABEL}{\@biblabel}%
\def\@lbibitem[#1]#2{%
\@skiphyperreftrue
\H@item[%
\ifx\Hy@raisedlink\@empty
\hyper@anchorstart{cite.\the\@bibunitauxcnt.#2\@extra@b@citeb}%
\@BIBLABEL{#1}%
\hyper@anchorend
\else
\Hy@raisedlink{%
\hyper@anchorstart{cite.\the\@bibunitauxcnt.#2\@extra@b@citeb}\hyper@anchorend
}%
\@BIBLABEL{#1}%
\fi
\hfill
]%
\@skiphyperreffalse
\if@filesw
\begingroup
\let\protect\noexpand
\immediate\write\@auxout{%
\string\bibcite{#2}{#1}%
}%
\endgroup
\fi
\ignorespaces
}%
\def\@bibitem#1{%
\@skiphyperreftrue\H@item\@skiphyperreffalse
\Hy@raisedlink{%
\hyper@anchorstart{cite.\the\@bibunitauxcnt.#1\@extra@b@citeb}\relax\hyper@anchorend
}%
\if@filesw
\begingroup
\let\protect\noexpand
\immediate\write\@auxout{%
\string\bibcite{#1}{\the\value{\@listctr}}%
}%
\endgroup
\fi
\ignorespaces
}%
}{}
\endinput