summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/natbib
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-02-03 01:27:50 +0000
committerKarl Berry <karl@freefriends.org>2009-02-03 01:27:50 +0000
commit7da0c3762d07bfc8387027a844b9372302d48f03 (patch)
tree64ce00c41d51e48dcbfa6a737cb710aaf6566d69 /Master/texmf-dist/source/latex/natbib
parentb396e9795f300708e4296019397ba084a1a37ace (diff)
natbib 83 (2feb09)
git-svn-id: svn://tug.org/texlive/trunk@12056 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/natbib')
-rw-r--r--Master/texmf-dist/source/latex/natbib/natbib.drv52
-rw-r--r--Master/texmf-dist/source/latex/natbib/natbib.dtx1997
-rw-r--r--Master/texmf-dist/source/latex/natbib/natbib.ins8
3 files changed, 1567 insertions, 490 deletions
diff --git a/Master/texmf-dist/source/latex/natbib/natbib.drv b/Master/texmf-dist/source/latex/natbib/natbib.drv
deleted file mode 100644
index 62be6e3fb69..00000000000
--- a/Master/texmf-dist/source/latex/natbib/natbib.drv
+++ /dev/null
@@ -1,52 +0,0 @@
-%%
-%% This is file `natbib.drv',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% natbib.dtx (with options: `driver')
-%% ============================================
-%% This is the driver file to produce the LaTeX documentation
-%% from the original source file natbib.dtx.
-%%
-%% Make changes to it as needed. (Never change the file natbib.dtx!)
-%% ============================================
-%% Copyright 1993-2007 Patrick W Daly
-%% Max-Planck-Institut f\"ur Sonnensystemforschung
-%% Max-Planck-Str. 2
-%% D-37191 Katlenburg-Lindau
-%% Germany
-%% E-mail: daly@mps.mpg.de
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{natbib.drv}
- [2007/10/30 8.1 (PWD)]
-\documentclass{ltxdoc}
-%\documentclass[twoside]{ltxdoc}
-%\documentclass[a4paper]{ltxdoc}
-%\documentclass[twoside,a4paper]{ltxdoc}
-\raggedbottom
-
- %** To include the detailed explanation of the coding, comment out
- %** the next line
-\OnlyDescription
-
- %** To produce a command index: add the following line for one run,
- %** then run makeindex -s gind.ist natbib
- %** and reprocess, with or without this line (much faster without)
-% \EnableCrossrefs\CodelineIndex
-
- %** To produce a change history: add the following line for one run,
- %** then run makeindex -s gglo.ist -o natbib.gls natbib.glo
- %** and reprocess, with or without this line (faster without)
-% \RecordChanges
-
-\DisableCrossrefs %May stay; zapped by \EnableCrossrefs
-\CodelineNumbered %May stay
-
-\begin{document}
- \DocInput{natbib.dtx}
-\end{document}
-%%
-%% End of documentation driver file.
-%%
-%% End of file `natbib.drv'.
diff --git a/Master/texmf-dist/source/latex/natbib/natbib.dtx b/Master/texmf-dist/source/latex/natbib/natbib.dtx
index 794bb080155..3fd60e9fee0 100644
--- a/Master/texmf-dist/source/latex/natbib/natbib.dtx
+++ b/Master/texmf-dist/source/latex/natbib/natbib.dtx
@@ -5,7 +5,7 @@
{NATBIB.DTX}
%========================================================================
%</dtx>
-%% Copyright 1993-2007 Patrick W Daly
+%% Copyright 1993-2009 Patrick W Daly
%% Max-Planck-Institut f\"ur Sonnensystemforschung
%% Max-Planck-Str. 2
%% D-37191 Katlenburg-Lindau
@@ -26,7 +26,7 @@
% LaTeX this file: creates docstrip installation file natbib.ins
% AND the documentation
% (La)TeX natbib.ins: creates package file natbib.sty
-% and optionally documentation driver natbib.drv
+% and optionally documentation driver natbib.ltx
% (natbib.ins may be edited as needed)
% Docstrip options available:
% package - to produce a package .sty file
@@ -50,12 +50,12 @@
%
% *** Identify the driver file:-
%<driver>\NeedsTeXFormat{LaTeX2e}
-%<driver>\ProvidesFile{natbib.drv}
+%<driver>\ProvidesFile{natbib.ltx}
%
% *** The DATE, VERSION, and other INFO
%\fi
%\ProvidesFile{natbib}
- [2007/10/30 8.1 (PWD)]
+ [2009/02/02 8.3 (PWD, AO)]
% \changes{4.0}{1993 Aug 19}{First documented release}
% \changes{4.1}{1993 Oct 4}{Simplification of \cs{@citeapalk}}
% \changes{4.1a}{1993 Oct 14}{Add \texttt{rev} option for reversed comments
@@ -174,8 +174,49 @@
% \changes{8.0}{2007 Feb 5}{Remove 2.09 support}
% \changes{8.0}{2007 Feb 5}{Remove subpackage option (and agu, egs options)}
% \changes{8.1}{2007 Oct 30}{Replace some \cs{edef}s with \cs{protected@edef}}
-%
-% \CheckSum{2381}
+% \changes{8.2}{2008 Jan 10}{(AO)Introduce, for \texttt{merge} package option,
+% \cs{NAT@bibitem@first@sw} and \cs{NAT@bibitem@label@sw}}
+% \changes{8.2}{2008 Jan 10}{(AO) The sort algorithm had not been stable; fixed.}%
+% \changes{8.2}{2008 Jan 10}{(AO) Various changes to \texttt{NAT@sort@cites} and friends}%
+% \changes{8.2}{2008 Jun 26}{(AO) Employ \cs{NAT@ifcat@num} to make the test on \cs{NAT@num}}%
+% \changes{8.2}{2008 Jun 26}{(AO) Use \cs{NAT@space}, \cs{NAT@spacechar}, and \cs{NAT@penalty}
+% instead of explicit space and primitive penalty in \cs{NAT@idxtxt},
+% \cs{NAT@cite}, \cs{NAT@citenum}, \cs{NAT@citesuper}.}%
+% \changes{8.2}{2008 Jun 28}{(AO) Introduce \cs{NAT@ifcat@num}, ensuring that the
+% \cs{catcode} of the underscore is 8 at the time;
+% use for tests on \cs{NAT@num} and \cs{NAT@last@num}.}%
+% \changes{8.2}{2008 Jul 01}{(AO) Allow graceful transition away from the use of \texttt{natbib}}%
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}:
+% allow for tighter \cs{ifnum} comparisons.}%
+% \changes{8.2}{2008 Jul 01}{(AO) Give \cs{NAT@split} a good argument,
+% even when \cs{NAT@temp} is poorly constructed.}%
+% \changes{8.2}{2008 Jul 01}{(AO) Provide a layer of abstraction to assignments
+% to \cs{@citea}, using \cs{NAT@def@citea} and \cs{NAT@reset@citea}.}%
+% \changes{8.2}{2008 Jul 01}{(AO) With our abstraction of \cs{@citea};
+% we use wrappers \cs{NAT@def@citea@box} and \cs{NAT@hyper@citea}. Also \cs{NAT@penalty} in place of an explicit \cs{penalty}.}%
+% \changes{8.2}{2008 Jul 01}{(AO) Use \cs{NAT@hyper@} and \cs{NAT@hyper@citea}
+% to wrap up the hyperlink calls in \cs{NAT@citexnum}, \cs{NAT@citex}, .}%
+% \changes{8.2}{2008 Jul 02}{(AO) Add \cs{@ifxundefined}, a tool for testing a \cs{TeX} macro,
+% and \cs{@ifnum}, a tool for testing numbers, like \cs{ifnum}.}%
+% \changes{8.2}{2008 Jul 02}{(AO) Employ \cs{@ifxundefined}, instead of \cs{@ifundefined},
+% for use on \cs{@cprwrite}, \cs{@indexfile}, \cs{bbl@redefine}, \cs{chapter},
+% \cs{NAT@sectionbib}, and \cs{bib@heading}: the \cs{csname} being tested ought not to be altered as a side effect.}%
+% \changes{8.2}{2008 Jul 02}{(AO) The value of \cs{NAT@sort} and \cs{NAT@cmprs}
+% will be \cs{z@} or \cs{@ne}: something created by \cs{chardef}. This works better in \cs{ifnum} tests.}%
+% \changes{8.2}{2008 Jul 12}{(AO) Do not write .aux file entries in \cs{NAT@citexnum}
+% or \cs{NAT@citex}; do this in \cs{NAT@sort@cites} where the keys will be in the user's order.}
+% \changes{8.2}{2008 Jul 13}{(AO) Allow optional arguments preceding cite key.}
+% \changes{8.2}{2008 Jul 13}{(AO) Commented-out code has been made into a comment.}
+% \changes{8.2}{2008 Jul 13}{(AO) Protect against case where \cs{NAT@num} is
+% defined to be the same as \cs{@empty} (malformed \texttt{.aux} file).}
+% \changes{8.3}{2008 Aug 28}{Refine the compatibility with babel}
+% \changes{8.3}{2008 Sep 23}{Fix problem with spacing and raised commas for multiple superscripts}
+% \changes{8.3}{2008 Nov 5}{Repair a number of bugs from AO's coding}
+% \changes{8.3}{2008 Dec 8}{Put all comments inside braces with \cs{citet},
+% even for numerical (previously only for author--year)}
+% \changes{8.3}{2009 Feb 2}{Include AO's last delta corrections}
+%
+% \CheckSum{2848}
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -201,7 +242,7 @@
%^^A =============================================
\begin{filecontents*}{natbib.ins}
% File: natbib.ins
-% Copyright 2006 Patrick W. Daly
+% Copyright 2009 Patrick W. Daly
%
% This is the natbib installation file for extracting package and driver
% files from the original source file. Simply process it under
@@ -275,16 +316,16 @@ End of documentation driver file.
\askforoverwritefalse
\generate{\file{natbib.sty}{\from{natbib.dtx}{package,all}}
- \file{natnotes}{\usepreamble\refsheet\usepostamble\refsheetq
+ \file{natnotes.tex}{\usepreamble\refsheet\usepostamble\refsheetq
\from{natbib.dtx}{notes}}
- \file{natbib.drv}{\usepreamble\driver\usepostamble\driverq
+ \file{natbib.ltx}{\usepreamble\driver\usepostamble\driverq
\from{natbib.dtx}{driver}}
}
\obeyspaces
\Msg{*********************************************}%
\Msg{* For documentation, process natbib.dtx *}%
-\Msg{* or the driver file natbib.drv *}%
+\Msg{* or the driver file natbib.ltx *}%
\Msg{* For reference sheet, process natnotes.tex *}
\Msg{*********************************************}
\end{filecontents*}
@@ -403,8 +444,8 @@ End of documentation driver file.
% \DoNotIndex{\@sort@celt,\@tempcnta,\@tempcntb,\delimiter,\endgroup}
% \DoNotIndex{\ifcat,\m@ne,\number,\kern,\protected@edef}
% \DoNotIndex{\@markboth,\@mkboth,\nobreak,\SK@,\SK@@citex}
-% \DoNotIndex{\SK@@label,\SK@@ref,SK@def,\SK@lbibitem,\bbl@redefine}
-% \DoNotIndex{\@safe@activesfalse,\@save@activestrue,\active@prefix}
+% \DoNotIndex{\SK@@label,\SK@@ref,SK@def,\SK@lbibitem}
+% \DoNotIndex{\@nameuse,\@extra@b@citeb,\@tempb,\@tempc}
%
% \setcounter{IndexColumns}{2}
% \setlength{\IndexMin}{10cm}
@@ -417,11 +458,12 @@ End of documentation driver file.
% \title{{\bfseries Natural Sciences Citations and References}\\
% (Author--Year and Numerical Schemes)}
%
-% \author{Patrick W. Daly}
+% \author{Patrick W. Daly\thanks{%
+% The code for merged numerical bibliography entries, emulating the \texttt{mcite} package,
+% has been commissioned by the American Physical Society and provided by Arthur Ogawa}}
%
% \date{This paper describes package \texttt{\filename}\\
-% version \fileversion{} from \filedate.
-% }
+% version \fileversion{} from \filedate.}
%
% \maketitle
%
@@ -479,9 +521,10 @@ with those for \texttt{harvard}, \texttt{apalike}, \texttt{chicago},
%
% It is compatible with the packages: \texttt{babel}, \texttt{index}, \texttt{citeref},
% \texttt{showkeys}, \texttt{chapterbib}, \texttt{hyperref}, \texttt{koma} and
-% with the classes \texttt{amsbook} and \texttt{amsart}. It can also emulate the
-% sorting and compressing functions of the \texttt{cite} package (with which it
-% is otherwise incompatible).
+% with the classes \texttt{amsbook} and \texttt{amsart}.
+% It can also emulate the sorting and compressing functions of the \texttt{cite} package
+% as well as the multiple citation (and merging) functions of Thorsten Ohl's \texttt{mcite} package.
+% (The \thestyle{} package, however, is not compatible with either \texttt{cite} or \texttt{mcite} themselves.)
%
% Note that the \texttt{citeref} package (for adding citation page numbers in the
% bibliography) must be loaded after \thestyle. (The \texttt{hyperref} package with
@@ -1040,14 +1083,32 @@ hyperlinks.
Use the command |\setcitestyle| with a list of comma-separated
keywords (without spaces) as argument.
% \fi
-\begin{quote}
- Citation mode: |authoryear| or |numbers| or |super|\\
- Braces: |round| or |square| or |open={|\emph{char}|},close={|\emph{char}|}|\\
- Between citations: |semicolon| or |comma| or |citesep={|\emph{char}|}|\\
- Between author and year: |aysep={|\emph{char}|}|\\
- Between years with common author: |yysep={|\emph{char}|}|\\
+\begin{itemize}
+\item
+ Citation mode: |authoryear| or |numbers| or |super|
+% (corresponds to fourth argument of |\bibpunct|).
+ %^^A \ifNAT@numbers \ifNAT@super
+\item
+ Braces: |round| or |square| or |open={|\emph{char}|},close={|\emph{char}|}|
+% (corresponds to first and second arguments of |\bibpunct|).
+ %^^A \NAT@open \NAT@close
+\item
+ Between citations: |semicolon| or |comma| or |citesep={|\emph{char}|}|
+% (corresponds to third argument of |\bibpunct|).
+ %^^A \NAT@sep
+\item
+ Between author and year: |aysep={|\emph{char}|}|
+% (corresponds to fifth argument of |\bibpunct|).
+ %^^A \NAT@aysep
+\item
+ Between years with common author: |yysep={|\emph{char}|}|
+% (corresponds to sixth argument of |\bibpunct|).
+ %^^A \NAT@yrsep
+\item
Text before post-note: |notesep={|\emph{text}|}|
-\end{quote}
+% (corresponds to optional argument of |\bibpunct|).
+ %^^A \NAT@cmt
+\end{itemize}
Defaults are |authoryear|, |round|, |comma|, |aysep={;}|, |yysep={,}|,
|notesep={, }|
@@ -1084,8 +1145,8 @@ into (Jones et al. 1990; and references therein).
% \end{itemize}
%
% \DescribeMacro{\bibpunct}
-% The older command for setting the citation style is |\bibpunct| which
-% takes one optional and 6 mandatory arguments:
+% The older command for setting the citation style is |\bibpunct|, which
+% takes one optional and six required arguments:
% \begin{enumerate}
% \item the opening bracket symbol, default = (
% \item the closing bracket symbol, default = )
@@ -1143,7 +1204,7 @@ into (Jones et al. 1990; and references therein).
% This means that a citation style can be
% directly associated with a \texttt{.bst} file. Such implicit styles are
% immediately overwritten by any explicit style specifications, such as package
-% options or |\setcitestyle|, |\bibpunct|, |\citestyle| commands.
+% options, or by |\setcitestyle|, |\bibpunct|, or |\citestyle| commands.
%
% Predefined citation styles are contained within the \thestyle\ code for the
% following bibliography styles:
@@ -1215,26 +1276,26 @@ the list of references. This is normally |\section*| or |\chapter*|.
%
% \DescribeMacro{\bibpreamble}
% A preamble appearing after the |\bibsection| heading may be inserted before
-% the actual list of references by defining |\bibpreamble|. This will appear in
+% the actual list of references by redefining |\bibpreamble|. This will appear in
% the normal text font unless it contains font declarations. The
% |\bibfont| applies to the list of references, not to this preamble.
%
% \iffalse
-Define |\bibpreamble| to be any text that is to be printed after the heading but
+Redefine |\bibpreamble| to be any text that is to be printed after the heading but
before the actual list of references.
% \fi
%
% \DescribeMacro{\bibfont}
% The list of references is normally printed in the same font size and
-% style as the main body. However, it is possible to define |\bibfont|
+% style as the main body. However, it is possible to redefine |\bibfont|
% to be font commands that are in effect within the \texttt{thebibliography}
% environment after any preamble. For example,
% \begin{quote}
-% |\newcommand{\bibfont}{\small}|
+% |\renewcommand{\bibfont}{\small}|
% \end{quote}
% \iffalse
-Define |\bibfont| to be a font declaration, e.g.\ |\small| to apply to
+Redefine |\bibfont| to be a font declaration, e.g.\ |\small| to apply to
the list of references.
% \fi
@@ -1244,12 +1305,12 @@ the list of references.
% to be a font declaration like |\itshape| or even a command taking arguments
% like |\textit|.
% \begin{quote}
-% |\newcommand{\citenumfont}[1]{\textit{#1}}|
+% |\renewcommand{\citenumfont}[1]{\textit{#1}}|
% \end{quote}
% The above is better than |\itshape| since it automatically adds italic
% correction.
% \iffalse
-Define |\citenumfont| to be a font declaration or command like |\itshape|
+Redefine |\citenumfont| to be a font declaration or command like |\itshape|
or |\textit|.
% \fi
@@ -1347,7 +1408,7 @@ entries will no longer be made.
%
% \subsection{Hyper\TeX\ Compatibility}
% The \thestyle\ package is compatible with the \texttt{hyperref}
-% package of Sebastian Rahtz
+% package of Sebastian Rahtz and Heiko Oberdiek.
% , for use with
% \LaTeX\ $\rightarrow$ HTML conversions, pdf\TeX, \texttt{pdfmark}.
% The compatibility is of a mutual nature: both packages contain
@@ -1479,6 +1540,75 @@ in their order in the reference list.
%</notes>
% \fi
%
+% \subsection{Merged Numerical References}
+% \label{sec:merge}
+
+% \iffalse
+%<*notes>
+\head{Merged Numerical References}
+Do not use the \texttt{mcite} package with \thestyle; rather use the package option \texttt{merge}.
+
+%</notes>
+% \fi
+% \begin{quote}
+% \textbf{Note:} the |merge| coding was contributed by
+% Arthur Ogawa for the American Physical Society.
+% \end{quote}
+%
+% Thorsten Ohl's \texttt{mcite} package cannot be used together with
+% \thestyle. Instead, one must invoke the package option
+% \texttt{merge} with the |\usepackage| statement.
+%
+% \iffalse
+%<*notes>
+% \fi
+
+With this option in effect, citation keys within a multiple |\citep| command
+may contain a leading * that causes them to be merged in the bibliography
+together with the previous citation as a single entry with a single reference
+number. For example, |\citep{feynmann,*salam,*epr}| produces a single number,
+and all three references are listed in the bibliography under one entry with
+that number.
+%
+% Certain restrictions of Thorsten Ohl's \texttt{mcite} package are lifted: a *
+% prefix can be used with any citation key, and Ohl's restrictions on syntax do
+% not apply.
+%
+% An additional feature allows text to be inserted inside the bibliography entry:
+% within the argument of \verb+\citep+, a cite key may be preceded by two optional arguements, e.g.,
+% \verb+\citep{[+\emph{pre}\verb+][+\emph{post}\verb+]+\emph{key}\verb+}+,
+% where \emph{pre} represents text to be prepended to the reference (\verb+\bibitem+ content),
+% with \emph{post} appended thereto.
+%
+% Thus it is possible for the user to mark up the document:
+% \begin{verbatim}
+% text \citep{*[{See, e.g., }][ for a simpler explanation]ablebaker}
+% \end{verbatim}
+% The above example illustrates the use of the star-form and both optional arguments.
+%
+% \medskip\noindent
+% \textbf{Caution:} Because the comma (,) character is part of the syntax of \verb+\citep+,
+% and because the bracket delimiters ([]) are mere text characters and not true delimiters (like the braces),
+% you must enclose the optional argument in braces (\verb+{}+) if a comma is present in the
+% argument (that goes for brackets, too, of course).
+
+The \texttt{elide} option also activates the merging features, but also sees
+to it that common parts of the merged references (e.g., authors) are not
+repeated but are written only once in the single bibliography entry.
+
+The \texttt{mcite} option turns off the merging and eliding features, but
+allows the special syntax (the * and optional inserted texts) to be ignored.
+
+These functions are available only to numerical-mode citations, and only when
+used parenthetically, similar to the restrictions on \texttt{sort} and
+\texttt{compress}.
+
+They also require special \texttt{.bst} files, as provided for example by the
+American Physical Society for their REV\TeX\ class.
+% \iffalse
+%</notes>
+% \fi
+%
% \subsection{Long Author List on First Citation}\label{sec:long}
%
% A feature that has often been requested by otherwise happy users of
@@ -1616,7 +1746,13 @@ is read in after the main package file.
|\chapter| command; to be used with the \texttt{chapterbib} package;
\item[\ttfamily nonamebreak] keeps all the authors' names in a citation on
one line; causes overfull hboxes but helps with some \texttt{hyperref}
- problems.
+ problems;
+\item[\ttfamily merge] to allow the * prefix to the citation key,
+ and to merge such a citation's reference with that of the previous
+ citation;
+\item[\ttfamily elide] to elide common elements of merged references, like
+ the authors or year;
+\item[\ttfamily mcite] to recognize (and ignore) the merging syntax.
\end{description}
% The options \texttt{curly} and \texttt{angle} are not really serious; I only
% added them because that completes the normal list of bracket types. The only
@@ -1766,6 +1902,10 @@ is read in after the main package file.
% compress - compresses without sorting
% longnamesfirst - makes first citation full author list
% sectionbib - puts bibliography in a \section* instead of \chapter*
+ % merge - allows the citation key to have a * prefix,
+ % signifying to merge its reference with that of the previous citation.
+ % elide - if references are merged, repeated portions of later ones may be removed.
+ % mcite - recognizes and ignores the * prefix for merging.
% Punctuation so selected dominates over any predefined ones.
% Package options are called as, e.g.
% \usepackage[square,comma]{natbib}
@@ -1807,7 +1947,7 @@ is read in after the main package file.
% \item[\ttfamily notes] extracts a summary of usage to be used as a
% reference sheet; the resulting file is to be \LaTeX{}ed;
%
-% \item[\ttfamily driver] to produce a driver \texttt{.drv} file that will
+% \item[\ttfamily driver] to produce a driver \texttt{.ltx} file that will
% print out the documentation when \LaTeX'd. This file can be modified
% to produce various alternatives (page size, fonts, manual only, or with
% annotated code). The \thestyle\texttt{.dtx} file is itself such a driver
@@ -1981,6 +2121,9 @@ is read in after the main package file.
% It is nested between |%<*package>| and |%</package>|, which
% are indicators to \texttt{docstrip} that this coding belongs to the package
% file.
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
%
% With \LaTeX\ release from \texttt{1995/12/01}, |\cite| is made robust,
% something that I have adopted as well.
@@ -1994,17 +2137,56 @@ is read in after the main package file.
% relying on the kernel coding, I make \thestyle\ more
% self-reliant.
%
+% \subsection{Prerequisites}
+%
+% \begin{macro}{\@ifxundefined}
+% \begin{macro}{\@ifnum}
+% \changes{8.2}{2008 Jul 02}{(AO) Add \cs{@ifxundefined}, a tool for testing a
+% \cs{TeX} macro, and \cs{@ifnum}, a tool for testing numbers, like \cs{ifnum}.}
+% The test |\@ifxundefined| is similar syntactically to |\@ifundefined|, but
+% its first argument is a control sequence name.
+%
+% A singular disadvantage of |\@ifundefined| is its side effect of
+% changing the state of the effective control sequence name, if undefined, to |\relax|.
+% In the usual usage of |\@ifundefined|, this does not have serious consequences,
+% but it can, and |\@ifxundefined| avoids these.
+%
+% We also provide |\@ifnum|, a vehicle for |\ifnum| tests, but using the same
+% Boolean algebra as, e.g., |\@ifundefined|, with its attendant advantages.
+% \begin{macrocode}
+\providecommand\@ifxundefined[1]{%
+ \ifx#1\@undefined\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+}%
+\providecommand\@ifnum[1]{%
+ \ifnum#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+}%
+\providecommand\@ifx[1]{%
+ \ifx#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+}%
+\providecommand\appdef[2]{%
+ \toks@\expandafter{#1}\@temptokena{#2}%
+ \edef#1{\the\toks@\the\@temptokena}%
+}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
% \subsection{Test for Specific Journals}
% This package should not be loaded with the specific journal packages that
% already include it; it is superfluous and can lead to contradictions.
% \begin{macrocode}
-%<*package>
\@ifclassloaded{agu2001}{\PackageError{natbib}
{The agu2001 class already includes natbib coding,\MessageBreak
so you should not add it explicitly}
{Type <Return> for now, but then later remove\MessageBreak
the command \protect\usepackage{natbib} from the document}
\endinput}{}
+\@ifclassloaded{agutex}{\PackageError{natbib}
+ {The AGUTeX class already includes natbib coding,\MessageBreak
+ so you should not add it explicitly}
+ {Type <Return> for now, but then later remove\MessageBreak
+ the command \protect\usepackage{natbib} from the document}
+ \endinput}{}
\@ifclassloaded{aguplus}{\PackageError{natbib}
{The aguplus class already includes natbib coding,\MessageBreak
so you should not add it explicitly}
@@ -2110,12 +2292,34 @@ is read in after the main package file.
% |\ifNAT@numbers| is \meta{false} by default (author--year) and switches
% to \meta{true} for numerical citations. The flag |\ifNAT@super| indicates
% if the numerical citation is to be done with superscripts.
+%
+% Note that changing |\ifNAT@numbers| or |\ifNAT@super|
+% in the body of the text
+% will not alter the way the citations are processed;
+% their values at the end of the preamble determine the citation style for the
+% rest of the document.
% \begin{macrocode}
\newif\ifNAT@numbers \NAT@numbersfalse
\newif\ifNAT@super \NAT@superfalse
% \end{macrocode}
% \end{macro}\end{macro}
%
+% \begin{macro}{\NAT@merge}
+% \changes{8.2}{2008 Jan 10}{(AO)Introduce \texttt{merge} package option}
+% The package option |merge| allows multiple references to be merged under a single number
+% in the bibliography, inspired by Thorsten Ohl's |mcite| package for \LaTeX.
+% New syntax for the |\cite| command: e.g., |\cite{latex,*latex-companion}|,
+% where the * signifies that the \LaTeX\ Companion and \LaTeX, a Document Formatting Language
+% appear in the bibliography under the same number.
+% |merge| applies only to the numerical citation mode; it is inactive in author-year mode.
+% It is by default turned off (|\NAT@merge|${}={}$|\z@|).
+% If |\NAT@merge|${}>{}$|\@ne|, all features are turned on.
+% If |\NAT@merge|${}={}$|\@ne|, then the * syntax is active, but the merging is not done.
+% \begin{macrocode}
+\let\NAT@merge\z@
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\DeclareOption}
% \changes{5.0}{1994 May 18}{Add \LaTeXe{} options.}
% \changes{5.3}{1994 Sep 13}{Add options \texttt{angle} and \texttt{curly}}
@@ -2134,6 +2338,9 @@ is read in after the main package file.
% The standard option \texttt{openbib} is also defined here so that its
% behaviour is entirely under my control. Relying on the standard classes
% can lead to trouble.
+% \changes{8.2}{2008 Jul 02}{(AO) The value of \cs{NAT@sort} and \cs{NAT@cmprs}
+% will be \cs{z@} or \cs{@ne}: something created by \cs{chardef}.
+% This works better in \cs{ifnum} tests.}
% \begin{macrocode}
\DeclareOption{numbers}{\NAT@numberstrue
\ExecuteOptions{square,comma,nobibstyle}}
@@ -2164,14 +2371,20 @@ is read in after the main package file.
\newif\ifNAT@openbib \NAT@openbibfalse
\DeclareOption{openbib}{\NAT@openbibtrue}
\DeclareOption{sectionbib}{\def\NAT@sectionbib{on}}
-\def\NAT@sort{0}
-\def\NAT@cmprs{0}
-\DeclareOption{sort}{\def\NAT@sort{1}}
-\DeclareOption{compress}{\def\NAT@cmprs{1}}
-\DeclareOption{sort&compress}{\def\NAT@sort{1}\def\NAT@cmprs{1}}
+\def\NAT@sort{\z@}
+\def\NAT@cmprs{\z@}
+\DeclareOption{sort}{\def\NAT@sort{\@ne}}
+\DeclareOption{compress}{\def\NAT@cmprs{\@ne}}
+\DeclareOption{sort&compress}{\def\NAT@sort{\@ne}\def\NAT@cmprs{\@ne}}
+\DeclareOption{mcite}{\let\NAT@merge\@ne}
+\DeclareOption{merge}{\@ifnum{\NAT@merge<\tw@}{\let\NAT@merge\tw@}{}}
+\DeclareOption{elide}{\@ifnum{\NAT@merge<\thr@@}{\let\NAT@merge\thr@@}{}}
\@ifpackageloaded{cite}{\PackageWarningNoLine{natbib}
{The `cite' package should not be used\MessageBreak
with natbib. Use option `sort' instead}\ExecuteOptions{sort}}{}
+\@ifpackageloaded{mcite}{\PackageWarningNoLine{natbib}
+ {The `mcite' package should not be used\MessageBreak
+ with natbib. Use option `merge' instead}\ExecuteOptions{merge}}{}
\@ifpackageloaded{citeref}{\PackageError{natbib}
{The `citeref' package must be loaded after natbib}%
{Move \protect\usepackage{citeref} to after \string\usepackage{natbib}}}{}
@@ -2229,9 +2442,13 @@ is read in after the main package file.
% \texttt{bst}-specific definitions. This definition is made here before
% |\ExecuteOptions| so that options may make use of it; the option
% \texttt{nobibstyle} turns it off, for example.
+%
+% Coding note (AO): if the csname has not been defined, then executing it simply
+% executes |\relax|, so the coding here could be considerably simplified:
+% just execute |\csname| |bibstyle@||#1||\endcsname| whether defined or not.
+% (Done, PWD)
% \begin{macrocode}
-\renewcommand\bibstyle[1]{\@ifundefined{bibstyle@#1}{\relax}
- {\csname bibstyle@#1\endcsname}}
+\renewcommand\bibstyle[1]{\csname bibstyle@#1\endcsname}
% \end{macrocode}
% This is executed only when the auxiliary file is read in, and that is
% when |\begin{document}| is issued. Thus this is well before any |\cite|
@@ -2502,21 +2719,48 @@ is read in after the main package file.
% equal to |\relax| so the condition is \meta{true}. Now any notes beginning
% with an asterix will give trouble.
%
+% \changes{8.2}{2008 Jul 02}{(AO) Replace \cs{ } with \cs{NAT@spacechar} in four instances.}
% \begin{macrocode}
\newcommand\NAT@cite%
- [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\ \fi
+ [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\NAT@spacechar\fi
#1\if*#3*\else\NAT@cmt#3\fi\NAT@@close\else#1\fi\endgroup}
\newcommand\NAT@citenum%
- [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\ \fi
+ [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\NAT@spacechar\fi
#1\if*#3*\else\NAT@cmt#3\fi\NAT@@close\else#1\fi\endgroup}
\newcommand\NAT@citesuper[3]{\ifNAT@swa
-\if*#2*\else#2\ \fi
+\if*#2*\else#2\NAT@spacechar\fi
\unskip\kern\p@\textsuperscript{\NAT@@open#1\NAT@@close}%
- \if*#3*\else\ #3\fi\else #1\fi\endgroup}
+ \if*#3*\else\NAT@spacechar#3\fi\else #1\fi\endgroup}
\providecommand\textsuperscript[1]{\mbox{$^{\mbox{\scriptsize#1}}$}}
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}\end{macro}
%
+% \begin{macro}{\NAT@ifcat@num}
+% This ``trick with the catcode'' is Donald Arseneau's.
+% Used in |\NAT@citexnum| and |\NAT@make@cite@list|,
+% it determines if the argument really is a number. It will be a
+% non-number if the optional argument to |\bibitem| does not conform to any
+% of the allowed \thestyle\ syntaxes, such as if \texttt{alph.bst} is used.
+%
+% When the macro is defined, the |\catcode| of the underscore character ought to be 8.
+% Once the definition is complete, the macro can be used, and the current \cs{catcode} value of
+% underscore will then be irrelevant.
+%
+% \changes{8.2}{2008 Jun 28}{(AO) Introduce \cs{NAT@ifcat@num} and ensure that
+% the \cs{catcode} of the underscore is 8 at the time.}
+% \begin{macrocode}
+\begingroup \catcode`\_=8
+\gdef\NAT@ifcat@num#1{%
+ \ifcat_\ifnum\z@<0#1_\else A\fi
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}%
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@citex}
% \changes{5.5}{1995 Mar 21}{Is \cs{let} equal to the numerical or
% author--year definition}
@@ -2550,9 +2794,11 @@ is read in after the main package file.
% parentheses, so they are really part of the main text.
%
% The temporary command |\@citeb| takes on the value of each of the keys in
-% turn; |\@citea| is the separator between multiple citations, initially
-% set to nothing, becoming |\NAT@sep| plus line-break suppression
-% afterwards. The |\@firstofone| macro removes any leading blanks in
+% turn;
+% |\@citea| is prepended to a production and forms the separator between multiple citations,
+% initially set to |\@empty|,
+% becoming |\NAT@sep| plus line-break suppression afterwards.
+% The |\@firstofone| macro removes any leading blanks in
% |\@citeb|, making |\cite{key1, key2}| possible. If |\b@|\emph{key} is
% not defined (as on the first run, for example), a warning is printed, and
% a question mark inserted. Finally, the decoded label text is placed into
@@ -2567,8 +2813,8 @@ is read in after the main package file.
% that have name conflicts with \thestyle, they will also have conflicts with
% standard \LaTeX\ too.
%
-% The number |\NAT@ctype| controls whether author (1), year (2), or number (0)
-% is output by this macro. A value of 3 produces the cite alias.
+% The value of |\NAT@ctype| controls whether number (0), author (1), year (2), or
+% cite alias (3) is output by this macro.
%
% For compatibility with the \texttt{chapterbib} package of Donald Arseneau,
% add |\@extra@b@citeb| to the cite key; this contains the number of the
@@ -2580,23 +2826,37 @@ is read in after the main package file.
% the same as the input. If compression of numerical lists is active
% (|NAT@cmprs|=1) only the parenthetical output is affected.
%
-% The command |\@cprwrite| is defined in the \texttt{citeref} package.
+% ^^A === Note (PWD): remove the following comment by AO from the printed output.
+% ^^A Note (AO): an arguable misfeature of |\NAT@citexnum| is that it resists the user reordering
+% ^^A the references: if the first citation to several references occurs within
+% ^^A the argument of |\NAT@citexnum|, and if |\NAT@sort| is turned on, then
+% ^^A the numbering of the references involved will not change even if their order
+% ^^A is changed in the argument of the macro. The procedure |\NAT@citex| works likewise.
+%
% \changes{7.2}{2006 Jan 12}{Add \texttt{citeref} support}
% \changes{8.1}{2007 Oct 30}{Add \cs{@empty} after \cs{@citeb}, as now in standard \LaTeX}
-% \begin{macrocode}
+% \changes{8.2}{2008 Jun 28}{(AO) Use \cs{NAT@ifcat@num} instead of unrolling.}
+% \changes{8.2}{2008 Jul 01}{(AO) Provide a layer of abstraction to assignments
+% to \cs{@citea}; here, this means using \cs{NAT@reset@citea}.}
+% \changes{8.2}{2008 Jul 02}{(AO) Employ \cs{@ifxundefined} for use on \cs{@cprwrite}.}
+% \changes{8.2}{2008 Jul 01}{(AO) Perform the \cs{ifnum} test on \cs{NAT@ctype} against
+% \cs{z@}: \TeX\ finishes parsing the number and does the comparison earlier.}
+% \changes{8.2}{2008 Jul 02}{(AO) Use \cs{@ifxundefined}, instead of \cs{@ifundefined}, on \cs{@cprwrite}.}
+% \changes{8.2}{2008 Jul 01}{(AO) Use \cs{NAT@hyper@} to wrap up the hyperlink calls.}
+% \changes{8.2}{2008 Jul 12}{(AO) Do not write .aux file entries in \cs{NAT@citexnum}
+% or \cs{NAT@citex}; do this in \cs{NAT@sort@cites} where the keys will be in the user's order.}
+% \begin{macrocode}
\providecommand\@firstofone[1]{#1}
\newcommand\NAT@citexnum{}
\def\NAT@citexnum[#1][#2]#3{%
- \NAT@sort@cites{#3}%
- \let\@citea\@empty
+ \NAT@reset@parser
+ \NAT@sort@cites{#3}%
+ \NAT@reset@citea
\@cite{\def\NAT@num{-1}\let\NAT@last@yr\relax\let\NAT@nm\@empty
- \ifNAT@swa\else
- \ifnum\NAT@ctype=0\if*#1*\else
- #1\ \fi\fi\fi
\@for\@citeb:=\NAT@cite@list\do
- {\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
- \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}%
- \@ifundefined{@cprwrite}{}{\expandafter\@cprwrite\@citeb=}\fi
+ {\@safe@activestrue
+ \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \@safe@activesfalse
\@ifundefined{b@\@citeb\@extra@b@citeb}{%
{\reset@font\bfseries?}
\NAT@citeundefined\PackageWarning{natbib}%
@@ -2630,104 +2890,274 @@ is read in after the main package file.
% \changes{7.2}{2006 Jan 12}{Add hyperlinks to compressed cites}
% \changes{7.4a}{2006 Sep 06}{Add \cs{noexpand} to \cs{hyper@natlinkend}}
% \changes{8.1}{2007 Oct 30}{Change \cs{edef} to \cs{protected@edef}}
+%
+% The code for parenthetical citations starts here.
% \begin{macrocode}
\ifNAT@swa
- \ifnum\NAT@ctype>1\relax\@citea
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \ifnum\NAT@ctype=2\relax\NAT@test{\NAT@ctype}%
- \else\NAT@alias
- \fi\hyper@natlinkend\else
- \ifnum\NAT@cmprs>0
- \begingroup\catcode`\_=8
- \ifcat _\ifnum\z@<0\NAT@num _\else A\fi
- \global\let\NAT@nm=\NAT@num \else \gdef\NAT@nm{-2}\fi
- \ifcat _\ifnum\z@<0\NAT@last@num _\else A\fi
- \global\@tempcnta=\NAT@last@num \global\advance\@tempcnta by\@ne
- \else \global\@tempcnta\m@ne\fi
- \endgroup
- \ifnum\NAT@nm=\@tempcnta
- \ifx\NAT@last@yr\relax
- \protected@edef\NAT@last@yr{\@citea \mbox{%
- \noexpand\hyper@natlinkstart{\@citeb\@extra@b@citeb}{%
- \noexpand\citenumfont{\NAT@num}}\noexpand\hyper@natlinkend}}%
- \else
- \protected@edef\NAT@last@yr{--\penalty\@m\mbox{%
- \noexpand\hyper@natlinkstart{\@citeb\@extra@b@citeb}{%
- \noexpand\citenumfont{\NAT@num}}\noexpand\hyper@natlinkend}}%
- \fi
- \else
- \NAT@last@yr \@citea \mbox{\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- {\citenumfont{\NAT@num}}\hyper@natlinkend}%
- \let\NAT@last@yr\relax
- \fi
- \else
- \@citea \mbox{\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- {\citenumfont{\NAT@num}}\hyper@natlinkend}%
- \fi
- \fi
- \def\@citea{\NAT@sep\penalty\@m\NAT@space}%
% \end{macrocode}
+% This portion comprises the code for year- and alias-type citations.
+% \changes{8.2}{2008 Jul 01}{(AO) Perform the \cs{ifnum} test on \cs{NAT@ctype}
+% against \cs{@ne}, resp. \cs{tw@}: no need to use \cs{relax};
+% \TeX\ finishes parsing the number and does the comparison earlier.}
+% \changes{8.2}{2008 Jul 01}{(AO) Use \cs{NAT@hyper@} to wrap up the hyperlink calls.}
+% \begin{macrocode}
+ \@ifnum{\NAT@ctype>\@ne}{%
+ \@citea
+ \NAT@hyper@{\@ifnum{\NAT@ctype=\tw@}{\NAT@test{\NAT@ctype}}{\NAT@alias}}%
+ }{%
+% \end{macrocode}
+% Here begins the code for the cases where |\NAT@ctype|${}\le{}$|1|, covering author and number citations.
+% We start off with the code for compressed citations.
+%
+% The number of the current citation |\NAT@num| has been calculated by |\NAT@parse|.
+% We also have state variables |\NAT@last@num| and |\NAT@last@yr|.
+% |\NAT@last@num| represents |\NAT@num|'s value last time through this loop, $-1$ initially.
+% |\NAT@last@yr| contains the production for the last citation, in case it requires deferring
+% (if the last citation is to be compressed away, |\NAT@last@yr| will be clobbered by the current citation).
+%
+% We next determine if |\NAT@num| and |\NAT@last@num| are each numerical values.
+% If |\NAT@num| is numerical, |\NAT@nm| is set to its value, to $-2$ if not.
+% If |\NAT@last@num| is numerical,
+% the counter |\@tempcnta| is set to its value, to $-1$ if not.
+%
+% Note (AO): the catcode of the |_| token stored in the macro's replacement
+% part will be assigned at the time the macro definition is read in.
+% Therefore, this macro, like |\NAT@make@cite@list|, needs to be defined accordingly.
+% At the same time, the group created below along with
+% the catcode assignment and global assignments, are all unnecessary.
+% \changes{8.2}{2008 Jul 01}{(AO) Use \cs{NAT@ifcat@num} instead of unrolling the code in the macro. Global assignments are no longer necessary (which is good, since we are using \cs{@tempcnta}).}
+% \changes{8.2}{2008 Jul 01}{(AO) Perform the \cs{@ifnum} test on \cs{NAT@cmprs} against \cs{z@}; \TeX\ finishes parsing the number and does the comparison earlier in the expansion.}
+% \begin{macrocode}
+ \@ifnum{\NAT@cmprs>\z@}{%
+ \NAT@ifcat@num\NAT@num
+ {\let\NAT@nm=\NAT@num}%
+ {\def\NAT@nm{-2}}%
+ \NAT@ifcat@num\NAT@last@num
+ {\@tempcnta=\NAT@last@num\relax}%
+ {\@tempcnta\m@ne}%
+% \end{macrocode}
+% We enumerate the states in which we can arrive here.
+% \begin{enumerate}
+% \item[1] First citation in the list.
+% \item[2] Second citation, and consecutive to the first, beginning an elision run.
+% \item[3] Third or later, and consecutive to the previous, extending the run.
+% \item[4] Second or later, but not consecutive to the previous, breaking the run.
+% \item[5] Second or later, and duplicates the previous. Run or no, this one should be suppressed.
+% \end{enumerate}
+% Each of these cases is handled by its own part of the following code.
+%
+% \changes{8.2}{2008 Jan 10}{(AO)Introduce \texttt{merge} package option}
+% The following section handles case (5).
+% With the |merge| option in effect, we do nothing (this merges the current citation with the previous).
+% Without, we do the same as cases (1) and (4) below.
+% \begin{macrocode}
+ \@ifnum{\NAT@nm=\@tempcnta}{%
+ \@ifnum{\NAT@merge>\@ne}{}{\NAT@last@yr@mbox}%
+ }{%
+% \end{macrocode}
+% The following section handles cases (2) and (3). The value of |\NAT@last@yr| gets clobbered,
+% which does the compressing. The citation stored in |\NAT@last@yr| will be the same except
+% for the delimiter: the en-dash is used when there was an actual citation elided.
+% \begin{macrocode}
+ \advance\@tempcnta by\@ne
+ \@ifnum{\NAT@nm=\@tempcnta}{%
+ \ifx\NAT@last@yr\relax
+ \def@NAT@last@yr{\@citea}%
+ \else
+ \def@NAT@last@yr{--\NAT@penalty}%
+ \fi
+ }{%
+% \end{macrocode}
+% The following section handles cases (1) and (4).
+% |\NAT@last@yr| is expanded (actually producing something in case (4)),
+% the current citation is produced, and |\NAT@last@yr| is re-initialized.
+% \begin{macrocode}
+ \NAT@last@yr@mbox
+ }%
+ }%
+% \end{macrocode}
+% The code for compressed citations is complete.
+% \begin{macrocode}
+ }{%
+% \end{macrocode}
+% The following code is executed when compression is turned off.
+% We merge duplicates if |merge| is in effect.
+% \begin{macrocode}
+ \@tempswatrue
+ \@ifnum{\NAT@merge>\@ne}{\@ifnum{\NAT@last@num=\NAT@num\relax}{\@tempswafalse}{}}{}%
+ \if@tempswa\NAT@citea@mbox\fi
+ }%
+ }%
+% \end{macrocode}
+% The code for author- and number-type citations is complete;
+% we conclue the code for parenthetical citations.
+%
+% Ensure that proper punctuation appears before the second and following entries.
+% \changes{8.2}{2008 Jul 01}{(AO) Provide a layer of abstraction to assignments to \cs{@citea};
+% here, this means using \cs{NAT@def@citea}.}
+% \begin{macrocode}
+ \NAT@def@citea
+% \end{macrocode}
+% Here ends the portion relating to parenthetical citations.
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% Here commences the code for textual citations.
+% Note that compression (|\NAT@cmprs|) and merging (|\NAT@merge|)
+% do not apply to such citations.
+%
% \changes{7.5}{2007 Feb 2}{Textual numerical cites print notes outside brackets}
+% \changes{8.2}{2008 Jul 01}{(AO) With our abstraction of \cs{@citea};
+% we use wrappers \cs{NAT@def@citea@box} and \cs{NAT@hyper@citea}.
+% Also \cs{NAT@penalty} in place of an explicit \cs{penalty}.}
+% \changes{8.3}{2008 Sep 23}{Insert small space before \cs{NAT@@open}; this is
+% simultaneously removed from superscript version of \cs{NAT@mbox}}
+% \changes{8.3}{2008 Dec 5}{Use \cs{NAT@super@kern} for small spacing with
+% superscripts only; else is \cs{relax}}
% For textual citations, test what the output is to be (number, year,
% author) and also test for comments.
+% \changes{8.3}{2008 Dec 8}{Move \cs{NAT@@close} so post-comment inside braces}
% \begin{macrocode}
- \else
- \ifcase\NAT@ctype\relax
- \ifx\NAT@last@nm\NAT@nm \NAT@yrsep\penalty\@m\NAT@space\else
- \@citea \NAT@test{1}\ \NAT@mbox{\NAT@@open}%
- \fi \NAT@mbox{%
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- {\citenumfont{\NAT@num}}\hyper@natlinkend}%
- \def\@citea{\NAT@mbox{\NAT@@close\NAT@sep\penalty\@m\ }}%
- \or\@citea
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@test{\NAT@ctype}\hyper@natlinkend
- \def\@citea{\NAT@sep\penalty\@m\ }%
- \or\@citea
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@test{\NAT@ctype}\hyper@natlinkend
- \def\@citea{\NAT@sep\penalty\@m\ }%
- \or\@citea
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@alias\hyper@natlinkend
- \def\@citea{\NAT@sep\penalty\@m\ }%
+ \ifcase\NAT@ctype
+ \ifx\NAT@last@nm\NAT@nm \NAT@yrsep\NAT@penalty\NAT@space\else
+ \@citea \NAT@test{\@ne}\NAT@spacechar\NAT@mbox{\NAT@super@kern\NAT@@open}%
+ \fi
+ \if*#1*\else#1\NAT@spacechar\fi
+ \NAT@mbox{\NAT@hyper@{{\citenumfont{\NAT@num}}}}%
+ \NAT@def@citea@box
+ \or
+ \NAT@hyper@citea@space{\NAT@test{\NAT@ctype}}%
+ \or
+ \NAT@hyper@citea@space{\NAT@test{\NAT@ctype}}%
+ \or
+ \NAT@hyper@citea@space\NAT@alias
\fi
\fi
- }}%
- \ifnum\NAT@cmprs>0\relax\NAT@last@yr\fi
- \ifNAT@swa\else\NAT@mbox{\NAT@@close}%
- \ifnum\NAT@ctype=0\if*#2*\else
- \NAT@cmt#2\fi
- \fi\fi}{#1}{#2}}
+% \end{macrocode}
+% The code for textual citations is complete, along with the |\ifNAT@swa| started far above.
+%
+% Here ends the false branch of |\@ifundefined{b@\@citeb\@extra@b@citeb}|.
+% \begin{macrocode}
+ }%
+% \end{macrocode}
+% Here ends the |\@for| loop.
+% \begin{macrocode}
+ }%
+% \end{macrocode}
+% Clean up: the deferred portion from a possible parenthetical (|\NAT@last@yr|) citation.
+% \begin{macrocode}
+ \@ifnum{\NAT@cmprs>\z@}{\NAT@last@yr}{}%
+% \end{macrocode}
+% More cleanup: the closing delimiter for textual (|\NAT@mbox|) citations is executed.
+% \changes{8.2}{2008 Jan 10}{(AO)Introduce \texttt{merge} package option}
+% (AO) I changed the |\ifnum| comparison to halt the parsing of the number earlier:
+% otherwise \TeX\ would parse all the way to the |*| before calculating the |\ifnum| comparison.
+% This feature of \TeX's scanner can cause difficult-to-understand problems.
+% \changes{8.3}{2008 Dec 8}{Move \cs{NAT@@close} so post-comment inside braces}
+% \begin{macrocode}
+ \ifNAT@swa\else
+ \@ifnum{\NAT@ctype=\z@}{%
+ \if*#2*\else\NAT@cmt#2\fi
+ }{}%
+ \NAT@mbox{\NAT@@close}%
+ \fi
+ }{#1}{#2}%
+}%
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\NAT@citea@mbox}
+% \changes{8.2}{2008 Jan 10}{(AO)Introduce \texttt{merge} package option}
+% \begin{macro}{\NAT@hyper@}
+% \begin{macro}{\NAT@last@yr@mbox}
+% \begin{macro}{\def@NAT@last@yr}
+% \begin{macro}{\NAT@hyper@citea}
+% \begin{macro}{\NAT@hyper@citea@space}
+% Here we provide wrapper procedures for use in |\NAT@citexnum|.
+% The |\NAT@citea@mbox| macro produces the citation itself preceded by appropriate punctuation,
+% while |\def@NAT@last@yr| defines a macro |\NAT@last@yr| which, when expanded, produces the same thing.
+% The procedure |\NAT@hyper@| is shorthand for a common hyperlink idiom involving
+% the pair |\hyper@natlinkstart| and |\hyper@natlinkend|.
+% Finally, |\NAT@last@yr@mbox| produces two citations: the first by expanding |\NAT@last@yr| (which it resets),
+% the second by executing |\NAT@citea@mbox|.
+% \begin{macrocode}
+\def\NAT@citea@mbox{%
+ \@citea\mbox{\NAT@hyper@{{\citenumfont{\NAT@num}}}}%
+}%
+\def\NAT@hyper@#1{%
+ \hyper@natlinkstart{\@citeb\@extra@b@citeb}#1\hyper@natlinkend
+}%
+\def\NAT@hyper@citea#1{%
+ \@citea
+ \NAT@hyper@{#1}%
+ \NAT@def@citea
+}%
+\def\NAT@hyper@citea@space#1{%
+ \@citea
+ \NAT@hyper@{#1}%
+ \NAT@def@citea@space
+}%
+\def\def@NAT@last@yr#1{%
+ \protected@edef\NAT@last@yr{%
+ #1%
+ \noexpand\mbox{%
+ \noexpand\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
+ {\noexpand\citenumfont{\NAT@num}}%
+ \noexpand\hyper@natlinkend
+ }%
+ }%
+}%
+\def\NAT@last@yr@mbox{%
+ \NAT@last@yr\let\NAT@last@yr\relax
+ \NAT@citea@mbox
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\NAT@test}
% \changes{6.6}{1997 May 29}{Add macro}
% \changes{7.4}{2006 Aug 18}{Fix bug by adding \cs{NAT@nmfmt}}
+% \changes{8.2}{2008 Jul 16}{(AO) Perform tests on first argument using \cs{@ifnum}: that argument is always \cs{NAT@ctype} or one of its possible values.}
+% \changes{8.2}{2008 Jul 16}{(AO) Use \cs{begingroup} instead of \cs{bgroup} for pushing \TeX's context stack.}
+% \changes{8.3}{2008 Dec 4}{Remove the \cs{NAT@nmfmt} from name test; cannot see how it could help; only hinders}
% For numerical mode, need to test if there really is a name or date; if a
% numerical \texttt{.bst} file is being used, there will not be any names or
% dates. This macro tests and writes |\NAT@nm| or |\NAT@date| according to
% its argument being 1 or 2.
% \begin{macrocode}
-\newcommand\NAT@test[1]{\ifnum#1=1 \ifx\NAT@nmfmt{\NAT@nm}\NAT@noname
- {\reset@font\bfseries(author?)}\PackageWarning{natbib}
- {Author undefined for citation`\@citeb'
- \MessageBreak
- on page \thepage}\else \NAT@nm \fi
- \else \if\relax\NAT@date\relax
- {\reset@font\bfseries(year?)}\PackageWarning{natbib}
- {Year undefined for citation`\@citeb'
- \MessageBreak
- on page \thepage}\else \NAT@date \fi \fi}
+\newcommand\NAT@test[1]{%
+ \@ifnum{#1=\@ne}{%
+ \ifx\NAT@nm\NAT@noname
+ \begingroup\reset@font\bfseries(author?)\endgroup
+ \PackageWarning{natbib}{%
+ Author undefined for citation`\@citeb' \MessageBreak on page \thepage%
+ }%
+ \else \NAT@nm
+ \fi
+ }{%
+ \if\relax\NAT@date\relax
+ \begingroup\reset@font\bfseries(year?)\endgroup
+ \PackageWarning{natbib}{%
+ Year undefined for citation`\@citeb' \MessageBreak on page \thepage%
+ }%
+ \else \NAT@date
+ \fi
+ }%
+}%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\citenumfont}
% \changes{7.0}{1999 May 7}{Add macro to format numerical citations}
-% To set the numerical citations in a different font, define |\citenumfont|.
+% \changes{8.3}{2008 Nov 19}{Initialize as \cs{@empty} not \cs{relax}}
+% To set the numerical citations in a different font, redefine |\citenumfont|.
% \begin{macrocode}
-\let\citenumfont=\relax
+\let\citenumfont=\@empty
% \end{macrocode}
% \end{macro}
%
@@ -2772,23 +3202,33 @@ is read in after the main package file.
% The command |\@cprwrite| is defined in the \texttt{citeref} package.
% \changes{7.2}{2006 Jan 12}{Add \texttt{citeref} support}
% \changes{8.1}{2007 Oct 30}{Add \cs{@empty} after \cs{@citeb}, as now in standard \LaTeX}
+% \changes{8.2}{2008 Jul 01}{(AO) Provide a layer of abstraction to assignments to \cs{@citea};
+% here, this means using \cs{NAT@reset@citea}.}
+% \changes{8.2}{2008 Jul 02}{(AO) Employ \cs{@ifxundefined} for use on \cs{@cprwrite}.}
+% \changes{8.3}{2008 Aug 27}{Add \cs{@safe@activesfalse} for babel compatibility}
+% \changes{8.2}{2008 Jul 12}{(AO) Do not write .aux file entries in \cs{NAT@citexnum} or \cs{NAT@citex};
+% do this in \cs{NAT@sort@cites} where the keys will be in the user's order.}
% \begin{macrocode}
\newcommand\NAT@citex{}
\def\NAT@citex%
[#1][#2]#3{%
+ \NAT@reset@parser
\NAT@sort@cites{#3}%
- \let\@citea\@empty
+ \NAT@reset@citea
\@cite{\let\NAT@nm\@empty\let\NAT@year\@empty
\@for\@citeb:=\NAT@cite@list\do
- {\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
- \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}%
- \@ifundefined{@cprwrite}{}{\expandafter\@cprwrite\@citeb=}\fi
+ {\@safe@activestrue
+ \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \@safe@activesfalse
+% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}% Move to \NAT@sort@cites
+% \@ifxundefined\@cprwrite{}{\expandafter\@cprwrite\@citeb=}% Move to \NAT@cite@list@append
+% \fi
\@ifundefined{b@\@citeb\@extra@b@citeb}{\@citea%
{\reset@font\bfseries ?}\NAT@citeundefined
\PackageWarning{natbib}%
{Citation `\@citeb' on page \thepage \space undefined}\def\NAT@date{}}%
{\let\NAT@last@nm=\NAT@nm\let\NAT@last@yr=\NAT@year
- \NAT@parse{\@citeb}%
+ \NAT@parse{\@citeb}%
\ifNAT@longnames\@ifundefined{bv@\@citeb\@extra@b@citeb}{%
\let\NAT@name=\NAT@all@names
\global\@namedef{bv@\@citeb\@extra@b@citeb}{}}{}%
@@ -2833,13 +3273,15 @@ is read in after the main package file.
% option, it becomes |\mbox|. This was a special request.
%
% \changes{7.1}{2003 June 6}{Add test for missing letter with multiple cites}
+% \changes{8.2}{2008 Jul 01}{(AO) Use \cs{NAT@hyper@} to wrap up the hyperlink calls in seven instances.}
+% \changes{8.2}{2008 Jul 01}{(AO) Provide a layer of abstraction to assignments to \cs{@citea};
+% here, this means using \cs{NAT@def@citea}.}
% Add a test for a missing extra letter in multiple citations. This can happen
% with the \texttt{chicago} style, for example. Pointed out by Frank Mittelbach.
% \begin{macrocode}
\ifNAT@swa\ifcase\NAT@ctype
\if\relax\NAT@date\relax
- \@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@nmfmt{\NAT@nm}\NAT@date\hyper@natlinkend
+ \@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}\NAT@date}%
\else
\ifx\NAT@last@nm\NAT@nm\NAT@yrsep
\ifx\NAT@last@yr\NAT@year
@@ -2848,36 +3290,36 @@ is read in after the main package file.
{Multiple citation on page \thepage: same authors and
year\MessageBreak without distinguishing extra
letter,\MessageBreak appears as question mark}\fi
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}\NAT@exlab
- \hyper@natlinkend
- \else\unskip\
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}\NAT@date
- \hyper@natlinkend
+ \NAT@hyper@{\NAT@exlab}%
+ \else\unskip\NAT@spacechar
+ \NAT@hyper@{\NAT@date}%
\fi
- \else\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@nmfmt{\NAT@nm}%
- \hyper@natlinkbreak{\NAT@aysep\ }{\@citeb\@extra@b@citeb}%
- \NAT@date\hyper@natlinkend
+ \else
+ \@citea\NAT@hyper@{%
+ \NAT@nmfmt{\NAT@nm}%
+ \hyper@natlinkbreak{%
+ \NAT@aysep\NAT@spacechar}{\@citeb\@extra@b@citeb
+ }%
+ \NAT@date
+ }%
\fi
\fi
- \or\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@nmfmt{\NAT@nm}\hyper@natlinkend
- \or\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@date\hyper@natlinkend
- \or\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@alias\hyper@natlinkend
- \fi \def\@citea{\NAT@sep\ }%
+ \or\@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}}%
+ \or\@citea\NAT@hyper@{\NAT@date}%
+ \or\@citea\NAT@hyper@{\NAT@alias}%
+ \fi \NAT@def@citea
% \end{macrocode}
% Begin textual citation. Do same checks for repeated names and years.
% Optional notes are added here, not in |\NAT@cite|, which means for
% multiple citations, each one will receive the notes in the year part.
% (Pre-notes are questionable for this, but include them anyway.)
% \changes{6.6}{1997 July 5}{Fix closing brace bug}
+% \changes{8.2}{2008 Jul 01}{(AO) Use \cs{NAT@hyper@} to wrap up the hyperlink calls in four instances.}
% \begin{macrocode}
- \else\ifcase\NAT@ctype
+ \else
+ \ifcase\NAT@ctype
\if\relax\NAT@date\relax
- \@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@nmfmt{\NAT@nm}\hyper@natlinkend
+ \@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}}%
\else
\ifx\NAT@last@nm\NAT@nm\NAT@yrsep
\ifx\NAT@last@yr\NAT@year
@@ -2886,26 +3328,29 @@ is read in after the main package file.
{Multiple citation on page \thepage: same authors and
year\MessageBreak without distinguishing extra
letter,\MessageBreak appears as question mark}\fi
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}\NAT@exlab
- \hyper@natlinkend
- \else\unskip\
- \hyper@natlinkstart{\@citeb\@extra@b@citeb}\NAT@date
- \hyper@natlinkend
+ \NAT@hyper@{\NAT@exlab}%
+ \else
+ \unskip\NAT@spacechar
+ \NAT@hyper@{\NAT@date}%
\fi
- \else\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@nmfmt{\NAT@nm}%
- \hyper@natlinkbreak{\ \NAT@@open\if*#1*\else#1\ \fi}%
- {\@citeb\@extra@b@citeb}%
- \NAT@date\hyper@natlinkend\fi
+ \else
+ \@citea\NAT@hyper@{%
+ \NAT@nmfmt{\NAT@nm}%
+ \hyper@natlinkbreak{\NAT@spacechar\NAT@@open\if*#1*\else#1\NAT@spacechar\fi}%
+ {\@citeb\@extra@b@citeb}%
+ \NAT@date
+ }%
+ \fi
\fi
- \or\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@nmfmt{\NAT@nm}\hyper@natlinkend
- \or\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@date\hyper@natlinkend
- \or\@citea\hyper@natlinkstart{\@citeb\@extra@b@citeb}%
- \NAT@alias\hyper@natlinkend
- \fi \if\relax\NAT@date\relax\def\@citea{\NAT@sep\ }%
- \else\def\@citea{\NAT@@close\NAT@sep\ }\fi
+ \or\@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}}%
+ \or\@citea\NAT@hyper@{\NAT@date}%
+ \or\@citea\NAT@hyper@{\NAT@alias}%
+ \fi
+ \if\relax\NAT@date\relax
+ \NAT@def@citea
+ \else
+ \NAT@def@citea@close
+ \fi
\fi
}}\ifNAT@swa\else\if*#2*\else\NAT@cmt#2\fi
\if\relax\NAT@date\relax\else\NAT@@close\fi\fi}{#1}{#2}}
@@ -2913,6 +3358,59 @@ is read in after the main package file.
%
% \end{macro}\end{macro}
%
+% \begin{macro}{\NAT@spacechar}
+% \begin{macro}{\NAT@separator}
+% \changes{8.3}{2008 Sep 23}{Remove \cs{NAT@space} from definition;
+% add explicitly elsewhere}
+% \begin{macro}{\NAT@reset@citea}
+% \begin{macro}{\NAT@def@citea}
+% \begin{macro}{\NAT@def@citea@space}
+% \changes{8.3}{2008 Dec 5}{Add macro}
+% \begin{macro}{\NAT@def@citea@close}
+% \begin{macro}{\NAT@def@citea@box}
+% \changes{8.3}{2008 Sep 23}{Fix for better spacing and separations with superscripts}
+% We introduce |\NAT@spacechar|, which takes the place of the space character in all
+% productions. Note that the macro |\NAT@space| is variable: it is the space character
+% except for superscript citations, where it becomes |\relax|. This is to suppress
+% spacing between superscripted citations.
+%
+% The macro |\NAT@separator| is the commonly employed separator between citations.
+%
+% The procedures |\NAT@reset@citea|, |\NAT@def@citea|, and |\NAT@def@citea@close|
+% manage the |\@citea| macro for |\NAT@citex|,
+% while |\NAT@def@citea@box| acts only for |\NAT@citexnum| in textual mode.
+% Any assignment to |\@citea| is done by one of these procedures.
+%
+% Note that |\NAT@def@citea@box| uses the fixed |\NAT@spacechar|; this allows
+% a space to appear between multiple superscripted citations that appear with the author
+% names, whereas multiple superscripts (either for repeated authors or no authors)
+% have no space between them.
+%
+% And |\NAT@def@citea| sets the variable |\NAT@space| between citations, while
+% |\NAT@def@citea@space| uses the fixed space. This is employed with |\citet|
+% in numerical mode, for author, year, alias only. It makes a difference for
+% superscripts, allowing space to appear between such multiples.
+%
+% An extension to \thestyle\ could change these procedures to effect more sophisticated
+% behaviour of the punctuation between textual citations.
+% \begin{macrocode}
+\def\NAT@spacechar{\ }%
+\def\NAT@separator{\NAT@sep\NAT@penalty}%
+\def\NAT@reset@citea{\c@NAT@ctr\@ne\let\@citea\@empty}%
+\def\NAT@def@citea{\def\@citea{\NAT@separator\NAT@space}}%
+\def\NAT@def@citea@space{\def\@citea{\NAT@separator\NAT@spacechar}}%
+\def\NAT@def@citea@close{\def\@citea{\NAT@@close\NAT@separator\NAT@space}}%
+\def\NAT@def@citea@box{\def\@citea{\NAT@mbox{\NAT@@close}\NAT@separator\NAT@spacechar}}%
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\NAT@@open}
% \changes{6.6}{1997 May 26}{Add macro}
% \begin{macro}{\NAT@@close}
@@ -2969,7 +3467,9 @@ is read in after the main package file.
% \begin{macrocode}
\newcommand\shortcites[1]{%
\@bsphack\@for\@citeb:=#1\do
- {\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ {\@safe@activestrue
+ \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \@safe@activesfalse
\global\@namedef{bv@\@citeb\@extra@b@citeb}{}}\@esphack}
% \end{macrocode}
% \end{macro}
@@ -3080,6 +3580,12 @@ is read in after the main package file.
% \changes{6.8a}{1998 May 14}{\cs{@biblabel} redefined only for numericals}
% \changes{7.5}{2007 Feb 2}{Saving user definitions of \cs{@biblabel} done differently}
% \changes{7.5}{2007 Feb 2}{\cs{NAT@idxtxt} defaults to appropriate style in numerical mode}
+% \changes{8.2}{2008 Jun 26}{(AO) use \cs{NAT@space} and \cs{NAT@penalty} for
+% author-year citation style as well as in \cs{NAT@citexnum}}
+% \changes{8.2}{2008 Jul 02}{(AO) use \cs{NAT@spacechar} in \cs{NAT@idxtxt}}
+% \changes{8.3}{2008 Sep 23}{Remove small space before \cs{textsuperscript} in
+% superscript version of \cs{NAT@mbox}}
+% \changes{8.3}{2008 Dec 5}{Define \cs{NAT@super@kern} for small spacing with superscripts}
% The four internal macros that have different definitions depending on the
% citation style have been defined with different names; now set the macros
% to be executed to that set that is actually wanted. This is determined by
@@ -3091,27 +3597,35 @@ is read in after the main package file.
% extra labels (the letters added to the dates); these are to be suppressed
% for numerical citations.
% \begin{macrocode}
-\newcommand\NAT@set@cites{\ifNAT@numbers
- \ifNAT@super \let\@cite\NAT@citesuper
- \def\NAT@mbox##1{\unskip\nobreak\hspace{1\p@}\textsuperscript{##1}}%
- \let\citeyearpar=\citeyear
- \let\NAT@space\relax\else
- \let\NAT@mbox=\mbox
- \let\@cite\NAT@citenum \def\NAT@space{ }\fi
- \let\@citex\NAT@citexnum
- \let\@biblabel\NAT@biblabelnum
- \let\@bibsetup\NAT@bibsetnum
- \renewcommand\NAT@idxtxt{\NAT@name\ \NAT@open\NAT@num\NAT@close}%
- \def\natexlab##1{}%
- \else
- \let\@cite\NAT@cite
- \let\@citex\NAT@citex
- \let\@biblabel\NAT@biblabel
- \let\@bibsetup\NAT@bibsetup
- \let\NAT@space\relax
- \renewcommand\NAT@idxtxt{\NAT@name\ \NAT@open\NAT@date\NAT@close}%
- \def\natexlab##1{##1}%
- \fi}
+\newcommand\NAT@set@cites{%
+ \ifNAT@numbers
+ \ifNAT@super \let\@cite\NAT@citesuper
+ \def\NAT@mbox##1{\unskip\nobreak\textsuperscript{##1}}%
+ \let\citeyearpar=\citeyear
+ \let\NAT@space\relax
+ \def\NAT@super@kern{\kern\p@}%
+ \else
+ \let\NAT@mbox=\mbox
+ \let\@cite\NAT@citenum
+ \let\NAT@space\NAT@spacechar
+ \let\NAT@super@kern\relax
+ \fi
+ \let\@citex\NAT@citexnum
+ \let\@biblabel\NAT@biblabelnum
+ \let\@bibsetup\NAT@bibsetnum
+ \renewcommand\NAT@idxtxt{\NAT@name\NAT@spacechar\NAT@open\NAT@num\NAT@close}%
+ \def\natexlab##1{}%
+ \def\NAT@penalty{\penalty\@m}%
+ \else
+ \let\@cite\NAT@cite
+ \let\@citex\NAT@citex
+ \let\@biblabel\NAT@biblabel
+ \let\@bibsetup\NAT@bibsetup
+ \let\NAT@space\NAT@spacechar
+ \let\NAT@penalty\@empty
+ \renewcommand\NAT@idxtxt{\NAT@name\NAT@spacechar\NAT@open\NAT@date\NAT@close}%
+ \def\natexlab##1{##1}%
+ \fi}
\AtBeginDocument{\NAT@set@cites}
% \end{macrocode}
% \end{macro}
@@ -3161,14 +3675,15 @@ is read in after the main package file.
\fi}
% \end{macrocode}
%
-% \changes{7.2}{2006 Jan 12}{Previously |hyperref| would turn off compression; now allow this}
+% \changes{7.2}{2006 Jan 12}{Previously \texttt{hyperref} would turn off compression; now allow this}
+% \changes{8.2}{2008 Jul 13}{(AO) Commented-out code has been made into a comment.}
% With the \texttt{hyperref} package, compression of numerical citations
% was turned off in earlier versions. As of 7.2, remove this constraint, and
% make the first and last numbers in the compressed range into links.
-% \begin{macrocode}
+% \begin{verbatim}
% \AtBeginDocument{\@ifpackageloaded{hyperref}{%
-% \ifnum\NAT@sort=2\def\NAT@sort{1}\fi}{}}
-% \end{macrocode}
+% \ifnum\NAT@sort=\tw@\def\NAT@sort{\@ne}\fi}{}}
+% \end{verbatim}
%
% \subsection{The Citations}
%
@@ -3178,6 +3693,7 @@ is read in after the main package file.
% \changes{6.6}{1997 May 26}{Define with \cs{ifNAT@par} on}
% \changes{6.6}{1997 May 27}{Redefine for new coding of \cs{@citex}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% Textual citations are made with the |\citet| command, which has a starred
% form for full authors, and may have one or two optional arguments for notes.
%
@@ -3217,7 +3733,7 @@ is read in after the main package file.
\newif\ifNAT@full\NAT@fullfalse
\newif\ifNAT@swa
\DeclareRobustCommand\citet
- {\begingroup\NAT@swafalse\def\NAT@ctype{0}\NAT@partrue
+ {\begingroup\NAT@swafalse\let\NAT@ctype\z@\NAT@partrue
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
\newcommand\NAT@citetp{\@ifnextchar[{\NAT@@citetp}{\NAT@@citetp[]}}
\newcommand\NAT@@citetp{}
@@ -3232,6 +3748,7 @@ is read in after the main package file.
% \changes{6.6}{1997 May 26}{Define with \cs{ifNAT@par} on}
% \changes{6.6}{1997 May 27}{Redefine for new coding of \cs{@citex}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% Parenthetical citations are made with the |\citep| command, which has a
% starred form for full authors, and may have one or two optional arguments for
% notes.
@@ -3245,7 +3762,7 @@ is read in after the main package file.
% to the older syntax |\cite|\oarg{pre}\oarg{post}\marg{key}.
% \begin{macrocode}
\DeclareRobustCommand\citep
- {\begingroup\NAT@swatrue\def\NAT@ctype{0}\NAT@partrue
+ {\begingroup\NAT@swatrue\let\NAT@ctype\z@\NAT@partrue
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
% \end{macrocode}
% \end{macro}
@@ -3257,6 +3774,7 @@ is read in after the main package file.
% \changes{6.5}{1997 Jan 30}{Declare obsolete, retained for compatibility}
% \changes{6.6}{1997 May 27}{Redefine for new coding of \cs{@citex}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% The |\cite| command was originally used to produce both textual and
% parenthetical citations; with an option argument, even an empty one,
% the citation was parenthical. I now recommend the use of |\citet| and
@@ -3267,7 +3785,7 @@ is read in after the main package file.
% author--year mode, this flag depends on presence or absence of notes.
% \begin{macrocode}
\DeclareRobustCommand\cite
- {\begingroup\def\NAT@ctype{0}\NAT@partrue\NAT@swatrue
+ {\begingroup\let\NAT@ctype\z@\NAT@partrue\NAT@swatrue
\@ifstar{\NAT@fulltrue\NAT@cites}{\NAT@fullfalse\NAT@cites}}
\newcommand\NAT@cites{\@ifnextchar [{\NAT@@citetp}{%
\ifNAT@numbers\else
@@ -3287,6 +3805,7 @@ is read in after the main package file.
% \changes{6.6}{1997 Jun 23}{Add macro, like \cs{citep} without parentheses}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
% \changes{7.0}{1999 May 21}{Include in subpack}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% An alternative form of citation is one in which the parentheses are not
% printed. This was originally requested by Alexander Holt, who wanted it to be
% the same as |\citet| but without any braces; since then James Bednar has asked
@@ -3304,16 +3823,17 @@ is read in after the main package file.
% should be added later.
% \begin{macrocode}
\DeclareRobustCommand\citealt
- {\begingroup\NAT@swafalse\def\NAT@ctype{0}\NAT@parfalse
+ {\begingroup\NAT@swafalse\let\NAT@ctype\z@\NAT@parfalse
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
\DeclareRobustCommand\citealp
- {\begingroup\NAT@swatrue\def\NAT@ctype{0}\NAT@parfalse
+ {\begingroup\NAT@swatrue\let\NAT@ctype\z@\NAT@parfalse
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
% \end{macrocode}
% \end{macro}\end{macro}
%
% \begin{macro}{\citenum}
% \changes{7.5}{2007 Feb 2}{Add macro to print citation number number}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@}: allow for tighter \cs{ifnum} comparisons.}
% With version~7.5, |\citenum| is a new feature: it prints the citation number
% just like |\citealp| but without authors, and without raising it in superscript
% mode. This was requested by Antony Stone who
@@ -3323,8 +3843,9 @@ is read in after the main package file.
%
% \begin{macrocode}
\DeclareRobustCommand\citenum
- {\begingroup\NAT@swatrue\def\NAT@ctype{0}\NAT@parfalse\let\textsuperscript\
- \NAT@citexnum[][]}
+ {\begingroup
+ \NAT@swatrue\let\NAT@ctype\z@\NAT@parfalse\let\textsuperscript\NAT@spacechar
+ \NAT@citexnum[][]}
% \end{macrocode}
% \end{macro}
%
@@ -3336,12 +3857,13 @@ is read in after the main package file.
% \changes{6.4}{1996 Oct 2}{Add dummy macros for \texttt{hyperref.sty}}
% \changes{6.6}{1997 May 27}{Define with \cs{@citex} and \cs{NAT@ctype}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{@ne}: allow for tighter \cs{ifnum} comparisons.}
% In order to refer to the authors without year or number, provide
% |\citeauthor| and |\citeauthor*|; for historical reasons, keep
% |\citefullauthor|.
% \begin{macrocode}
\DeclareRobustCommand\citeauthor
- {\begingroup\NAT@swafalse\def\NAT@ctype{1}\NAT@parfalse
+ {\begingroup\NAT@swafalse\let\NAT@ctype\@ne\NAT@parfalse
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
% \end{macrocode}
% \end{macro}
@@ -3356,6 +3878,7 @@ is read in after the main package file.
% \changes{7.0}{1999 May 10}{Add macro}
% \begin{macro}{\Citeauthor}
% \changes{7.0}{1999 May 10}{Add macro}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{z@} (resp. \cs{@ne}): allow for tighter \cs{ifnum} comparisons.}
% When a textual citation occurs at the beginning of a sentence and the first
% name is something like ``de la Maire'', it needs to be capitalized. This is
% done with the |\NAT@up| command that is redefined to be |\NAT@Up|.
@@ -3364,23 +3887,23 @@ is read in after the main package file.
% eventually ask for it, so do it now.
% \begin{macrocode}
\DeclareRobustCommand\Citet
- {\begingroup\NAT@swafalse\def\NAT@ctype{0}\NAT@partrue
+ {\begingroup\NAT@swafalse\let\NAT@ctype\z@\NAT@partrue
\let\NAT@up\NAT@Up
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
\DeclareRobustCommand\Citep
- {\begingroup\NAT@swatrue\def\NAT@ctype{0}\NAT@partrue
+ {\begingroup\NAT@swatrue\let\NAT@ctype\z@\NAT@partrue
\let\NAT@up\NAT@Up
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
\DeclareRobustCommand\Citealt
- {\begingroup\NAT@swafalse\def\NAT@ctype{0}\NAT@parfalse
+ {\begingroup\NAT@swafalse\let\NAT@ctype\z@\NAT@parfalse
\let\NAT@up\NAT@Up
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
\DeclareRobustCommand\Citealp
- {\begingroup\NAT@swatrue\def\NAT@ctype{0}\NAT@parfalse
+ {\begingroup\NAT@swatrue\let\NAT@ctype\z@\NAT@parfalse
\let\NAT@up\NAT@Up
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
\DeclareRobustCommand\Citeauthor
- {\begingroup\NAT@swafalse\def\NAT@ctype{1}\NAT@parfalse
+ {\begingroup\NAT@swafalse\let\NAT@ctype\@ne\NAT@parfalse
\let\NAT@up\NAT@Up
\@ifstar{\NAT@fulltrue\NAT@citetp}{\NAT@fullfalse\NAT@citetp}}
% \end{macrocode}
@@ -3394,20 +3917,22 @@ is read in after the main package file.
% \changes{6.4}{1996 Oct 2}{Add dummy macros for \texttt{hyperref.sty}}
% \changes{6.6}{1997 May 27}{Define with \cs{@citex} and \cs{NAT@ctype}}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{tw@}: allow for tighter \cs{ifnum} comparisons.}
% Similarly for the year only.
% \begin{macrocode}
\DeclareRobustCommand\citeyear
- {\begingroup\NAT@swafalse\def\NAT@ctype{2}\NAT@parfalse\NAT@citetp}
+ {\begingroup\NAT@swafalse\let\NAT@ctype\tw@\NAT@parfalse\NAT@citetp}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\citeyearpar}
% \changes{6.6}{1997 May 17}{Add macro}
% \changes{6.8}{1998 Feb 19}{Place inside a group}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{tw@}: allow for tighter \cs{ifnum} comparisons.}
% I have often been asked for a version of |\citeyear| in parentheses.
% \begin{macrocode}
\DeclareRobustCommand\citeyearpar
- {\begingroup\NAT@swatrue\def\NAT@ctype{2}\NAT@partrue\NAT@citetp}
+ {\begingroup\NAT@swatrue\let\NAT@ctype\tw@\NAT@partrue\NAT@citetp}
% \end{macrocode}
% \end{macro}
%
@@ -3447,6 +3972,7 @@ is read in after the main package file.
% \changes{6.9}{1999 Jan 22}{Add macro}
% \begin{macro}{\citepalias}
% \changes{6.9}{1999 Jan 22}{Add macro}
+% \changes{8.2}{2008 Jul 01}{(AO) Assign \cs{NAT@ctype} with \cs{let} \cs{thr@@}: allow for tighter \cs{ifnum} comparisons.}
% An alias is an alternative designation for a reference, something like [ABG]
% in place of [Alpher, Bethe, Gamow, 1980]. The alias is defined with
% |\defcitealias| and used with |\citetalias| and |\citepalias|.
@@ -3461,9 +3987,9 @@ is read in after the main package file.
{\PackageWarning{natbib}{Overwriting existing alias for citation #1}}
\@namedef{al@#1\@extra@b@citeb}{#2}}
\DeclareRobustCommand\citetalias{\begingroup
- \NAT@swafalse\def\NAT@ctype{3}\NAT@parfalse\NAT@citetp}
+ \NAT@swafalse\let\NAT@ctype\thr@@\NAT@parfalse\NAT@citetp}
\DeclareRobustCommand\citepalias{\begingroup
- \NAT@swatrue\def\NAT@ctype{3}\NAT@partrue\NAT@citetp}
+ \NAT@swatrue\let\NAT@ctype\thr@@\NAT@partrue\NAT@citetp}
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}
%
@@ -3478,7 +4004,9 @@ is read in after the main package file.
% \begin{macrocode}
\renewcommand\nocite[1]{\@bsphack
\@for\@citeb:=#1\do{%
+ \@safe@activestrue
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \@safe@activesfalse
\if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
\if*\@citeb\else
\@ifundefined{b@\@citeb\@extra@b@citeb}{%
@@ -3521,15 +4049,27 @@ is read in after the main package file.
% is first necessary to expand |\b@|\emph{key} into a temporary command
% |\NAT@temp|, which is then used as the argument of |\NAT@split|, which
% makes the individual assignments.
+%
+% When the |\bibcite| command has been written by standard LaTeX, its second argument
+% will consist of a number instead of what \thestyle\ expects (four brace-delimited things).
+% One must not assume that things are as we would like.
+% \changes{8.2}{2008 Jul 01}{(AO) Give \cs{NAT@split} a good argument, even when \cs{NAT@temp} is poorly constructed.}%
+% \changes{8.2}{2008 Jul 16}{(AO) Avoid global definition of \cs{NAT@temp}}%
+% \changes{8.2}{2008 Sep 12}{(AO) Change pattern part of \cs{NAT@split} to avoid problems with standard .aux files.}%
% \begin{macrocode}
-\newcommand\NAT@parse[1]{{%
- \let\protect=\@unexpandable@protect\let~\relax
- \let\active@prefix=\@gobble
- \xdef\NAT@temp{\csname b@#1\@extra@b@citeb\endcsname}}%
- \expandafter\NAT@split\NAT@temp
- \expandafter\NAT@parse@date\NAT@date??????@@%
- \ifciteindex\NAT@index\fi
-}
+\newcommand\NAT@parse[1]{%
+ \begingroup
+ \let\protect=\@unexpandable@protect
+ \let~\relax
+ \let\active@prefix=\@gobble
+ \edef\NAT@temp{\csname b@#1\@extra@b@citeb\endcsname}%
+ \aftergroup\NAT@split
+ \expandafter
+ \endgroup
+ \NAT@temp{}{}{}{}{}@@%
+ \expandafter\NAT@parse@date\NAT@date??????@@%
+ \ifciteindex\NAT@index\fi
+}%
% \end{macrocode}
%
% The |\active@prefix| command appearing in \texttt{babel} causes problems
@@ -3545,15 +4085,28 @@ is read in after the main package file.
% \changes{5.5}{1995 May 14}{Fix coding slightly}
% \changes{5.5}{1995 May 18}{Renamed from \cs{@citez}}
% \changes{6.0}{1995 Sep 4}{Recode for new \cs{bibcite} structure}
+% \changes{8.2}{2008 Jul 13}{(AO) Protect against case where \cs{NAT@num} is defined to be the same as \cs{@empty} (malformed \texttt{.aux} file).}
+% \changes{8.2}{2008 Jul 16}{(AO) Arrange to restore original state (in case \cs{cite} argument is empty).}%
+% \changes{8.2}{2008 Sep 12}{(AO) Change pattern part of \cs{NAT@split} to avoid problems with standard .aux files.}%
% The actual assignments of the author--year and numerical label texts to
% the corresponding commands is carried out by |\NAT@split|. If the long
% author list is missing (argument |#4|), it is set equal to the short
% list.
+%
+% Query (AO): why are these assignments |\global|? I would not think it necessary.
% \begin{macrocode}
-\newcommand\NAT@split[4]{%
+\def\NAT@split#1#2#3#4#5@@{%
\gdef\NAT@num{#1}\gdef\NAT@name{#3}\gdef\NAT@date{#2}%
\gdef\NAT@all@names{#4}%
- \ifx\NAT@noname\NAT@all@names \gdef\NAT@all@names{#3}\fi}
+ \ifx\NAT@num\@empty\gdef\NAT@num{0}\fi
+ \ifx\NAT@noname\NAT@all@names \gdef\NAT@all@names{#3}\fi
+}%
+\def\NAT@reset@parser{%
+ \global\let\NAT@num\@empty
+ \global\let\NAT@name\@empty
+ \global\let\NAT@date\@empty
+ \global\let\NAT@all@names\@empty
+}%
% \end{macrocode}
% \end{macro}
%
@@ -3590,11 +4143,13 @@ is read in after the main package file.
% \changes{6.0}{1995 Sep 21}{Add macro}
% \changes{6.9}{1999 Jan 22}{Allow \cs{makeindex} to be issued before package
% loaded}
+% \changes{8.2}{2008 Jul 02}{(AO) Replace \cs{ } with \cs{NAT@spacechar} in \cs{NAT@idxtxt}.}
% To make an entry in the index for every citation, I have added
% |\NAT@index| to the |\NAT@parse| command. This will do nothing unless
% |\makeindex| has been issued in the preamble, in which case it writes the
% citation information to the \texttt{.idx} file by means of the standard
-% \LaTeX\ internal |\@wrindex|. The actual format of the citation
+% \LaTeX\ internal |\@wrindex| (which contains the closing |\endgroup\@esphack|).
+% The actual format of the citation
% information is contained in |\NAT@idxtxt| which a user may redefine if
% needed.
% \begin{macrocode}
@@ -3603,13 +4158,14 @@ is read in after the main package file.
\renewcommand\makeindex{\NAT@makeindex
\renewcommand\NAT@index{\@bsphack\begingroup
\def~{\string~}\@wrindex{\NAT@idxtxt}}}
-\newcommand\NAT@idxtxt{\NAT@name\ \NAT@open\NAT@date\NAT@close}
+\newcommand\NAT@idxtxt{\NAT@name\NAT@spacechar\NAT@open\NAT@date\NAT@close}
% \end{macrocode}
% If |\makeindex| has already been issued before \thestyle\ is loaded, it
% does not contain these extra features. Thus issue it once more, but only with
% the extra features.
+% \changes{8.2}{2008 Jul 02}{(AO) Employ \cs{@ifxundefined} for use on \cs{@indexfile}.}
% \begin{macrocode}
-\@ifundefined{@indexfile}{}{\let\NAT@makeindex\relax\makeindex}
+\@ifxundefined\@indexfile{}{\let\NAT@makeindex\relax\makeindex}
% \end{macrocode}
% \end{macro}\end{macro}
% \begin{macro}{\ifciteindex}
@@ -3637,15 +4193,19 @@ is read in after the main package file.
% \texttt{.idx} and \texttt{.ind}. To make the automatic index entries go to
% a different set, redefine |\citeindextype|.
%
-% The |\mbox{}| before |\index| below prevents vertical shifts when the
-% |\cite| command comes at the beginning of a tabular column. Heaven knows why.
+% \changes{8.3}{2008 Dec 03}{Remove \cs{mbox} from \cs{NAT@exp}}
+% There used to be an
+% |\mbox{}| before |\index| below which apparently ``prevents vertical shifts when the
+% |\cite| command comes at the beginning of a tabular column.''
+% However, it also causes crashes when listing the bibliography because it comes
+% before the first |\item| command. Removed.
%
% \begin{macrocode}
\newcommand\citeindextype{default}
\newcommand\NAT@index@alt{{\let\protect=\noexpand\let~\relax
\xdef\NAT@temp{\NAT@idxtxt}}\expandafter\NAT@exp\NAT@temp\@nil}
\newcommand\NAT@exp{}
-\def\NAT@exp#1\@nil{\mbox{}\index[\citeindextype]{#1}}
+\def\NAT@exp#1\@nil{\index[\citeindextype]{#1}}
\AtBeginDocument{%
\@ifpackageloaded{index}{\let\NAT@index=\NAT@index@alt}{}}
@@ -3721,10 +4281,10 @@ is read in after the main package file.
\def\NAT@bare#1(#2)#3(@)#4\@nil#5{%
%<*all|apalike|authordate>
\if @#2
- \expandafter\NAT@apalk#1, , \@nil{#5}\else
+ \expandafter\NAT@apalk#1, , \@nil{#5}%
+ \else
%</all|apalike|authordate>
- \stepcounter{NAT@ctr}%
- \NAT@wrout{\arabic {NAT@ctr}}{#2}{#1}{#3}{#5}
+ \NAT@wrout{\the\c@NAT@ctr}{#2}{#1}{#3}{#5}%
%<all|apalike|authordate>\fi
}
% \end{macrocode}
@@ -3775,10 +4335,7 @@ is read in after the main package file.
% counter value in as the argument to |\@lbibitem| which is then treated as
% a non-author--year label.
% \begin{macrocode}
-\renewcommand\bibitem{%
- \@ifnextchar[{\@lbibitem}{%
- \global\NAT@stdbsttrue
- \stepcounter{NAT@ctr}\@lbibitem[\arabic{NAT@ctr}]}}
+\renewcommand\bibitem{\@ifnextchar[{\@lbibitem}{\@lbibitem[]}}%
% \end{macrocode}
% Write the label with |\item| in the bibliography listing with the current
% value of |\NAT@num|, if it exists. This will either be the sequential
@@ -3791,27 +4348,314 @@ is read in after the main package file.
%
% \changes{6.8b}{1998 July 6}{To work with \texttt{chapterbib} and
% \texttt{backref}}
+% \changes{8.2}{2008 Jan 10}{(AO)
+% Introduce, for \texttt{merge} package option, \cs{NAT@bibitem@first@sw}}
% The \texttt{hyperref} package can call the \texttt{backref} package which
% do not work with the \texttt{chapterbib} package. I have arranged with
% Sebastian Rahtz to add the compatibility via \thestyle. Thus I add a fix to
% include the |\@extra@b@citeb| suffix to the |\br@#2| commands called by
% \texttt{backref}.
+%
+% The optional arguments to the cite key have the effect of giving a meaning
+% to the |\BibitemOpen| and |\BibitemShut| control sequence names.
% \begin{macrocode}
+\let\NAT@bibitem@first@sw\@secondoftwo
\def\@lbibitem[#1]#2{%
\if\relax\@extra@b@citeb\relax\else
\@ifundefined{br@#2\@extra@b@citeb}{}{%
- \@namedef{br@#2}{\@nameuse{br@#2\@extra@b@citeb}}}\fi
- \@ifundefined{b@#2\@extra@b@citeb}{\def\NAT@num{}}{\NAT@parse{#2}}%
- \item[\hfil\hyper@natanchorstart{#2\@extra@b@citeb}\@biblabel{\NAT@num}%
- \hyper@natanchorend]%
- \NAT@ifcmd#1(@)(@)\@nil{#2}}
+ \@namedef{br@#2}{\@nameuse{br@#2\@extra@b@citeb}}%
+ }%
+ \fi
+ \@ifundefined{b@#2\@extra@b@citeb}{%
+ \def\NAT@num{}%
+ }{%
+ \NAT@parse{#2}%
+ }%
+ \def\NAT@tmp{#1}%
+% \end{macrocode}
+% \changes{8.2}{2008 Jul 13}{(AO) Allow optional arguments preceding cite key.}
+% We give meanings to \cs{bibitemOpen} and \cs{bibitemShut};
+% the default is \verb+\relax+. Special .bst files take care of inserting markup into
+% the .bbl file. There, each \cs{bibitem} begins with \cs{BibitemOpen} and
+% ends with \cs{BibitemShut}.
+% \begin{macrocode}
+ \expandafter\let\expandafter\bibitemOpen\csname NAT@b@open@#2\endcsname
+ \expandafter\let\expandafter\bibitemShut\csname NAT@b@shut@#2\endcsname
+% \end{macrocode}
+% \changes{8.2}{2008 Jan 10}{(AO)Introduce \texttt{merge} package option}
+% (AO) If this reference's |\cite| had been marked with a *,
+% then it is to be merged into the previous reference,
+% but only if this is not the first \verb+\bibitem+.
+%
+% We do Boolean algebra: if |\NAT@merge| > 1, and
+% if this is not the first |\bibitem|, and
+% if this citation key was starred, then
+% perform the action delimited by the second set of braces below, otherwise the first set.
+% \begin{macrocode}
+ \@ifnum{\NAT@merge>\@ne}{%
+ \NAT@bibitem@first@sw{%
+ \@firstoftwo
+ }{%
+ \@ifundefined{NAT@b*@#2}{%
+ \@firstoftwo
+ }{%
+ \expandafter\def\expandafter\NAT@num\expandafter{\the\c@NAT@ctr}%
+ \@secondoftwo
+ }%
+ }%
+ }{%
+ \@firstoftwo
+ }%
+% \end{macrocode}
+% The first set of braces will be executed (format an |\item|) unless the above test was satisfied.
+% \changes{8.3}{2008 Nov 5}{(PWD) Correct code for when label is ok}
+% \changes{8.3}{2008 Nov 5}{(PWD) Move incrementing of counter}
+% \begin{macrocode}
+ {%
+ \global\advance\c@NAT@ctr\@ne
+ \@ifx{\NAT@tmp\@empty}{\@firstoftwo}{%
+ \@secondoftwo
+ }%
+ {%
+ \expandafter\def\expandafter\NAT@num\expandafter{\the\c@NAT@ctr}%
+ \global\NAT@stdbsttrue
+ }{}%
+ \bibitem@fin
+ \item[\hfil\NAT@anchor{#2}{\NAT@num}]%
+ \global\let\NAT@bibitem@first@sw\@secondoftwo
+ \NAT@bibitem@init
+ }%
+% \end{macrocode}
+% The second set of braces, executed when the test is satisfied. This does the
+% merging with the previous entry.
+% \begin{macrocode}
+ {%
+ \NAT@anchor{#2}{}%
+ \NAT@bibitem@cont
+ \bibitem@fin
+ }%
% \end{macrocode}
+% If working on an author-year styled entry,
+% we tail out with |\NAT@ifcmd|, which subjects our arguments to further processing.
+% Otherwise, we write out a very simple |\bibcite| command to the .aux file.
+% \begin{macrocode}
+ \@ifx{\NAT@tmp\@empty}{%
+ \NAT@wrout{\the\c@NAT@ctr}{}{}{}{#2}%
+ }{%
+ \expandafter\NAT@ifcmd\NAT@tmp(@)(@)\@nil{#2}%
+ }%
+}%
+% \end{macrocode}
+%
% Note: in standard \LaTeX, the sequential list counter is printed directly
% with |\item|, and then written to the auxiliary file so that |\cite| can
% refer to it on the next run. Here, |\item| prints exactly the same thing
% as |\cite| on the current run, if we are in numerical mode, otherwise
% nothing.
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bibitem@fin}
+% \begin{macro}{\NAT@bibitem@init}
+% \begin{macro}{\NAT@bibitem@cont}
+% The procedure \cs{bibitem@fin}, a dispatcher based on \cs{@bibstop},
+% completes the processing of the previous \cs{bibitem},
+% producing the needed punctuation.
+% The other procedures are hooks,
+% \cs{NAT@bibitem@init} executed if we are calling \cs{item},
+% and \cs{NAT@bibitem@cont} if we are not.
+% \begin{macrocode}
+\def\bibitem@fin{%
+ \@ifxundefined\@bibstop{}{\csname bibitem@\@bibstop\endcsname}%
+}%
+\def\NAT@bibitem@init{%
+ \let\@bibstop\@undefined
+}%
+\def\NAT@bibitem@cont{%
+ \let\bibitem@Stop\bibitemStop
+ \let\bibitem@NoStop\bibitemContinue
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\BibitemOpen}
+% \begin{macro}{\BibitemShut}
+% \begin{macro}{\bibitemStop}
+% \begin{macro}{\bibitemNoStop}
+% \begin{macro}{\bibitemContinue}
+% \begin{macro}{\bibAnnote}
+% \begin{macro}{\bibAnnoteFile}
+% The markup that the special .bst puts into the .bbl file delimits each entry with
+% \cs{BibitemOpen} and \cs{BibitemShut}, thereby giving us the means
+% to insert text at the beginning and end of the entry.
+% The latter command takes an argument, allowing Bib\TeX\ to tell us
+% if the entry ended with a stop (period) or not.
+% These punctuation procedures are defined here:
+% \cs{bibitemStop} in the case where the entry ended with a stop,
+% \cs{bibitemNoStop} if no stop,
+% and the alternative \cs{bibitemContinue} if we are continuing the previous item.
+% The latter two also assign the \cs{spacefactor} explicitly: we are at the end of
+% a sentence.
+% \begin{macrocode}
+\def\BibitemOpen{%
+ \bibitemOpen
+}%
+\def\BibitemShut#1{%
+ \bibitemShut
+ \def\@bibstop{#1}%
+ \let\bibitem@Stop\bibitemStop
+ \let\bibitem@NoStop\bibitemNoStop
+}%
+\def\bibitemStop{}%
+\def\bibitemNoStop{.\spacefactor\@mmm\space}%
+\def\bibitemContinue{\spacefactor\@mmm\space}%
+\mathchardef\@mmm=3000 %
+\providecommand{\bibAnnote}[3]{%
+ \BibitemShut{#1}%
+ \def\@tempa{#3}\@ifx{\@tempa\@empty}{}{%
+ \begin{quotation}\noindent
+ \textsc{Key:}\ #2\\\textsc{Annotation:}\ \@tempa
+ \end{quotation}%
+ }%
+}%
+\providecommand{\bibAnnoteFile}[2]{%
+ \IfFileExists{#2}{%
+ \bibAnnote{#1}{#2}{\input{#2}}%
+ }{%
+ \bibAnnote{#1}{#2}{}%
+ }%
+}%
+\let\bibitemOpen\relax
+\let\bibitemShut\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bibfield}
+% \begin{macro}{\@bibfield}
+% \begin{macro}{\bibinfo}
+% We provide a facility for handling the |\bibfield| markup in the .bbl file
+% (that markup is generated by custom-bib styles that enable the \texttt{bibfield} guard code).
+% The default semantics is to remember the content of the second argument so that it
+% can be compared to the next instance of this class of |\bibfield| command.
+% (In the case where references are being merged, that is, if |\NAT@merge| \(> 1\),
+% and the present bib entry's key has been starred (*)).
+%
+% The outcome of comparing, say, the author field, is to execute one of two procedures,
+% |\@bib@Xauthor| or |\@bib@Yauthor| with the content as the argument.
+%
+% If no special features have been enabled, these two procedures just |\relax| out, and the
+% content is processed as usual.
+%
+% And if |elide| semantics are turned off, we do |\@secondoftwo|, which is the custom-bib default.
+%
+% Note that we take special measures when constructing the replacement part of the \TeX\
+% macro |\@tempa| (this will be remembered as the effective value of the field).
+% If a |\Doi| markup command is encountered, we wish to ignore its first argument
+% (which will be unique to the particular reference).
+%
+% We also define here the utility |\bibinfo| markup command of custom-bib
+% (this markup is enabled by the \texttt{bibinfo} guard code).
+% The procedure is a straightforward dispatcher to a macro whose name is
+% based on the first argument to |\bibinfo|. For instance, |\bibinfo| |{foo}|
+% will execute a procedure named |\bibinfo@X@foo|.
+% If that name is undefined, the second argument of |\bibinfo| is simply expanded as is.
+% If defined, the procedure should take a single argument, just like |\@firstofone| does.
+% \begin{macrocode}
+\def\bibfield{\@ifnum{\NAT@merge>\tw@}{\@bibfield}{\@secondoftwo}}%
+\def\@bibfield#1#2{%
+ \begingroup
+ \let\Doi\@gobble
+ \let\bibinfo\relax
+ \let\restore@protect\@empty
+ \protected@edef\@tempa{#2}%
+ \aftergroup\def\aftergroup\@tempa
+ \expandafter\endgroup\expandafter{\@tempa}%
+ \expandafter\@ifx\expandafter{\csname @bib#1\endcsname\@tempa}{%
+ \expandafter\let\expandafter\@tempa\csname @bib@X#1\endcsname
+ }{%
+ \expandafter\let\csname @bib#1\endcsname\@tempa
+ \expandafter\let\expandafter\@tempa\csname @bib@Y#1\endcsname
+ }%
+ \@ifx{\@tempa\relax}{\let\@tempa\@firstofone}{}%
+ \@tempa{#2}%
+}%
+\def\bibinfo#1{%
+ \expandafter\let\expandafter\@tempa\csname bibinfo@X@#1\endcsname
+ \@ifx{\@tempa\relax}{\@firstofone}{\@tempa}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\NAT@bibitem@init}
+% \begin{macro}{\@bib@Xauthor}
+% \begin{macro}{\@bib@Xjournal}
+% \begin{macro}{\@bibibid@}
+% We now implement a scheme (just one out of many possible ones) for eliding repeated fields.
+%
+% If the author field matches, then that portion is elided, and if
+% in addition the journal field matches, that portion is also elided.
+% If the journal field matches and the author field does not,
+% then the journal is replaced with \textit{ibid.}
+%
+% How it works:
+% when the journal is processed by |\bibfield|, one of three possibilities will be at hand:
+% \begin{enumerate}
+% \item
+% (the \texttt{journal} does not match)
+% Here, the procedure |\@bib@Yjournal| is executed, but this control sequence name is undefined,
+% so the second argument is expanded in place.
+% \item
+% (\texttt{journal} matchs but \texttt{author} does not)
+% Here, |\bibinfo@X@journal| is set to |\@bib@Z@journal|, and the latter has its
+% default meaning:
+% the second argument of |\bibinfo| is replaced by \textit{ibid.},
+% \item
+% (The \texttt{journal} matches and \texttt{author} also matches)
+% In this case, |\bibinfo@X@journal| will be the same as |\@bib@Z@journal|,
+% which has been set to |\@gobble|,
+% so the second argument of |\bibinfo| is replaced by nothing.
+% \end{enumerate}
+%
+% Adopters of \thestyle\ have the option of creating their own scheme
+% and can even remove the present scheme by doing
+% |\let| |\@bib@Xauthor| |\@undefined| and |\let| |\@bib@Xjournal| |\@undefined|.
+% \begin{macrocode}
+\def\@bib@Xauthor#1{\let\@bib@Xjournal\@gobble}%
+\def\@bib@Xjournal#1{\begingroup\let\bibinfo@X@journal\@bib@Z@journal#1\endgroup}%
+\def\@bibibid@#1{\textit{ibid}.}%
+\appdef\NAT@bibitem@init{%
+ \let\@bibauthor \@empty
+ \let\@bibjournal \@empty
+ \let\@bib@Z@journal\@bibibid@
+}%
+% \end{macrocode}
+%
+% Let us illustrate how eliding might be extended to the \texttt{year}.
+% Two things need to be done:
+% 1) define \cs{@bib@Xyear} to be \cs{@gobble}, and
+% 2) append to \cs{NAT@bibitem@init} the code |\let| |\@bibyear| |\@empty|, thus:
+% \begin{verbatim}
+% \let\@bib@Xyear\@gobble
+% \appdef\NAT@bibitem@init{\let\@bibyear\@empty}%
+% \end{verbatim}
+% However, the above fails to take into account what should happen if
+% the year matches but the journal or author do not.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SK@lbibitem}
% \changes{6.3}{1996 Jun 10}{Include \texttt{showkeys} coding if already
% loaded}
% \changes{6.4}{1996 Jun 27}{Remove from 2.09 coding}
@@ -3831,21 +4675,47 @@ is read in after the main package file.
\def\@lbibitem[#1]#2{%
\SK@lbibitem[#1]{#2}\SK@\SK@@label{#2}\ignorespaces}\fi
% \end{macrocode}
-% \end{macro}\end{macro}
+% \end{macro}
%
% \begin{macro}{\ifNAT@stdbst}
% \changes{6.0}{1995 Sep 4}{Add flag}
+% \changes{8.3}{2008 Nov 5}{Change autoswitch to numerical mode to include an error message}
% If any non-author--year |\bibitem|s have been issued, then force
% numerical mode, since the author--year |\bibitem|s can handle this, but
-% the numerical ones cannot work in author--year mode. Do this by inserting
-% |\NAT@numberstrue| in the auxiliary file.
+% the numerical ones cannot work in author--year mode.
+% Do this by setting |\NAT@stdbsttrue| when this is discovered (in |\@lbibitem|)
+% and use this flag to write |\NAT@force@numbers| into the aux file.
+%
% \begin{macrocode}
\newif\ifNAT@stdbst \NAT@stdbstfalse
-\AtEndDocument
- {\ifNAT@stdbst\if@filesw\immediate\write\@auxout{\string
- \global\string\NAT@numberstrue}\fi\fi
- }
+\AtEndDocument{%
+ \ifNAT@stdbst\if@filesw
+ \immediate\write\@auxout{%
+ \string\providecommand\string\NAT@force@numbers{}%
+ \string\NAT@force@numbers
+ }%
+ \fi\fi
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NAT@force@numbers}
+% \changes{8.3}{2008 Nov 5}{Add command to issue error message when numerical mode forced}
+% This is written to the aux file when author--year citation cannot be supported.
+% It is executed when the aux file is read in at the start of the next
+% run. It prints an error message (warning is not enough, it may be ignored)
+% and sets the numerical flag.
+% \begin{macrocode}
+\newcommand\NAT@force@numbers{%
+ \ifNAT@numbers\else
+ \PackageError{natbib}{Bibliography not compatible with author-year
+ citations.\MessageBreak
+ Press <return> to continue in numerical citation style}
+ {Check the bibliography entries for non-compliant syntax,\MessageBreak
+ or select author-year BibTeX style, e.g. plainnat}%
+ \global\NAT@numberstrue\fi}
+
% \end{macrocode}
% \end{macro}
%
@@ -3867,17 +4737,26 @@ is read in after the main package file.
% `references'.)
% \begin{macrocode}
\providecommand\bibcite{}
-\renewcommand\bibcite[2]{\@ifundefined{b@#1\@extra@binfo}\relax
- {\NAT@citemultiple
- \PackageWarningNoLine{natbib}{Citation `#1' multiply defined}}%
- \global\@namedef{b@#1\@extra@binfo}{#2}}
+\renewcommand\bibcite[2]{%
+ \@ifundefined{b@#1\@extra@binfo}{\relax}{%
+ \NAT@citemultiple
+ \PackageWarningNoLine{natbib}{Citation `#1' multiply defined}%
+ }%
+ \global\@namedef{b@#1\@extra@binfo}{#2}%
+}%
\AtEndDocument{\NAT@swatrue\let\bibcite\NAT@testdef}
\newcommand\NAT@testdef[2]{%
- \def\NAT@temp{#2}\expandafter \ifx \csname b@#1\@extra@binfo\endcsname
- \NAT@temp \else \ifNAT@swa \NAT@swafalse
- \PackageWarningNoLine{natbib}{Citation(s) may have
- changed.\MessageBreak
- Rerun to get citations correct}\fi\fi}
+ \def\NAT@temp{#2}%
+ \expandafter \ifx \csname b@#1\@extra@binfo\endcsname\NAT@temp
+ \else
+ \ifNAT@swa \NAT@swafalse
+ \PackageWarningNoLine{natbib}{%
+ Citation(s) may have changed.\MessageBreak
+ Rerun to get citations correct%
+ }%
+ \fi
+ \fi
+}%
% \end{macrocode}
% \end{macro}
%
@@ -3887,6 +4766,7 @@ is read in after the main package file.
% \changes{5.3}{1994 Sep 13}{Full author list equals short list}
% \changes{5.5}{1995 May 18}{Renamed from \cs{@citeapalk}}
% \changes{6.0}{1995 Sep 4}{Recoded for version~6.0}
+% \changes{8.3}{2008 Dec 3}{Remove additional increments of numerical counter}
% If the argument of |\bibitem| contains no command, and if it does not
% conform to the \thestyle{} syntax, then try the \texttt{apalike}
% syntax (\emph{short}\texttt{, }\emph{year}). This has a funny template
@@ -3897,11 +4777,14 @@ is read in after the main package file.
% \begin{macrocode}
%<*all|apalike|authordate>
\newcommand\NAT@apalk{}
-\def\NAT@apalk#1, #2, #3\@nil#4{\if\relax#2\relax
- \global\NAT@stdbsttrue
- \NAT@wrout{#1}{}{}{}{#4}\else
- \stepcounter{NAT@ctr}%
- \NAT@wrout{\arabic {NAT@ctr}}{#2}{#1}{}{#4}\fi}
+\def\NAT@apalk#1, #2, #3\@nil#4{%
+ \if\relax#2\relax
+ \global\NAT@stdbsttrue
+ \NAT@wrout{#1}{}{}{}{#4}%
+ \else
+ \NAT@wrout{\the\c@NAT@ctr}{#2}{#1}{}{#4}%
+ \fi
+}%
%</all|apalike|authordate>
% \end{macrocode}
% Note: the |NAT@ctr| is stepped here and everywhere else it is used,
@@ -3927,31 +4810,38 @@ is read in after the main package file.
% \begin{macro}{\citeauthoryear}
% \changes{5.3}{1994 Sep 13}{Allow full authors in citation}
% \changes{6.0}{1995 Sep 4}{Recode for version 6.0}
+% \changes{8.3}{2008 Dec 3}{Remove additional increments of numerical counter}
% For \texttt{newapa.bst} itself, the commands |\citestarts|, |\citeends|,
% as well as |\betweenauthors| must be defined; for others in this group,
% these commands are not needed.
% \begin{macrocode}
%<*newapa|chicago|all>
\newcommand\citeauthoryear{}
-\def\citeauthoryear#1#2#3(@)(@)\@nil#4{\stepcounter{NAT@ctr}\if\relax#3\relax
- \NAT@wrout{\arabic {NAT@ctr}}{#2}{#1}{}{#4}\else
- \NAT@wrout{\arabic {NAT@ctr}}{#3}{#2}{#1}{#4}\fi}
-\newcommand\citestarts{\NAT@open}
-\newcommand\citeends{\NAT@close}
-\newcommand\betweenauthors{and}
+\def\citeauthoryear#1#2#3(@)(@)\@nil#4{%
+ \if\relax#3\relax
+ \NAT@wrout{\the\c@NAT@ctr}{#2}{#1}{}{#4}%
+ \else
+ \NAT@wrout{\the\c@NAT@ctr}{#3}{#2}{#1}{#4}%
+ \fi
+}%
+\newcommand\citestarts{\NAT@open}%
+\newcommand\citeends{\NAT@close}%
+\newcommand\betweenauthors{and}%
%</newapa|chicago|all>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\astroncite}
% \changes{6.0}{1995 Sep 4}{Recode for version 6.0}
+% \changes{8.3}{2008 Dec 3}{Remove additional increments of numerical counter}
% The |\astroncite| command must similarly conform to |\NAT@bare| syntax
% and put its arguments into the auxiliary file in the correct order.
% \begin{macrocode}
%<*astron|all>
\newcommand\astroncite{}
-\def\astroncite#1#2(@)(@)\@nil#3{\stepcounter{NAT@ctr}\NAT@wrout{\arabic
-{NAT@ctr}}{#2}{#1}{}{#3}}
+\def\astroncite#1#2(@)(@)\@nil#3{%
+ \NAT@wrout{\the\c@NAT@ctr}{#2}{#1}{}{#3}%
+}%
%</astron|all>
% \end{macrocode}
% \end{macro}
@@ -3982,9 +4872,13 @@ is read in after the main package file.
%
% \begin{macrocode}
%<*harvard|all>
-\newcommand\harvarditem[4][]%
- {\if\relax#1\relax\bibitem[#2(#3)]{#4}\else
- \bibitem[#1(#3)#2]{#4}\fi }
+\newcommand\harvarditem[4][]{%
+ \if\relax#1\relax
+ \bibitem[#2(#3)]{#4}%
+ \else
+ \bibitem[#1(#3)#2]{#4}%
+ \fi
+}%
% \end{macrocode}
% The command |\citeasnoun| must be defined since \texttt{harvard.bst}
% can add it for cross-referencing.
@@ -4025,7 +4919,7 @@ is read in after the main package file.
%
% \subsection{The Bibliography Listing}
% Changes must be made to the \texttt{thebibliography} environment for
-% author--year citations. This is done be defining the environment with the
+% author--year citations. This is done by defining the environment with the
% features common to both schemes, and then by invoking |\@bibsetup|, which
% is either the author--year or numerical version.
%
@@ -4049,21 +4943,29 @@ is read in after the main package file.
%
% The packages of the KOMA scripts make use of |\bib@heading| which functions
% much like |\bibsection|. If it is defined, let |\bibsection| be equal to it.
+% \changes{8.2}{2008 Jul 02}{(AO) Employ \cs{@ifxundefined} for use on \cs{chapter}, \cs{NAT@sectionbib}, and \cs{bib@heading}.}
+% \changes{8.3}{2008 Dec 5}{Restore \cs{@ifundefined} for \cs{chapter}, because of
+% clashes with \texttt{chapterbib} package which also does this test}
% \begin{macrocode}
\providecommand\bibsection{}
-\@ifundefined{chapter}%
- {\renewcommand\bibsection{\section*{\refname
- \@mkboth{\MakeUppercase{\refname}}{\MakeUppercase{\refname}}}}}
- {\@ifundefined{NAT@sectionbib}%
- {\renewcommand\bibsection{\chapter*{\bibname
- \@mkboth{\MakeUppercase{\bibname}}{\MakeUppercase{\bibname}}}}}
- {\renewcommand\bibsection{\section*{\bibname
- \ifx\@mkboth\@gobbletwo\else\markright{\MakeUppercase{\bibname}}\fi}}}}
-\@ifclassloaded{amsart}%
- {\renewcommand\bibsection{\section*{\refname}}}{}
-\@ifclassloaded{amsbook}%
- {\renewcommand\bibsection{\chapter*{\bibname}}}{}
-\@ifundefined{bib@heading}{}{\let\bibsection\bib@heading}
+\@ifundefined{chapter}{%
+ \renewcommand\bibsection{%
+ \section*{\refname\@mkboth{\MakeUppercase{\refname}}{\MakeUppercase{\refname}}}%
+ }%
+}{%
+ \@ifxundefined\NAT@sectionbib{%
+ \renewcommand\bibsection{%
+ \chapter*{\bibname\@mkboth{\MakeUppercase{\bibname}}{\MakeUppercase{\bibname}}}%
+ }%
+ }{%
+ \renewcommand\bibsection{%
+ \section*{\bibname\ifx\@mkboth\@gobbletwo\else\markright{\MakeUppercase{\bibname}}\fi}%
+ }%
+ }%
+}%
+\@ifclassloaded{amsart}{\renewcommand\bibsection{\section*{\refname}}}{}%
+\@ifclassloaded{amsbook}{\renewcommand\bibsection{\chapter*{\bibname}}}{}%
+\@ifxundefined\bib@heading{}{\let\bibsection\bib@heading}%
% \end{macrocode}
% \end{macro}
%
@@ -4105,19 +5007,27 @@ is read in after the main package file.
% elsewhere with |\@listctr|, but now I refer to it explicitly. This is to
% avoid trouble if |\@listctr| should ever disappear. (The value of
% |\@listctr| is set by |\usecounter|.)
+%
+% \changes{8.2}{2008 Jan 10}{(AO)Introduce \texttt{merge} package option}
+% We need to keep track of our state within the bibliography's list:
+% |\NAT@bibitem@first@sw| will be true before the first |\item| command
+% is executed, false thereafter.
% \begin{macrocode}
\newcounter{NAT@ctr}
\renewenvironment{thebibliography}[1]{%
- \bibsection\parindent \z@\bibpreamble\bibfont\list
- {\@biblabel{\arabic{NAT@ctr}}}{\@bibsetup{#1}%
- \setcounter{NAT@ctr}{0}}%
- \ifNAT@openbib
- \renewcommand\newblock{\par}
- \else
- \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
- \fi
- \sloppy\clubpenalty4000\widowpenalty4000
- \sfcode`\.=1000\relax
+ \bibsection
+ \parindent\z@
+ \bibpreamble
+ \bibfont
+ \list{\@biblabel{\the\c@NAT@ctr}}{\@bibsetup{#1}\global\c@NAT@ctr\z@}%
+ \ifNAT@openbib
+ \renewcommand\newblock{\par}%
+ \else
+ \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
+ \fi
+ \sloppy\clubpenalty4000\widowpenalty4000
+ \sfcode`\.\@m
+ \let\NAT@bibitem@first@sw\@firstoftwo
% \end{macrocode}
% The files \texttt{chicago.bst} and \texttt{named.bst} can add the
% commands |\citeN| and |\shortcite| respectively to the \texttt{.bbl}
@@ -4127,12 +5037,19 @@ is read in after the main package file.
% \begin{macrocode}
%<newapa|chicago|all> \let\citeN\cite \let\shortcite\cite
%<harvard|all> \let\citeasnoun\cite
- }{\def\@noitemerr{%
- \PackageWarning{natbib}
- {Empty `thebibliography' environment}}%
- \endlist\vskip-\lastskip}
- \let\bibfont\relax
-\let\bibpreamble\relax
+}{%
+ \bibitem@fin
+ \bibpostamble
+ \def\@noitemerr{%
+ \PackageWarning{natbib}{Empty `thebibliography' environment}%
+ }%
+ \endlist
+ \bibcleanup
+}%
+\let\bibfont\@empty
+\let\bibpreamble\@empty
+\let\bibpostamble\@empty
+\def\bibcleanup{\vskip-\lastskip}%
% \end{macrocode}
% \end{environment}
%
@@ -4221,6 +5138,8 @@ is read in after the main package file.
% \end{macrocode}
% \end{macro}\end{macro}
%
+% \begin{macro}{\NAT@anchor}
+% A general hypertext tool, \cs{NAT@anchor}, is defined right here.
% \begin{macro}{\hyper@natanchorstart}
% \changes{6.4}{1996 Oct 2}{Provide macro for \texttt{hyperref} package}
% \begin{macro}{\hyper@natanchorend}
@@ -4246,84 +5165,72 @@ is read in after the main package file.
%
% The |\hyper@natlinkbreak| to designed to break links between the names and
% date, avoiding some possible problems when links go over a page.
+%
% \begin{macrocode}
-\providecommand\hyper@natanchorstart[1]{}
-\providecommand\hyper@natanchorend{}
-\providecommand\hyper@natlinkstart[1]{}
-\providecommand\hyper@natlinkend{}
-\providecommand\hyper@natlinkbreak[2]{#1}
+\def\NAT@anchor#1#2{%
+ \hyper@natanchorstart{#1\@extra@b@citeb}%
+ \def\@tempa{#2}\@ifx{\@tempa\@empty}{}{\@biblabel{#2}}%
+ \hyper@natanchorend
+}%
+\providecommand\hyper@natanchorstart[1]{}%
+\providecommand\hyper@natanchorend{}%
+\providecommand\hyper@natlinkstart[1]{}%
+\providecommand\hyper@natlinkend{}%
+\providecommand\hyper@natlinkbreak[2]{#1}%
% \end{macrocode}
-% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \changes{6.7}{1997 Nov 10}{Accommodate \texttt{babel}'s redefinitions}
% \changes{6.9}{1999 Feb 26}{Include \texttt{babel} accommodation with
% \texttt{subpack}}
% \changes{6.9a}{1999 Apr 20}{Fixes for \texttt{babel} 3.6t}
+% \changes{8.3}{2008 Aug 28}{Redo the \texttt{babel} accommodations}
% The \texttt{babel} bundle redefines several internal commands in order to
-% handle special active characters required by some languages. One of these
-% redefined commands is |\@citex|. This fails for \thestyle\ for two
-% reasons: the syntax is different and the \thestyle\ definition of |\@citex|
-% has not yet been finalized. I correct this doing \texttt{babel}'s
-% redefinition at the |\begin{document}| with the right syntax.
-%
-% The main purpose of these redefinitions is to allow special active characters
-% to appear in the citation keys. To this end, |\@citex|, |\bibcite|,
-% |\nocite|, |\@bibitem|, and |\@lbibitem| need changing such that the active
-% characters are turned off when the keys are processed. In the case of
-% |\bibcite|, which is only ever called in a context where the active
-% characters are turned off, the second argument, the actual label, has the
-% active characters temporarily turned on. This causes \thestyle\ to crash;
-% hence \texttt{babel} now checks (v3.6t) for \thestyle\ and keeps the original
-% definition. This means any active characters in the \thestyle\ labels will
-% not be processed correctly, but these special characters should never be here
-% anyway, since they violate portability.
-%
-% It is also necessary to redefine |\NAT@testdef| which also uses the keys as
-% arguments. (It is a replacement for |\bibcite| for when the \texttt{.aux}
-% file is read in at the end.) Furthermore, |\@lbibitem| needs redefining, but
-% \texttt{babel} does not (yet) do this, only |\@bibitem|.
-%
-% Strictly speaking, \thestyle\ should be loaded before \texttt{babel} so that
-% the latter saves and modifies the \thestyle\ definitions, and not the
-% standard \LaTeX\ ones. However, in reality this is not necessary since
-% |\bibcite| is not redefined with \thestyle\ and |\@citex| is redefined by
-% \thestyle\ itself after the preamble. However, |\nocite| and |\@lbibitem| can
-% cause problems with the ordering. Solve this by redefining them immediately
-% if \texttt{babel} is present (i.e., \texttt{babel} before \thestyle); in this
-% case, \texttt{babel} has previously redefined them wrongly, \thestyle\ then
-% creates its own base definitions, and the \texttt{babel} redefinition is now
-% carried out again, with the proper ``originals''. A complication comes with
-% |\@lbibitem| in that at present \texttt{babel} does not redefine it, so it
-% must be (conditionally) added to the |\AtBeginDocument| hook in case
-% \thestyle\ is loaded first. If \texttt{babel} is changed in future, this
-% addition will not be needed and will not be executed. Thus the order of the
-% two packages is unimportant.
-%
-% Note: all this redefining is only important if there are keys containing
-% active characters. One point to note is that optional notes containing active
-% characters will not work right for \texttt{babel}, neither with or
-% without \thestyle. They will work with the \texttt{german} package, but then
-% the keys with active characters will not. Oh boy!
+% handle special active characters required by some languages.
+% The purpose of these redefinitions is to allow special active characters
+% to appear in the citation keys; one good example is the colon which
+% becomes active with the \texttt{french} option.
+% The redefined commands are: |\@bibitem|, |\nocite|, |\bibcite|, and |\@citex|.
+% The first is not used at all by \thestyle, which uses only |\@lbibitem| instead.
+%
+% But \texttt{babel} does special things for \thestyle: the |\bibcite| definition is left
+% unchanged, and |\@citex| is changed to account for the different syntax under
+% \thestyle. However, the way \texttt{babel} alters the \thestyle\ |\@citex|
+% relies on \thestyle\ doing the same thing; this is to make the order of loading the
+% packages unimportant. It is rather confusing situation.
+%
+% As of version~8.3 of \thestyle, we do things better. The necessary switches
+% |\@safe@activestrue| and |\@safe@activesfalse| are put around all expansions
+% of the citation keys, making the \thestyle\ commands immediately compatible
+% with \texttt{babel}; no redefinitions are necessary. However, since \texttt{babel}
+% (at least up to version 3.8l of 2008/03/16) redefines |\@citex| in a way that
+% relies on \thestyle\ having already done it too (more precisely, it relies
+% on \thestyle\ having already defined |\org@@citex| as the original
+% definition) this step must be preserved in \thestyle. It does no harm.
+%
+% It is also necessary to define dummy |\@safe@actives...| in case \texttt{babel}
+% is not included. Do this when \thestyle\ is loaded, not at |\begin{doc}|;
+% \texttt{babel} overwrites with |\def| so order with \thestyle\ is not important;
+% however, \texttt{chapterbib} issues |\nocite{*}| when loaded, and this causes
+% problems if these are not already defined.
+%
+% \changes{8.2}{2008 Jul 02}{(AO) Employ \cs{@ifxundefined} for use on \cs{bbl@redefine}.}
%
% \begin{macrocode}
-\@ifundefined{bbl@redefine}{}{%
- \bbl@redefine\nocite#1{%
- \@safe@activestrue\org@nocite{#1}\@safe@activesfalse}%
-\bbl@redefine\@lbibitem[#1]#2{%
- \@safe@activestrue\org@@lbibitem[#1]{#2}\@safe@activesfalse}%
-}
-\AtBeginDocument{\@ifundefined{bbl@redefine}{}{%
-\bbl@redefine\@citex[#1][#2]#3{%
- \@safe@activestrue\org@@citex[#1][#2]{#3}\@safe@activesfalse}%
-\bbl@redefine\NAT@testdef#1#2{%
- \@safe@activestrue\org@NAT@testdef{#1}{#2}\@safe@activesfalse}%
-\@ifundefined{org@@lbibitem}{%
-\bbl@redefine\@lbibitem[#1]#2{%
- \@safe@activestrue\org@@lbibitem[#1]{#2}\@safe@activesfalse}}{}%
-}}
+\AtBeginDocument{%
+ \@ifpackageloaded{babel}{%
+ \let\org@@citex\@citex}{}}
+\providecommand\@safe@activestrue{}%
+\providecommand\@safe@activesfalse{}%
+
% \end{macrocode}
%
-% \subsection{Sorting and Compression of Numbers}
+% \subsection{Sorting, Compressing, and Merging of Numbers}
% The \texttt{cite} and (obsolete) \texttt{citesort} packages by Donald
% Arseneau provide the coding for printing multiple citation numbers in
% ascending order, and with a range where applicable. That is, if the
@@ -4342,6 +5249,149 @@ is read in after the main package file.
% \texttt{sort} and \texttt{sort\&compress}.
%
% \begin{macro}{\NAT@sort@cites}
+% \changes{8.2}{2008 Jan 10}{(AO)Various changes to \texttt{NAT@sort@cites} and friends}
+% \changes{8.2}{2008 Jul 12}{(AO) Do not write .aux file entries in \cs{NAT@citexnum} or \cs{NAT@citex};
+% do this in \cs{NAT@sort@cites} where the keys will be in the user's order.}
+%
+% |\NAT@sort@cites| has been taken over so that we can preprocess the
+% citation keys with |\NAT@star@cite|,
+% where |\NAT@cite@list| is created as a side effect.
+% Afterwards, if |\NAT@sort| is greater than zero, the list is sorted with |\NAT@sort@cites@|.
+%
+% \begin{macrocode}
+\newcommand\NAT@sort@cites[1]{%
+ \let\NAT@cite@list\@empty
+ \@for\@citeb:=#1\do{\expandafter\NAT@star@cite\@citeb\@@}%
+ \if@filesw
+ \expandafter\immediate\expandafter\write\expandafter\@auxout
+ \expandafter{\expandafter\string\expandafter\citation\expandafter{\NAT@cite@list}}%
+ \fi
+ \@ifnum{\NAT@sort>\z@}{%
+ \expandafter\NAT@sort@cites@\expandafter{\NAT@cite@list}%
+ }{}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NAT@star@cite}
+% \begin{macro}{\NAT@star@cite@star}
+% \begin{macro}{\NAT@star@cite@nostar}
+% \begin{macro}{\NAT@star@cite@pre}
+% \begin{macro}{\NAT@star@cite@post}
+% \changes{8.2}{2008 Jan 10}{(AO)Various changes to \texttt{NAT@sort@cites} and friends}
+%
+% With package option |merge| in effect,
+% the |\NAT@star@cite| procedure determines if the optional * character
+% has been prepended to the citation key, and strips it.
+% (If so, we define a macro that later (in |thebibliography|) flags this fact,
+% allowing us to merge that reference back with the previous reference, under
+% a single number.)
+% The citation key is then appended to |\NAT@cite@list|.
+%
+% If |\NAT@merge|\({}=1\), the only processing done:
+% the * is recognized as part of the |merge| syntax.
+%
+% \textbf{Caveat:} the citation key is chosen by the user, and there is no rule saying
+% that the * character must not appear in the key. So, if the user has chosen a key
+% that begins with the * character, she will get unexpected results
+% (undefined citation, for one).
+% The best we can do for her is allow the user to turn off this processing step,
+% which they will want to do if they are being confounded: remove the |merge| package option.
+%
+% A problem arises when keys are being sorted, because a key marked with a * could conceivably
+% move away from the key it was intended to be merged with.
+% The solution is for the user to proceed by deliberate steps:
+% first, select all the references and citations with sorting turned off |\NAT@sort|${}=0$,
+% then, second, turn on sorting and merge together.
+%
+% \changes{8.2}{2008 Jul 13}{(AO) Allow optional arguments preceding cite key.}
+% A second syntactical extension provided by \thestyle\ pertains to the key itself:
+% within the argument of \verb+\cite+, a cite key may be preceded by two optional arguements, e.g.,
+% \verb+\cite[+\emph{pre}\verb+]+\verb+[+\emph{post}\verb+]{+\emph{key}\verb+}+,
+% where \emph{pre} represents text to be prepended to the reference (\verb+\bibitem+ content),
+% with \emph{post} appended thereto.
+%
+% Thus it is possible for the user to mark up the document:
+% \begin{verbatim}
+% text \cite{*[{See, e.g., }][ for a facile explanation]ablebaker}
+% \end{verbatim}
+% The above example illustrates the use of the star-form and both optional arguments.
+%
+% \textbf{Caveat:} Because the comma (,) character is part of the syntax of \verb+\cite+,
+% and because the bracket delimiters ([]) are not first-class delimiters in the eyes of \TeX,
+% you must enclose the optional argument in braces (\verb+{}+) if a comma is present in the
+% argument (that goes for brackets, too, of course).
+%
+% The five procedures defined here are solely for the purpose of parsing the star (*) and
+% the two optional arguments, followed by the usual cite key.
+% \begin{macrocode}
+\def\NAT@star@cite{%
+ \let\NAT@star@sw\@secondoftwo
+ \@ifnum{\NAT@merge>\z@}{%
+ \@ifnextchar*{%
+ \let\NAT@star@sw\@firstoftwo
+ \NAT@star@cite@star
+ }{%
+ \NAT@star@cite@nostar
+ }%
+ }{%
+ \NAT@star@cite@nostar
+ }%
+}%
+\def\NAT@star@cite@star*{%
+ \NAT@star@cite@nostar
+}%
+\def\NAT@star@cite@nostar{%
+ \let\nat@keyopt@open\@empty
+ \let\nat@keyopt@shut\@empty
+ \@ifnextchar[{\NAT@star@cite@pre}{\NAT@star@cite@pre[]}%
+}%
+\def\NAT@star@cite@pre[#1]{%
+ \def\nat@keyopt@open{#1}%
+ \@ifnextchar[{\NAT@star@cite@post}{\NAT@star@cite@post[]}%
+}%
+\def\NAT@star@cite@post[#1]#2\@@{%
+ \def\nat@keyopt@shut{#1}%
+ \NAT@star@sw{\expandafter\global\expandafter\let\csname NAT@b*@#2\endcsname\@empty}{}%
+ \NAT@cite@list@append{#2}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\NAT@cite@list@append}
+% |\NAT@cite@list@append{bar}|
+% appends |bar| to the replacement part of |\NAT@cite@list| (without any expansion of |bar|).
+% We separate the entries with a comma (,).
+%
+% \begin{macrocode}
+\def\NAT@cite@list@append#1{%
+ \edef\@citeb{\@firstofone#1\@empty}%
+ \if@filesw\@ifxundefined\@cprwrite{}{\expandafter\@cprwrite\@citeb=}\fi
+ \if\relax\nat@keyopt@open\relax\else
+ \global\expandafter\let\csname NAT@b@open@\@citeb\endcsname\nat@keyopt@open
+ \fi
+ \if\relax\nat@keyopt@shut\relax\else
+ \global\expandafter\let\csname NAT@b@shut@\@citeb\endcsname\nat@keyopt@shut
+ \fi
+ \toks@\expandafter{\NAT@cite@list}%
+ \ifx\NAT@cite@list\@empty
+ \@temptokena\expandafter{\@citeb}%
+ \else
+ \@temptokena\expandafter{\expandafter,\@citeb}%
+ \fi
+ \edef\NAT@cite@list{\the\toks@\the\@temptokena}%
+}%
+% \end{macrocode}
+% Now that we have |\NAT@appdef|, it would be beneficial to apply it to
+% the workings of |\NAT@sort@cites@| and |\NAT@make@cite@list|:
+% a whole lot of those nasty |\protected@edef|s would evaporate!
+% \end{macro}
+%
+% \begin{macro}{\NAT@sort@cites@}
% \changes{6.4}{1996 Oct 11}{Add coding from \texttt{cite.sty}}
% \changes{6.6}{1997 Jun 3}{Redo to sort cite keys; works with author--year
% mode}
@@ -4350,7 +5400,7 @@ is read in after the main package file.
% for no sorting; 1 for sorting; compression (numerical mode only) is
% controlled with |\NAT@cmprs| being 0 (off) and 1 (on).
%
-% The macro |\NAT@sort@cites| places the reordered list of citation keys (the
+% The macro |\NAT@sort@cites@| places the reordered list of citation keys (the
% argument to |\cite|\textit{xxx}) in |\NAT@cite@list|. If sorting is turned
% off, this list is the same as the input.
%
@@ -4360,82 +5410,161 @@ is read in after the main package file.
% |\NAT@num|, these are added to |\NAT@nonsort@list|, which is appended at the
% end to the main list. Finally, the trailing comma is removed with
% |\NAT@xcom|.
+%
+% Algorithm note (AO): aside from an optimization for inserting a trailing key,
+% the sort algorithm performs a linear search through the
+% partial list of sorted keys each time a new key is inserted, thereby
+% executing $O(n^2)$ key comparisons for an $n$-key list.
+%
+% \changes{8.2}{2008 Jan 10}{(AO)Various changes to \texttt{NAT@sort@cites} and friends}
+% \changes{8.2}{2008 Jan 10}{(AO) The sort algorithm had not been stable; fixed.}
+% \changes{8.2}{2008 Jul 16}{(AO) Protect against empty argument.}
+% This procedure used to be known as |\NAT@sort@cites|.
+% It is now called by |\NAT@sort@cites| if |\NAT@sort| is positive.
+% Note that compiling |\NAT@cite@list| has already been taken care of by |\NAT@star@cite|.
+% We are using the Plain \TeX\ count register |\count@| to calculate how many citations
+% there will be (but we do not get the right answer if \texttt{compress} is in effect).
+%
% \begin{macrocode}
-\ifnum\NAT@sort>0
-\newcommand\NAT@sort@cites[1]{%
-\@tempcntb\m@ne
-\let\@celt\delimiter
-\def\NAT@num@list{}%
-\def\NAT@cite@list{}%
-\def\NAT@nonsort@list{}%
-\@for \@citeb:=#1\do{\NAT@make@cite@list}%
-\protected@edef\NAT@cite@list{\NAT@cite@list\NAT@nonsort@list}%
-\protected@edef\NAT@cite@list{\expandafter\NAT@xcom\NAT@cite@list @@}}
+\newcommand\NAT@sort@cites@[1]{%
+ \count@\z@
+ \@tempcntb\m@ne
+ \let\@celt\delimiter
+ \def\NAT@num@list{}%
+ \let\NAT@cite@list\@empty
+ \let\NAT@nonsort@list\@empty
+ \@for \@citeb:=#1\do{\NAT@make@cite@list}%
+ \ifx\NAT@nonsort@list\@empty\else
+ \protected@edef\NAT@cite@list{\NAT@cite@list\NAT@nonsort@list}%
+ \fi
+ \ifx\NAT@cite@list\@empty\else
+ \protected@edef\NAT@cite@list{\expandafter\NAT@xcom\NAT@cite@list @@}%
+ \fi
+}%
% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\NAT@make@cite@list}
+% Work by side effect: add to \cmd\NAT@cite@list\ or \cmd\NAT@nonsort@list.
% This is essentially Arseneau's coding, with some renaming and the addition
-% of |\NAT@cite@list| for the citation keys. The trick with the catcode is
-% his, and it determines if |\NAT@num| is really a number. This is a
+% of |\NAT@cite@list| for the citation keys. The trick |\NAT@ifcat@num| does is his:
+% it determines if |\NAT@num| is really a number. This is a
% non-number if the optional argument to |\bibitem| does not conform to any
% of the allowed \thestyle\ syntaxes, such as if \texttt{alph.bst} is used.
+%
+% Note that in the expanded definitions of |\NAT@num@list|, the token |\celt| remains unexpanded.
+%
+% \changes{8.2}{2008 Jan 10}{(AO)Various changes to \texttt{NAT@sort@cites} and friends}
+% \changes{8.2}{2008 Jun 26}{(AO)Employ \cs{NAT@ifcat@num} to make the test on \cs{NAT@num}}
+% Made the sort a stable sort.
% \begin{macrocode}
-\begingroup \catcode`\_=8
-\gdef\NAT@make@cite@list{%
- \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
- \@ifundefined{b@\@citeb\@extra@b@citeb}{\def\NAT@num{A}}%
- {\NAT@parse{\@citeb}}%
- \ifcat _\ifnum\z@<0\NAT@num _\else A\fi
- \@tempcnta\NAT@num \relax
+\def\NAT@make@cite@list{%
+ \advance\count@\@ne
+ \@safe@activestrue
+ \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \@safe@activesfalse
+ \@ifundefined{b@\@citeb\@extra@b@citeb}%
+ {\def\NAT@num{A}}%
+ {\NAT@parse{\@citeb}}%
+ \NAT@ifcat@num\NAT@num
+ {\@tempcnta\NAT@num \relax
% \end{macrocode}
-% If highest number so far, add at the end.
+% If less than the highest number so far,
+% process the numerical list to insert number and citation key.
% \begin{macrocode}
- \ifnum \@tempcnta>\@tempcntb
- \protected@edef\NAT@num@list{\NAT@num@list \@celt{\NAT@num}}%
- \protected@edef\NAT@cite@list{\NAT@cite@list\@citeb,}%
- \@tempcntb\@tempcnta
- \else
+ \@ifnum{\@tempcnta<\@tempcntb}{%
+ \let\NAT@@cite@list=\NAT@cite@list
+ \let\NAT@cite@list\@empty
+ \begingroup\let\@celt=\NAT@celt\NAT@num@list\endgroup
+ \protected@edef\NAT@num@list{%
+ \expandafter\NAT@num@celt \NAT@num@list \@gobble @%
+ }%
% \end{macrocode}
-% Else, process the numerical list to insert number and citation key.
+% Else append. Stable sort is achieved when a duplicate high value appears.
% \begin{macrocode}
- \let\NAT@@cite@list=\NAT@cite@list \def\NAT@cite@list{}%
- \protected@edef\NAT@num@list{\expandafter\NAT@num@celt \NAT@num@list \@gobble @}%
- {\let\@celt=\NAT@celt\NAT@num@list}%
- \fi
- \else
+ }{%
+ \protected@edef\NAT@num@list{\NAT@num@list \@celt{\NAT@num}}%
+ \protected@edef\NAT@cite@list{\NAT@cite@list\@citeb,}%
+ \@tempcntb\@tempcnta
+ }%
% \end{macrocode}
% If not a number, add it to |\NAT@nonsort@list|.
% \begin{macrocode}
- \protected@edef\NAT@nonsort@list{\NAT@nonsort@list\@citeb,}%
- \fi}
-\endgroup
+ }%
+ {\protected@edef\NAT@nonsort@list{\NAT@nonsort@list\@citeb,}}%
+}%
% \end{macrocode}
% \end{macro}
-% This is the macro to insert a new key into the key list. All the keys so
-% far are first stored in |\NAT@@cite@list| and transferred over to
-% |\NAT@cite@list|, with the new key inserted where appropriate. The macros
-% |\NAT@nextc| and |\NAT@restc| return the next entry in the list, or the
+%
+% \begin{macro}{\NAT@celt}
+% Possibly insert a new key into the current position in the key list |\NAT@cite@list|.
+% \changes{8.2}{2008 Jan 10}{(AO)Various changes to \texttt{NAT@sort@cites} and friends}
+% Made the sort a stable sort.
+%
+% This procedure is run against each successive position in the key list |\NAT@num@list|,
+% initially with |\NAT@cite@list| empty and |\NAT@@cite@list| holding the original key list.
+%
+% \begin{macrocode}
+\def\NAT@celt#1{%
+% \end{macrocode}
+% If the new key is lower than the current key, then insert the key.
+% The assignment |\let\@celt| has the effect of traversing the remained of the list with a no-op.
+% \begin{macrocode}
+ \@ifnum{#1>\@tempcnta}{%
+ \xdef\NAT@cite@list{\NAT@cite@list\@citeb,\NAT@@cite@list}%
+ \let\@celt\@gobble
+% \end{macrocode}
+% Pop |\NAT@@cite@list|, appending to |\NAT@cite@list|, and continue the traversal of the list.
+% \begin{macrocode}
+ }{%
+ \expandafter\def@NAT@cite@lists\NAT@@cite@list\@@
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NAT@num@celt}
+% Insert a new number into the number list.
+% The trio of |\expandafter|s result in |\NAT@num@celt| tailing on, thus forming a loop.
+% \changes{8.2}{2008 Jan 10}{(AO)Various changes to \texttt{NAT@sort@cites} and friends}
+% Made the sort a stable sort.
+% \begin{macrocode}
+\def\NAT@num@celt#1#2{%
+ \ifx#1\@celt
+ \@ifnum{#2>\@tempcnta}{%
+ \@celt{\number\@tempcnta}%
+ \@celt{#2}%
+ }{%
+ \@celt{#2}%
+ \expandafter\NAT@num@celt
+ }%
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\def@NAT@cite@lists}
+% \begin{macro}{\NAT@nextc}
+% \begin{macro}{\NAT@restc}
+% \begin{macro}{\NAT@xcom}
+% The procedure |\def@NAT@cite@lists| effectively
+% removes the first element of |\NAT@@cite@list| and appends it to |\NAT@cite@list|.
+% The macros |\NAT@nextc| and |\NAT@restc| return the next entry in the list, and the
% rest of the list without the first entry, respectively.
+% (AO: in lisp terminology, |\NAT@nextc| is car, |\NAT@restc| is cdr.)
% \begin{macrocode}
-\def\NAT@celt#1{\ifnum #1<\@tempcnta
- \xdef\NAT@cite@list{\NAT@cite@list\expandafter\NAT@nextc\NAT@@cite@list @@}%
- \xdef\NAT@@cite@list{\expandafter\NAT@restc\NAT@@cite@list}%
- \else
- \xdef\NAT@cite@list{\NAT@cite@list\@citeb,\NAT@@cite@list}\let\@celt\@gobble%
- \fi}
-\def\NAT@num@celt#1#2{\ifx \@celt #1%
- \ifnum #2<\@tempcnta
- \@celt{#2}%
- \expandafter\expandafter\expandafter\NAT@num@celt
- \else
- \@celt{\number\@tempcnta}\@celt{#2}%
- \fi\fi}
+\def\def@NAT@cite@lists#1,#2\@@{%
+ \xdef\NAT@cite@list{\NAT@cite@list#1,}%
+ \xdef\NAT@@cite@list{#2}%
+}%
\def\NAT@nextc#1,#2@@{#1,}
\def\NAT@restc#1,#2{#2}
\def\NAT@xcom#1,@@{#1}
-\else
- \newcommand\NAT@sort@cites[1]{\protected@edef\NAT@cite@list{#1}}\fi
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \subsection{Local Configuration}
% \changes{5.2}{1994 Aug 25}{Add reading in of \texttt{natbib.cfg}}
diff --git a/Master/texmf-dist/source/latex/natbib/natbib.ins b/Master/texmf-dist/source/latex/natbib/natbib.ins
index 14f4c8380ae..bba3026fc85 100644
--- a/Master/texmf-dist/source/latex/natbib/natbib.ins
+++ b/Master/texmf-dist/source/latex/natbib/natbib.ins
@@ -1,5 +1,5 @@
% File: natbib.ins
-% Copyright 2006 Patrick W. Daly
+% Copyright 2009 Patrick W. Daly
%
% This is the natbib installation file for extracting package and driver
% files from the original source file. Simply process it under
@@ -73,15 +73,15 @@ End of documentation driver file.
\askforoverwritefalse
\generate{\file{natbib.sty}{\from{natbib.dtx}{package,all}}
- \file{natnotes}{\usepreamble\refsheet\usepostamble\refsheetq
+ \file{natnotes.tex}{\usepreamble\refsheet\usepostamble\refsheetq
\from{natbib.dtx}{notes}}
- \file{natbib.drv}{\usepreamble\driver\usepostamble\driverq
+ \file{natbib.ltx}{\usepreamble\driver\usepostamble\driverq
\from{natbib.dtx}{driver}}
}
\obeyspaces
\Msg{*********************************************}%
\Msg{* For documentation, process natbib.dtx *}%
-\Msg{* or the driver file natbib.drv *}%
+\Msg{* or the driver file natbib.ltx *}%
\Msg{* For reference sheet, process natnotes.tex *}
\Msg{*********************************************}