让哈佛和 hyperref 合作

让哈佛和 hyperref 合作

首先:我不想为此使用 bibtex;我想自己排版我的参考书目。

通过查看source2e.pdf文档,我发现了有关重新定义\@cite和的内容\@biblabel,并且我的引用风格基本与此一致。

现在剩下的问题是:我想允许两种不同的引用方式。(这似乎被称为“哈佛风格”。)一种是在正文中:

正如 John Doe (1900) 所证明的那样……

而另一个将被括起来:

…已经得到证实(John Doe 1900)。

现在我的问题是年份的不同处理方式,一种格式必须用括号括起来,而另一种格式则不需要。当然,我需要两个不同的命令来处理不同的引用。但到目前为止,每次拆分引用标签的尝试都失败了,至少如果我想使用的话hyperref。如果没有该包,以下内容似乎可以满足我的要求:

\documentclass{article}
% \usepackage{hyperref}
\makeatletter
\def\@cite#1#2{ ({#1\if@tempswa , #2\fi})}
\def\@biblabel#1{}
\def\@cite@ofmt#1{\edef\my@tmp{#1}\expandafter\my@split\my@tmp}
\def\my@split#1(#2){\hbox{#1#2}}
\def\my@tcite#1#2{{#1\if@tempswa , #2\fi}}
\def\my@tsplit#1(#2){\hbox{#1(#2)}}
\newcommand\tcite[1]{{\let\@cite\my@tcite\let\my@split\my@tsplit\cite{#1}}}
\makeatother
\begin{document}
\ldots has already been demonstrated \cite{JohnDoe}.\par
\ldots as \tcite{JohnDoe} demonstrated \ldots\par
\ldots has already been demonstrated \cite{JohnDoe}.\par
\begin{thebibliography}{1}
\bibitem[John Doe (1900)]{JohnDoe}
John Doe, The famous book, 1900.
\end{thebibliography}
\end{document}

hyperref启用后,我收到此错误消息:

! Undefined control sequence.
\hyper@@link ->\let \Hy@reserved@a 
                                   \relax \@ifnextchar [{\hyper@link@ }{\hyp...

查看源代码hyperref.sty,我发现它确实尝试支持与harvard软件包的兼容性。所以我将示例调整为:

\documentclass{article}
\usepackage{harvard}
\usepackage{hyperref}
\begin{document}
\ldots has already been demonstrated \cite{JohnDoe}.\par
\ldots as \citeasnoun{JohnDoe} demonstrated \ldots\par
\ldots has already been demonstrated \cite{JohnDoe}.\par
\begin{thebibliography}{1}
\harvarditem{John Doe}{1900}{JohnDoe}
John Doe, The famous book, 1900.\par
\end{thebibliography}
\end{document}

但我不断

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

无论我处理该文档多少次,我都无法获得任何超链接。

我如何才能获得带有手动设置参考书目和有效超链接的哈佛风格引文?

我正在使用 texlive 2013,其中包括hyperref.sty2012/11/06 的 v6.83m 和harvard.sty1994 年的 2.0.5 版本。

答案1

基于您已经非常详尽的回答:

为了实现引用命令和包之间的完全互操作性hyperref,建议加载natbibhar2nat包而不是包harvard。(如果你加载natbibhar2nat,你应该不是加载harvard包。

在下面的例子中,请注意\harvarditem\citeasnounharvard基于 的宏,它们被包透明地“翻译”har2nat成 可以理解的指令natbib。宏\cite也可用于“Basic LaTeX”(即,无需加载任何引文管理包),它被修改为natbib可用于 authoryear 样式的引文。最后,\citet\citep\citealt\citealp\citeauthor是包直接提供的宏natbib

在此处输入图片描述

\documentclass{article}
\usepackage{natbib,har2nat}
\usepackage[colorlinks=true,citecolor=blue]{hyperref}
\setlength\parindent{0pt} % just for this example
\begin{document}
\ldots\ has already been demonstrated \cite{JohnDoe}.

\ldots\ as \citeasnoun{JohnDoe} has demonstrated \ldots

\citet{JohnDoe}; \citealt{JohnDoe}

\citep{JohnDoe}; \citealp{JohnDoe}

\citeauthor{JohnDoe}

\begin{thebibliography}{99}
\harvarditem{Doe}{1900}{JohnDoe}
John Doe, {\em The Famous Book}, Forest Glen: The Buck Press. 1900.
\end{thebibliography}
\end{document}

附录:如果您无论如何都要完全手动构建参考书目,那么就没有必要绕道使用\harvarditem{}{}{}...指令并将它们“翻译”成natbib-equivalent 指令。相反,只需natbib直接使用基于 - 的语法即可。(这样做还可以让您跳过加载har2nat)。前面的代码将如下所示 - 请注意使用\bibitem而不是\harvarditem

\documentclass{article}
\usepackage{natbib}
\usepackage[colorlinks=true,citecolor=blue]{hyperref}
\setlength\parindent{0pt} % just for this example
\begin{document}
\ldots\ has already been demonstrated \cite{JohnDoe}.

\ldots\ as \citeauthor{JohnDoe} has demonstrated \ldots

\citet{JohnDoe}; \citealt{JohnDoe}

\citep{JohnDoe}; \citealp{JohnDoe}

\begin{thebibliography}{99}
\bibitem[Doe(1900)]{JohnDoe}
John Doe, {\em The Famous Book}, Forest Glen: The Buck Press. 1900.
\end{thebibliography}
\end{document}

答案2

让哈佛和 hyperref 合作

harvard将加载html(如果存在),而hyperref使用时又会加载pdflatex。因此,即使您以不同的顺序使用这些包,也会hyperref在之前加载。因此无法直接定义,否则in会抱怨。相反,会尝试在其钩子中重新定义该宏。但为时已晚:该钩子已执行harvardhyperred\harvardcite\newcommandharvardhyperref\AtBeginDocument文件jobname.aux已读入,并且辅助文件包含\harvardcite需要此操作的调用。因此,从版本hyperref永远不会被调用。

因此,我目前的解决方法是无条件地定义定义它的\harvardcite方式,但在读取文件hyperref之前这样做:jobname.aux

\documentclass{article}
\usepackage{hyperref}
\usepackage{harvard}

\makeatletter
\gdef\harvardcite#1#2#3#4{%
  \global\@namedef{HAR@fn@#1}{\hyper@@link[cite]{}{cite.#1}{#2}}%
  \global\@namedef{HAR@an@#1}{\hyper@@link[cite]{}{cite.#1}{#3}}%
  \global\@namedef{HAR@yr@#1}{\hyper@@link[cite]{}{cite.#1}{#4}}%
  \global\@namedef{HAR@df@#1}{\csname HAR@fn@#1\endcsname}%
}
\makeatother

\begin{document}
\ldots has already been demonstrated \cite{JohnDoe}.\par
\ldots as \citeasnoun{JohnDoe} demonstrated \ldots\par
\ldots has already been demonstrated \cite{JohnDoe}.\par
\begin{thebibliography}{1}
\harvarditem{John Doe}{1900}{JohnDoe}
John Doe, The famous book, 1900.\par
\end{thebibliography}
\end{document}

在这个玩具例子中我仍然收到警告:

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
pdfTeX warning (dest): name{cite.JohnDoe} has been referenced but does not exist, replaced by a fixed one

但在实际需要它的真实文档中,一切都运行良好。不知道这里发生了什么,但只要事情在我真正需要的地方正常工作,我就很高兴了。尽管有警告,但玩具看起来还是很正常。

相关内容