You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
665 lines
26 KiB
665 lines
26 KiB
% 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{|}~
|
|
|