% \iffalse meta-comment % % =================================================================== % splitbib.dtx % % Nicolas MARKEY % 2005/12/22 % v1.17 % % =================================================================== % % \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} % %<+package>\ProvidesPackage{splitbib} [2005/12/22 v1.17 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{1860} \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} % % \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.} % \changes{1.12}{2005/02/25}{} % \changes{1.13}{2005/08/16}{} % \changes{1.14}{2005/11/26}{[export] doesn't export the number % if it will be computed correctly.} % \changes{1.15}{2005/11/27}{fix a bug in option reorder} % \changes{1.16}{2005/12/12}{fix a stupid bug in previous version} % \changes{1.17}{2005/12/22}{fix another bug related to reorder, % fix a bug with label prefixes} % % % \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. With \texttt{reorder}, entries that have no category % will be omitted. % \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, but you should consider % adding this option if you encounter compilation problems. % \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". % {\makeatletter\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{---- Splitbib warning ----^^J% -- The following bib entries have no category: #1^^J}} \def\NMSB@warndblcateg#1,\end{% \message{---- Splitbib 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{---- Splitbib 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{---- Splitbib 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{---- Splitbib error ----^^J% -- You defined too many entries in one category % (max = \theNMSB@maxent)^^J}} \def\NMSB@errcattoodeep{% \message{---- Splitbib error ----^^J -- Only two category depth allowed.^^J}} \def\NMSB@errentriesoutsidecat{% \message{---- Splitbib error ----^^J -- \string\SBentries outside category environment.^^J}} \def\NMSB@errentrieswithoptinsidecat{% \message{----Splitbib error ----^^J -- \string\SBentries with optional argument inside category env.^^J}} \def\NMSB@erraliasoutsidecat{% \message{----Splitbib error ----^^J -- \string\SBalias used outside category environment.^^J}} \def\NMSB@erraliasalreadydef#1{% \message{----Splitbib error ----^^J -- Alias #1 multiply defined.^^J}} \def\NMSB@erraliasundefined#1{% \message{----Splitbib error ----^^J -- Alias #1 undefined.^^J}} \def\NMSB@errcommentoutsidecat{% \message{----Splitbib 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}{\@lNMSBcategory[]}} \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 is 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@#2\endcsname{% % \csname NMSBcateg@#2\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@#1\endcsname{% % \csname NMSBcateg@#1\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 \else \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter\NMSB@tempentry \expandafter\expandafter\expandafter{% \expandafter\the\expandafter\NMSB@currprefixtok \the\value{\@listctr}}% \expandafter\NMSB@writecatbib\expandafter{% \expandafter[\NMSB@tempentry]}% \fi \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