使用 natbib 按姓氏排序但不排序数字

使用 natbib 按姓氏排序但不排序数字

可能有类似的问题,但没有一个真正回答了以下问题。我希望将参考文献按第一作者的姓氏排序,但使用 natbib 时,数字应该与文本中的出现相对应,例如,它应该看起来像

[42]  A. Einstein, Relativity, 1927...
[1]   R. P. Feynmann, Magnetism, 1957...
[102] J. C. Maxwell, Electricity, 1873...

感谢您的帮助。

答案1

下面包含一个改变数字的技巧。请注意,这会让读者感到困惑。

这个想法是使用样式按字母顺序排序plainnat,但更改为每个按字母顺序排列的项目分配数字的代码。

为此,代码应跟踪文档中的引用顺序。这可以通过向命令添加一些代码来实现,\cite该代码使用引用键作为宏名存储计数器。此计数器应仅在第一次提及引用时分配,因此您可以检查使用引用键命名的宏是否存在。

然后修改参考书目代码(具体来说\@lbibitem),使用 citekey-macro 作为数字,而不是常规NAT@ctr计数器。

可以使用\patchcmd\apptocmd来修改命令etoolbox,它还提供\csxdef\ifcsundef

梅威瑟:

\begin{filecontents}{\jobname.bib}
@misc{relativity,
  author = {Einstein, A.},
  title = {Relativity},
  year = {1927}
}
@misc{magnetism,
  author = {Feynmann, R.P.},
  title = {Magnetism},
  year = {1957}
}
@misc{electricity,
  author = {Maxwell, J.C.},
  title = {Electricity},
  year = {1873}
}
\end{filecontents}
\documentclass{article}
\usepackage{hyperref}
\usepackage[numbers]{natbib}
\usepackage{etoolbox}

% counter to keep track of document citation order
\newcounter{myunsrt}
\setcounter{myunsrt}{1}

\makeatletter
% use the cite key macro (argument #2 of \bibitem and \@lbibitem) as number
% instead of a sequential NAT@ctr
\patchcmd{\@lbibitem}{\global\advance\c@NAT@ctr\@ne}{\setcounter{NAT@ctr}{\csname#2\endcsname}}{}{}

% store the current value of the myunsrt counter in a macro
% using the cite key (argument #3) as macro name
\apptocmd{\NAT@citexnum}{%
\ifcsundef{#3}% don't renumber if it already exists
{\csxdef{#3}{\themyunsrt}\stepcounter{myunsrt}}%
{}%
}{}{}
\makeatother
\begin{document}
\cite{magnetism}, \cite{relativity}, \cite{electricity}
\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}

结果:

在此处输入图片描述

令人惊讶的是,它hyperref开箱即用,并产生了正确的链接。

请注意,引用键必须适合作为宏名才能使用此技巧。

相关内容