可能有类似的问题,但没有一个真正回答了以下问题。我希望将参考文献按第一作者的姓氏排序,但使用 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
开箱即用,并产生了正确的链接。
请注意,引用键必须适合作为宏名才能使用此技巧。