summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/collref/collref.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/collref/collref.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/collref/collref.dtx')
-rw-r--r--macros/latex/contrib/collref/collref.dtx757
1 files changed, 757 insertions, 0 deletions
diff --git a/macros/latex/contrib/collref/collref.dtx b/macros/latex/contrib/collref/collref.dtx
new file mode 100644
index 0000000000..bf9078c6ca
--- /dev/null
+++ b/macros/latex/contrib/collref/collref.dtx
@@ -0,0 +1,757 @@
+% \iffalse
+%
+% collref.dtx Copyright (C) 2003-2018 Niklas Beisert
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Niklas Beisert.
+%
+% This work consists of the files collref.dtx and collref.ins
+% and the derived files collref.sty and collsamp.tex
+%
+%<package|sample>\NeedsTeXFormat{LaTeX2e}[1996/12/01]
+%<package>\ProvidesPackage{collref}[2018/01/17 v2.0c Collect References]
+%<sample>\ProvidesFile{collsamp.tex}[2018/01/17 v2.0c Sample for Collect References]
+%<*driver>
+%\ProvidesFile{collref.drv}[2018/01/17 v2.0c Collect References Manual file]
+\PassOptionsToClass{10pt,a4paper}{article}
+\documentclass{ltxdoc}
+
+\usepackage[margin=35mm]{geometry}
+\usepackage{hyperref}
+\usepackage{hyperxmp}
+
+\hypersetup{colorlinks=true}
+\hypersetup{pdfstartview=FitH}
+\hypersetup{pdfpagemode=UseNone}
+\hypersetup{pdfsource={}}
+\hypersetup{pdflang={en-UK}}
+\hypersetup{pdfcopyright={Copyright 2003-2018 Niklas Beisert.
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either version 1.3
+ of this license or (at your option) any later version.}}
+\hypersetup{pdflicenseurl={http://www.latex-project.org/lppl.txt}}
+\hypersetup{pdfcontactaddress={ETH Zurich, ITP, HIT K, Wolfgang-Pauli-Strasse 27}}
+\hypersetup{pdfcontactpostcode={8093}}
+\hypersetup{pdfcontactcity={Zurich}}
+\hypersetup{pdfcontactcountry={Switzerland}}
+\hypersetup{pdfcontactemail={nbeisert@itp.phys.ethz.ch}}
+\hypersetup{pdfcontacturl={http://people.phys.ethz.ch/\xmptilde nbeisert/}}
+
+\newenvironment{thebib}
+{\list{[\theenumi]}{\parsep0pt\usecounter{enumi}}}
+{\endlist}
+
+\begin{document}
+
+\title{The \textsf{collref} Package\thanks{%
+Earlier versions developed at: Max-Planck-Institut f\"ur Gravitationsphysik
+(Albert-Einstein-Institut), Potsdam, Germany;
+\texttt{AEI-2009-054}}}
+\hypersetup{pdftitle={The collref Package}}
+\author{Niklas Beisert\\[2ex]
+ Institut f\"ur Theoretische Physik\\
+ Eidgen\"ossische Technische Hochschule Z\"urich\\
+ Wolfgang-Pauli-Strasse 27, 8093 Z\"urich, Switzerland\\[1ex]
+ \href{mailto:nbeisert@itp.phys.ethz.ch}
+ {\texttt{nbeisert@itp.phys.ethz.ch}}}
+\hypersetup{pdfauthor={Niklas Beisert}}
+\hypersetup{pdfsubject={Manual for the LaTeX2e Package collref}}
+\date{17 January 2018, \textsf{v2.0c}}
+\maketitle
+
+\begin{abstract}\noindent
+\textsf{collref} is a \LaTeXe{} package to automatically collect
+multiple |\bibitem| references which always appear in the same sequence
+in |\cite| into a single |\bibitem| block.
+\end{abstract}
+
+\tableofcontents
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Introduction}
+
+Suppose a manuscript uses the following set of four references:
+%
+\begin{thebib}
+\item Reference A
+\item Reference B
+\item Reference C
+\item Reference D
+\end{thebib}
+%
+Now if references B and C cover similar or related material,
+they might always be cited together as in ``[\ldots, 2, 3, \ldots]''
+throughout the manuscript.
+In some (physics) journals it is then customary to collect the two
+references into a single reference
+%
+\begin{thebib}
+\item Reference A
+\item Reference B
+\par Reference C
+\item Reference D
+\end{thebib}
+%
+and cite it by ``[\ldots, 2, \ldots]''.
+The package \textsf{collref} automates this process
+by analysing the |\cite| commands
+and identifying blocks of references
+which always appear in conjunction.
+These blocks are collapsed to a single item
+in the bibliography.
+Please note that \textsf{collref} requires the sequence
+of |\bibitem| entries to match with
+the sequence of |\cite| blocks.
+This is most easily achieved through the use of \BibTeX{}
+with any \emph{unsorted} style.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Usage}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{Inclusion.}
+
+To use \textsf{collref} simply add the command
+\begin{center}|\usepackage{collref}|\end{center}
+to the preamble of your \LaTeX{} document.
+No further interaction is required.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{Punctuation.}
+
+\textsf{collref} provide basic punctuation between collected references.
+This is specified through the package options
+|\usepackage[|\textit{opt}|]{collref}|
+where \textit{opt} is one of the following
+\par\vspace{2ex}\noindent%
+\begin{minipage}[t]{0.24\linewidth}
+\centerline{\texttt{nosep} (default)}\par\vspace{1ex}
+no separator:
+\begin{thebib}
+\item A
+\item B C
+\item D
+\end{thebib}
+\end{minipage}%
+\begin{minipage}[t]{0.24\linewidth}
+\centerline{\texttt{parsep}}\par\vspace{1ex}
+separated by |\par|:
+\begin{thebib}
+\item A
+\item B
+\par C
+\item D
+\end{thebib}
+\end{minipage}%
+\begin{minipage}[t]{0.24\linewidth}
+\centerline{\texttt{bulletsep}}\par\vspace{1ex}
+separated by `\textbullet':
+\begin{thebib}
+\item A
+\item B \textbullet{} C
+\item D
+\end{thebib}
+\end{minipage}%
+\begin{minipage}[t]{0.28\linewidth}
+\centerline{\texttt{punctsep}}\par\vspace{1ex}
+punctuated by `;' and '.':
+\begin{thebib}
+\item A .
+\item B ; C .
+\item D .
+\end{thebib}
+cf.\ note on spacing below.
+\end{minipage}%
+\par\vspace{2ex}\noindent
+%
+Alternative separators can be specified in the preamble through the
+command:
+\begin{center}
+|\collectsep[|\textit{punctuation}|]{|\textit{separator}|}|
+\end{center}
+The \textit{separator} appears between references in a block and
+the \textit{punctuation} at the end of a block of references.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{Bibliography Preparation.}
+
+Please note that only such blocks of references can be collapsed
+which appear in the same order for
+|\cite| commands as for |thebibliography|.
+It is recommended to prepare the bibliography through \BibTeX{}
+which does this automatically.
+You must use a style which does not sort the references
+but preserves the order in which they were |\cite|'d,
+e.g.\ \texttt{unsrt.bst}.
+
+Also note that \textsf{collref} suppresses
+new paragraphs invoked by empty lines in the bibliography.
+This allows to use standard \BibTeX{} styles
+which commonly separate reference entries by empty lines.
+If these empty lines would be expanded to new paragraphs,
+\textsf{collref} would not be able to join two references properly.
+Therefore new paragraphs have to be invoked by the
+command |\par|.
+
+If you wish to use the style \texttt{punctsep}, please
+refer to the following note on spacing and punctuation.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{Spacing and Punctuation.}
+
+References are usually punctuated in some way.
+Three of the predefined styles --
+\texttt{nosep}, \texttt{parsep} and \texttt{bulletsep} --
+preserve the punctuation from the bibliography.
+
+The fourth predefined style -- \texttt{punctsep} --
+automatically performs the punctuation.
+This however requires care in the preparation
+of the bibliography:
+The entries have to be provided \emph{without} punctuation.
+Furthermore, there must not be \emph{whitespaces} at the
+end of an entry.
+They can be suppressed with `|%|'
+or |\ignorespaces|
+directly following the last word of the entry.
+See Appendix \ref{sec:sample} for an example.
+The standard \BibTeX{} styles, e.g.\ \texttt{unsrt.bst},
+have to be adjusted to remove the punctuation and whitespaces.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{Control.}
+
+
+The package \textsf{collref} provides one command to control
+which references (not) to collect:
+%
+\begin{center}
+|\nocollect{|\textit{label}|}|
+\end{center}
+%
+It ensures that the label \textit{label} starts
+a new block of references.
+It is not collapsed with earlier references.
+Later references, however, can still be collapsed
+to the end of \textit{label}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{Labels for Blocks of References.}
+
+While \textsf{collref} aims to automatically
+collect similar references into a single block, it is often
+convenient for the author to refer to such blocks
+with a single citation label.
+Standard \TeX/\LaTeX{} commands can be used to define such a block:
+\begin{center}
+|\newcommand{|\textit{$\backslash$blocklabel}|}{|\textit{label1, label2, \ldots}|}|
+\end{center}
+Subsequently this block can be referenced with
+|\cite{|\textit{\ldots, $\backslash$blocklabel, \ldots}|}|.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Information}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Copyright}
+
+\begingroup
+\parskip1ex
+\parindent0pt
+
+Copyright \copyright{} 2003--2018 Niklas Beisert
+
+This work may be distributed and/or modified under the
+conditions of the \LaTeX{} Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in
+ \url{http://www.latex-project.org/lppl.txt}
+and version 1.3 or later is part of all distributions of \LaTeX{}
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Niklas Beisert.
+
+This work consists of the files |README.txt|, |collref.ins| and |collref.dtx|
+as well as the derived files |collref.sty|, |collsamp.tex| and |collref.pdf|.
+
+\endgroup
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Files and Installation}
+
+The package consists of the files
+%
+\begin{center}
+\begin{tabular}{ll}
+ |README.txt| & readme file \\
+ |collref.ins| & installation file \\
+ |collref.dtx| & source file \\
+ |collref.sty| & package file \\
+ |collsamp.tex|& sample file \\
+ |collref.pdf| & manual
+\end{tabular}
+\end{center}
+%
+The distribution consists of the files
+|README.txt|, |collref.ins| and |collref.dtx|.
+%
+\begin{itemize}
+\item
+Run (pdf)\LaTeX{} on |collref.dtx|
+to compile the manual |collref.pdf| (this file).
+\item
+Run \LaTeX{} on |collref.ins| to create the package |collref.sty|
+and the sample |collsamp.tex|.
+Copy the file |collref.sty| to an appropriate directory of your \LaTeX{}
+distribution, e.g.\ \textit{texmf-root}|/tex/latex/collref|.
+Alternatively, you may copy |collref.sty| to the local directories of
+manuscripts for which you wish to use \textsf{collref}.
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Related CTAN Packages}
+
+The objective and some of the implementation
+of the \textsf{collref} package is similar to the CTAN packages
+\href{http://www.ctan.org/pkg/mcite}
+{\textsf{mcite}} by Thorsten Ohl
+and \href{http://www.ctan.org/pkg/mciteplus}
+{\textsf{mciteplus}} by Michael Shell,
+but the functionality is different is several respects:
+%
+\begin{itemize}
+\item
+\textsf{collref} is intended to work transparently:
+\LaTeX{} documents which compile with \textsf{collref}
+should also compile fine without invoking \textsf{collref}
+(obviously without collected references).
+The package decides automatically which references
+can be collapsed,
+no further interaction of the author is required.
+
+\textsf{mcite} and \textsf{mciteplus} leave the
+decision/duty to collapse certain references
+using the modified syntax |\cite{A,*B,*C}|.
+
+\item
+\textsf{mcite} and \textsf{mciteplus} are intended to handle punctuations
+in collapsed references correctly.
+This requires a specialised \BibTeX{} style.
+
+No effort is made in \textsf{collref} in this regard.
+Some minor modification in \texttt{collref.sty}
+together with a modified \BibTeX{} style
+might achieve basic punctuation features similar to \textsf{mcite}.
+\end{itemize}
+%
+The package \textsf{collref} has been tested with other
+CTAN packages concerned with citations and the bibliography:
+%
+\begin{itemize}
+\item
+\textsf{collref} works in conjunction with
+\href{http://www.ctan.org/pkg/cite}{\textsf{cite}}.
+Note that you must load \textsf{cite} \emph{before} \textsf{collref}
+so that the latter can pass the correctly reduced list of
+references down to \textsf{cite}.
+Tested with v5.1 and v5.3 (2010/09/10).
+
+\item
+\textsf{collref} works in conjunction with
+\href{http://www.ctan.org/pkg/hyperref}{\textsf{hyperref}}.
+The two packages can be loaded in any sequence.
+Tested with v6.78s and v6.83m (2012/11/06).
+
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\subsection{Feature Suggestions}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\subsection{Revision History}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v2.0c:} 2018/01/17
+
+\begin{itemize}
+\item
+manual rearranged
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v2.0b:} 2014/08/31
+
+\begin{itemize}
+\item
+updated author addresses
+\item
+minor internal changes
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v2.0:} 2009/09/07
+
+\begin{itemize}
+\item
+proper punctuation added
+(thanks to Oleg Zhirov for suggestion)
+\item
+blocks of references enabled
+(thanks to Oleg Zhirov for suggestion)
+\item
+manual extended
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v1.0:} 2009/06/09
+
+\begin{itemize}
+\item
+streamlined detection of chains
+\item
+manual and installation package added
+\item
+renamed package to \textsf{collref} due to name clash on CTAN
+\item
+first version published on CTAN
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v0.9:}
+
+\begin{itemize}
+\item
+package named \textsf{collect}; unpublished
+\end{itemize}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\appendix
+
+\settowidth\MacroIndent{\rmfamily\scriptsize 000\ }
+\parskip1ex
+\parindent0pt
+
+ \DocInput{collref.dtx}
+
+\end{document}
+%</driver>
+% \fi
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Sample File}\label{sec:sample}
+%\iffalse
+%<*sample>
+%\fi
+%
+% In this section we provide a sample file.
+%
+% \begin{macrocode}
+\documentclass{article}
+
+%%\usepackage{cite}
+\usepackage[punctsep]{collref}
+%%\usepackage{hyperref}
+
+\begin{document}
+
+\def\tworef{c8,c9}
+
+\cite{c1,c2,c3,c4}
+\nocollect{c3}
+\cite{c5,c6,c7,\tworef}
+\cite{c5,c6,c7}
+\cite{c7,\tworef}
+
+\begin{thebibliography}{11}
+\bibitem{c1} reference 1%
+\bibitem{c2} reference 2%
+\bibitem{c3} reference 3%
+\bibitem{c4} reference 4%
+\bibitem{c5} reference 5
+\bibitem{c6} reference 6
+\bibitem{c7} reference 7 %
+\bibitem{c8} reference 8\ignorespaces
+\bibitem{c9} reference 9\ignorespaces
+\end{thebibliography}
+
+\end{document}
+% \end{macrocode}
+%\iffalse
+%</sample>
+%\fi
+% It produces the output:
+% \vspace{2ex}
+%
+% [1, 2] [3, 4, 5] [3, 4] [4, 5]
+%
+% \begin{thebib}
+% \item reference 1; reference 2.
+% \item reference 3; reference 4.
+% \item reference 5 ; reference 6 .
+% \item reference 7 .
+% \item reference 8; reference 9.
+% \end{thebib}
+% Note the different behaviour for references 5, 6 and 7
+% for which trailing whitespaces were not removed.
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Implementation}
+%\iffalse
+%<*package>
+%\fi
+%
+% In this section we describe the package |collref.sty|.
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \paragraph{Internal Lists.}
+%
+% For each bibliography label \textit{label} the package
+% maintains a predecessor |\nc@p@|\textit{label}
+% and a successor |\nc@s@|\textit{label}.
+% These are initially undefined.
+% When a label \textit{label} is first cited these labels
+% are set to the \textit{predecessor} and \textit{successor} labels, respectively,
+% in |\cite{|\textit{\ldots, predecessor, label, successor, \ldots}|}|.
+% An empty |\nc@p@|\textit{label} or |\nc@s@|\textit{label}
+% refers to the beginning and end of a block, respectively.
+% Whenever |\cite| finds conflicting blocks
+% (non-matching predecessors or successors in two |\cite|'s),
+% it terminates the blocks to the maximum common overlap.
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \paragraph{Interface.}
+%
+% The package provides two public commands, described above:
+% \begin{macrocode}
+\newcommand{\collectsep}[2][]{\def\nc@punct{#1}\def\nc@sep{#2}}
+\newcommand{\nocollect}[1]{\nc@breakbefore{#1}\ignorespaces}
+% \end{macrocode}
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \paragraph{Package Options.}
+%
+% The package provides four predefined separators described above:
+% \begin{macrocode}
+\DeclareOption{nosep}{\collectsep{}}
+\DeclareOption{parsep}{\collectsep{\par}}
+\DeclareOption{bulletsep}{\collectsep{\textbullet{} }}
+\DeclareOption{punctsep}{\collectsep[.]{; }}
+\ExecuteOptions{nosep}
+\ProcessOptions
+% \end{macrocode}
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \paragraph{Internal Commands.}
+%
+% Some internal commands for abbreviation:
+% \begin{macrocode}
+\newcommand{\nc@getcsname}[1]{\csname #1\endcsname}
+\newcommand{\nc@setcsname}[2]{\expandafter\xdef\csname #1\endcsname{#2}}
+% \end{macrocode}
+% Command to terminate the chain before a label:
+% The predecessor of the label is terminated.
+% If the predecessor was active, its successor is also terminated.
+% \begin{macrocode}
+\newcommand{\nc@breakbefore}[1]{%
+ \edef\nc@citepred{\@ifundefined{nc@p@#1}{}{\nc@getcsname{nc@p@#1}}}%
+ \ifx\nc@citepred\@empty\else\nc@setcsname{nc@s@\nc@citepred}{}\fi%
+ \nc@setcsname{nc@p@#1}{}%
+}
+% \end{macrocode}
+% Command to terminate the chain after a label. Similar to the above command.
+% \begin{macrocode}
+\newcommand{\nc@breakafter}[1]{%
+ \edef\nc@citesucc{\@ifundefined{nc@s@#1}{}{\nc@getcsname{nc@s@#1}}}%
+ \ifx\nc@citesucc\@empty\else\nc@setcsname{nc@p@\nc@citesucc}{}\fi%
+ \nc@setcsname{nc@s@#1}{}%
+}
+% \end{macrocode}
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \paragraph{Citations.}
+%
+% Hack for |\@citex|:
+% It is assumed that (as in \LaTeXe) |\cite| eventually
+% passes down to |\@citex|.
+% \begin{macrocode}
+\let\nc@old@citex\@citex
+
+\def\@citex[#1]#2{%
+ \let\nc@citecomma\@empty%
+ \let\nc@citestring\@empty%
+ \let\nc@citelast\@empty%
+ \edef\nc@citelist{#2}%
+% \end{macrocode}
+% Main loop to process the arguments of |\cite|.
+% The current label is stored in |\nc@citethis|.
+% \begin{macrocode}
+ \@for\nc@citethis:={\nc@citelist}\do{%
+ \edef\nc@citethis{\expandafter\@firstofone\nc@citethis\@empty}%
+% \end{macrocode}
+% The first entry has no predecessor, terminate the chain.
+% \begin{macrocode}
+ \ifx\nc@citelast\@empty%
+ \nc@breakbefore{\nc@citethis}%
+ \else%
+% \end{macrocode}
+% Non-first entry: Fill undefined successor and predecessors entries
+% with the current chain sequence.
+% \begin{macrocode}
+ \@ifundefined{nc@s@\nc@citelast}%
+ {\nc@setcsname{nc@s@\nc@citelast}{\nc@citethis}}{}%
+ \@ifundefined{nc@p@\nc@citethis}%
+ {\nc@setcsname{nc@p@\nc@citethis}{\nc@citelast}}{}%
+% \end{macrocode}
+% Get the successor and predecessors for the last and current entry, respectively.
+% \begin{macrocode}
+ \edef\nc@citesucc{\nc@getcsname{nc@s@\nc@citelast}}%
+ \edef\nc@citepred{\nc@getcsname{nc@p@\nc@citethis}}%
+% \end{macrocode}
+% In case of mismatching chains: terminate all links.
+% \begin{macrocode}
+ \ifx\nc@citesucc\nc@citethis%
+ \ifx\nc@citepred\nc@citelast%
+ \else%
+ \nc@breakafter{\nc@citelast}%
+ \nc@breakbefore{\nc@citethis}%
+ \fi%
+ \else%
+ \nc@breakafter{\nc@citelast}%
+ \nc@breakbefore{\nc@citethis}%
+ \fi%
+ \fi%
+% \end{macrocode}
+% Get content of |\b@|\textit{label} entry to find out
+% whether the |\bibitem{label}| entry exists.
+% We need to take special care of extended label definitions in \textsf{hyperref}.
+% \begin{macrocode}
+ {\def\hyper@@link[##1]##2##3##4{##4}%
+ \xdef\nc@citelabel{\nc@getcsname{b@\nc@citethis}}}%
+% \end{macrocode}
+% Only add those labels which actually exist to the pass-on string.
+% This removes collaped references from the citation marks.
+% \begin{macrocode}
+ \ifx\nc@citelabel\@empty\else%
+ \edef\nc@citestring{\nc@citestring\nc@citecomma\nc@citethis}%
+ \fi%
+% \end{macrocode}
+% Write |\citation| tag to .aux file in original order.
+% Some duplicate |\citation|'s will be written by
+% the original |\citex| code, but these will have no impact.
+% \begin{macrocode}
+ \if@filesw\immediate\write\@auxout{\string\citation{\nc@citethis}}\fi%
+% \end{macrocode}
+% Continue to next label.
+% \begin{macrocode}
+ \edef\nc@citelast{\nc@citethis}%
+ \def\nc@citecomma{,}%
+ }%
+% \end{macrocode}
+% The last entry has no successor, terminate the chain.
+% \begin{macrocode}
+ \nc@breakafter{\nc@citelast}%
+% \end{macrocode}
+% Pass on to original \LaTeX{} code.
+% \begin{macrocode}
+ \nc@old@citex[#1]{\nc@citestring}%
+}
+% \end{macrocode}
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \paragraph{Bibliography.}
+%
+% Enhance the |thebibliography| environment to
+% a) set the |\nc@biblast| label to something,
+% and empty |\nc@nextpunct|
+% (no predecessor for the first entry),
+% b) convert linebreaks into whitespaces (avoid implicit |\par|'s), and
+% c) put the final punctuation for the last entry.
+%
+% \begin{macrocode}
+\let\nc@old@thebibliography\thebibliography
+\let\nc@old@endthebibliography\endthebibliography
+
+\def\thebibliography{%
+ \xdef\nc@biblast{asldjfhasklfh}%
+ \xdef\nc@nextpunct{}%
+ \catcode`\^^M=10%
+\nc@old@thebibliography}
+
+\def\endthebibliography{%
+ \nc@nextpunct%
+\nc@old@endthebibliography}
+% \end{macrocode}
+
+% Overwrite |\bibitem|:
+% It is assumed that the native \LaTeXe{} code
+% is equivalent but with the \LaTeX{}
+% internals |\@lbibitem| and |\@bibitem|.
+% Some other packages may also redefine |\bibitem|
+% and this will inevitable cause compatibility issues.
+% This implementation is safe with current versions of \textsf{hyperref}.
+% \begin{macrocode}
+\def\bibitem{\@ifnextchar[\nc@lbibitem\nc@bibitem}
+% \end{macrocode}
+%
+% |\nc@noitem| is invoked in place of the original |\@bibitem| or |\@lbibitem|
+% for collapsed references:
+% \begin{macrocode}
+\def\nc@noitem#1{%
+ \if@filesw\immediate\write\@auxout{\string\bibcite{#1}{}}\fi%
+\ignorespaces}
+% \end{macrocode}
+
+% The hack for |\@bibitem|: It checks whether
+% this reference is part of a block.
+% If so, put separator and collect by |\nc@noitem|.
+% Otherwise put punctuation and pass down to |\@bibitem|.
+% Finally let |\nc@biblast| point to current item,
+% and fill the punctuation |\nc@nextpunct| for the next entry.
+% \begin{macrocode}
+\def\nc@bibitem#1{%
+ \edef\nc@bibpred{\@ifundefined{nc@p@#1}{}{\nc@getcsname{nc@p@#1}}}%
+ \ifx\nc@biblast\nc@bibpred\nc@sep\nc@noitem{#1}%
+ \else\nc@nextpunct\@bibitem{#1}\fi%
+ \xdef\nc@biblast{#1}%
+ \xdef\nc@nextpunct{\nc@punct}%
+\ignorespaces}
+% \end{macrocode}
+
+% Similar hack for |@lbibitem|:
+% \begin{macrocode}
+\def\nc@lbibitem[#1]#2{%
+ \edef\nc@bibpred{\@ifundefined{nc@p@#2}{}{\nc@getcsname{nc@p@#2}}}%
+ \ifx\nc@biblast\nc@bibpred\nc@sep\nc@noitem{#2}%
+ \else\nc@nextpunct\@lbibitem[#1]{#2}\fi%
+ \xdef\nc@biblast{#2}%
+ \xdef\nc@nextpunct{\nc@punct}%
+\ignorespaces}
+% \end{macrocode}
+
+%\iffalse
+%</package>
+%\fi
+%
+\endinput