tcc-latex/abntex2cite.sty

1350 lines
40 KiB
TeX

%% abntex2cite.sty, v<VERSION> laurocesar
%% Copyright 2012-<COPYRIGHT_YEAR> by abnTeX2 group at https://www.abntex.net.br/
%%
%% 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 the abnTeX2 team, led
%% by Lauro César Araujo. Further information are available on
%% https://www.abntex.net.br/
%%
%% Creator and original mantainer: Gerald Weber <gweber@codigolivre.org.br>
%% Copyright 2001-2002 by the abnTeX group at http://abntex.codigolivre.org.br
% How this package is organized:
% ------------------------------
% - Implementing `search for substring'
% - \AfterTheBibliography{} hook
% - Options declaration (search for substring needed here)
% alf, num (default)
% alfantigo, experimental (default)
% biblabel-on-margin
% sem-bibtex (apply settings without count with code in .bbl)
% no-abnt-option-file (in case one defines its own options file)
% recuo (then makes bibitem indent 1.8em) (default: NO indentation)
% recuo=<length> (sets custom indentation)
% indent is an alias for recuo (indent or indent=<length>)
% versalete author in alf mode as with smallcaps
% other options are considered "\citeoption's" (mechanism includes a
% list that stores non defined options, and in \AtBeginDocument,
% \citeoption acts over this list)
% - allocing auxiliar variables
% - \citeoption
% Similar to \nocite, but does not complain about obviously not defined
% citations. Intented to access options of abnTeX's bibtex styles.
% - \bibliography
% extra care to auto include abnt-options as bibliography database (if
% needed)
% - \bibliographystyle
% if none is given, the style correspondent to the package style in
% use (alf or num) is given.
% - Style customization
% \authorcapstyle, \authorstyle, \yearstyle, \optionaltextstyle
% (detail: \authorcapstyle's default setting uses \smaller from relsize
% package, but only if package is present.)
% - \bibitem
% defines action of \bibitem by its subcommands. Comatibility with old
% abnt-alf is present.
% - \hiddenbibitem
% creates an empty bibliography entry buts creates all labels.
% - \abntrefinfo
% From the creation of abntcite, options are present as a separated
% command. This enables compatibility with any bibtex style.
%
% - \cite
% This command depends on if the style is alf or num
% If alf, then \cite produces (<explicit (capital)>, <year>)
% If num, then \cite produces a superscript with [<implicit (lowercase)>]
% - \citeonline
% This command depends on if the style is alf or num
% If alf, \citeonline produces <implicit (lowercase)>, (<year>)
% If num, \citeonline then produces <implicit (lowercase)>
% - \citeyear
% Produces <year>
% - \citeauthor
% Produces <explicit (capital) author>
% - \citeauthoronline
% Produces <implicit (lowercase) author>
% - \apud[comments]{First}{Second}
% Produces a double citation: (FIRST, YEAR apud SECOND, YEAR<, comments>)
% - \apudonline[comments]{First]{Second]
% Produces a double citation: First (apud SECOND, YEAR<, comments>)
% - \Idem[comments]{Author}
% Produces: Id., YEAR<, comments>
% - \Ibidem[comments]{Author}
% Produces: Ibid.<, comments>
% - \opcit[comments]{Author}
% Produces: AUTHOR, op. cit.<, comments>
% - \cfcite[comments]{Author}
% Produces: Cf. AUTHOR, YEAR<, comments>
%
% - implementing `recuo' (bibindent style)
% - Macros for output sorted and compressed numerical citations
% [9,2,3,1,4,11,7,10] becames [1--4,7,9--11]
\NeedsTeXFormat{LaTeX2e}
%\input{cvs-id.def}
%\CVSExtract$Id: abntcite.sty,v 1.26 2003/10/13 09:40:41 gweber Exp $
%\CVSPackage{abntcite}{\space Chamadas de referencias no texto (NBR10520)} %substitui \ProvidesPackage (replaces \ProvidesPackage)
\ProvidesPackage{abntex2cite}[<CURRENT_DATE> v<VERSION> abnTeX2]
\RequirePackage{ifthen}
\RequirePackage{calc}
\RequirePackage{abntex2abrev}
\RequirePackage{setspace}
\RequirePackage{url} %*****
%%%%%% Options Declaration %%%%%%
%----------------------------------------------------------------
% Extracted from substr.sty (2000-06-15)
%----------------------------------------------------------------
% Copyright 2000 Harald Harders <h.harders@tu-bs.de>
% Look at www.ctan.org for original package
%
% Commands:
%
% \IfSubStringInString{substring}{string}{true part}{false part}
% This command searches <substring> in <string> and executes the
% <true part> if it is and else the <else part>
% expands the first and second argument with
% \protected@edef and calls #3 with them:
\ifx \su@ExpandTwoArgs\undefined
\newcommand{\su@ExpandTwoArgs}[3]{%
\protected@edef\su@SubString{#1}%
\protected@edef\su@String{#2}%
\expandafter\expandafter\expandafter#3%
\expandafter\expandafter\expandafter{%
\expandafter\su@SubString\expandafter
}\expandafter{\su@String}%
}
\fi
%%
%% tests if #1 in #2. If yes execute #3, else #4
\ifx \IfSubStringInString\undefined
\newcommand*{\IfSubStringInString}[2]{%
\su@ExpandTwoArgs{#1}{#2}\su@IfSubStringInString
}
\fi
%%
\ifx \su@IfSubStringInString\undefined
\newcommand*{\su@IfSubStringInString}[2]{%
\def\su@compare##1#1##2\@nil{%
\def\su@param{##2}%
\ifx\su@param\@empty
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
\fi
}%
\su@compare#2#1\@nil
}
\fi
%----------------------------------------------------------------
% alf, num: main options
\newboolean{ABCItextondemand}
\DeclareOption{alf}{\def\AbntCitetype{alf}\setboolean{ABCItextondemand}{true}}
\DeclareOption{num}{\def\AbntCitetype{num}}
\ExecuteOptions{num}
% references on page foot
\newboolean{ABCIfoot}
\DeclareOption{foot}{\setboolean{ABCIfoot}{true}%
\setboolean{ABCItextondemand}{false}}
\DeclareOption{not-foot}{\setboolean{ABCIfoot}{false}%
\setboolean{ABCItextondemand}{true}}
\ExecuteOptions{not-foot}
% cite text on demand (defaults depends on foot or not-foot)
% (also recall that options are executed in order of definition at
% \ProcessOptions)
\DeclareOption{load-text-on-demand}{\setboolean{ABCItextondemand}{true}}
\DeclareOption{load-text}{\setboolean{ABCItextondemand}{false}}
% compatibility with old abnt-alf.bst
\newboolean{ABCIcompoldalf}
\DeclareOption{alfantigo}{\setboolean{ABCIcompoldalf}{true}}
\DeclareOption{experimental}{\setboolean{ABCIcompoldalf}{false}}
\ExecuteOptions{experimental}
% biblabel-on-margin
\newboolean{ABCIbibjustif}
\DeclareOption{bibjustif}{\setboolean{ABCIbibjustif}{true}}
\DeclareOption{bibleftalign}{\setboolean{ABCIbibjustif}{false}}
\ExecuteOptions{bibleftalign}
% biblabel-on-margin
\newboolean{ABCIbiblabelonmargin}
\DeclareOption{biblabel-on-margin}
{\setboolean{ABCIbiblabelonmargin}{true}}
\DeclareOption{biblabel-not-on-margin}
{\setboolean{ABCIbiblabelonmargin}{false}}
\ExecuteOptions{biblabel-not-on-margin}
% \bibliography includes abnt-options automatically unless next option is used
\newboolean{ABCIauto-abntoptions}
\DeclareOption{abnt-option-file}{\setboolean{ABCIauto-abntoptions}{true}}
\DeclareOption{no-abnt-option-file}{\setboolean{ABCIauto-abntoptions}{false}}
\ExecuteOptions{abnt-option-file}
% recuo : compatibility with old norms
\ifx \bibindent\undefined
\newlength{\bibindent}
\fi
\setlength{\bibindent}{0em}
\DeclareOption{recuo}{\setlength{\bibindent}{1.8em}}
% indent : an alias to recuo
\DeclareOption{indent}{\setlength{\bibindent}{1.8em}}
\newcommand{\citebrackets}[2]{\def\citeopen{#1}\def\citeclose{#2}}
\newcommand{\setcitebrackets}{\citebrackets()}
% 10520:2002 now defines only two numerical styles
\newboolean{ABNTovercite}
\DeclareOption{overcite}{\setboolean{ABNTovercite}{true}}
\DeclareOption{inlinecite}{\setboolean{ABNTovercite}{false}}
% \authorcapstyle em versalete (smallcaps) como opcional
\newboolean{ABNTversalete}
\setboolean{ABNTversalete}{false}
\DeclareOption{versalete}{\setboolean{ABNTversalete}{true}}
% 10520:2002 does not allow (XX) or [XX] for superscript cites
\newboolean{ABNTstrictnumformat}
% Incorpora o arquivo nbr10520-2002.def do abntex1
% A norma NBR 10520:2002 removeu as opções [] e () para citações
% em superscrito
\ifx\AbntCitetype\AbntCitetypeALF
\else
\renewcommand{\setcitebrackets}{
\ifthenelse{\boolean{ABNTovercite}}{\citebrackets{}{}}{\citebrackets()}}
\fi
%
% Allocing variables
%
% used for \@biblabel in num
\newlength{\minimumbiblabelwidth}
\newlength{\ABCIauxlen}
% auxiliar counters used in `sort and group' mechanism
\newcounter{ABCIaux}
\newcounter{ABCImax}
% Here I define a LaTeX list that will contain all options not defined
% before.
%
% A LaTeX list is a command containing a comma separated list of
% itens. The list is processed by command \@for, as in \citeoption.
\def\citeoptionlist{}
% This command adds a string to the list.
\newcommand{\addtociteoptionlist}[1]{
\ifthenelse{\equal{\citeoptionlist}{}}
{\edef\citeoptionlist{#1}}
{\edef\citeoptionlist{\citeoptionlist,#1}}
}
% suporting options in a keyval style
% recuo=<length> gives indentation of \bibitem
% other options: passed thought \citeoption (stored now in \citeoptionlist
% and after (in \AtBeginDocument hook) \citeoption will act on it)
% To grab 6 letters. (recuo=)
\newcommand{\grabsix}[6]{}
% To grab 7 letters. (indent=)
\newcommand{\grabseven}[7]{}
\DeclareOption{abnt-substyle=COPPE}
{\newcommand{\bibtextitlecommand}[2]{``#2''}%
\addtociteoptionlist{abnt-substyle=COPPE}}
\DeclareOption*{
\IfSubStringInString{recuo=}{\CurrentOption}
{\setlength{\bibindent}{\expandafter\grabsix\CurrentOption}}
{\IfSubStringInString{indent=}{\CurrentOption}
{\setlength{\bibindent}{\expandafter\grabseven\CurrentOption}}
{\addtociteoptionlist{\CurrentOption}}}
}
\provideboolean{ABNThyperref}
\@ifpackageloaded{hyperref}{%
%\addtociteoptionlist{abnt-url-package=hyperref}
\setboolean{ABNThyperref}{true}
}{\setboolean{ABNThyperref}{false}}
\@ifpackageloaded{url}{%
\addtociteoptionlist{abnt-url-package=url}
\def\UrlLeft{<}
\def\UrlRight{>}
\urlstyle{same}}
\provideboolean{ABNTbackref} %By AWSS
\@ifpackageloaded{backref}{% %By AWSS
\setboolean{ABNTbackref}{true} %By AWSS
}{\setboolean{ABNTbackref}{false}} %By AWSS
\ProcessOptions
% Check if not running pdf/xe/lua/htlatex, then load breakurl
% From http://tex.stackexchange.com/a/53943
\RequirePackage{ifpdf,ifxetex}
\edef\texforht{TT\noexpand\fi
\@ifpackageloaded{tex4ht}
{\noexpand\iftrue}
{\noexpand\iffalse}}
\ifpdf
\else
\ifxetex
\else
\if\texforht
\else
\@ifpackageloaded{hyperref}
{\RequirePackage{breakurl}}{}
\fi% texforht
\fi% xetex
\fi% pdftex
% really foot?
\ifthenelse{\boolean{ABCIfoot}\and\equal{\AbntCitetype}{num}}
{\setboolean{ABCIfoot}{true}}
{\setboolean{ABCIfoot}{false}}
% Now, after all options are processed, \citeoption process the list of
% options given as package options.
%
\ifthenelse{\equal{\citeoptionlist}{}}
{}
{\AtBeginDocument{\citeoption{\citeoptionlist}}}
% \citeoption - equal to \nocite (I copied source from \nocite)
% but not complains about this option be obviously undefined
\newboolean{ABCIciteoptionwasused}
\setboolean{ABCIciteoptionwasused}{false}
\def\citeoption#1{\@bsphack
\@for\@citekey:=#1\do{%
% next line eliminates white space before citation name
\edef\@citekey{\expandafter\@firstofone\@citekey}%
\if@filesw\immediate\write\@auxout{\string\citation{\@citekey}}\fi
}%
\@esphack%
\setboolean{ABCIciteoptionwasused}{true}%
}
%
% \bibliography{list of files .bib to be processed by bibTeX}
%
% I had to redefine this command such that abnt-options.bib is
% automatically used in case that some \citeoption was given as package
% option. An entry
% \bibliography{abnt-options,abnt-options,..}
% produces an error in bibTeX. So I had to check if user already
% includes abnt-options by (him/her)self.
%
% implementation:
%
% \citeoption was used?
% If YES, (abnt-options must be given to bibtex!)
% checks for abnt-options into parameter given to \bibliography
% if present
% user have included, so I don't add it once more
% not present
% I add necessary abnt-options
% If NO
% no changes to \bibliography
\def\bibliography#1{% ****
{
\ifx \SingleSpacing\undefined
\singlespacing
\else
\SingleSpacing
\fi
%
\ifthenelse{\boolean{ABCIciteoptionwasused}
\and\boolean{ABCIauto-abntoptions}}
{
% this system of checking is not good...
\IfSubStringInString{abntex2-options}{#1}
{\if@filesw\immediate\write\@auxout{\string\bibdata{#1}}\fi}
{\if@filesw\immediate\write\@auxout{\string\bibdata{abntex2-options,#1}}\fi}
}
{
\if@filesw
\immediate\write\@auxout{\string\bibdata{#1}}%
\fi
}
\@input@{\jobname.bbl}
}
}
%
% The next piece of code looks if bibtexstyle is used or not, and if not,
% includes the respective style from the abntcite mode (alf or num)
\newboolean{ABCIbibtexstyleused}
\setboolean{ABCIbibtexstyleused}{false}
%
\def\bibliographystyle#1{%
\ifx\@begindocumenthook\@undefined\else
\expandafter\AtBeginDocument
\fi
{\if@filesw
\immediate\write\@auxout{\string\bibstyle{#1}}%
\fi}
\setboolean{ABCIbibtexstyleused}{true}
}
% \AtEndDocument is the last chace for include bibliography style..
\AtEndDocument{
\ifthenelse{\not\boolean{ABCIbibtexstyleused}}
{\bibliographystyle{abntex2-\AbntCitetype}}
{}
}
% relsize used in \authorcapstyle. If package not present, \smaller=\relax
\IfFileExists{relsize.sty}
{\RequirePackage{relsize}}
{\let\smaller\relax}
%%%%%%%%%%%%%% Style %%%%%%%%%%%%%%%%%
\newcommand{\authorcapstyle}{\ifthenelse{\boolean{ABNTversalete}}{\smaller}{}}
\newcommand{\authorstyle}{\relax}
\newcommand{\yearstyle}{\relax}
\newcommand{\optionaltextstyle}{\relax}
\newcommand{\citenumstyle}{\relax}
\newlength{\biblabelsep}
\setlength{\biblabelsep}{1ex}
%%%%%%%%%%%%%%%%%%%%% Implementation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% automatic care for commas inside references
\providecommand{\ABCIccomma}{}
\newcommand{\ABCIcitecommadefault}{,\penalty\@m\ }
\newcommand{\ABCIcitecomma}{\ABCIccomma\let\ABCIccomma\ABCIcitecommadefault}
\newcommand{\ABCIinitcitecomma}{\def\ABCIccomma{}}
\newcommand{\ABCIcitecolondefault}{; }%{;\penalty\@m\ }
% How \bibitem works?
% definition of \bibitem
% \def\bibitem{\@ifnextchar\@lbibitem\@bibitem}
\ifthenelse{\boolean{ABCIcompoldalf}\and\equal{\AbntCitetype}{alf}}
{
% In the old mplementation on abnt-alf, the command \bibitem should be
% \bibitem[{explicit}{implicit}{year}]{key}
% if \bibitem has optional parameter, uses it (three pieces of data
% stored into .aux file)
\def\@lbibitem[#1#2#3]#4{
\gdef\abntnextkey{#4}
\item[\@biblabel{#1}\hfill]%
\if@filesw
{
\let\protect\noexpand
\immediate\write\@auxout{\string\bibcite{#4++EXPL}{#1}}
\immediate\write\@auxout{\string\bibcite{#4++IMPL}{#2}}
\immediate\write\@auxout{\string\bibcite{#4++YEAR}{#3}}
}
\fi%
\ignorespaces
}
% if no optional is used, uses a list counter (stores its value into .aux)
\def\@bibitem#1{
\gdef\abntnextkey{#1}
\item%
\if@filesw
{\immediate\write\@auxout{\string\bibcite{#1}{\the\value{\@listctr}}}}
\fi%
\ignorespaces
}
}
{ %if normal mode (non-compatible with old alf)
\ifthenelse{\boolean{ABCIfoot}}
{
% foot-num mode
\def\@lbibitem[#1]#2{\gdef\abntnextkey{#2}}
\def\@bibitem#1{\gdef\abntnextkey{#1}}
}
{
\def\@lbibitem[#1]#2{
\gdef\abntnextkey{#2}
\item[\@biblabel{#1}\hfill]%
\ifthenelse{\boolean{ABNThyperref}}{%
\hyper@anchorstart{cite.#2}\relax\hyper@anchorend}{}%
\if@filesw
{
\let\protect\noexpand
\immediate\write\@auxout{\string\bibcite{#2}{#1}}
}
\fi%
\ignorespaces
}
\def\@bibitem#1{
\gdef\abntnextkey{#1}
% \ifthenelse{}{\item}{\item}
\item%
\ifthenelse{\boolean{ABNThyperref}}{%
\hyper@anchorstart{cite.#1}\relax\hyper@anchorend}{}%
\if@filesw
{\immediate\write\@auxout{\string\bibcite{#1}{\the\value{\@listctr}}}}
\fi%
\ignorespaces
}
}
}
\newcommand{\hiddenbibitem}[2][]{\gdef\abntnextkey{#2}}
\newcommand{\ABCIgetcitetext}[1]{
\if@filesw
{\let\protect\noexpand
\immediate\write\@auxout{\string\bibcite{\abntnextkey++TEXT}{#1}}}%
\fi}
\newcommand{\ABCIgetcitetextecho}[1]{\ABCIgetcitetext{#1}#1}
%we are repeating \bibcite command as defined in hyperref.sty
%so that we have it all together at one place.
\ifthenelse{\boolean{ABNThyperref}}{%
\renewcommand{\bibcite}[2]{%
\@newl@bel{b}{#1}{\hyper@@link[cite]{}{cite.#1}{#2}}}%
\newcommand{\bibciteEXPL}[2]{%
\@newl@bel{b}{#1++EXPL}{\hyper@@link[cite]{}{cite.#1}{#2}}}%
\newcommand{\bibciteIMPL}[2]{%
\@newl@bel{b}{#1++IMPL}{\hyper@@link[cite]{}{cite.#1}{#2}}}%
\newcommand{\bibciteYEAR}[2]{%
\@newl@bel{b}{#1++YEAR}{\hyper@@link[cite]{}{cite.#1}{#2}}}%
}{}
\newcommand{\abntrefinfo}[3]{%
\if@filesw
{%
\let\protect\noexpand
\ifthenelse{\boolean{ABNThyperref}}{%
\immediate\write\@auxout{\string\bibciteEXPL{\abntnextkey}{#1}}%
\immediate\write\@auxout{\string\bibciteIMPL{\abntnextkey}{#2}}%
\immediate\write\@auxout{\string\bibciteYEAR{\abntnextkey}{#3}}}{%
\immediate\write\@auxout{\string\bibcite{\abntnextkey++EXPL}{#1}}%
\immediate\write\@auxout{\string\bibcite{\abntnextkey++IMPL}{#2}}%
\immediate\write\@auxout{\string\bibcite{\abntnextkey++YEAR}{#3}}}%
}%
\fi
\ifthenelse{\boolean{ABCIfoot}}
{\ifthenelse{\boolean{ABCItextondemand}}
{\@ifundefined{ABCIdemand@\abntnextkey}
{\let\ABCIprocesscitetext\@gobble}
{\let\ABCIprocesscitetext\ABCIgetcitetext}}
{\let\ABCIprocesscitetext\ABCIgetcitetext}}
{\ifthenelse{\boolean{ABCItextondemand}}
{\@ifundefined{ABCIdemand@\abntnextkey}
{\let\ABCIprocesscitetext\relax}
{\let\ABCIprocesscitetext\ABCIgetcitetextecho}}
{\let\ABCIprocesscitetext\ABCIgetcitetextecho}}%
\ABCIprocesscitetext
}
\newcommand{\ABCIdemand}[1]{\expandafter\gdef\csname ABCIdemand@#1\endcsname{}}
\def\AbntCitetypeALF{alf}
\let\ABCInewblock\newblock
\DeclareRobustCommand{\newblock}{\ABCInewblock}
%%%%%%%%%%%%%%%%%%%% abnt-alf %%%%%%%%%%%%%%%%%%%%%%%
% the next line was before \ifthenelse{\equal{\AbntCitetype}{alf}}
\setcitebrackets
\ifx\AbntCitetype\AbntCitetypeALF % if alf
\renewcommand{\@biblabel}[1]{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \cite[optional]{list of keys}
%
% Implicit citation - author in capital letters and year;
% mechanism to deal with repeated names;
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\renewcommand{\@cite}[2]%
{\citeopen{#1\ifthenelse{\equal{#2}{}}{}{,
{\optionaltextstyle#2}}}\citeclose}
\DeclareRobustCommand{\cite}[2][]{%
%
\leavevmode
\let\@citeprevious\@empty%
\@cite{%
\@for\@citekey:=#2\do% \@citekey contains the key
{%
\edef\@citekey{\expandafter\@firstofone\@citekey\@empty}%
%
% here, a tricky \let\@citename\"b@\@citekey++IMPL"
\expandafter\let\expandafter\@citename%
\csname b@\@citekey++IMPL\endcsname%
\expandafter\let\expandafter\@citeyear%
\csname b@\@citekey++YEAR\endcsname%
\ifx\@citeprevious\@empty%
\else%
\ifx\@citename\@citeprevious%
\ABCIcitecommadefault% echoing ", "
\else%
\ABCIcitecolondefault% echoing "; "
\fi%
\fi%
% writing on aux file
\if@filesw\immediate\write\@auxout{\string\citation{\@citekey}}\fi%
% if undefined bibitem
\@ifundefined{b@\@citekey++IMPL}%
{% if undefined
{\bfseries??}% echoing ?
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citekey' on page \thepage \space undefined}%
}%
{% if already defined
\ifx\@citename\@citeprevious%
{\yearstyle\@citeyear\@}\@%
\else%
{\authorcapstyle\@citename}, %
{\yearstyle\@citeyear\@}%
\fi%
\let\@citeprevious\@citename%
}%
\ifthenelse{\boolean{ABNTbackref}}{\Hy@backout{#2}}{}% By AWSS: put backref
}% end for
}{#1}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \citeonline[optional]{list of keys}
%
% Inline (explicit) citation - author in "inline style" and year;
% mechanism to deal with repeated names;
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\@citeonline}[2]%
{{#1\ifthenelse{\equal{#2}{}}{}{, {\optionaltextstyle#2}}}\citeclose}
\DeclareRobustCommand{\citeonline}[2][]{%
%
\leavevmode
\let\@citeprevious\@empty%
\@citeonline{%
\@for\@citekey:=#2\do%\@citekey contains the key
{%
\edef\@citekey{\expandafter\@firstofone\@citekey\@empty}%
%
% here, a tricky \let\@citename\"b@\@citekey++UP" :-)
\expandafter\let\expandafter\@citename%
\csname b@\@citekey++EXPL\endcsname%
\expandafter\let\expandafter\@citeyear%
\csname b@\@citekey++YEAR\endcsname%
\ifx\@citeprevious\@empty%
\else%
\ifx\@citename\@citeprevious%
\ABCIcitecommadefault% echoing ", "
\else%
\citeclose, % echoing "), "
\fi%
\fi%
% writing in aux file
\if@filesw\immediate\write\@auxout{\string\citation{\@citekey}}\fi%
\@ifundefined{b@\@citekey++EXPL}%
{% if undefined
{\bfseries??}% echoing ?
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citekey' on page \thepage \space undefined}%
}%
{% if really defined
\ifx\@citename\@citeprevious%
\else%
{\authorstyle\@citename\@{}} \citeopen%
\fi%
{\yearstyle\@citeyear\@}%
\let\@citeprevious\@citename%
}%
\ifthenelse{\boolean{ABNTbackref}}{\Hy@backout{#2}}{}% By AWSS: put backref
}% end for
}{#1}%
}
% "overcite" compatibility
\let\citen\citeonline
\let\citenum\citeonline
% end alf
%
%
%%%%%%%%%%%%%%%%%%%%%%%%% abnt-num %%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
\else % if not alf,
\ifABCIfoot
\renewenvironment{thebibliography}[1]{}{}
\citebrackets{}{}
\let\ABCIscriptfont\scriptsize
\renewcommand{\newblock}{}
\def\ABCI@cite#1#2{\raisebox{.8ex}%
{\ABCIscriptfont\citeopen{#1\if@tempswa, #2\fi}\citeclose}}
\def\ABCI@citeonline#1#2{{#1\if@tempswa, #2\fi}}
\DeclareRobustCommand\cite{%
\let\@cite\ABCI@cite%
\@ifnextchar[{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
\DeclareRobustCommand\citeonline{%
\leavevmode\let\@cite\ABCI@citeonline%
\@ifnextchar[{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
\def\@citex[#1]#2{%
\def\@safe@activesfalse{}%
\ABCIinitcitecomma%
\def\ABCIcitelist{}%
\def\ABCIaftercitex{}% to put the footnotes
\@cite{%
\@for\@citeb:=#2\do%
{%
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
\if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi%
\@ifundefined{b@\@citeb++IMPL}%
{%
{\bfseries??}%
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citeb' on page \thepage \space undefined}%
}%
{%
\@ifundefined{b@\@citeb}
{%
\stepcounter{footnote}%
\expandafter\xdef\csname b@\@citeb\endcsname{\thefootnote}%
\ABCItoken=\expandafter{\ABCIaftercitex}%
\xdef\ABCIaftercitex%
{\the\ABCItoken\noexpand\footnotetext%
{\noexpand\citetext{\@citeb}}}%
}
{}%
\expandafter\let\expandafter\ABCIcitation%
\csname b@\@citeb\endcsname%
% test for positive number
\ifcat _\ifnum\z@<0\ABCIcitation _\else A\fi
\ABCIaddtocitelist{\ABCIcitation}%
\else% else \ifcat
\ABCIcitecomma\hbox{\ABCIcitation}%
\fi% end \ifcat
}%
}%
\ABCIoutputgroupedcitelist%
}{#1}%
\ABCIaftercitex%
}
\newcommand{\citeifnotcited}[1]{%
\def\ABCIcitelist{}%
\@for\@citeb:=#1\do%
{%
\@ifundefined{b@\@citeb}
{\ABCIaddtocitelist{\@citeb}}
{}%
}%
\expandafter\cite\expandafter{\ABCIcitelist}%
}
\newcommand{\citeonlineifnotcited}[1]{%
\def\ABCIcitelist{}%
\@for\@citeb:=#1\do%
{%
\@ifundefined{b@\@citeb}
{\ABCIaddtocitelist{\@citeb}}
{}%
}%
\expandafter\citeonline\expandafter{\ABCIcitelist}%
}
\newcommand{\ABCIaddtocitelist}[1]{%
\ifthenelse{\equal{\ABCIcitelist}{}}%
{\edef\ABCIcitelist{#1}}
{\edef\ABCIcitelist{\ABCIcitelist,#1}}%
}%
\newcommand{\ifcited}[3]{\@ifundefined{b@#1}{#3}{#2}}
\else % if num and NOT foot
% this only works with proper settings in \ABCIthebibliformat
\ifthenelse{\boolean{ABCIbiblabelonmargin}}
{
\renewcommand{\@biblabel}[1]%
{\ifthenelse{\equal{#1}{}}{}{{\citenumstyle #1\hspace{\biblabelsep}}}}
}
{
\renewcommand{\@biblabel}[1]%
{%
\ifthenelse{\equal{#1}{}}
{}
{%
\def\biblabeltext{{\citenumstyle #1\hspace{\biblabelsep}}}%
\settowidth{\ABCIauxlen}{\biblabeltext}%
\ifthenelse{\lengthtest{\ABCIauxlen<\minimumbiblabelwidth}}
{\setlength{\ABCIauxlen}{\minimumbiblabelwidth-\ABCIauxlen}}
{\setlength{\ABCIauxlen}{0cm}}%
{\biblabeltext\hspace{\ABCIauxlen}}%
}%
}%
}
\let\ABCIscriptfont\scriptsize
\ifthenelse{\boolean{ABNTovercite}}{%
\def\ABCI@cite#1#2{\raisebox{1ex}%
{\ABCIscriptfont\citeopen{#1\if@tempswa, #2\fi}\citeclose}}}{%
\def\ABCI@cite#1#2{\citeopen{#1\if@tempswa, #2\fi}\citeclose}}
\def\ABCI@citeonline#1#2{{#1\if@tempswa, #2\fi}}
\DeclareRobustCommand\cite{%
\let\@cite\ABCI@cite%
\@ifnextchar[{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
\DeclareRobustCommand\citeonline{%
\leavevmode\let\@cite\ABCI@citeonline%
\@ifnextchar[{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
% \renewcommand{\@openbib@code}%
% {\setlength{\leftmargin}{0pt}\addtolength{\itemindent}{\labelsep}}
\def\@citex[#1]#2{%
\def\@safe@activesfalse{}%
\ABCIinitcitecomma%
\def\ABCIcitelist{}%
\@cite{%
\@for\@citeb:=#2\do%
{%
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
\if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi%
\@ifundefined{b@\@citeb}%
{%
{\bfseries??}%
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citeb' on page \thepage \space undefined}%
}%
{%
\expandafter\let\expandafter\ABCIcitation%
\csname b@\@citeb\endcsname%
% test for positive number
\ifcat _\ifnum\z@<0\ABCIcitation _\else A\fi
\ABCIaddtocitelist{\ABCIcitation}%
\else% else \ifcat
\ABCIcitecomma\hbox{\ABCIcitation}%
\fi% end \ifcat
}%
}%
\ABCIoutputgroupedcitelist%
}{#1}%
}
\newcommand{\ABCIaddtocitelist}[1]{%
\ifthenelse{\equal{\ABCIcitelist}{}}%
{\edef\ABCIcitelist{#1}}
{\edef\ABCIcitelist{\ABCIcitelist,#1}}%
}%
\fi
\fi % end if alf
\providecommand{\citeifnotcited}[1]{}
\providecommand{\citeonlineifnotcited}[1]{}
\providecommand{\ifcited}[3]{}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \citeyear{list of keys}
%
% Citation by year
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\DeclareRobustCommand{\citeyear}[1]{%
%
% \let\@safe@activesfalse\@empty%
\leavevmode
\let\@citeprevious\@empty%
\@for\@citekey:=#1\do %\@citekey contains the key
{%
% \edef\@citekey{\expandafter\@firstofone\@citekey\@empty}%
\expandafter\let\expandafter\@citename%
\csname b@\@citekey++YEAR\endcsname%
%compare previous name with current name and decide the punctuation marks
%if first use do nothing
\ifx\@citeprevious\@empty%
\else%
, % echoing ",
\fi%
% writing on aux file
\if@filesw\immediate\write\@auxout{\string\citation{\@citekey}}\fi%
% if undefined bibitem
\@ifundefined{b@\@citekey++YEAR}%
{% if undefined
{\bfseries??}% echoing ?
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citekey' on page \thepage \space undefined}%
}%
{% if already defined
\ifx\@citename\@citeprevious%
\else%
{\@citename\@}%
\fi%
\let\@citeprevious\@citename%
}%
\ifthenelse{\boolean{ABNTbackref}}{\Hy@backout{#1}}{}% By AWSS: put backref
}% end for
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \citeauthor{list of keys}
%
% Implicit citation (capital letters)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\DeclareRobustCommand{\citeauthor}[1]{%
%
% \let\@safe@activesfalse\@empty%
\leavevmode
\let\@citeprevious\@empty%
\@for\@citekey:=#1\do %\@citekey contains the key
{%
% \edef\@citekey{\expandafter\@firstofone\@citekey\@empty}%
\expandafter\let\expandafter\@citename\csname b@\@citekey++IMPL\endcsname%
% writing on aux file
\if@filesw\immediate\write\@auxout{\string\citation{\@citekey}}\fi%
% if undefined bibitem
\@ifundefined{b@\@citekey++IMPL}%
{% if undefined
{\bfseries??}%
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citekey' on page \thepage \space undefined}%
}%
{% if already defined
\ifx\@citename\@citeprevious%
\else%
\ifx\@citeprevious\@empty%
\else%
; % echoing "; "
\fi%
{\authorcapstyle\@citename\@}%
\fi%
\let\@citeprevious\@citename%
}%
\ifthenelse{\boolean{ABNTbackref}}{\Hy@backout{#1}}{}% By AWSS: put backref
}% end for
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \citeauthoronline{list of keys}
%
% Explicit citation (non capital letter)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\DeclareRobustCommand{\citeauthoronline}[1]{%
%
% \let\@safe@activesfalse\@empty%
\leavevmode
\let\@citeprevious\@empty%
\@for\@citekey:=#1\do %\@citekey contains the key
{%
% \edef\@citekey{\expandafter\@firstofone\@citekey\@empty}%
\expandafter\let\expandafter\@citename\csname b@\@citekey++EXPL\endcsname%
% writing on aux file
\if@filesw\immediate\write\@auxout{\string\citation{\@citekey}}\fi%
% if undefined bibitem
\@ifundefined{b@\@citekey++EXPL}%
{% if undefined
{\bfseries??}%
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citekey' on page \thepage \space undefined}%
}%
{% if already defined
\ifx\@citename\@citeprevious%
\else%
\ifx\@citeprevious\@empty%
\else%
; % echoing "; "
\fi%
{\authorstyle\@citename\@}%
\fi%
\let\@citeprevious\@citename%
}%
\ifthenelse{\boolean{ABNTbackref}}{\Hy@backout{#1}}{}% By AWSS: put backref
}% end for
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \citetext{list of keys}
%
% Text of the reference
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\DeclareRobustCommand{\citetext}[1]{%
%
% \let\@safe@activesfalse\@empty%
\leavevmode
\let\@citeprevious\@empty%
\@for\@citekey:=#1\do %\@citekey contains the key
{%
% \edef\@citekey{\expandafter\@firstofone\@citekey\@empty}%
\expandafter\let\expandafter\@citename\csname b@\@citekey++TEXT\endcsname%
% writing on aux file
\if@filesw\immediate\write\@auxout{\string\citation{\@citekey}}\fi%
\if@filesw\immediate\write\@auxout{\string\ABCIdemand{\@citekey}}\fi%
% if undefined bibitem
\@ifundefined{b@\@citekey++TEXT}%
{% if undefined
{\bfseries??}%
\G@refundefinedtrue%
\@latex@warning%
{Citation `\@citekey' on page \thepage \space undefined}%
}%
{% if already defined
\ifx\@citename\@citeprevious%
\else%
\relax
\ifx\@citeprevious\@empty%
\else%
; % echoing "; "
\fi%
{\@citename}%
\fi%
\let\@citeprevious\@citename%
}%
\ifthenelse{\boolean{ABNTbackref}}{\Hy@backout{#1}}{}% By AWSS: put backref
}% end for
}
%
% Setting up `recuo' (=indent in Portuguese)
%
% To ensure that the margin settings of this package works, \leftmargin
% (inside thebibliography) must be 0cm. \@openbib@code is a hook inside
% thebibliography.
\let\@openbib@codeBACKUP\@openbib@code
\def\@openbib@code{\@openbib@codeBACKUP\setlength{\leftmargin}{0cm}}
% adding things after \begin{thebibliography}{}
\let\thebibliographyBkUp\thebibliography
\def\thebibliography#1{\thebibliographyBkUp{#1}\ABCIthebibliformat}
%
% \AfterTheBibliography{} hook
%
\newtoks\ABCItoken
\newcommand{\ABCIthebiblihook}{}
\newcommand{\AfterTheBibliography}[1]{
\ABCItoken=\expandafter{\ABCIthebiblihook}
\expandafter\def\expandafter\ABCIthebiblihook\expandafter{\the\ABCItoken#1}
}
\ifthenelse{\boolean{ABCIbibjustif}}
{}
{\AfterTheBibliography{\setlength{\rightskip}{0pt plus 2cm}}}
\ifthenelse{\equal{\AbntCitetype}{alf}}
{% mode alf
\newcommand{\ABCIthebibliformat}{
\setlength{\leftskip}{\bibindent}
\setlength{\labelwidth}{0cm}
\setlength{\labelsep}{0cm}
\setlength{\itemindent}{-\bibindent}
\setlength{\listparindent}{0cm}
\ABCIthebiblihook
}
}
{% mode num
\ifthenelse{\boolean{ABCIbiblabelonmargin}}
{
\newcommand{\ABCIthebibliformat}{
\setlength{\leftskip}{\bibindent}
\setlength{\labelwidth}{10cm}
\setlength{\labelsep}{0cm}
\setlength{\itemindent}{-\bibindent}
\setlength{\listparindent}{0cm}
\setlength{\biblabelsep}{1.5ex}
\ABCIthebiblihook
}
}
{
\newcommand{\ABCIthebibliformat}{
\setlength{\leftskip}{\bibindent}
\setlength{\labelwidth}{0cm}
\setlength{\labelsep}{0cm}
\setlength{\itemindent}{-\bibindent}
\setlength{\listparindent}{0cm}
\setlength{\minimumbiblabelwidth}{\leftskip}
\ABCIthebiblihook
}
\AfterTheBibliography{
\ifthenelse{\lengthtest{\minimumbiblabelwidth=0pt}}
{\setlength{\biblabelsep}{1.8ex}}
{\setlength{\biblabelsep}{1ex}}
}
}
}
%---------------------------------------------------------------%
% Macros for output sorted and compressed numerical citations %
%---------------------------------------------------------------%
% Store to maximum of a given list to the counter "ABCImax"
\newcommand{\maximuminlist}[1]{%
\setcounter{ABCImax}{0}%
\@for\ABCIaux:=#1\do%
{%
\setcounter{ABCIaux}{\ABCIaux}%
\ifnum \value{ABCIaux}>\value{ABCImax}%
\setcounter{ABCImax}{\value{ABCIaux}}%
\fi%
}%
}
% It takes a command containing a comma separeted list of
% positive numbers and redefines the original command with
% the list without its maximum element.
\newcommand{\ABCIlistwithoutmaximum}[1]{%
\maximuminlist{#1}%
\let\ABCItemplist#1%
\def#1{}%
\def\ABCIcomma{}%
\@for\ABCIaux:=\ABCItemplist\do%
{%
\ifnum\ABCIaux<\value{ABCImax}%
\edef#1{#1\ABCIcomma\ABCIaux}%
\def\ABCIcomma{,}%
\fi%
}%
}
% It requires a command containing a comma separeted list of
% positive numbers. It redefines that command with the same
% list, but sorted.
\newcommand{\ABCIsortlist}[1]{%
\edef\ABCItempslist{#1}%
\def#1{}%
\def\ABCIcomma{}%
\whiledo{\not\equal{\ABCItempslist}{}}%
{%
\maximuminlist{\ABCItempslist}%
\edef#1{\arabic{ABCImax}\ABCIcomma#1}%
\def\ABCIcomma{,}%
\ABCIlistwithoutmaximum{\ABCItempslist}%
}%
}
% \ifconsecutive{num1}{num2}{block1}{block2}
% executes block1 if num1 = num2+1 and block2 otherwise.
\newcommand{\ifconsecutive}[4]{%
\@tempcnta#1%
\@tempcntb#2%
\advance\@tempcntb 1 %
\ifnum\@tempcnta=\@tempcntb#3\else#4\fi%
}
%
% It sorts and outputs in grouped way the list \ABCIcitelist generated in
% \cite when in `num' mode.
%
\newcommand{\ABCIoutputgroupedcitelist}{%
\ifthenelse{\equal{\ABCIcitelist}{}}%
{}%
{%
\ABCIsortlist{\ABCIcitelist}%
\setcounter{ABCIaux}{0}%
\@for \ABCIaux:=\ABCIcitelist\do%
{%
\ifthenelse{\value{ABCIaux}=0}%
{%
\let\ABCIfirst\ABCIaux%
\let\ABCIlast\ABCIaux%
\setcounter{ABCIaux}{1}%
}%
{%
\ifconsecutive{\ABCIaux}{\ABCIlast}%
{%
\let\ABCIlast\ABCIaux%
\addtocounter{ABCIaux}{1}%
}%
{%
\ifthenelse{\value{ABCIaux}=1}%
{%
\ABCIcitecomma\ABCIfirst%
}%
{%
\ifthenelse{\value{ABCIaux}=2}%
{%
\ABCIcitecomma\ABCIfirst%
\ABCIcitecomma\ABCIlast%
}%
{%
\ABCIcitecomma\ABCIfirst--\ABCIlast%
}%
}%
\let\ABCIfirst\ABCIaux%
\let\ABCIlast\ABCIaux%
\setcounter{ABCIaux}{1}%
}%
}%
}%
\ifthenelse{\value{ABCIaux}=1}%
{%
\ABCIcitecomma\ABCIfirst%
}%
{%
\ifthenelse{\value{ABCIaux}=2}%
{%
\ABCIcitecomma\ABCIfirst%
\ABCIcitecomma\ABCIlast%
}%
{%
\ABCIcitecomma\ABCIfirst--\ABCIlast%
}%
}%
}%
}
\newcommand{\apudname}{apud}
\newcommand{\Idemname}{Id.}
\newcommand{\Ibidemname}{Ibid.}
\newcommand{\opcitname}{op.\ cit.}
\newcommand{\passimname}{passim}
\newcommand{\loccitname}{loc.\ cit.}
\newcommand{\cfcitename}{Cf.}
\newcommand{\etseqname}{et seq.}
\DeclareRobustCommand{\footciteref}[1]{%
\footnote{\citetext{#1}}
}
\newcommand{\apud}[3][]{(\citeauthor{#2}, \citeyear{#2} \apudname\ %
\citeauthor{#3}, \citeyear{#3}%
\ifthenelse{\equal{#1}{\empty}}{}{, #1})}
\newcommand{\apudonline}[3][]{\citeauthoronline{#2} (\citeyear{#2} \apudname\ %
\citeauthor{#3}, \citeyear{#3}%
\ifthenelse{\equal{#1}{\empty}}{}{, #1})}
\newcommand{\Idem}[2][]{\Idemname, \citeyear{#2}%
\ifthenelse{\equal{#1}{\empty}}{}{, #1}}
\newcommand{\Ibidem}[2][]{\Ibidemname%
\ifthenelse{\equal{#1}{\empty}}{}{, #1}}
\newcommand{\opcit}[2][]{\citeauthor{#2}, \opcitname%
\ifthenelse{\equal{#1}{\empty}}{}{, #1}}
\newcommand{\passim}[2][]{\citeauthor{#2}, \citeyear{#2}%
\ifthenelse{\equal{#1}{\empty}}{}{, #1}, \passimname}
\newcommand{\loccit}[2][]{\citeauthor{#2}, \citeyear{#2}%
\ifthenelse{\equal{#1}{\empty}}{}{, #1}, \loccitname}
\newcommand{\cfcite}[2][]{\cfcitename\ \citeauthor{#2}, \citeyear{#2}%
\ifthenelse{\equal{#1}{\empty}}{}{, #1}}
\newcommand{\etseq}[2][]{\citeauthor{#2}, \citeyear{#2}%
\ifthenelse{\equal{#1}{\empty}}{}{, #1}, \etseqname}
\ifthenelse{\equal{\AbntCitetype}{num}}%
{\renewcommand{\citeauthor}[1]{\citeauthoronline{#1}\cite{#1}}}{}
\endinput