%     C I T E . S T Y
%
%     version 5.5  (Feb 2015)
%
%     Compressed, sorted lists of on-line or superscript numerical citations.
%     see also drftcite.sty (And the stub overcite.sty)
%
%     Copyright (C) 1989-2015 by Donald Arseneau
%     These macros may be freely used, transmitted, reproduced, or modified
%     provided that this notice is left intact.
%
%     Instructions in cite.pdf and follow \endinput.
%  ------------------------------------
% First, ensure that some catcodes have the expected values
\edef\citenum{% temporary def to restore funny codes later
  \catcode\string`\string ` \the\catcode\string`\`
  \catcode\string`\string ' \the\catcode\string`\'
  \catcode\string`\string . \the\catcode\string`\.
  \catcode\string`\string = \the\catcode\string`\=
  \catcode\string`\string _ \the\catcode\string`\_
  \catcode\string`\string : \the\catcode\string`\:}
% set  codes:
\catcode\string`\` 12
\catcode`\' 12
\catcode`\. 12
\catcode`\= 12
\catcode`\_ 8  % This is UNusual
\catcode`\: 12

%   Prepare for optional variations:
%   [ verbose, nospace, space, ref, nosort, noadjust, superscript, nomove ],
%   \citeform,\citeleft,\citeright,\citemid,\citepunct,\citedash
%
%   Set defaults first:

%   [ on the left.  Option [ref] does: [Ref. 12, note]
\providecommand\citeleft{[}

%   ] on the right:
\providecommand\citeright{]}

%   , (comma space) before note
\providecommand\citemid{,\penalty\citemidpenalty\ }

%   , (comma thin-space) between entries; [nospace] eliminates the space
\providecommand\citepunct{,\penalty\citepunctpenalty%
        \hskip.13emplus.1emminus.1em\relax}%

%   -- (endash) designating range of numbers:
% (using \hbox avoids easy \exhyphenpenalty breaks)
\providecommand{\citedash}{\hbox{--}\penalty\citepunctpenalty}

% Default line-breaking penalties. Use \mathchardef instead of count registers
\mathchardef\citeprepenalty=\@highpenalty
\mathchardef\citemidpenalty=\@medpenalty
\mathchardef\citepunctpenalty=\@m

%   Each number left as-is:
\providecommand\citeform{}

%   punctuation characters to move for overcite
\providecommand{\CiteMoveChars}{.,:;}

%   font selection for superscript numbers
\providecommand\OverciteFont{\fontsize\sf@size\baselineskip\selectfont}


%   [verbose] is no-op. Default is to repeat warnings anyway.
%\let\oc@verbo\relax

%----------------------
% \citen uses \@nocite to ignore spaces after commas, and write the aux file
% \citation. \citen then loops over the citation tags, using \@make@cite@list
% to make a sorted list of numbers.  Finally, \citen executes \@citelist to
% compress ranges of numbers and print the list. \citen can be used by itself
% to give citation numbers without the brackets and other formatting; e.g.,
% "See also ref.~\citen{junk}."
%  Make internal version called \@cite@n just in case packages put hooks in
%  \citen
%
\DeclareRobustCommand\citen{\@cite@n}
\def\@cite@n#1{%
 \begingroup
  \let\@safe@activesfalse\@empty
  \@nocite{#1}% ignores spaces, writes to .aux file, returns #1 in \@no@sparg
  \@tempcntb\m@ne    % \@tempcntb tracks highest number
  \let\@celt\delimiter % an unexpandable, but identifiable, token
  \def\@cite@list{}% % empty list to start
  \let\@citea\@empty % no punctuation preceding first
  \@for \@citeb:=\@no@sparg\do{\@make@cite@list}% make a sorted list of numbers
  % After sorted citelist is made, execute it to compress citation ranges.
  \@tempcnta\m@ne    % no previous number
  \mathchardef\@cite@incr\z@ % no previous sequence
  \let\@h@ld\@empty  % nothing held from list yet
  \let\@celt\@compress@cite \@cite@list % output number list with compression
  \@h@ld % output anything held over
 \endgroup
 \@restore@auxhandle
 }

% For each citation, check if it is defined. If so, then extract plain
% value to \@B@citeB (without hyperlink info). Then, 
% If it is a pure number, add it to cite list
% Otherwise, try extracting prefix and suffix characters.
%
\def\@make@cite@list{%
 \expandafter\ifx\csname b@\@citeb\@extra@b@citeb 
      \endcsname\relax % undefined: output ? and warning
    \@citea {\bfseries ?}\let\@citea\citepunct \G@refundefinedtrue
    \@warning {Citation `\@citeb' on page \thepage\space undefined}%
 %% always verbose \oc@verbo \global\@namedef{b@\@citeb\@extra@b@citeb}{?}%
 \else %  defined        
    \@cite@nonhyper@sanitize
    \@addto@cite@list
 \fi}

\def\@nonhyper@@link [#1]#2#3#4{#4}
\def\@cite@nonhyper@sanitize{\begingroup
    \let\hyper@@link\@nonhyper@@link
    \protected@xdef\@B@citeB{\csname b@\@citeb\@extra@b@citeb \endcsname}%
  \endgroup}

\def\@cite@out#1{\citeform{\csname #1\endcsname}}

% Add entry to the list of citations.  This default definition sorts pure
% numbers as well as numbers with other single-character tags.  There 
% is presently no other definition than this default, but features may 
% be added later.
%
\def\@addto@cite@list{% 
 \@cite@posnumtest\@B@citeB
   {\@addnumto@cite@list\@B@citeB}%  a positive number, put in list
   {\@cite@combo@num}% not a pure positive number, test for combo forms
}

% With this \@cite@combo@num we delve into handling of numbers combined
% with non-numeric tags.  The specific command name \@cite@combo@num can
% serve as a hook for redefinition, perhaps to give simple non-sorting 
% for anything not a pure number, or to attempt even more complicated
% sorting, say dictionary sorting of textual citations.  The following
% definition leads down the road of sorting mostly-numbers but with 
% optional single-character prefix and/or suffix. 

\def\@cite@combo@num{\expandafter\@cite@try@combo\@B@citeB\delimiter}

% First of many stages for sorting numbers with prefix/suffix characters.
% Test for a leading token of category letter or other (appropriate for
% all combination types).
%
\def\@cite@try@combo{%
  \@if@printable@char{\@cite@try@prefix}{\@cite@gobbledump@now}}

% First token is good, so test for a character prefix before a number.
% Process first token, either a first digit or a prefix
%
\def\@cite@try@prefix#1{% #1 is first character of citation
  \@cite@posnumtest{#1}% a digit else prefix
   {\@cite@add@letnumD {\z@}#1}% no prefix character (use zero)
   {\@cite@add@letnumC {`#1}}% prefix char; use the char code
}

% Examine character after prefix to ensure it is a number.  First must
% ensure it is a plain character token
%
\def\@cite@add@letnumC#1{\@if@printable@char%
   {\@cite@add@letnumD{#1}}% continue with prefix (perhaps zero)
   {\@cite@gobbledump@now}% else abandon fancy processing and output citation
}

% Save prefix (if any) numerically in \@tempcnta, test next character for being
% a digit, then collect main number
%
\def\@cite@add@letnumD#1#2{% #1 = numeric code for prefix, #2 = next char
  \@tempcnta=#1\multiply\@tempcnta 16384 %
  \@cite@posnumtest{#2}% if next char is a digit, continue with number:
   {\afterassignment\@cite@add@letnumE \advance\@tempcnta #2}%
   {\@cite@gobbledump@now}% No number so just output citation
}

% Have collected number.  Now look for a non-number suffix or separator.
%
\gdef\@cite@add@letnumE{%
  \multiply\@tempcnta\@cclvi
  \@if@printable@char{% a suffix or separator given
      \@cite@add@letnumF
    }{% else, maybe nothing remains
      \ifx\@let@token\delimiter % use number, and remove trailing \delimiter
        \@citeaddcnta \expandafter\@gobble
      \else % non-printable char found, so abandon fancy processing
        \expandafter\@cite@gobbledump@now
      \fi
    }}

%  Have everything up to a suffix or separator character.  Check 
%  following to see which. Three possibilites are (1) nothing =>
%  a suffix; (2) number => separator-number; (3) other => garbage.
%
\def\@cite@add@letnumF#1#2\delimiter{% #1 = suffix/separator #2=rest
  \advance\@tempcnta`#1\relax
  \@cite@posnumtest{#2}{\@cite@add@numsepnum{#2}}% handle as num sep num
    {% else...
     \ifx\delimiter#2\delimiter % nothing left, so #1 is a suffix
       \@citeaddcnta
     \else % some non-number; dump it
       \@cite@dump@now
     \fi
}}

% Handle citation as number separator number.
% Yes, there is a bug that the list 1.1,1.258,1.515 will be compressed as
% 1.1-1.515; so sue me.

\def\@cite@add@numsepnum#1{% #1 = last number
  \ifnum\@tempcnta<262144 % OK numeric range
    \multiply\@tempcnta 4096
    \advance\@tempcnta #1 % num,sep,num have maximum numbers:  1023, 255, 4095
    \@citeaddcnta
  \else % out of range, treat as raw string
    \@cite@dump@now
  \fi}

% This is our bail-out when the citation cannot be processed as
% [prefix]number[suffix] or number[sep]number: it outputs the citation 
% immediately (unsorted) and consumes tokens to the \delimiter tag used 
% as an end-marker
%
\def\@cite@gobbledump@now#1\delimiter{\@cite@dump@now}%

\def\@cite@dump@now{%
  \@citea \@cite@out{b@\@citeb\@extra@b@citeb}\let\@citea\citepunct}

% add an entry to the sorted list, using its sort-number \@tempcnta, and
% also saving the plain-text value \@B@citeB as well as the csname 
% b@\@citeb\@extra@b@citeb. (The \@B@citeB is actually not used, unless 
% somebody extends the definitions.)
\def\@citeaddcnta{%
   \ifnum \@tempcnta>\@tempcntb % new highest, add to end (efficiently)
      \edef\@cite@list{\@cite@list 
        \@celt{\number\@tempcnta}{\@B@citeB}{b@\@citeb\@extra@b@citeb}}%
      \@tempcntb\@tempcnta
   \else % other sortable value: insert appropriately
      \edef\@cite@list{\expandafter\@sort@celt\@cite@list \@gobble.\@gobble.}%
   \fi
  }

% add pure numeric entry to cite list, with sorting
\def\@addnumto@cite@list#1{%
   \@tempcnta#1\relax
   \multiply\@tempcnta\@cclvi
   \@citeaddcnta}

% \@sort@celt inserts number (\@tempcnta) into list of \@celt{num}{text}{tag} 
% (#1{#2}{#3}{#4})
% \@celt must not be expandable, and the arguments must not be fragile. 
% List should end with four vanishing tokens.
%
\def\@sort@celt#1#2#3#4{\ifx \@celt #1% parameters are \@celt{num}{text}{tag}
   \ifnum #2<\@tempcnta % number goes later in list
      \@celt{#2}{#3}{#4}%
      \expandafter\expandafter\expandafter\@sort@celt % continue
   \else % number goes here
      \@celt{\number\@tempcnta}{\@B@citeB}{b@\@citeb\@extra@b@citeb}%
      \@celt{#2}{#3}{#4}% stop comparing
\fi\fi}

% Check if each number follows previous and can be put in a range. 
% Since there are suffix characters allowed, there are two kinds of 
% ranges: ranges of consecutive pure numbers with no (or same) 
% suffix, or ranges of the same number with consecutive suffix
% characters.
%
\def\@compress@cite#1#2#3{%% This is executed for each number
  \ifnum\@cite@incr=\z@   % no consecutives pending. Try both types of sequence
    \advance\@tempcnta\@cclvi % Now \@tempcnta has incremented number
    \ifnum #1=\@tempcnta    % Start a sequence of consecutive numbers
       \expandafter\def\expandafter\@h@ld\expandafter{\@citea\@cite@out{#3}}%
       \mathchardef\@cite@incr=\@cclvi
    \else % next try increment of suffix
       \advance\@tempcnta-\@cclv % Now \@tempcnta has incremented suffix
       \ifnum #1=\@tempcnta      % Start a sequence of suffix increments
         \expandafter\def\expandafter\@h@ld\expandafter{\@citea\@cite@out{#3}}%
         \mathchardef\@cite@incr=\@ne
       \else % it is no type of sequence -- emit number (nothing is held)
         \@citea \@cite@out{#3}%
       \fi
    \fi
  \else % a sequence is running
    \advance\@tempcnta\@cite@incr % Now \@tempcnta is next in sequence
    \ifnum #1=\@tempcnta   % Number follows previous--hold on to it
       \def\@h@ld{\citedash \@cite@out{#3}}%
    \else   %  non-successor -- dump what's held and do this one
       \@h@ld \@citea \@cite@out{#3}%
       \let\@h@ld\@empty
       \mathchardef\@cite@incr=\z@
    \fi
  \fi
  \@tempcnta#1\let\@citea\citepunct
}

% Ordinary on-line \cite command

\DeclareRobustCommand{\cite}{%
  \@ifnextchar[{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}

% Do \cite command on line.
%
\def\@citex[#1]#2{\@cite{\@cite@n{#2}}{#1}}

\def\@cite#1#2{\leavevmode \cite@adjust
  \citeleft{#1\if@tempswa\@safe@activesfalse\citemid{#2}\fi
  \spacefactor\@m % punctuation in note doesn't affect outside
  }\citeright
 \@restore@auxhandle}

%  Put a penalty before the citation, and adjust the spacing: if no space
%  already or if there is extra space due to some punctuation, then change
%  to one inter-word space.
%
\def\cite@adjust{\begingroup%
  \@tempskipa\lastskip \edef\@tempa{\the\@tempskipa}\unskip
  \ifnum\lastpenalty=\z@ \penalty\citeprepenalty \fi
  \ifx\@tempa\@zero@skip \spacefactor1001 \fi % if no space before, set flag
  \ifnum\spacefactor>\@m \ \else \hskip\@tempskipa \fi
  \endgroup}

\edef\@zero@skip{\the\z@skip}

% \nocite: This is changed to ignore *ALL* spaces and be robust.  The
% parameter list, with spaces removed, is `returned' in \@no@sparg, which
% is used by \@cite@n (\citen).
%
\DeclareRobustCommand\nocite[1]{%
 \@bsphack \@nocite{#1}%
 \@for \@citeb:=\@no@sparg\do{\@ifundefined{b@\@citeb\@extra@b@citeb}%
    {\G@refundefinedtrue\@warning{Citation `\@citeb' undefined}%
    %%\oc@verbo \global\@namedef{b@\@citeb\@extra@b@citeb}{?}
    }{}}%
 \@esphack}

\def\@nocite#1{\begingroup\let\protect\string% normalize active chars
 \xdef\@no@sparg{\expandafter\@cite@ignsp#1,\: ,\:}% remove spaces
 \if@filesw \immediate\write\@newciteauxhandle % =\@auxout, except with multibib
    {\string\citation {\@no@sparg}}\fi
 \endgroup}

% remove spaces before and after commas. One level of braces is also
% stripped, so an item {a,b} is changed to two a and b.
%
\def\@cite@ignsp#1 ,#2{\ifx\:#2\@empty 
  \expandafter\@cite@ignsp@\romannumeral-`\:\else
  \expandafter\@cite@ignsp \fi #1,#2}
\def\@cite@ignsp@#1,#2{#1\ifx\:#2\@empty\expandafter\@gobblethree
   \else,\expandafter\@cite@ignsp@\fi #2}

\long\def\@gobblethree #1#2#3{}

% \@if@fillglue{glue}{true}{false}
\begingroup
 \catcode`F=12 \catcode`I=12\catcode`L=12
 \lowercase{\endgroup
 \def\@if@fillglue#1{%
  \begingroup \skip@#1\relax
  \expandafter\endgroup\expandafter 
  \@is@fil@ \the\skip@ \relax\@firstoftwo FIL\relax\@secondoftwo\@nil}
 \def\@is@fil@ #1FIL#2\relax#3#4\@nil{#3}
}

% Test if next token is a char of "printable" categories other or letter or 
% active.  Syntax:
%  \@if@printable@char {do if printable}{do if not printable}<char>
%
\def\@if@printable@char#1#2{%
  \def\reserved@a{#1}%
  \def\reserved@b{#2}%
  \futurelet\@let@token\@test@print@char
}

% Note side-effect of redefining \reserved@a and \reserved@b
\def\@test@print@char{%
 \ifnum 
    \ifcat\noexpand\@let@token A1\fi
    \ifcat\noexpand\@let@token 11\fi
    \ifcat\noexpand\@let@token \noexpand~1\fi%
  0>\z@
    \expandafter\reserved@a \else
    \expandafter\reserved@b \fi
}

% Test for a pure positive number: {possible number}{true}{false}
\def\@cite@posnumtest#1{%
  \ifcat _\ifnum\z@<0#1_\else A\fi
    \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi
}

\let\nocitecount\relax  % in case \nocitecount was used for drftcite

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                     option processing
\def\oc@movep{YY}% default Yes move
%
\DeclareOption{verbose}{}% Unused now. Was \def\oc@verbo#1#2#3#4{}
\DeclareOption{nospace}{\def\citepunct{,\penalty\citepunctpenalty}}
\DeclareOption{space}{\def\citepunct{,\penalty\citepunctpenalty\ }}
\DeclareOption{nobreak}{% no line-breaks
 \mathchardef\citeprepenalty=\@M
 \mathchardef\citemidpenalty=\@M
 \mathchardef\citepunctpenalty=\@M
}
\DeclareOption{ref}{\def\citeleft{[Ref.\penalty\@M\ }}
%  To disable sorting [nosort], the redefinition depends on whether [nocompress]
%  was also selected, so just set a flag first.
\DeclareOption{nosort}{\let\@citeaddcnta\@empty}
\DeclareOption{sort}{}% default!
%  Likewise set flag for [nocompress]
\DeclareOption{nocompress}{\let\@compress@cite\@empty}
\DeclareOption{compress}{}% default
\DeclareOption{nomove}{\def\oc@movep{no}}% Flag for later definition
\DeclareOption{move}{\def\oc@movep{YY}}% default
\DeclareOption{super}{\ExecuteOptions{superscript}}
\DeclareOption{superscript}{\let\@citess\cite}% Just a flag redefined below
\DeclareOption{noadjust}{\let\cite@adjust\@empty}% Don't change spaces
\DeclareOption{adjust}{}% adjust space before [ ]
\DeclareOption{biblabel}{\let\@biblabel\def}% see below
\ProvidesPackage{cite}[2015/02/27 \space v 5.5]
\ProcessOptions

\ifx\@biblabel\def % [biblabel] option 
  \ifx\@citess\cite % [superscript] option
    \def\@biblabel#1{\@citess{#1}\kern-\labelsep\,}
  \else % normal
    \def\@biblabel#1{\citeleft{#1}\citeright}
  \fi
\fi

% Process [superscript] option, and [nomove].

\ifx\@citess\cite 

%  Superscript cite, \cite chooses superscript or on-line-with-note
%
\DeclareRobustCommand{\cite}{%
    \@ifnextchar[{\@tempswatrue\@citex}{\@tempswafalse\@citew}}

%  Superscript cite, with no optional note.  Check for punctuation first.
\def\@citew#1{\begingroup \leavevmode
  \@if@fillglue \lastskip \relax \unskip
  \def\@tempa{\@tempcnta\spacefactor
     \/% this allows the last word to be hyphenated, and it looks better.
     \@citess{\@cite@n{#1}}\spacefactor\@tempcnta
     \endgroup \@restore@auxhandle}%
  \oc@movep\relax}% check for following punctuation (depending on options)

%  \@citess defines the formatting with superscripts and no brackets.
%  HOWEVER, trailing punctuation has already been moved over.  The
%  format for cites with note is given by \@cite.  Redefine \@cite and/
%  or \@citex to get different appearance.  I don't use \textsuperscript
%  because it is defined BADLY in compatibility mode.

\def\@citess#1{\mbox{$\m@th^{\hbox{\OverciteFont{#1}}}$}}

\if \oc@movep %  Move citation past trailing punctuation; [move] is default

\def\oc@movep#1{\futurelet\@tempb\@citey}
%
\def\@citey{\let\@tempc\@tempa
   % Watch for double periods and suppress them
   \ifx\@tempb.\ifnum\spacefactor<\sfcode`.\else
     \@citeundouble
   \fi\fi
   % Move other punctuation
   \expandafter\@citepc\CiteMoveChars\delimiter
   \@tempc}%

% This is in a separate macro in case the next "character" (token)
% is \if or \fi, etc.
\def\@citeundouble{% Suppress doubling of periods
   \let\@tempb\relax \let\@tempc\oc@movep
}

\def\@citepc#1{%
   \ifx\@tempb#1\@empty #1\let\@tempc\oc@movep \fi
   \ifx\delimiter#1\else \expandafter\@citepc\fi}

%  Set detectable sfcodes when \frenchspacing
\mathchardef\cite@mi1001 % 
\g@addto@macro\frenchspacing
    {\sfcode`\.\cite@mi \sfcode`\?\cite@mi \sfcode`\!\cite@mi }%
\AtBeginDocument {%
  \ifnum\sfcode`\.<1002 \frenchspacing  \let\normalsfcodes\frenchspacing \fi
}% performed after \normalsfcodes defined

\else % [nomove] option:

  \def\oc@movep{\@tempa}
  \let\@citey\relax

\fi % end of move/nomove options
%
\fi %  end [superscript] option processing
%
%  make redefinitions to handle [nosort] [nocompress] and their combination
\ifx\@compress@cite\@empty
   \ifx\@citeaddcnta\@empty
      % [nosort,nocompress] -- short-circuit much processing
      \def\@addto@cite@list{\@cite@dump@now}
   \else
      % [sort,nocompress]
      \def\@compress@cite#1#2#3{%  % This is executed for each number
        \@h@ld \@citea \@cite@out{#3}%
        \let\@h@ld\@empty \let\@citea\citepunct
      }
   \fi
\else %  
   \ifx\@citeaddcnta\@empty % [nosort,compress]
     %  nosort: always add to end of list, but still calculate
     %  sort-order number (\@tempcnta) because it may be used for
     %  collapsing consecutive numbers.
     \def\@citeaddcnta{%
       \edef\@cite@list{\@cite@list 
        \@celt{\number\@tempcnta}{\@B@citeB}{b@\@citeb\@extra@b@citeb}}%
     }
   \fi
\fi

%  Compatability with chapterbib (see use of \@extra@b@citeb above and in chapterbib)
\@ifundefined{@extra@b@citeb}{\def\@extra@b@citeb{}}{}

%  Compatability with multibib (see use of \@newciteauxhandle) (Yes, this is
%  overly messy, but I asked for it...  I can't have multibib putting junk after 
%  the cite command because it hides following punctuation, but then I have
%  to restore the ordinary meaning of \@newciteauxhandle = \@auxout.)
\providecommand\@newciteauxhandle{\@auxout}
\AtBeginDocument{\@ifundefined{newcites}{\global\let\@restore@auxhandle\relax}{}}
\def\@restore@auxhandle{\def\@newciteauxhandle{\@auxout}}

%  compatability with backref: prevent it from redefining \@citex
%  in the wrong way (ignoring \@citew and \citen.  I install hook in
%  \@nocite so it applies to \cite, \citen, and \nocite.
%
\AtBeginDocument{\@ifundefined{Hy@backout}{}{%
  \@ifundefined{BRorg@citex}{}{\global\let\@citex\BRorg@citex}%
  \global\let\BR@citex\@citex
  \global\let\@citeorg@nocite\@nocite % use my own hook -> into \@nocite
  \gdef\@nocite#1{\@citeorg@nocite{#1}\Hy@backout{#1}}%
}}

%  compatability with babel:  Prevent it from redefining \@citex
\@ifundefined{@safe@activesfalse}{\let\@safe@activesfalse\relax}{}
\@ifundefined{bbl@cite@choice}{}{\@ifundefined{org@@citex}{}%
  {\let\org@@citex\@citex}}% Prevent stomping by babel

\citenum % execute restore-catcodes

% Aliases:
\def\citenum{\citen}
\def\citeonline{\citen}

\endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


                   CITE.STY

Modify LaTeX's normal citation mechanism for improved handling of numeric
citations, behaving as follows:

o Put a comma and a small space between each citation number, allowing 
  line breaks with penalty.

o Compress lists of three or more consecutive numbers, or similar, to a 
  range which can be split, with difficulty, after the dash.  

o Sort citations into ascending order.  

o Sortable and compressible citations are numeric like [5-8]; or numbers 
  with prefix and/or suffix characters like [18a-18c,19] or [A2,Q1,Q3-Q5];
  or two numbers with separator like [1.9-1.12,2.2].

o Allow, but discourage, line breaks within the group of citations (after
  dashes, and after punctuation). 

o Adjust spacing before citation.

o All breaks can be forbidden with the [nobreak] package option.

o With package option [superscript] (or [super] for short), display citations
  as superscripts (unless they have optional notes, causing them to be printed 
  on-line with brackets).  Superscripted citations use THE SAME INPUT FORMAT 
  as ordinary citations; this style will ignore spaces before the \cite command
  and move trailing punctuation before the superscript citation. Doubling of 
  periods (.., ?., !.) is checked for and suppressed. 

o Define \citen to get just the numbers without the brackets or superscript
  and extra formatting.  Aliases are \citenum and \citeonline.

There are several package options for \usepackage{cite}.

 [superscript] use superscrpts for cites without optional notes
 [super]       alias for [superscript] (like natbib)
 [nospace]     eliminates the spaces after commas in the number list
 [space]       uses a full inter-word space after the commas
 [nobreak]     eliminate all line-breaks
 [nosort]      prevents sorting of the numbers (default is to sort, and the...
 [sort]        option is provided for completeness).
 [nomove]      prevents moving the superscript cite after punctuation.
 [move]        is the default
 [noadjust]    disables `smart' handling of space before a cite
 [adjust]      is the default
 [nocompress]  inhibit compression of consecutive numbers into ranges
 [compress]    is the default
 [ref]         uses the format "[Ref.~12, given note]" (useful with [super])
 [biblabel]    define the bibliography label to match \cite

If your citations are not numeric, then you should probably not use 
cite.sty, but if you must, then at least use the [nosort,nocompress] 
options.

See more detailed instructions in cite.pdf (cite.ltx). 


% Version 1991: Ignore spaces after commas in the parameter list. Move most of
% \citen into \@cmpresscites for speed. Give the proper \spacefactor afterwards.
% Version 1992: make \citepunct hold the punctuation between numbers (for ease
% of changing).  Add \/ to allow hyphenation of previous word, and look better
% in italics.
% 1992a: Make it work with NFSS.  (Thank you C. Hamlin and Rainer Schoepf)
%
% Version 3.0 (1992):  Rewrite, including sorting.  Make entries like "4th"
% be treated properly as text.
% 3.1: Bug fixes (and Joerg-Martin Schwarz also convinced me to use \ifcat)
% 3.2: NFSS support was wrong--added \reset@font.  Suppress repetitions of
%      warnings.  Include \@extra@b@citeb hook.
% 3.3: Handle LaTeX2e options. Introduce various customization hooks.
% 3.4: Heuristics to avoid removing \hspace glue before on-line \cite.
%      Make \nocite ignore spaces in list, simplify. Aliases for \citen.
%      Compatability with amsmath (which defines \over).
% 3.5: Replace \reset@font with \selectfont so italics are preserved
%      Include \G@refundefinedtrue.  Fix cite-with-note bug (Lars Engebretsen).
% 3.6: Add nosort option.
% 3.7: Add nomove option; catcode preservation and global \@no@sparg for
%      french.sty; warnings in \nocite.
% 3.8: \citedash hook, fix token look-ahead (Heiko Selber), noadjust, babel.
% 3.9: More babel-compatibility hacks. Punctuation move with \frencspacing.
% 4.0: Combine overcite with cite: [superscript] option.  Also add [nocompress]
%      option and \CiteMoveChars; multibib hooks.
% 4.01 \bf -> \bfseries
% 4.02 Bury undouble action in a separate macro to avoid extra \fi error.
% 5.0  Hyperref and backref compatability! Penalty parameters and [nobreak]. 
%      Letter prefix and suffix sorting! Stop suppressing multiple warnings.
% 5.1  Fix a missing "b@" (disappearing named cites), fix nosort
% 5.2  More robust treatment of non-numbers
% 5.3  Handle sort/compress of compound citation numbers (number by chapter)
%      such as 3.18 or 5-3.  Note that these compounds cannot have prefix or
%      suffix letters (not enough bits in the maximum TeX number).
% 5.4  Only ignore spaces at begin and end of tag (LaTeX ignores at begin)
% 5.5  Improve handling of \frenchspacing. Option rearrangements.
%
% TODO: other sorting, like dictionary or roman numeral
% TODO: create special "final punct" that could be ", and " and likewise
%       a "single punct" that could be " and " 
%
% Send problem reports to asnd@triumf.ca

Test file integrity:  ASCII 32-57, 58-126:  !"#$%&'()*+,-./0123456789
:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~