summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/splitbib
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:57:55 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:57:55 +0000
commit7ae0f3e92fd45d0f42c38ac06ca545161be45581 (patch)
treee584ffcfca68a6e8bf46efe1f41e69390759efdf /Master/texmf-dist/source/latex/splitbib
parent8b54a05165b12334943b0e0503d0f498c699b2c4 (diff)
trunk/Master/texmf-dist/source/latex/splitbib
git-svn-id: svn://tug.org/texlive/trunk@522 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/splitbib')
-rw-r--r--Master/texmf-dist/source/latex/splitbib/splitbib.dtx1414
-rw-r--r--Master/texmf-dist/source/latex/splitbib/splitbib.ins45
2 files changed, 1459 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/splitbib/splitbib.dtx b/Master/texmf-dist/source/latex/splitbib/splitbib.dtx
new file mode 100644
index 00000000000..b154dd08f9a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitbib/splitbib.dtx
@@ -0,0 +1,1414 @@
+% \iffalse meta-comment
+%
+% ===================================================================
+% splitbib.dtx
+%
+% Nicolas MARKEY <markey@lsv.ens-cachan.fr>
+% 2005/02/25
+%
+% ===================================================================
+%
+% \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
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% This file is built for \LaTeXe, so we make sure an error is
+% generated when it is used with another format
+% \begin{macrocode}
+%<+package>\NeedsTeXFormat{LaTeX2e}
+% \end{macrocode}
+%
+% Now announce the package name and version:
+% \begin{macrocode}
+%<*dtx>
+\ProvidesFile{splitbib.dtx}
+%</dtx>
+%<+package>\ProvidesPackage{splitbib}
+ [2005/02/25 v1.12 Splits bibliography into categories]
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{boxedminipage}
+\usepackage{splitbib}
+\usepackage[dvips]{graphicx}
+% \end{macrocode}
+% We do want an index, using linenumbers
+% \begin{macrocode}
+\CheckSum{1872}
+\StopEventually{}
+\EnableCrossrefs
+\CodelineIndex
+\DoNotIndex{\begin,\begingroup,\endgroup,\framebox,\fboxsep,\hbox,\long}
+\DoNotIndex{\newif}
+\DoNotIndex{\gdef,\@arabic,\@empty,\@firstofone,\@for,\@ifundefined,\@tempa,\@tempb}
+\DoNotIndex{\@tempboxa,\addtocounter,\advance,\baselineskip,\bfseries,\bigskip}
+\DoNotIndex{\chapter,\csname,\def,\do,\edef,\end,\endcsname,\endlist,\expandafter}
+\DoNotIndex{\ifx,\else,\fi,\ifdim,\ifnum,\ifx,\fi,\fi,\fi}
+\DoNotIndex{\gdef,\hfill,\hskip,\ignorespaces,\immediate,\Large,\let,\list,%
+ \medskip,\message,\newcounter,\newdimen,\noindent,\null,\par,\relax,%
+ \renewcommand,\setbox,\setcounter,\setlength,\settowidth,\smallskip,\stepcounter,%
+ \string,\textwidth,\the,\unskip,\value,\vspace,\vskip,\vrule,\vbox,\wd,\xdef}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\package#1{\texttt{#1.sty}}
+\def\cmpt#1{\texttt{#1}}
+\def\ext#1{\texttt{.#1}}
+\def\env#1{\texttt{#1}}
+\def\news#1{\textsf{#1}}
+\def\btcmd#1{\texttt{#1\$}}
+\begin{document}
+\DocInput{splitbib.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+% \fi
+% \GetFileInfo{splitbib.dtx}
+%
+% \changes{0.99}{2004/06/18}{First release candidate}
+% \changes{0.99b}{2004/06/29}{Added \cmd\SBalias}
+% \changes{0.99c}{2004/06/30}{Added strict option +
+% multiple category management}
+% \changes{0.99d}{2004/07/04}{Added reorder option}
+% \changes{1.00}{2004/07/21}{Added the "export" option +
+% comment management +
+% published on CTAN}
+% \changes{1.10}{2004/08/14}{Protect arguments against
+% expansion when exporting}
+% \changes{1.11}{2005/02/22}{\string\NMSB@currprefix was also
+% not expanded in v1.10. This led to
+% wrong references when extra prefixes
+% were used.}
+%
+% \title{Split your bibliography into categories
+% \thanks{This file has version number \fileversion,
+% last revised \filedate.}}
+%
+% \author{ Nicolas Markey \\
+% \texttt{markey@lsv.ens-cachan.fr}}
+%
+% \date{\today}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package allows for sorting a bibliography into categories and
+% subcategories. This is interesting for lists of publications, for
+% grouping references by subject, by year,~... An option allows to export
+% the resulting bibliography as a \ext{bbl}~like file.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% Up to now, there exists several ways for sorting bibliographic references
+% into categories:
+% \begin{itemize}
+% \item Using a bibliographic style allowing it.
+% There exists a few such styles, but then you'll need to add a
+% "category" field in each entry of your \ext{bib}~file.
+% Moreover, grouping criteria might change from one document to the
+% other, and modifying categories requires that you modify your
+% \ext{bib}~file, which is a long and tedious task;
+% \item \package{multibib}, by Thorsten Hansen, allows to create several
+% bibliographies, by defining several \cmd\cite{} commands. This however
+% has several limitations: Duplicate labels, risk of citing one reference
+% in two different categories,~...
+% \item Typesetting the bibliography by hand, which should eventually give
+% you exactly what you want, if you're patient enough...
+% \end{itemize}
+%
+% \package{splitbib} offers a new, original way of doing this with \LaTeX.
+% It uses a \env{category} environment for defining categories. Up to two
+% such environments can be nested. Those environments take one mandatory
+% argument defining the "title" of the category. Within a category, command
+% \cmd\SBentries{} defines the entries that should appear in that category.
+% With the \texttt{reorder} option, this will also define the order in
+% which references should appear (the default is to keep the order of the
+% original \ext{bbl}~file within each (sub)category).
+%
+% Then, when a reference appears in a \env{thebibliography} environment,
+% it is moved in its category. A warning may be echoed in case a reference
+% appears in two categories. On the contrary, if a reference has not been
+% assigned a category, it is put in a ``miscellaneous'' category.
+%
+% \section{How does it work?}
+%
+% \subsection{Once upon a time...}
+%
+% The starting point of this package is a selection sorting algorithm
+% initially proposed
+% by Josselin Noirel on \news{fr.comp.text.tex}, and that I made more
+% performant
+% by using a quicksort algorithm. A discussion followed about the
+% usefulness of such a command...
+%
+% \subsection{The link between sorting and categories}
+%
+% As mentionned previously, some bibliographic styles handle categories. This
+% is achieved by adding a prefix to the \btcmd{sort.key} string used by
+% Bib\TeX{} for sorting bibliographic items. We use the same idea here, using
+% a numeric value for each category. Another numeric value is appended to the
+% category entry, in order to keep the initial order within each category.
+%
+% \subsection{In practice}
+%
+% Defining categories is achieved with a \env{category} environment.
+% The argument of this environment defines the title of that new category.
+% An optional argument allows to define a prefix for the labels of each entry
+% in that category.
+%
+% Within a category, the \cmd\SBentries~command defines which entries should
+% appear in that category. It is a comma-separated list of internal keys.
+%
+% Everything else should be transparent for the user. Several important
+% remarks though:
+% \begin{itemize}
+% \item \package{splitbib} redefines \cmd\bibitem{} and the
+% \env{thebibliography} environment. More precisely,
+% \cmd\begin\marg{thebibliography} does almost nothing, \cmd\bibitem~just
+% stores the references (but echoes nothing), and
+% \cmd\end\marg{thebibliography} sorts and outputs the bibliography.
+% \item Since this package deeply redefines \cmd\bibitem{} and the
+% \env{thebibliography} environment, it must be loaded \emph{after}
+% packages that redefine those commands. In particular \package{apalike},
+% \package{natbib} or \package{jurabib};
+% \item \package{natbib} and \package{jurabib} use very special formats
+% for the optional argument
+% of \cmd\bibitem. In order to fully use their features, you should load
+% \package{splitbib} with the \texttt{export} argument, so that their original
+% definitions of \cmd\bibitem will be used when processing the bibliography.
+% Globally speaking, the \texttt{export} option should make \package{splitbib}
+% compatible with many type of bibliography;
+% \item Since
+% it is possible to add a prefix to reference labels, the argument of the
+% \env{thebibliography} environment is irrelevant. Therefore, the longest
+% label will be re-computed, or can be forced;
+% \item Last, several styles for
+% category titles are predefined, but you can define your own style
+% by redefining \cmd\SBtitle~and \cmd\SBsubtitle.
+% \end{itemize}
+%
+% \subsection{An example}
+%
+% An example is shown on figure~\ref{example}. It contains the basic commands
+% for a simple use of \package{splitbib}.
+%
+% \begin{figure}[!htp]
+% \noindent\begin{boxedminipage}{\textwidth}
+% \def\MacroFont{\fontsize{7pt}{8pt}\selectfont\ttfamily}
+% \begin{minipage}[t]{.45\linewidth}
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage{splitbib}
+%
+% \begin{category}[A]{First category}
+% \SBentries{entry1,entry4}
+% \end{category}
+% \begin{category}[B]{Second category}
+% \begin{category}{First sub-category}
+% \SBentries{entry2,entry6}
+% \end{category}
+% \begin{category}{Second sub-category}
+% \SBentries{entry5,entry3}
+% \end{category}
+% \end{category}
+%
+% \begin{document}
+% We cite~\cite{entry1,entry3,entry4,%
+% entry5}. Note that we cite neither
+% \verb+entry2+ nor \verb+entry6+,
+% even though they have been assigned
+% a category.
+% \end{verbatim}
+% \end{minipage}
+% \hfil\vrule\hfil
+% \begin{minipage}[t]{.45\linewidth}
+% \begin{verbatim}
+% defined in the last category. The first
+% sub-category will then not appear in the
+% bibliography.
+%
+% % \def\SBlongestlabel{A1}
+% \SBtitlestyle{bar}
+% \SBsubtitlestyle{none}
+% \begin{thebibliography}{1}
+% \bibitem{entry1} This is the first entry.
+%
+% \bibitem{entry3} This is the third entry.
+%
+% \bibitem{entry4} This is the fourth one.
+%
+% \bibitem{entry5} This is the last one.
+%
+% \end{thebibliography}
+% \end{document}
+% \end{verbatim}
+% \end{minipage}
+% \end{boxedminipage}
+% \vskip5mm
+%
+% \noindent\begin{boxedminipage}{\linewidth}
+% \vskip5mm
+% \centering\begin{minipage}{.7\linewidth}
+% \begin{category}[A]{First category}
+% \SBentries{entry1,entry4}
+% \end{category}
+% \begin{category}[B]{Second category}
+% \begin{category}{First sub-category}
+% \SBentries{entry2,entry6}
+% \end{category}
+% \begin{category}{Second sub-category}
+% \SBentries{entry5,entry3}
+% \end{category}
+% \end{category}
+%
+% \fontsize{7pt}{8pt}\selectfont
+% We cite~\cite{entry1,entry3,entry4,entry5}.
+% Note that we cite neither \texttt{entry2} nor
+% \texttt{entry6}, even though they have been
+% defined in the last category. The first
+% sub-category will then not appear in the
+% bibliography.
+%
+% % \def\SBlongestlabel{A1}
+% \SBtitlestyle{bar}
+% \SBsubtitlestyle{none}
+% \begin{thebibliography}{1}
+% \bibitem{entry1} This is the first entry.
+%
+% \bibitem{entry3} This is the third entry.
+%
+% \bibitem{entry4} This is the fourth one.
+%
+% \bibitem{entry5} This is the last one.
+%
+% \end{thebibliography}
+% \end{minipage}
+% \vskip5mm\par\vbox{}
+% \end{boxedminipage}
+% \caption{An example using \package{splitbib}}\label{example}
+% \end{figure}
+%
+%
+%
+% \newpage
+% \section{The code}
+% \begin{macro}{\ifNMSB@strict}
+% \begin{macro}{strict}
+% \begin{macro}{nonstrict}
+% \begin{macro}{\ifNMSB@ownorder}
+% \begin{macro}{reorder}
+% \begin{macro}{keeporder}
+% \begin{macro}{\ifNMSB@export}
+% \begin{macro}{export}
+% \begin{macro}{noexport}
+% \begin{macro}{\ifNMSB@newchap}
+% \begin{macro}{newchap}
+% \begin{macro}{newsec}
+% \begin{macro}{nonewchap}
+% \begin{macro}{nonewsec}
+% \package{splitbib} understands four options: \begin{itemize}
+% \item \texttt{nonstrict} is to disallow multiple categories for one entry.
+% Default is to
+% allow it: In that case, \package{splitbib} won't complain, but \LaTeX{}
+% will find multiply defined labels. In the other case, if an entry is
+% declared in several categories, only the first one will be used, and
+% \package{splitbib} will warn you about the problem.
+% \item \texttt{reorder} tells \package{splitbib} to use the order the entries
+% appear in the \cmd\SBentries\ as the output order. The default is to
+% keep the order the references appear in the \ext{bib}~file within each
+% (sub)categories.
+% \item\texttt{export} will export the new \env{thebibliography} environment
+% into an \ext{sbb}~file, similar to the \ext{bbl}~file, but with
+% categories. The default is not to create that file.
+% \item\texttt{nonewchap} and \texttt{nonewsec} prevent \env{thebibliography}
+% to start a new chapter or section.
+% \end{itemize}
+% \begin{macrocode}
+\newif\ifNMSB@strict\NMSB@strictfalse
+\DeclareOption{strict}{\NMSB@stricttrue}
+\DeclareOption{nonstrict}{\NMSB@strictfalse}
+\newif\ifNMSB@ownorder\NMSB@ownorderfalse
+\DeclareOption{reorder}{\NMSB@ownordertrue}
+\DeclareOption{keeporder}{\NMSB@ownorderfalse}
+\newif\ifNMSB@export\NMSB@exportfalse
+\DeclareOption{export}{\NMSB@exporttrue}
+\DeclareOption{noexport}{\NMSB@exportfalse}
+\newif\ifNMSB@newchap\NMSB@newchaptrue
+\DeclareOption{newchap}{\NMSB@newchaptrue}
+\DeclareOption{newsec}{\NMSB@newchaptrue}
+\DeclareOption{nonewchap}{\NMSB@newchapfalse}
+\DeclareOption{nonewsec}{\NMSB@newchapfalse}
+\ProcessOptions*
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{NMSB@catlevelone}
+% \begin{macro}{NMSB@catleveltwo}
+% These two counters are used for numbering categories. Their initial value is
+% set to $10$ here. We require that the category number always has two digits,
+% because it is important to ensure that the sorting number we will generate
+% all have the same number of digits (because the 11th entry in the first
+% category should be numberred differently from the 1st entry in the 11th
+% category). The definition below allows up to 89 categories (in fact, 90, but
+% one is reserved as the "misc" category), and $89\times
+% 89$ subcategories, which should be
+% sufficient. It this is not, be aware that modifying the values below is not
+% sufficient, and that several other values has to be updated.
+% \begin{macrocode}
+\newcounter{NMSB@catlevelone}
+\newcounter{NMSB@catleveltwo}
+\setcounter{NMSB@catlevelone}{10}
+\setcounter{NMSB@catleveltwo}{10}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{NMSB@catlevel}
+% This counter counts the nesting depth of categories. This depth is
+% limited to~$2$, and nesting $3$~categories raises an error.
+% \begin{macrocode}
+\newcounter{NMSB@catlevel}
+\setcounter{NMSB@catlevel}{0}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{SBresetdepth}
+% When using numerical labels, this defines when the label counter
+% has to be reset. $0$ means "never", $1$ means "at each new level-$1$
+% category", and $2$ means "at each new category".
+% \begin{macrocode}
+\newcounter{SBresetdepth}
+\setcounter{SBresetdepth}{0}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{NMSB@ent}
+% \begin{macro}{NMSB@maxent}
+% \begin{macro}{\NMSB@initent}
+% \begin{macro}{NMSB@tok}
+% \cmpt{NMSB@ent} will be the number of the current entry. \cmpt{NMSB@maxent}
+% is the
+% max value, computed from the initial value {\makeatletter\cmd\NMSB@initent}
+% in order to
+% always have the same number of digits. Here, we allow up to 900 entries per
+% category or subcategory. If you \emph{really} need more, you'll probably
+% also have to modify the memory limits of \LaTeX{} anyway. However, as regards
+% \package{splitbib}, this can be achieved by simply replacing "100" below by,
+% say, "1000".
+% \cmd\NMSB@tok~is a token that will be used to protect commands against expansion.
+% \begin{macrocode}
+\newcounter{NMSB@ent}
+\newcounter{NMSB@maxent}
+\def\NMSB@initent{100}
+\newtoks\NMSB@tok
+\setcounter{NMSB@maxent}{\NMSB@initent0}
+\addtocounter{NMSB@maxent}{-1}
+\setcounter{NMSB@ent}{\NMSB@initent}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@longest}
+% \begin{macro}{\NMSB@reallylongest}
+% \begin{macro}{\NMSB@reallylongestlabel}
+% Those variables are used when computing the longest label. This is done in
+% two phases: first when reading \cmd\bibitem{}s. It is just an approximation,
+% since we can't know numeric labels at that time. Exact computation is done
+% at a second time,
+% when writing bibliographic references. This second computation uses
+% {\makeatletter\cmd\NMSB@reallylongest and \cmd\NMSB@reallylongestlabel}.
+% \begin{macrocode}
+\newdimen\NMSB@longest
+\newdimen\NMSB@reallylongest
+\setlength{\NMSB@longest}{0pt}
+\setlength{\NMSB@reallylongest}{0pt}
+\def\NMSB@reallylongestlabel{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSBtitle@99}
+% \begin{macro}{\NMSBprefix@9999}
+% \begin{macro}{\NMSB@currprefixtok}
+% \begin{macro}{\NMSB@currprefixlevelonetok}
+% \begin{macro}{\SBmisctitle}
+% \begin{macro}{\SBmiscprefix}
+% Some macros for handling titles and prefix. "Misc" commands will be used
+% for bibliographic entries whose category has not been defined.
+% \begin{macrocode}
+\expandafter\def\csname NMSBtitle@99\endcsname{\SBmisctitle}
+\expandafter\def\csname NMSBprefix@9999\endcsname{\SBmiscprefix}
+\def\SBmisctitle{Miscellaneous}
+\def\SBmiscprefix{}
+\newtoks\NMSB@currprefixtok
+\newtoks\NMSB@currprefixlevelonetok
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@prevcat}
+% \begin{macro}{\NMSB@prevcatlevelone}
+% Those commands will be used for detecting category changes.
+% \begin{macrocode}
+\def\NMSB@prevcat{0}
+\def\NMSB@prevcatlevelone{0}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@missingcat}
+% \begin{macro}{\NMSB@doublecat}
+% Those two commands will contain entries that are \cmd\cite{}d but have not
+% category, or that have two categories, resp.
+% \begin{macrocode}
+\def\NMSB@missingcat{}
+\def\NMSB@doublecat{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@valuelist}
+% The list of entries that appear in \cmd\SBentries, and that will be sorted.
+% \begin{macrocode}
+\let\NMSB@valuelist\relax
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SBabovesepwidth}
+% \begin{macro}{\SBbelowsepwidth}
+% Width of lines for the ``rules'' style.
+% \begin{macrocode}
+\newdimen\SBabovesepwidth
+\newdimen\SBbelowsepwidth
+\setlength{\SBabovesepwidth}{.4pt}
+\setlength{\SBbelowsepwidth}{.4pt}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@penalty}
+% \begin{macro}{\NMSB@halfpenalty}
+% Penalties inserted after category titles, in order to avoid lonely titles at
+% bottom of pages.
+% \begin{macrocode}
+\def\NMSB@penalty{5000}
+\def\NMSB@halfpenalty{500}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@warnnocateg}
+% \begin{macro}{\NMSB@warndblcateg}
+% \begin{macro}{\NMSB@warnwronglongest}
+% \begin{macro}{\NMSB@errtoomanycat}
+% \begin{macro}{\NMSB@errtoomanyent}
+% \begin{macro}{\NMSB@errcattoodepp}
+% \begin{macro}{\NMSB@errentriesoutsidecat}
+% \begin{macro}{\NMSB@errentrieswithoptinsidecat}
+% \begin{macro}{\NMSB@erraliasoutsidecat}
+% \begin{macro}{\NMSB@erraliasalreadydef}
+% \begin{macro}{\NMSB@erraliasundefined}
+% Errors or warning... Names should be explicit.
+% \begin{macrocode}
+\def\NMSB@warnnocateg#1,\end{%
+ \message{---- SortBib warning ----^^J%
+ -- The following bib entries have no category: #1^^J}}
+\def\NMSB@warndblcateg#1,\end{%
+ \message{---- SortBib warning ----^^J%
+ -- The following bib entries have several categories: #1^^J%
+ -- The first one will be used.^^J}}
+\def\NMSB@warnwronglongest{%
+ \expandafter\NMSB@tok\expandafter{\NMSB@reallylongestlabel}
+ \message{---- SortBib warning ----^^J%
+ -- The longest label appears to be [\the\NMSB@tok]
+ instead of}
+ \@ifundefined{SBlongestlabel}{}{\message{(forced)}}
+ \expandafter\NMSB@tok\expandafter{\NMSB@longestlabel}
+ \message{[\the\NMSB@tok]^^J}}
+\def\NMSB@errtoomanycat#1{%
+ \message{---- SortBib error ----^^J%
+ -- You defined too many level-#1 categories (max = 89).^^J}}
+\def\NMSB@errtoomanyent{%
+ \setcounter{NMSB@maxent}{\NMSB@initent0}
+ \addtocounter{NMSB@maxent}{-\NMSB@initent}
+ \message{---- SortBib error ----^^J%
+ -- You defined too many entries in one category %
+ (max = \theNMSB@maxent)^^J}}
+\def\NMSB@errcattoodeep{%
+ \message{---- Sortbib error ----^^J
+ -- Only two category depth allowed.^^J}}
+\def\NMSB@errentriesoutsidecat{%
+ \message{---- Sortbib error ----^^J
+ -- \string\SBentries outside category environment.^^J}}
+\def\NMSB@errentrieswithoptinsidecat{%
+ \message{----Sortbib error ----^^J
+ -- \string\SBentries with optional argument inside category env.^^J}}
+\def\NMSB@erraliasoutsidecat{%
+ \message{----Sortbib error ----^^J
+ -- \string\SBalias used outside category environment.^^J}}
+\def\NMSB@erraliasalreadydef#1{%
+ \message{----Sortbib error ----^^J
+ -- Alias #1 multiply defined.^^J}}
+\def\NMSB@erraliasundefined#1{%
+ \message{----Sortbib error ----^^J
+ -- Alias #1 undefined.^^J}}
+\def\NMSB@errcommentoutsidecat{%
+ \message{----Sortbib error ----^^J
+ -- \string\SBcomment used outside category environment.^^J}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\SBtitle}
+% \begin{macro}{\SBsubtitle}
+% \begin{macro}{\SBtitlestyle}
+% \begin{macro}{\SBsubtitlestyle}
+% \begin{macro}{\NMSB@titlestyle}
+% \begin{macro}{\NMSB@subtitlestyle}
+% \begin{macro}{\SBtitlefont}
+% \begin{macro}{\SBsubtitlefont}
+% \begin{macro}{\NMSB@stylebox}
+% \begin{macro}{\NMSB@stylebar}
+% \begin{macro}{\NMSB@styledash}
+% \begin{macro}{\NMSB@stylenone}
+% \begin{macro}{\NMSB@stylesimple}
+% Macros for (sub)title styles. The arguments are the numbers of the category
+% and subcategory. Of course, it is also possible to add titles in the
+% headers, in the table of contents,~...
+% \begin{macrocode}
+\def\SBtitlestyle#1{\gdef\NMSB@titlestyle{#1}}
+\def\SBsubtitlestyle#1{\gdef\NMSB@subtitlestyle{#1}}
+\def\NMSB@titlestyle{bar}
+\def\NMSB@subtitlestyle{dash}
+\def\SBtitle#1{\def\NMSB@level{title}%
+ \csname NMSB@style\NMSB@titlestyle\endcsname{}{#1}}
+\def\SBsubtitle#1#2{\def\NMSB@level{subtitle}%
+ \csname NMSB@style\NMSB@subtitlestyle\endcsname{}{#2}}
+\def\SBtitlefont#1{{\bfseries\Large #1}}
+\def\SBsubtitlefont#1{{\bfseries #1}}
+\def\NMSB@stylebox#1#2{\hskip-\leftmargin%
+ \vbox{%
+ \medskip\par
+ {\null\hfill
+ \setlength\fboxsep{\baselineskip}%
+ \framebox[\textwidth]{%
+ \csname SB\NMSB@level font\endcsname{#1#2}}%
+ \hfill\null}}%
+ \bigskip}
+\def\NMSB@stylebar#1#2{\hskip-\leftmargin%
+ \vbox{%
+ \medskip\par
+ \vrule height \SBabovesepwidth depth 0pt width \textwidth
+ \vskip.3\baselineskip\par\noindent
+ {\null\hfill
+ \csname SB\NMSB@level font\endcsname{#1#2}%
+ \hfill\null}%
+ \vskip-.4\baselineskip\par\noindent
+ \vrule height \SBbelowsepwidth depth 0pt width \textwidth}}
+\def\NMSB@styledash#1#2{\unskip\hskip-\leftmargin%
+ \vbox{%
+ \smallskip\noindent
+ {\null\hfill
+ \csname SB\NMSB@level font\endcsname{---~#1#2~---}}
+ \hfill\null}
+ \par}
+\def\NMSB@stylenone#1#2{%
+ \vspace{-2\itemsep}\vspace{-\baselineskip}}
+\def\NMSB@stylesimple#1#2{\hskip-\leftmargin%
+ \csname SB\NMSB@level font\endcsname{#1#2}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\category}
+% \begin{macro}{\endcategory}
+% \begin{macro}{\NMSB@category}
+% \begin{macro}{\lNMSB@category}
+% Definition of the \env{category} environment. While not too deep, we increase the
+% category number and define the corresponding title and prefix.
+% \begin{macrocode}
+\def\category{\@ifnextchar[{\@lNMSBcategory}{\@NMSBcategory}}
+\def\@lNMSBcategory[#1]#2{%
+ \stepcounter{NMSB@catlevel}%
+ \ifnum\theNMSB@catlevel>2\relax
+ \NMSB@errcattoodeep
+ \addtocounter{NMSB@catlevel}{-1}%
+ \fi
+ \ifnum\theNMSB@catlevel=1\relax
+ \ifnum\theNMSB@catlevelone=98\relax
+ \NMSB@errtoomanycat{one}%
+ \else
+ \stepcounter{NMSB@catlevelone}%
+ \fi
+ \setcounter{NMSB@catleveltwo}{10}%
+ \expandafter\gdef\csname NMSBprefix@\theNMSB@catlevelone
+ \endcsname{#1}%
+ \expandafter\gdef\csname NMSBtitle@\theNMSB@catlevelone
+ \endcsname{#2}%
+ \else
+ \ifnum\theNMSB@catleveltwo=98\relax
+ \NMSB@errtoomanycat{two}%
+ \else
+ \stepcounter{NMSB@catleveltwo}%
+ \fi
+ \expandafter\let\expandafter\NMSB@tempentry\csname
+ NMSBprefix@\theNMSB@catlevelone\endcsname
+ \expandafter\NMSB@tok\expandafter{\NMSB@tempentry}
+ \expandafter\xdef\csname NMSBprefix@\theNMSB@catlevelone
+ \theNMSB@catleveltwo\endcsname{\the\NMSB@tok #1}%
+ \expandafter\gdef\csname NMSBtitle@\theNMSB@catlevelone
+ \theNMSB@catleveltwo\endcsname{#2}%
+ \fi
+}
+\def\@NMSBcategory#1{%
+ \stepcounter{NMSB@catlevel}
+ \ifnum\theNMSB@catlevel>2\relax
+ \NMSB@errcattoodeep
+ \addtocounter{NMSB@catlevel}{-1}%
+ \fi
+ \ifnum\theNMSB@catlevel=1\relax
+ \ifnum\theNMSB@catlevelone=98\relax
+ \NMSB@errtoomanycat{one}%
+ \else
+ \stepcounter{NMSB@catlevelone}%
+ \fi
+ \setcounter{NMSB@catleveltwo}{10}
+ \expandafter\gdef\csname NMSBtitle@\theNMSB@catlevelone
+ \endcsname{#1}%
+ \else
+ \ifnum\theNMSB@catleveltwo=98\relax
+ \NMSB@errtoomanycat{two}%
+ \else
+ \stepcounter{NMSB@catleveltwo}%
+ \fi
+ \expandafter\ifx\csname NMSBprefix@\theNMSB@catlevelone\endcsname
+ \relax
+ \else
+ \expandafter\let\expandafter\NMSB@tempentry\csname
+ NMSBprefix@\theNMSB@catlevelone\endcsname
+ \expandafter\NMSB@tok\expandafter{\NMSB@tempentry}%
+ \expandafter\xdef\csname NMSBprefix@\theNMSB@catlevelone
+ \theNMSB@catleveltwo\endcsname{\the\NMSB@tok}%
+ \fi
+ \expandafter\gdef\csname NMSBtitle@\theNMSB@catlevelone
+ \theNMSB@catleveltwo\endcsname{#1}%
+ \fi
+}
+\def\endcategory{\addtocounter{NMSB@catlevel}{-1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\SBalias}
+% This defines an alias for the category, so that you can add new
+% items in that category afterwards, by using the optional argument of
+% \cmd\SBentries.
+% \begin{macrocode}
+\def\SBalias#1{%
+ \ifnum\theNMSB@catlevel<1\relax
+ \NMSB@erraliasoutsidecat
+ \else
+ \expandafter\ifx\csname NMSBalias@#1\endcsname\relax
+ \ifnum\theNMSB@catlevel=1\relax
+ \expandafter\xdef\csname NMSBalias@#1\endcsname{%
+ \theNMSB@catlevelone 10}%
+ \else
+ \expandafter\xdef\csname NMSBalias@#1\endcsname{%
+ \theNMSB@catlevelone\theNMSB@catleveltwo}%
+ \fi
+ \else
+ \NMSB@erraliasalreadydef{#1}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SBcomment}
+% Command \cmd\SBcomment~allows you to put a comment at the beginning of each
+% category. That comment will be put into a \env{minipage} for the moment, but
+% that behavior should depend on the style of titles and subtitles. I'll do
+% that shortly.
+% \begin{macrocode}
+\long\def\SBcomment#1{%
+ \ifnum\theNMSB@catlevel<1\relax
+ \NMSB@errcommentoutsidecat
+ \else
+ \ifnum\theNMSB@catlevel=1\relax
+ \expandafter\gdef\csname NMSBcomment@\theNMSB@catlevelone
+ \endcsname{#1}%
+ \else
+ \expandafter\gdef\csname NMSBcomment@\theNMSB@catlevelone
+ \theNMSB@catleveltwo\endcsname{#1}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SBentries}
+% \begin{macro}{\NMSB@entries@withoptarg}
+% \begin{macro}{\NMSB@entries@incatenv}
+% Command \cmd\SBentries~for defining entries that should appear
+% in that category. It should be either used with an optional argument
+% outside a \env{category}~environment, or without its optional
+% argument inside a \env{category}~environment.
+% \begin{macrocode}
+\def\SBentries{\@ifnextchar[
+ {\NMSB@entries@withoptarg}%
+ {\NMSB@entries@incatenv}}
+\def\NMSB@entries@withoptarg[#1]#2{%
+ \ifnum\theNMSB@catlevel>0\relax
+ \NMSB@errentrieswithoptinsidecat
+ \else
+ \@for\@citeb:=#2\do{%
+ \expandafter\ifx\csname NMSBcateg@\@citeb\endcsname\relax
+ \expandafter\ifx\csname NMSBalias@#1\endcsname\relax
+ \NMSB@erraliasundefined{#1}%
+ \else
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBalias@#1\endcsname}%
+ \ifNMSB@ownorder
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname\theNMSB@ent}%
+ \stepcounter{NMSB@ent}%
+ \ifnum\theNMSB@ent=\theNMSB@maxent\relax
+ \NMSB@errtoomanyent
+ \fi
+ \fi
+ \fi
+ \else
+ \ifNMSB@strict
+ \xdef\NMSB@doublecat{\NMSB@doublecat \@citeb,}%
+ \else
+ \expandafter\ifx\csname NMSBalias@#1\endcsname\relax
+ \NMSB@erraliasundefined{#1}%
+ \else
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname,%
+ \csname NMSBalias@#1\endcsname}%
+ \ifNMSB@ownorder
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname\theNMSB@ent}%
+ \stepcounter{NMSB@ent}%
+ \ifnum\theNMSB@ent=\theNMSB@maxent\relax
+ \NMSB@errtoomanyent
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi}%
+ \fi
+}
+\def\NMSB@entries@incatenv#1{%
+ \ifnum\theNMSB@catlevel<1\relax
+ \NMSB@errentriesoutsidecat
+ \else
+ \@for\@citeb:=#1\do{%
+ \expandafter\ifx\csname NMSBcateg@\@citeb\endcsname\relax
+ \ifnum\theNMSB@catlevel=2\relax
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \theNMSB@catlevelone\theNMSB@catleveltwo}%
+ \else
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \theNMSB@catlevelone10}%
+ \fi%
+ \ifNMSB@ownorder
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname\theNMSB@ent}%
+ \stepcounter{NMSB@ent}%
+ \ifnum\theNMSB@ent=\theNMSB@maxent\relax\NMSB@errtoomanyent\fi
+ \fi
+ \else
+ \ifNMSB@strict
+ \xdef\NMSB@doublecat{\NMSB@doublecat \@citeb,}%
+ \else
+ \ifnum\theNMSB@catlevel=2\relax
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname,%
+ \theNMSB@catlevelone\theNMSB@catleveltwo}%
+ \else
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname,%
+ \theNMSB@catlevelone10}%
+ \fi
+ \fi
+ \ifNMSB@ownorder
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname\theNMSB@ent}%
+ \stepcounter{NMSB@ent}%
+ \ifnum\theNMSB@ent=\theNMSB@maxent\relax\NMSB@errtoomanyent\fi
+ \fi
+ \fi}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSBorig@@lbibitem}
+% \begin{macro}{\NMSBorig@@bibitem}
+% \begin{macro}{\NMSBrealorig@@bibitem}
+% Keep track of the original \cmd\bibitem~commands.
+% \begin{macrocode}
+\let\@NMSBrealorig@@bibitem\@bibitem
+\let\@NMSBorig@@lbibitem\@lbibitem
+\def\@NMSBorig@@bibitem#1{\item\if@filesw \immediate\write\@auxout
+ {\string\bibcite{#1}{\the\NMSB@currprefixtok\the\value{\@listctr}}}%
+ \fi\ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@getcateg}
+% \begin{macro}{\NMSB@getent}
+% Those macros retrive the category and entry number from their concatenation.
+% This is used when reordering.
+% \begin{macrocode}
+\def\NMSB@getcateg#1#2#3#4#5-{#1#2#3#4}
+\def\NMSB@getent#1#2#3#4#5-{#5}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@lbibitem}
+% \begin{macro}{\@bibitem}
+% These are the new \cmd\bibitem~commands. They won't print
+% anything. Instead, they write their arguments in different commands
+% named after the number of the current
+% entry. Longest label ia also evaluated.
+% \begin{macrocode}
+\def\@lbibitem[#1]#2#3\par{%
+ \expandafter\ifx\csname NMSBcateg@#2\endcsname\relax
+ \expandafter\gdef\csname NMSBcateg@#2\endcsname{9999}%
+ \edef\NMSB@missingcat{\NMSB@missingcat #2,}%
+ \ifNMSB@ownorder
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname\theNMSB@maxent}%
+ \fi
+ \fi
+ \let\@tempa\relax
+ \ifNMSB@ownorder
+ \edef\NMSB@temp{\csname NMSBcateg@#2\endcsname}%
+ \@for\NMSB@local:=\NMSB@temp\do{%
+ \ifx\relax\@tempa\relax
+ \edef\@tempa{\expandafter\NMSB@getcateg\NMSB@local-}%
+ \else
+ \edef\@tempa{\@tempa,\expandafter\NMSB@getcateg\NMSB@local-}%
+ \fi
+ }%
+ \else
+ \edef\@tempa{\csname NMSBcateg@#2\endcsname}%
+ \fi
+ \expandafter\ifx\csname NMSBprefix@\@tempa\endcsname\relax
+ \def\@tempb{#1}%
+ \else
+ \expandafter\let\expandafter\NMSB@tempentry\csname
+ NMSBprefix@\@tempa\endcsname
+ \expandafter\NMSB@tok\expandafter{\NMSB@tempentry #1}%
+ \edef\@tempb{\the\NMSB@tok}%
+ \fi
+ \@ifundefined{SBlongestlabel}{%
+ \setbox\@tempboxa=\hbox{\@tempb}%
+ \ifdim\NMSB@longest<\wd\@tempboxa
+ \setlength\NMSB@longest{\wd\@tempboxa}%
+ \global\let\NMSB@longestlabel\@tempb
+ \fi}{}%
+ \ifNMSB@ownorder
+ \edef\NMSB@temp{\csname NMSBcateg@#2\endcsname}%
+ \@for\NMSB@local:=\NMSB@temp\do{%
+ \edef\NMSB@tempb{\expandafter\NMSB@getent\NMSB@local-}
+ \expandafter\xdef\csname NMSBkey@\NMSB@tempb\endcsname{#2}%
+ \global\expandafter\let\csname NMSBlabel@\NMSB@tempb\endcsname
+ \@tempb
+ \expandafter\gdef\csname NMSBentry@\NMSB@tempb\endcsname{#3}%
+ \ifx\relax\NMSB@valuelist\relax
+ \xdef\NMSB@valuelist{\NMSB@local}%
+ \else
+ \xdef\NMSB@valuelist{\NMSB@valuelist,\NMSB@local}%
+ \fi}%
+ \else
+ \expandafter\xdef\csname NMSBkey@\theNMSB@ent\endcsname{#2}%
+ \global\expandafter\let\csname NMSBlabel@\theNMSB@ent\endcsname
+ \@tempb
+ \expandafter\gdef\csname NMSBentry@\theNMSB@ent\endcsname{#3}%
+ \@for\NMSB@item:=\@tempa\do{%
+ \ifx\relax\NMSB@valuelist\relax
+ \xdef\NMSB@valuelist{\NMSB@item\theNMSB@ent}%
+ \else
+ \xdef\NMSB@valuelist{\NMSB@valuelist,\NMSB@item\theNMSB@ent}%
+ \fi}%
+ \stepcounter{NMSB@ent}%
+ \ifnum\theNMSB@ent=\theNMSB@maxent\relax\NMSB@errtoomanyent\fi
+ \fi
+}
+\def\@bibitem#1#2\par{%
+ \expandafter\ifx\csname NMSBcateg@#1\endcsname\relax
+ \expandafter\gdef\csname NMSBcateg@#1\endcsname{9999}%
+ \ifNMSB@ownorder
+ \expandafter\xdef\csname NMSBcateg@\@citeb\endcsname{%
+ \csname NMSBcateg@\@citeb\endcsname\theNMSB@maxent}%
+ \fi
+ \edef\NMSB@missingcat{\NMSB@missingcat #1,}%
+ \fi
+ \def\@tempa{}%
+ \ifNMSB@ownorder
+ \edef\NMSB@temp{\csname NMSBcateg@#1\endcsname}%
+ \@for\NMSB@local:=\NMSB@temp\do{%
+ \ifx\relax\@tempa\relax
+ \edef\@tempa{\expandafter\NMSB@getcateg\NMSB@local-}%
+ \else
+ \edef\@tempa{\@tempa,\expandafter\NMSB@getcateg\NMSB@local-}%
+ \fi}%
+ \else
+ \edef\@tempa{\csname NMSBcateg@#1\endcsname}%
+ \fi
+ \@ifundefined{SBlongestlabel}{%
+ \expandafter\ifx\csname NMSBprefix@\@tempa\endcsname\relax
+ \let\@tempb\NMSB@initiallongestlabel
+ \else
+ \expandafter\let\expandafter\NMSB@tempentry\csname
+ NMSBprefix@\@tempa\endcsname
+ \expandafter\expandafter\expandafter\NMSB@tok
+ \expandafter\expandafter\expandafter{%
+ \expandafter\NMSB@tempentry
+ \NMSB@initiallongestlabel}%
+ \edef\@tempb{\the\NMSB@tok}%
+ \fi
+ \setbox\@tempboxa=\hbox{\@tempb}%
+ \ifdim\NMSB@longest<\wd\@tempboxa
+ \setlength\NMSB@longest{\wd\@tempboxa}%
+ \global\let\NMSB@longestlabel\@tempb
+ \fi}{}%
+ \ifNMSB@ownorder
+ \edef\NMSB@temp{\csname NMSBcateg@#1\endcsname}%
+ \@for\NMSB@local:=\NMSB@temp\do{%
+ \edef\NMSB@tempb{\expandafter\NMSB@getent\NMSB@local-}
+ \expandafter\xdef\csname NMSBkey@\NMSB@tempb\endcsname{#1}%
+ \expandafter\gdef\csname NMSBentry@\NMSB@tempb\endcsname{#2}%
+ \ifx\relax\NMSB@valuelist\relax
+ \xdef\NMSB@valuelist{\NMSB@local}%
+ \else
+ \xdef\NMSB@valuelist{\NMSB@valuelist,\NMSB@local}%
+ \fi}%
+ \else
+ \expandafter\xdef\csname NMSBkey@\theNMSB@ent\endcsname{#1}%
+ \expandafter\gdef\csname NMSBentry@\theNMSB@ent\endcsname{#2}%
+ \@for\NMSB@item:=\@tempa\do{%
+ \ifx\relax\NMSB@valuelist\relax
+ \xdef\NMSB@valuelist{\NMSB@item\theNMSB@ent}%
+ \else
+ \xdef\NMSB@valuelist{\NMSB@valuelist,\NMSB@item\theNMSB@ent}%
+ \fi}%
+ \stepcounter{NMSB@ent}%
+ \ifnum\theNMSB@ent=\theNMSB@maxent\relax\NMSB@errtoomanyent\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@afterfi}
+% \begin{macro}{\NMSB@afterelse}
+% \begin{macro}{\NMSB@empty}
+% \begin{macro}{\NMSB@pivot}
+% \begin{macro}{\NMSB@qsort}
+% \begin{macro}{\NMSB@resort}
+% \begin{macro}{\NMSB@sort}
+% \begin{macro}{\NMSB@sortlt}
+% The sorting commands. This is an implementation of the quicksort
+% algorithm.
+% \begin{macrocode}
+\def\NMSB@afterfi#1\fi{\fi#1}
+\def\NMSB@afterelse#1\else#2\fi{\fi#1}
+\def\NMSB@empty{}
+\def\NMSB@pivot#1#2#3#4#5,{%
+ \ifx\relax#5\NMSB@empty%
+ \ifx\relax#3\relax\else\NMSB@resort{#1}{#3}, \fi%
+ #2%
+ \ifx\relax#4\relax\else,\NMSB@resort{#1}{#4}\fi%
+ \else%
+ \ifnum#5#1#2 \NMSB@afterelse{\NMSB@afterfi{%
+ \NMSB@pivot{#1}{#2}{#3#5,}{#4}}}%
+ \else%
+ \NMSB@afterfi{\NMSB@afterfi{%
+ \NMSB@pivot{#1}{#2}{#3}{#4#5,}}}%
+ \fi
+ \fi
+}%
+\def\NMSB@qsort#1#2,{%
+ \ifx\relax#2\relax\else
+ \NMSB@afterfi{\NMSB@pivot{#1}{#2}{}{}}\fi}
+\def\NMSB@resort#1#2{\NMSB@qsort{#1}#2\relax,}
+\def\NMSBsort#1#2{\NMSB@qsort{#1}#2,\relax,}
+\def\NMSBsortlt#1{\NMSBsort{<}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\NMSB@writecatbib}
+% Macros for writing unexpanded commands into the \ext{sbb}~file.
+% \begin{macrocode}
+\long\def\NMSB@writecatbib#1{%
+ \NMSB@tok{#1}%
+ \immediate\write\NMSB@catbib{\the\NMSB@tok}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NMSB@writeentry}
+% \begin{macro}{\NMSB@writelist}
+% Those macros are to write one entry, and the list of entries, respectively.
+% When writing an entry, we have to detect category-changes, for writing
+% the (sub)title.
+% {\makeatletter\cmd\NMSB@writeentry}~is becoming more and more complex,
+% but it mainly detects category changes, writes category titles if needed,
+% and writes a \cmd\bibitem.
+% \begin{macrocode}
+\def\NMSB@writeentry#1#2#3#4#5,{\ifx\relax #5\relax
+ \else
+ \def\NMSB@currcat{#1#2#3#4}%
+ \def\NMSB@currcatlevelone{#1#2}%
+ \ifx\NMSB@currcatlevelone\NMSB@prevcatlevelone\else
+ \expandafter\ifx\csname NMSBtitle@\NMSB@currcatlevelone
+ \endcsname\relax
+ \else
+ \ifNMSB@export
+ \if@filesw
+ \immediate\write\NMSB@catbib{%
+ \string\par\string\addpenalty{-\NMSB@penalty}%
+ \string\relax^^J%
+ \string\item[]%
+ \string\SBtitle}%
+ \expandafter\let\expandafter\NMSB@tempentry
+ \csname NMSBtitle@\NMSB@currcatlevelone\endcsname
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \expandafter{\NMSB@tempentry}}%
+ \immediate\write\NMSB@catbib{\string\relax^^J%
+ \string\par\string\addpenalty{\NMSB@penalty}%
+ \string\relax}%
+ \expandafter\ifx\csname
+ NMSBcomment@\NMSB@currcatlevelone\endcsname\relax
+ \else
+ \immediate\write\NMSB@catbib{\string\vskip2ex^^J%
+ \string\hspace{-\leftmargin}\string\relax^^J%
+ \string\begin{minipage}{\textwidth}^^J%
+ \string\addtolength\string\parindent{20pt}^^J%
+ \string\noindent}
+ \expandafter\let\expandafter\NMSB@tempentry
+ \csname NMSBcomment@\NMSB@currcatlevelone\endcsname
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \NMSB@tempentry^^J}%
+ \immediate\write\NMSB@catbib{\string\end{minipage}^^J%
+ \string\par\string\addpenalty{\NMSB@penalty}
+ \string\vskip2ex}
+ \fi
+ \fi
+ \else
+ \par\addpenalty{-\NMSB@penalty}%
+ \item[]%
+ \SBtitle{\csname NMSBtitle@\NMSB@currcatlevelone\endcsname}
+ \par\addpenalty{\NMSB@penalty}%
+ \expandafter\ifx\csname
+ NMSBcomment@\NMSB@currcatlevelone\endcsname\relax
+ \else
+ \vskip2ex\hspace{-\leftmargin}\begin{minipage}{\textwidth}%
+ \addtolength\parindent{20pt}\noindent%
+ \csname NMSBcomment@\NMSB@currcatlevelone\endcsname
+ \end{minipage}%
+ \par\addpenalty{\NMSB@penalty}\vskip2ex
+ \fi
+ \fi
+ \fi
+ \xdef\NMSB@prevcatlevelone{#1#2}%
+ \ifnum\theSBresetdepth>0\relax
+ \setcounter{\@listctr}{0}%
+ \fi
+ \expandafter\ifx\csname NMSBprefix@\NMSB@prevcatlevelone
+ \endcsname\relax
+ \NMSB@currprefixlevelonetok{\relax}%
+ \else
+ \expandafter\expandafter\expandafter\NMSB@currprefixlevelonetok
+ \expandafter\expandafter\expandafter{%
+ \csname NMSBprefix@\NMSB@prevcatlevelone\endcsname}%
+ \fi
+ \fi
+ \ifx\NMSB@currcat\NMSB@prevcat\else
+ \ifnum\NMSB@currcat=9999\else
+ \expandafter\ifx\csname NMSBtitle@\NMSB@currcat\endcsname
+ \relax
+ \else
+ \ifNMSB@export
+ \if@filesw
+ \immediate\write\NMSB@catbib{%
+ \string\par\string\addpenalty{-\NMSB@halfpenalty}%
+ \string\relax^^J%
+ \string\item[]%
+ \string\SBsubtitle}%
+ \expandafter\let\expandafter\NMSB@tempentrya
+ \csname NMSBtitle@\NMSB@currcatlevelone\endcsname
+ \expandafter\let\expandafter\NMSB@tempentryb
+ \csname NMSBtitle@\NMSB@currcat\endcsname
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \expandafter{\NMSB@tempentrya}}
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \expandafter{\NMSB@tempentryb}}
+ \immediate\write\NMSB@catbib{\string\relax^^J%
+ \string\par\string\addpenalty{\NMSB@penalty}%
+ \string\relax}%
+ \expandafter\ifx\csname
+ NMSBcomment@\NMSB@currcat\endcsname\relax
+ \else
+ \immediate\write\NMSB@catbib{\string\vskip2ex^^J%
+ \string\hspace{-\leftmargin}\string\relax^^J%
+ \string\begin{minipage}{\textwidth}^^J%
+ \string\addtolength\string\parindent{20pt}^^J%
+ \string\noindent}
+ \expandafter\let\expandafter\NMSB@tempentry
+ \csname NMSBcomment@\NMSB@currcat\endcsname
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \NMSB@tempentry^^J}%
+ \immediate\write\NMSB@catbib{\string\end{minipage}^^J%
+ \string\par\string\addpenalty{\NMSB@penalty}%
+ \string\vskip2ex}
+ \fi
+ \fi
+ \else
+ \par\addpenalty{-\NMSB@halfpenalty}%
+ \item[]
+ \SBsubtitle{\csname NMSBtitle@\NMSB@currcatlevelone\endcsname}%
+ {\csname NMSBtitle@\NMSB@currcat\endcsname}%
+ \par\addpenalty{\NMSB@penalty}%
+ \expandafter\ifx\csname
+ NMSBcomment@\NMSB@currcat\endcsname\relax
+ \else
+ \vskip2ex\hspace{-\leftmargin}\begin{minipage}{\textwidth}%
+ \addtolength\parindent{20pt}\noindent%
+ \csname NMSBcomment@\NMSB@currcat\endcsname
+ \end{minipage}%
+ \par\addpenalty{\NMSB@penalty}\vskip2ex
+ \fi
+ \fi
+ \fi
+ \fi
+ \xdef\NMSB@prevcat{#1#2#3#4}%
+ \ifnum\theSBresetdepth>1\relax
+ \setcounter{\@listctr}{0}%
+ \fi
+ \expandafter\ifx\csname NMSBprefix@\NMSB@currcat\endcsname\relax
+ \expandafter\NMSB@currprefixtok\expandafter{%
+ \the\NMSB@currprefixlevelonetok}%
+ \else
+ \expandafter\expandafter\expandafter\NMSB@currprefixtok
+ \expandafter\expandafter\expandafter{%
+ \csname NMSBprefix@\NMSB@currcat\endcsname}
+ \fi
+ \fi
+ \expandafter\ifx\csname NMSBlabel@#5\endcsname\relax
+ \ifNMSB@export
+ \if@filesw
+ \stepcounter\@listctr
+ \immediate\write\NMSB@catbib{%
+ \string\bibitem}%
+ \expandafter\ifx\expandafter\relax\the\NMSB@currprefixtok
+ \expandafter\def\expandafter\NMSB@tempentry
+ \expandafter{\the\value{\@listctr}}%
+ \else
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\NMSB@tempentry
+ \expandafter\expandafter\expandafter{%
+ \expandafter\the\expandafter\NMSB@currprefixtok
+ \the\value{\@listctr}}%
+ \fi
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \expandafter[\NMSB@tempentry]}%
+ \immediate\write\NMSB@catbib{%
+ {\csname NMSBkey@#5\endcsname}}
+ \expandafter\let\expandafter\NMSB@tempentry
+ \csname NMSBentry@#5\endcsname%
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \NMSB@tempentry^^J^^J}
+ \fi
+ \else
+ \@NMSBorig@@bibitem{\csname NMSBkey@#5\endcsname}%
+ \csname NMSBentry@#5\endcsname
+ \fi
+ \setbox\@tempboxa=\hbox{\the\NMSB@currprefixtok\the\value{\@listctr}}%
+ \ifdim\NMSB@reallylongest<\wd\@tempboxa
+ \setlength{\NMSB@reallylongest}{\wd\@tempboxa}%
+ \xdef\NMSB@reallylongestlabel{%
+ \expandafter\ifx\expandafter\relax\the\NMSB@currprefixtok
+ \else\the\NMSB@currprefixtok\fi\the\value{\@listctr}}%
+ \fi
+ \else
+ \ifNMSB@export
+ \if@filesw
+ \immediate\write\NMSB@catbib{%
+ \string\bibitem}
+ \expandafter\let\expandafter\NMSB@tempentry
+ \csname NMSBlabel@#5\endcsname
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \expandafter[\NMSB@tempentry]}%
+ \immediate\write\NMSB@catbib{%
+ {\csname NMSBkey@#5\endcsname}}%
+ \expandafter\let\expandafter\NMSB@tempentry
+ \csname NMSBentry@#5\endcsname%
+ \expandafter\NMSB@writecatbib\expandafter{%
+ \NMSB@tempentry^^J^^J}
+ \fi
+ \else
+ \@NMSBorig@@lbibitem[\csname NMSBlabel@#5\endcsname]%
+ {\csname NMSBkey@#5\endcsname}%
+ \csname NMSBentry@#5\endcsname
+ \fi
+ \setbox\@tempboxa=\hbox{\csname NMSBlabel@#5\endcsname}%
+ \ifdim\NMSB@reallylongest<\wd\@tempboxa
+ \setlength{\NMSB@reallylongest}{\wd\@tempboxa}%
+ \expandafter\let\expandafter\NMSB@reallylongestlabel\csname
+ NMSBlabel@#5\endcsname
+ \fi
+ \fi
+ \fi
+}
+\def\NMSB@writelist#1{%
+ \@for\NMSB@curritem:=#1\do{%
+ \edef\NMSB@curritem{\expandafter
+ \@firstofone\NMSB@curritem\@empty}%
+ \expandafter\NMSB@writeentry\NMSB@curritem ,}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@NMSBorig@thebibliography}
+% \begin{macro}{\@NMSBorig@endthebibliography}
+% \begin{macro}{\thebibliography}
+% \begin{macro}{\endthebibliography}
+% \cmd\thebibliography~does not really use its argument. It's simply used for
+% approximating the longest label. Note that
+% \cmd\endthebibliography~writes the entries, since sorting has to be
+% done after \cmd\bibitem{}s have treated all the entries.
+% \begin{macrocode}
+\let\@NMSBorig@thebibliography\thebibliography
+\let\@NMSBorig@endthebibliography\endthebibliography
+\def\thebibliography#1{%
+ \setcounter{NMSB@ent}{\NMSB@initent}%
+ \@ifundefined{SBlongestlabel}{%
+ \gdef\NMSB@initiallongestlabel{#1}}{%
+ \global\let\NMSB@longestlabel\SBlongestlabel
+ \setbox\@tempboxa=\hbox{\SBlongestlabel}%
+ \setlength{\NMSB@longest}{\wd\@tempboxa}}%
+ \ifNMSB@export
+ \if@filesw
+ \newwrite\NMSB@catbib
+ \immediate\openout\NMSB@catbib \jobname.sbb\relax
+ \expandafter\NMSB@tok\expandafter{\SBlongestlabel}
+ \immediate\write\NMSB@catbib{%
+ \string\begin{thebibliography}{%
+ \@ifundefined{SBlongestlabel}{#1}{\the\NMSB@tok}}}
+ \fi
+ \fi
+}
+\def\endthebibliography{%
+ \ifNMSB@export
+ \usecounter{enumiv}%
+ \else
+ \ifNMSB@newchap
+ \@ifundefined{chapter}{\section*{\refname}}{\chapter*{\bibname}}%
+ \fi
+ \list{\@biblabel{\the\NMSB@currprefixtok\@arabic\c@enumiv}\hfill}{%
+ \settowidth\labelwidth{\@biblabel{\NMSB@longestlabel}}%
+ \leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ \@openbib@code
+ \usecounter{enumiv}%
+ \let\p@enumiv\@empty
+ \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+ \fi
+ \edef\NMSB@sortedvaluelist{%
+ \expandafter\NMSBsortlt\expandafter{\NMSB@valuelist}}%
+ \expandafter\NMSB@writelist\expandafter{\NMSB@sortedvaluelist}%
+ \ifNMSB@export
+ \if@filesw
+ \immediate\write\NMSB@catbib{%
+ \string\end{thebibliography}}
+ \immediate\closeout\NMSB@catbib
+ \fi
+ \begingroup
+ \ifNMSB@newchap\else
+ \@ifundefined{chapter}{\def\section##1##2{}}{\def\chapter##1##2{}}%
+ \fi
+ \let\thebibliography\@NMSBorig@thebibliography
+ \let\endthebibliography\@NMSBorig@endthebibliography
+ \let\@lbibitem\@NMSBorig@@lbibitem
+ \let\@bibitem\@NMSBrealorig@@bibitem
+ \@input@{\jobname.sbb}
+ \endgroup
+ \else
+ \endlist
+ \fi
+ \ifx\NMSB@missingcat\NMSB@empty\else
+ \expandafter\NMSB@warnnocateg\NMSB@missingcat\end
+ \fi
+ \ifNMSB@strict
+ \ifx\NMSB@doublecat\NMSB@empty\else
+ \expandafter\NMSB@warndblcateg\NMSB@doublecat\end
+ \fi
+ \fi
+ \ifdim\NMSB@reallylongest=\NMSB@longest\relax\else
+ \NMSB@warnwronglongest
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \setcounter{IndexColumns}{2}
+% \IfFileExists{splitbib.ind}{}{%
+% \message{Please run "makeindex -s gind.ist splitbib.idx" for the index.}}
+% \PrintIndex
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/splitbib/splitbib.ins b/Master/texmf-dist/source/latex/splitbib/splitbib.ins
new file mode 100644
index 00000000000..efa717e964f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitbib/splitbib.ins
@@ -0,0 +1,45 @@
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\batchfile{splitbib.ins}
+\def\filedate{2004/06/18}
+\input docstrip.tex
+\preamble
+
+
+This is a generated file.
+
+
+IMPORTANT COPYRIGHT NOTICE:
+
+Permission is granted to copy this file to another file with a clearly
+different name and to customize the declarations in that copy to serve
+the needs of your installation.
+
+However, NO PERMISSION is granted to generate or to distribute a
+modified version of this file under its original name.
+
+You are NOT ALLOWED to change this file.
+
+
+\endpreamble
+\keepsilent
+
+% package file
+
+\generateFile{splitbib.sty}{t}{\from{splitbib.dtx}{package}}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by LaTeX:}
+\Msg{*}
+\Msg{* \space\space splitbib.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file splitbib.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+
+\endinput