LaTeX 如何处理 natbib 的 \bibcite 生成的命令?

LaTeX 如何处理 natbib 的 \bibcite 生成的命令?

为了明确起见,请考虑以下代码:

\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定义了 ,但我找不到实际使用内容的任何地方。\bibciteb@Millernatbib.styb@Miller

答案1

标准 LaTeX\cite{foo}访问\b@foo\label{foo}访问一样\r@foonatbib添加了一些额外的字段,以便您可以以不同的方式引用该作品,但基本代码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}}
                     %%%%%%%^^^^^^^^^%%%%%%%%%%

相关内容