为了明确起见,请考虑以下代码:
\documentclass{article}
\usepackage{natbib}
\bibliographystyle{unsrtnat}
\begin{filecontents}{\jobname.bib}
@book{Miller,
author = "A. P. Miller and K. C. Rowley",
title = "Move over",
year = "2001",
publisher = "Addison-Wesley",
address = "Reading, Massachusetts"
}
\end{filecontents}
\begin{document}
Let us cite the book \cite{Miller}.
\bibliography{\jobname}
\end{document}
在 .aux 文件中,将有命令
\bibcite{Miller}{{1}{2001}{{Miller and Rowley}}{{}}}
。
该命令的作用是生成一个名为的命令b@Miller
,可以通过以下方式调用
\@nameuse{b@Miller}
给予
{1}{2001}{{Miller and Rowley}}{{}}
。
但是 LaTeX 实际上是如何使用这个命令的b@Miller
?例如,虽然在 Defines中natbib.sty
定义了 ,但我找不到实际使用内容的任何地方。\bibcite
b@Miller
natbib.sty
b@Miller
答案1
标准 LaTeX\cite{foo}
访问\b@foo
与\label{foo}
访问一样\r@foo
。 natbib
添加了一些额外的字段,以便您可以以不同的方式引用该作品,但基本代码latex.ltx
是
\DeclareRobustCommand\cite{%
\@ifnextchar [{\@tempswatrue\@citex@checkblank}{\@tempswafalse\@citex@checkblank[]}}
\def\@citex@checkblank[#1]#2{%
\IfBlankTF {#2}%
{\@citex[#1]{\space}}%
{\@citex[#1]{#2}}%
}
\def\@citex[#1]#2{\leavevmode
\let\@citea\@empty
\@cite{\@for\@citeb:=#2\do
{\@citea\def\@citea{,\penalty\@m\ }%
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
\if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
\@ifundefined{b@\@citeb}{\hbox{\reset@font\bfseries ?}%
\G@refundefinedtrue
\@latex@warning
{Citation `\@citeb' on page \thepage \space undefined}}%
{\@cite@ofmt{\csname b@\@citeb\endcsname}}}}{#1}}
%%%%%%%^^^^^^^^^%%%%%%%%%%