hyperref 和 bibunit:将 cite-link 的目的地保持在同一个 bibunit 中

hyperref 和 bibunit:将 cite-link 的目的地保持在同一个 bibunit 中

我有一个相当大且复杂的文档,其中包含多个参考文献单元和重复引用。默认情况下,所有引用都以参考文献在参考书目中的第一次出现为目标,这会导致文档流程出现尴尬的跳跃,并让潜在读者感到厌烦。

不幸的是,这个问题及其答案对我来说不起作用,因为 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

相关内容