Last active
October 5, 2017 08:52
-
-
Save moewew/373b55c9b1ca2676d1ecf2f6f7c81268 to your computer and use it in GitHub Desktop.
Drop-in replacement for biblatex.sty version 3.7 for https://tex.stackexchange.com/q/334839/35864
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Copyright (c) 2006-2011 Philipp Lehman. | |
% 2012-2016 Philip Kime, Audrey Boruvka, Joseph Wright | |
% | |
% Permission is granted to copy, distribute and/or modify this | |
% software under the terms of the LaTeX Project Public License | |
% (LPPL), version 1.3c. | |
% | |
% This software is provided 'as is', without warranty of any kind, | |
% either expressed or implied, including, but not limited to, the | |
% implied warranties of merchantability and fitness for a | |
% particular purpose. | |
% Set up the version strings here | |
\def\abx@date{2016/12/05} | |
\def\abx@version{3.7} | |
\def\abx@bbxid{\abx@date\space v\abx@version\space biblatex bibliography style (PK/JW/AB)} | |
\def\abx@cbxid{\abx@date\space v\abx@version\space biblatex citation style (PK/JW/AB)} | |
\def\abx@lbxid{\abx@date\space v\abx@version\space biblatex localization (PK/JW/AB)} | |
\def\abx@cptid{\abx@date\space v\abx@version\space biblatex compatibility (PK/JW/AB)} | |
% This is not updated by build script as the control file version | |
% does not necessarily change with the package version. | |
% This is used when writing the .bcf | |
\def\blx@bcfversion{3.3} | |
% This is not updated by build script as the bbl version | |
% does not necessarily change with the package version. | |
% This is used when checking the .bbl | |
\def\blx@bblversion{2.8} | |
\NeedsTeXFormat{LaTeX2e}[2005/12/01] | |
\ProvidesPackage{biblatex} | |
[\abx@date\space v\abx@version\space programmable bibliographies (PK/JW/AB) - mod 2017/10/05 (MW)] | |
%% Dependencies | |
\RequirePackage{pdftexcmds} | |
\RequirePackage{etoolbox} | |
\RequirePackage{keyval} | |
\RequirePackage{kvoptions} | |
\RequirePackage{logreq} | |
\RequirePackage{ifthen} | |
\RequirePackage{url} | |
\RequirePackage{xstring} | |
%\RequirePackage{trace} | |
\@ifpackagelater{etoolbox}{2010/11/29} | |
{} | |
{\PackageError{biblatex} | |
{Outdated 'etoolbox' package} | |
{Upgrade to etoolbox v2.1 (2010/11/29) or later.\MessageBreak | |
I found: '\csuse{ver@etoolbox.sty}'.\MessageBreak | |
This is a fatal error. I'm aborting now.}% | |
\endinput} | |
%% Category codes | |
\def\blx@docatcodes{% | |
\do\=\do\<\do\>\do\-\do\"\do\'\do\`\do\.% | |
\do\,\do\;\do\:\do\!\do\?\do\/} | |
\def\do#1{\catcode\number`#1=\the\catcode`#1\relax} | |
\edef\blx@catcodes{\blx@docatcodes\do\^\do\~\do\&\do\|} | |
\let\do\noexpand | |
\def\blx@saneccodes{% | |
\catcode`\~=\active | |
\let\do\@makeother | |
\blx@docatcodes | |
\let\do\noexpand} | |
\blx@saneccodes | |
\catcode`\&=3 | |
\catcode`\|=3 | |
\catcode`\^=7 | |
\def\blx@nl{^^J} | |
%% Compatibility | |
\AtEndPreamble{% | |
\def\do#1{% | |
\@ifpackageloaded{#1} | |
{\blx@error | |
{Incompatible package '#1'} | |
{The '#1' package and biblatex are incompatible}} | |
{}}% | |
\docsvlist{% | |
amsrefs,apacite,babelbib,backref,bibtopic,bibunits,chapterbib, | |
cite,citeref,drftcite,footbib,inlinebib,jurabib,mcite,mciteplus, | |
mlbib,multibbl,multibib,natbib,opcit,overcite,splitbib,ucs}% | |
\def\blx@langstrings{}% | |
% Set up sortlocale defaults and default language if babel/polyglossia is not loaded | |
\ifdefstring\blx@sortlocale{auto} | |
{\ifdef\bbl@main@language% babel or polyglossia is loaded | |
{\edef\blx@sortlocale{\bbl@main@language}} | |
{\def\blx@sortlocale{english}}} | |
{}% | |
\@ifpackageloaded{polyglossia} | |
{% This is required for languages which are never explicitly selected | |
% This check because \xpg@loaded is not defined in polyglossia <= v1.42.0 | |
\ifundef\xpg@loaded | |
{\let\xpg@loaded\@empty | |
\let\xpg@vloaded\@empty | |
\PackageWarningNoLine{biblatex}{Upgrade package 'polyglossia' to >v1.42.0 recommended}} | |
{}% | |
\def\do#1{\blx@langsetup{#1}}% | |
\expandafter\docsvlist\expandafter{\xpg@loaded}% | |
\expandafter\docsvlist\expandafter{\xpg@vloaded}% | |
\ifboolexpr{ | |
not test {\iftoggle{blx@autolangbib}} | |
and | |
not test {\iftoggle{blx@autolangcite}}} | |
{\blx@mknoautolang} | |
{\blx@mkautolangpoly}} | |
{\@ifpackageloaded{babel} | |
{% This is required for languages which are never explicitly selected | |
\def\do#1{\blx@langsetup{#1}}% | |
\expandafter\docsvlist\expandafter{\bbl@loaded}% | |
\ifboolexpr{ | |
not test {\iftoggle{blx@autolangbib}} | |
and | |
not test {\iftoggle{blx@autolangcite}}} | |
{\blx@mknoautolang} | |
{\blx@mkautolangbabel}} | |
{\blx@mknoautolang}}% | |
% These already have defaults set to basically do nothing | |
% so if the toggles are true, we need to define again since | |
% mkautolang* redefines \blx@beglang | |
% In turn, \blx@beglang defines \blx@endlang and so \blx@beglangcite and | |
% \blx@endlangcite need redefining inside \blx@beglang after \blx@endlang | |
% has been defined. | |
\iftoggle{blx@autolangbib} | |
{\let\blx@beglangbib\blx@beglang} | |
{}% | |
\iftoggle{blx@autolangcite} | |
{\let\blx@beglangcite\blx@beglang} | |
{}% | |
\csuse{abx@extras@\blx@languagename}% | |
\csuse{abx@strings@\blx@languagename}% | |
\undef\blx@mkautolangbabel | |
\undef\blx@mkautolangpoly | |
\undef\blx@mknoautolang | |
\ifnum\blx@hyperref=\z@ | |
\blx@mknohyperref | |
\else | |
\@ifpackageloaded{hyperref} | |
{\blx@mkhyperref} | |
{\ifnum\blx@hyperref=\@ne | |
\blx@warning@noline{% | |
Missing 'hyperref' package.\MessageBreak | |
Setting hyperref=false}% | |
\fi | |
\blx@mknohyperref}% | |
\fi | |
\providecommand*{\nolinkurl}{\url}% | |
\undef\blx@mkhyperref | |
\undef\blx@mknohyperref | |
\ifundef\TE@hook | |
{\let\TE@hook\@empty | |
\toggletrue{blx@tempa}% | |
\def\do#1{% | |
\patchcmd#1% | |
{\let\isundefined\TE@undef} | |
{\let\isundefined\TE@undef\TE@hook} | |
{\togglefalse{blx@tempa}\listbreak} | |
{}}% | |
\docsvlist{% | |
\ifthenelse,% ifthen | |
\org@ifthenelse,% babel | |
\HyOrg@ifthenelse,% hyperref | |
\NROrg@ifthenelse}% nameref | |
\iftoggle{blx@tempa} | |
{\blx@err@patch{'ifthen' package}} | |
{}} | |
{}% | |
\appto\TE@hook{\blx@TE@hook}% | |
\toggletrue{blx@tempa}% | |
\def\do#1{% | |
\patchcmd#1% | |
{\color@begingroup} | |
{\color@begingroup\toggletrue{blx@footnote}} | |
{\togglefalse{blx@tempa}\listbreak} | |
{}}% | |
\docsvlist{% | |
\@footnotetext,% latex | |
\H@@footnotetext,% hyperref | |
\V@@footnotetext,% fancyvrb | |
\scr@saved@footnotetext,% koma-script 3.x | |
\l@dold@footnotetext,% ledmac | |
\l@doldold@footnotetext,% ledmac | |
\predefinedfootnotetext,% linguex | |
\@fntORI}% frenchle | |
\iftoggle{blx@tempa}% ams classes | |
{\patchcmd\@footnotetext | |
{\@makefntext} | |
{\toggletrue{blx@footnote}\@makefntext} | |
{\togglefalse{blx@tempa}} | |
{}} | |
{}% | |
\@ifclassloaded{memoir} | |
{\def\do#1{% | |
\patchcmd#1% | |
{\color@begingroup} | |
{\color@begingroup\toggletrue{blx@footnote}} | |
{} | |
{}}% | |
\docsvlist{% | |
\m@mold@footnotetext,% | |
\@plainfootnotetext,% | |
\@twocolfootnotetext,% | |
\@threecolfootnotetext,% | |
\@parafootnotetext}% | |
\def\do#1{% | |
\patchcmd#1% | |
{\color@begingroup\@makefntext} | |
{\color@begingroup\toggletrue{blx@footnote}\@makefntext} | |
{} | |
{}}% | |
\docsvlist{% | |
\@footnotetext,% patch twice | |
\H@@footnotetext,% patch twice | |
\@plainfootnotetext}} | |
{}% | |
\iftoggle{blx@tempa} | |
{\blx@warning@noline{% | |
Patching footnotes failed.\MessageBreak | |
Footnote detection will not work}} | |
{}% | |
\@ifpackageloaded{endnotes} | |
{\patchcmd\theendnotes | |
{\enoteformat} | |
{\toggletrue{blx@footnote}\enoteformat} | |
{} | |
{\blx@err@patch{'endnotes' package}}} | |
{}% | |
\@ifpackageloaded{bigfoot} | |
{\apptocmd\@makefnstartbox | |
{\toggletrue{blx@footnote}} | |
{} | |
{\blx@err@patch{'bigfoot' package}}} | |
{}% | |
\@ifpackageloaded{showkeys} | |
{\ifdef\SK@ | |
{\AtEveryBibitem{\SK@\SK@@label{\thefield{entrykey}}}% | |
\AtEveryLositem{\SK@\SK@@label{\thefield{entrykey}}}% | |
\ifundef\SK@cite % = 'notcite' disabled | |
{\AtEveryCitekey{\SK@\SK@@ref{\thefield{entrykey}}}} | |
{}} | |
{}} | |
{}% | |
\apptocmd\@floatboxreset | |
{\boolfalse{citetracker}% | |
\boolfalse{pagetracker}} | |
{} | |
{\blx@err@patch{floats}}% | |
\ifdef\TX@endtabularx % tabularx/memoir | |
{\pretocmd\TX@endtabularx | |
{\addtocounter{tabx@nest}{1}}% track nested tabularx environments | |
{} | |
{\blx@err@patch{'tabularx'}}% | |
% no need to conditionalise on top-level tabx as the search/replace | |
% will only match once anyway | |
\patchcmd\TX@endtabularx | |
{\edef\TX@ckpt{\cl@@ckpt}} | |
{\edef\TX@ckpt{\cl@@ckpt\abx@resttrackers}% | |
\abx@savetrackers} | |
{} | |
{\blx@err@patch{'tabularx'}}% | |
\apptocmd\TX@endtabularx | |
{\ifnum\value{tabx@nest}=1% only clear trackers for top-level tabularx | |
\abx@cleartrackers | |
\fi | |
\addtocounter{tabx@nest}{-1}} | |
{} | |
{\blx@err@patch{'tabularx'}}} | |
{}% | |
\@ifpackageloaded{csquotes} | |
{\@ifpackagelater{csquotes}{2009/05/30} | |
{} | |
{\blx@error | |
{Outdated 'csquotes' package} | |
{Upgrade to csquotes v4.4 (2009/05/30) or later.\MessageBreak | |
I found: '\csuse{ver@csquotes.sty}'}}% | |
\BlockquoteDisable{\let\blx@thecheckpunct\@gobble}% | |
\@ifpackagelater{csquotes}{2009/08/27} | |
{\appto\@blockquote@prehook{\abx@savetrackers}% | |
\appto\@blockquote@posthook{\abx@resttrackers\abx@cleartrackers}} | |
{}% | |
\@ifpackagelater{csquotes}{2010/06/09} | |
{} | |
{\newcommand*{\@quotereset}{}\newcount\@quotereset}} | |
{\@ifpackageloaded{babel} | |
{\blx@warning@noline{% | |
'babel/polyglossia' detected but 'csquotes' missing.\MessageBreak | |
Loading 'csquotes' recommended}} | |
{}% | |
\newcommand*{\@quotelevel}{}% | |
\newcount\@quotelevel | |
\newcommand*{\@quotereset}{}% | |
\newcount\@quotereset | |
\newcommand*{\@setquotesfcodes}{}% | |
\let\@setquotesfcodes\relax | |
\newrobustcmd*{\initoquote}{\@quotelevel\@ne}% | |
\newrobustcmd*{\initiquote}{\@quotelevel\tw@}% | |
\newrobustcmd*{\textooquote}{``}% | |
\newrobustcmd*{\textcoquote}{''}% | |
\newrobustcmd*{\textoiquote}{`\relax}% block ligs | |
\newrobustcmd*{\textciquote}{'\relax}% block ligs | |
\newrobustcmd*{\enquote}{\@ifstar\blx@enquote@ii\blx@enquote}% | |
\def\blx@enquote{% | |
\ifnum\@quotelevel>\z@ | |
\expandafter\blx@enquote@ii | |
\else | |
\expandafter\blx@enquote@i | |
\fi}% | |
\long\def\blx@enquote@i#1{% | |
\begingroup\initoquote | |
\textooquote#1\textcoquote | |
\endgroup}% | |
\long\def\blx@enquote@ii#1{% | |
\begingroup\initiquote | |
\textoiquote#1\textciquote | |
\endgroup}% | |
\appto\blx@setsfcodes{% | |
\sfcode`\`=\z@ | |
\sfcode`\'=\z@}}% | |
\let\do\noexpand} | |
\begingroup | |
\@makeother\# | |
% \relax: gobble newline -> titletoc.sty | |
\AtEndPreamble{% | |
\addtocontents{toc}{% | |
\boolfalse{citerequest}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\boolfalse{backtracker}\relax}% | |
\addtocontents{lof}{% | |
\boolfalse{citerequest}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\boolfalse{backtracker}\relax}% | |
\addtocontents{lot}{% | |
\boolfalse{citerequest}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\boolfalse{backtracker}\relax}% | |
\patchcmd\addtocontents | |
{\string\@writefile} | |
{\string\@writefile{#1}{\defcounter{refsection}{\the\c@refsection}\relax}% | |
\string\@writefile} | |
{} | |
{\blx@err@patch{\string\addtocontents}}} | |
\endgroup | |
% trick hyperref into believing we're natbib | |
\let\NAT@parse\@empty | |
% trick showkeys into believing we're havard | |
\let\HAR@checkdef\@empty | |
%% Allocation | |
\providecommand{\@gobblefive}[5]{} | |
% Counter to track nested tabularx environemnts so we don't | |
% try to patch the commands more than once below as this undefs some | |
% macros and an error is thrown | |
\newcounter{tabx@nest} | |
\setcounter{tabx@nest}{0} | |
\newcounter{listtotal} | |
\def\thelisttotal{\the\c@listtotal} | |
\newcounter{listcount} | |
\def\thelistcount{\the\c@listcount} | |
\newcounter{liststart} | |
\def\theliststart{\the\c@liststart} | |
\newcounter{liststop} | |
\def\theliststop{\the\c@liststop} | |
\newcounter{citecount} | |
\def\thecitecount{\the\c@citecount} | |
\newcounter{citetotal} | |
\def\thecitetotal{\the\c@citetotal} | |
\newcounter{multicitecount} | |
\def\themulticitecount{\the\c@multicitecount} | |
\newcounter{multicitetotal} | |
\def\themulticitetotal{\the\c@multicitetotal} | |
\newcounter{instcount} | |
\def\theinstcount{\the\c@instcount} | |
\newcounter{maxnames} | |
\def\themaxnames{\the\c@maxnames} | |
\newcounter{minnames} | |
\def\theminnames{\the\c@minnames} | |
\newcounter{maxitems} | |
\def\themaxitems{\the\c@maxitems} | |
\newcounter{minitems} | |
\def\theminitems{\the\c@minitems} | |
\newcounter{citecounter} | |
\def\thecitecount{\the\c@citecounter} | |
\newcounter{savedcitecounter} | |
\def\thecitecount{\the\c@savedcitecounter} | |
\newcounter{uniquelist} | |
\def\theuniquelist{\the\c@uniquelist} | |
\newcounter{uniquename} | |
\def\theuniquename{\the\c@uniquename} | |
\newcounter{refsection} | |
\def\therefsection{\the\c@refsection} | |
\newcounter{refsegment} | |
\def\therefsegment{\the\c@refsegment} | |
\newcounter{maxextratitle} | |
\def\themaxextratitle{\the\c@maxextratitle} | |
\newcounter{maxextratitleyear} | |
\def\themaxextratitleyear{\the\c@maxextratitleyear} | |
\newcounter{maxextrayear} | |
\def\themaxextrayear{\the\c@maxextrayear} | |
\newcounter{maxextraalpha} | |
\def\themaxextraalpha{\the\c@maxextraalpha} | |
\newcounter{abbrvpenalty} | |
\def\theabbrvpenalty{\the\c@abbrvpenalty} | |
\newcounter{highnamepenalty} | |
\def\thehighnamepenalty{\the\c@highnamepenalty} | |
\newcounter{lownamepenalty} | |
\def\thelownamepenalty{\the\c@lownamepenalty} | |
\newcounter{maxparens} | |
\def\themaxparens{\the\c@maxparens} | |
\newcounter{parenlevel} | |
\def\theparenlevel{\the\c@parenlevel} | |
\newcount\blx@tempcnta | |
\newcount\blx@tempcntb | |
\newcount\blx@tempcntc | |
\newcount\blx@maxsection | |
\expandafter\newcount\csname blx@maxsegment@0\endcsname | |
\newcount\blx@notetype | |
\newcount\blx@parenlevel@text | |
\newcount\blx@parenlevel@foot | |
\expandafter\newcount\csname blx@sectionciteorder@0\endcsname | |
\def\blx@uniquename{0} | |
\def\blx@uniquelist{0} | |
\def\blx@maxbibnames{0} | |
\def\blx@minbibnames{0} | |
\def\blx@maxcitenames{0} | |
\def\blx@mincitenames{0} | |
\def\blx@maxbibnames@type{\blx@maxbibnames} | |
\def\blx@minbibnames@type{\blx@minbibnames} | |
\def\blx@maxcitenames@type{\blx@maxcitenames} | |
\def\blx@mincitenames@type{\blx@mincitenames} | |
\def\blx@maxalphanames{0} | |
\def\blx@minalphanames{0} | |
\def\blx@maxitems{0} | |
\def\blx@minitems{0} | |
\def\blx@maxitems@type{\blx@maxitems} | |
\def\blx@minitems@type{\blx@minitems} | |
\newlength{\labelnumberwidth} | |
\newlength{\labelalphawidth} | |
\newlength{\biblabelsep} | |
\ifdef\bibitemsep % memoir | |
{} | |
{\newlength{\bibitemsep}} | |
\newlength{\bibnamesep} | |
\newlength{\bibinitsep} | |
\newlength{\bibparsep} | |
\newlength{\bibhang} | |
\newbool{refcontextdefaults} | |
\booltrue{refcontextdefaults}% | |
\newbool{sourcemap} | |
\newbool{citetracker} | |
\newbool{pagetracker} | |
\newbool{backtracker} | |
\newbool{citerequest} | |
\booltrue{citerequest} | |
\newbool{sortcites} | |
\newtoggle{blx@bbldone} | |
\newtoggle{blx@tempa} | |
\newtoggle{blx@tempb} | |
\newtoggle{blx@runltx} | |
\newtoggle{blx@runbiber} | |
\newtoggle{blx@block} | |
\newtoggle{blx@unit} | |
\newtoggle{blx@skipentry} | |
\newtoggle{blx@insert} | |
\newtoggle{blx@lastins} | |
\newtoggle{blx@keepunit} | |
\newtoggle{blx@bibtex} | |
\newtoggle{blx@debug} | |
\newtoggle{blx@sortcase} | |
\newtoggle{blx@sortupper} | |
\newtoggle{blx@autolangbib} | |
\newtoggle{blx@autolangcite} | |
\newtoggle{blx@clearlang} | |
\newtoggle{blx@defernumbers} | |
\newtoggle{blx@omitnumbers} | |
\newtoggle{blx@footnote} | |
\newtoggle{blx@labelalpha} | |
\newtoggle{blx@labelnumber} | |
\newtoggle{blx@labeltitle} | |
\newtoggle{blx@labeltitleyear} | |
\newtoggle{blx@labeldateparts} | |
\newtoggle{blx@natbib} | |
\newtoggle{blx@mcite} | |
\newtoggle{blx@loadfiles} | |
\newtoggle{blx@singletitle} | |
\newtoggle{blx@crossrefsource} | |
\newtoggle{blx@xrefsource} | |
\newtoggle{blx@uniqueprimaryauthor} | |
\newtoggle{blx@uniquetitle} | |
\newtoggle{blx@uniquebaretitle} | |
\newtoggle{blx@uniquework} | |
\newtoggle{blx@terseinits} | |
\newtoggle{blx@useprefix} | |
\newtoggle{blx@addset} | |
\newtoggle{blx@setonly} | |
\newtoggle{blx@dataonly} | |
\newtoggle{blx@skipbib} | |
\newtoggle{blx@skipbiblist} | |
\newtoggle{blx@skiplab} | |
\newtoggle{blx@citation} | |
\newtoggle{blx@bibliography} | |
\newtoggle{blx@citeindex} | |
\newtoggle{blx@bibindex} | |
\newtoggle{blx@localnumber} | |
\newtoggle{blx@refcontext} | |
% Nice command from etextools which causes too many problems if you load | |
% the whole package | |
% Don't use it on arbitrary user input as it dies on non-expandable arguments | |
\newcommand*{\blx@xifempty}[1]{\blx@xifstrcmp{#1}{}} | |
% {string1}{string2}{true}{false} | |
\newcommand*{\blx@xifstrcmp}[2]{\csname @% | |
\ifnum\pdf@strcmp{#1}{#2}=0 first\else second\fi | |
oftwo\endcsname} | |
% Special fields which need resolution using the information provided by biber | |
\listadd\abx@rfields{labeltitle} | |
\def\abx@dorfields{% | |
\dolistloop\abx@rfields% | |
} | |
\listadd\abx@rnames{labelname} | |
\def\abx@dornames{% | |
\dolistloop\abx@rnames% | |
} | |
% Used to track default refcontexts for citations | |
\cslet{blx@defaultrefcontexts@0}\@empty | |
\listadd\blx@allrefsections{0} | |
% Used to track sorting name key specifications | |
\global\let\blx@sortingnamekeyspecs\@empty | |
% Used to track transliterations | |
\global\let\blx@translits\@empty | |
% Initialise some lists which track changing citations/sortschemes | |
% etc. between runs | |
\global\let\blx@cites\@empty | |
\global\let\blx@refcontexts\@empty | |
\global\let\blx@lastrefcontexts\@empty | |
\global\let\blx@sortschemes\@empty | |
\global\let\blx@lastsortschemes\@empty | |
\global\let\blx@biblists\@empty | |
\global\let\blx@lastbiblists\@empty | |
\global\let\blx@lastcites\@empty | |
\global\let\blx@localnumaux\@empty | |
\newread\blx@bcfin | |
\newwrite\blx@bcfout | |
\def\blx@onlypreamble#1{% | |
\gappto\blx@dopreamblecmds{\do#1}} | |
\def\blx@dopreamblecmds{% | |
\do\blx@dopreamblecmds | |
\do\blx@onlypreamble} | |
% Deprecations | |
\newrobustcmd*{\DeprecateField}[2]{% | |
\csdef{abx@field@#1}{% | |
\ifcsundef{abx@field@legacy@warning@#1}{\blx@warning@noline{Field '#1' deprecated. #2}}{}% | |
\global\csdef{abx@field@legacy@warning@#1}{}}}% | |
\newrobustcmd*{\DeprecateList}[2]{% | |
\csdef{abx@list@#1}{% | |
\ifcsundef{abx@list@legacy@warning@#1}{\blx@warning@noline{List '#1' deprecated. #2}}{}% | |
\global\csdef{abx@list@legacy@warning@#1}{}}}% | |
\newrobustcmd*{\DeprecateName}[2]{% | |
\csdef{abx@name@#1}{% | |
\ifcsundef{abx@name@legacy@warning@#1}{\blx@warning@noline{Name '#1' deprecated. #2}}{}% | |
\global\csdef{abx@name@legacy@warning@#1}{}}}% | |
\DeprecateField{prefixnumber}{Please use 'labelprefix' instead} | |
%% Initialisation | |
\def\blx@blxinit{% | |
\let\blx@blxinit\relax | |
\blx@initunit} | |
\def\blx@secinit{% | |
\csgdef{blx@sections@\the\c@refsection}{true}% just to say we have a section for tests later | |
\ifcsundef{blx@bsee@\the\c@refsection} | |
{\global\cslet{blx@bsee@\the\c@refsection}\@empty} | |
{}% | |
\ifcsundef{blx@fsee@\the\c@refsection} | |
{\global\cslet{blx@fsee@\the\c@refsection}\@empty} | |
{}% | |
\blx@ibidreset@force | |
\blx@idemreset@force | |
\blx@opcitreset@force | |
\blx@loccitreset@force | |
% List to track all aliases in a section. We need to output all aliases | |
% to the .bcf every time so that they are visible to biber | |
% Reset only if undefined | |
\ifcsundef{blx@keyaliases@\the\c@refsection} | |
{\global\cslet{blx@keyaliases@\the\c@refsection}\@empty} | |
{}% | |
\ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty} | |
{}} | |
%% Auxiliary commands | |
\protected\def\blx@safe@actives{% | |
\let\blx@if@safe@actives\if@safe@actives | |
\let\if@safe@actives\iftrue} | |
\protected\def\blx@rest@actives{% | |
\let\if@safe@actives\blx@if@safe@actives} | |
\protected\def\blx@regimc#1{% | |
\xappto\blx@blxinit{% | |
\let\noexpand#1\expandafter\noexpand\csname | |
blx@imc@\expandafter\@gobble\string#1\endcsname}} | |
\protected\def\blx@regimcs#1{\blx@regimcs@i#1&} | |
\def\blx@regimcs@i#1{% | |
\ifx#1&\else | |
\blx@regimc#1% | |
\expandafter\blx@regimcs@i | |
\fi} | |
% {<field>} => \do{<item1>}\do{<item2>}... | |
\def\blx@imc@docsvfield#1{% | |
\blx@imc@iffieldundef{#1} | |
{} | |
{\expandafter\expandafter\expandafter\docsvlist | |
\expandafter\expandafter\expandafter{% | |
\csname abx@field@#1\endcsname}}} | |
% {<handler>}{<field>} => <handler>{<item1>}<handler>{<item2>}... | |
\def\blx@imc@forcsvfield#1#2{% | |
\blx@imc@iffieldundef{#2} | |
{} | |
{\expandafter\expandafter\expandafter\blx@imc@forcsvfield@i | |
\expandafter\expandafter\expandafter{% | |
\csname abx@field@#2\endcsname}{#1}}} | |
\def\blx@imc@forcsvfield@i#1#2{\forcsvlist{#2}{#1}} | |
\blx@regimcs{\docsvfield \forcsvfield} | |
% {<list>|<listmacro>} | |
\protected\long\def\blx@listloop#1{% | |
\expandafter\blx@listloop@i#1|&} | |
\long\def\blx@listloop@i#1|{% | |
\ifblank{#1} | |
{\blx@break} | |
{\blx@do{#1}\blx@listloop@i}} | |
\long\def\blx@break#1&{% | |
\blx@done | |
\undef\blx@do | |
\undef\blx@done} | |
% {<listmacro>}{<listcsname>} => matches in <listmacro> | |
\protected\def\blx@filter#1#2{% | |
\def\do##1{% | |
\ifinlistcs{##1}{#2} | |
{\listadd#1{##1}} | |
{}}% | |
\blx@runfilter#1} | |
% {<listmacro>}{<listcsname>} => matches in <listmacro> | |
% Slightly odd use of filtering to do citation sorting. | |
% Same as blx@filter but it keeps \tempcnta in step with the | |
% resulting number of things in the filtered list. This is | |
% because \tempcnta is used to set citetotal - this use | |
% of filtering for cite sorting has the side-effect of stripping | |
% duplicates like \cite{foo,foo} but we need then to keep citetotal | |
% in sync. | |
\protected\def\blx@filtercitesort#1#2{% | |
\blx@tempcnta\z@ | |
\def\do##1{% | |
\ifinlistcs{##1}{#2} | |
{\listadd#1{##1}% | |
\advance\blx@tempcnta\@ne} | |
{}}% | |
\blx@runfilter#1} | |
% {<listmacro>}{<listcsname>} => neg. matches in <listmacro> | |
\protected\def\blx@notfilter#1#2{% | |
\def\do##1{% | |
\ifinlistcs{##1}{#2} | |
{} | |
{\listadd#1{##1}}}% | |
\blx@runfilter#1} | |
\def\blx@runfilter#1{% | |
\begingroup\edef#1{\endgroup | |
\unexpanded{\let#1\@empty\dolistloop}{#1}}% | |
#1\let\do\noexpand} | |
% {<code>}{<string>} => <code>{<string>} | |
\protected\def\blx@xsanitizeafter#1#2{% | |
\begingroup | |
\abx@hook@xsanitize | |
\def\blx@tempa{\endgroup#1}% | |
\edef\blx@tempb{#2}% | |
\expandafter\blx@tempa | |
\expandafter{\detokenize\expandafter{\blx@tempb}}} | |
\def\abx@hook@xsanitize{% | |
\blx@safe@actives | |
\let\protect\string} | |
% {<code>}{<string>} => <code>{<string>} | |
\begingroup | |
\catcode`\<=\active | |
\catcode`\>=\active | |
\catcode`\&=\active | |
\catcode`\"=\active | |
\catcode`\'=\active | |
\protected\gdef\blx@xmlsanitizeafter#1#2{% | |
\begingroup | |
\abx@hook@xsanitize | |
\def\blx@tempa{\endgroup#1}% | |
\edef\blx@tempb{#2}% | |
\let\do\@makeother | |
\dospecials | |
\catcode`\<=\active | |
\catcode`\>=\active | |
\catcode`\&=\active | |
\catcode`\"=\active | |
\catcode`\'=\active | |
\edef<{\string<\string;}% | |
\edef>{\string>\string;}% | |
\edef&{\string&\string;}% | |
\edef"{\string"\string;}% | |
\edef'{\string&apos\string;}% | |
\endlinechar\m@ne | |
\everyeof{\noexpand}% | |
\edef\blx@tempb{\scantokens\expandafter{\blx@tempb}}% | |
\expandafter\blx@tempa | |
\expandafter{\detokenize\expandafter{\blx@tempb}}} | |
\endgroup | |
% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>} | |
\protected\long\def\blx@inputonce#1#2#3#4#5#6{% | |
\ifcsundef{blx@file@#1} | |
{\blx@info@noline{Trying to load #2..}% | |
\IfFileExists{#1} | |
{\blx@info@noline{... file '#1' found}% | |
\listxadd\blx@list@req@stat{#1}% | |
#3\@@input\@filef@und#4#5} | |
{\blx@info@noline{... file '#1' not found}#6}% | |
\global\csdef{blx@file@#1}{}% | |
\@addtofilelist{#1}} | |
{#5}} | |
% {<write>}{<precode>}{<string>} | |
\protected\def\blx@auxwrite#1#2#3{% | |
\if@filesw | |
\begingroup | |
\blx@safe@actives | |
\let\protect\string | |
#2% | |
\immediate\write#1{#3}% | |
\endgroup | |
\fi} | |
% {<file>}{<signature>}{<true>}{<false>} | |
\def\blx@ifsigned#1#2{% | |
\begingroup | |
\let\blx@tempa\@firstoftwo | |
\edef\blx@tempb{\csuse{blx@sig@#2}}% | |
\edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}% | |
\openin\blx@bcfin #1.#2\relax | |
\ifeof\blx@bcfin | |
\else | |
\endlinechar\m@ne | |
\readline\blx@bcfin to \blx@tempc | |
\ifeof\blx@bcfin | |
\else | |
\ifx\blx@tempb\blx@tempc | |
\readline\blx@bcfin to \blx@tempc | |
\edef\blx@tempb{\csuse{blx@ver@#2}}% | |
\edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}% | |
\ifx\blx@tempb\blx@tempc | |
\else | |
\blx@warning@noline{% | |
File '#1.#2' is wrong format version - expected \blx@bblversion} | |
\fi | |
\else | |
\blx@error | |
{File '#1.#2' not created by biblatex} | |
{This file was apparently not created by biblatex. | |
Rename it or\MessageBreak move it to a location were | |
TeX will not find it. If this error\MessageBreak | |
persists, consider redefining \string\blxauxsuffix.% | |
See the biblatex\MessageBreak manual for details}% | |
\let\blx@tempa\@secondoftwo | |
\fi | |
\fi | |
\fi | |
\closein\blx@bcfin | |
\expandafter\endgroup\blx@tempa} | |
\edef\blx@sig@bbl{\@percentchar\space $ biblatex auxiliary file $} | |
\edef\blx@ver@bbl{\@percentchar\space $ biblatex bbl format version \blx@bblversion\space $} | |
\edef\blx@sig@bcf{\detokenize{<?xml version="1.0" encoding="UTF-8"?>}} | |
\edef\blx@ver@bcf{% | |
\detokenize{<bcf:controlfile version="}\blx@bcfversion | |
\detokenize{" bltxversion="}\abx@version | |
\detokenize{" xmlns:bcf="https://sourceforge.net/projects/biblatex">}} | |
% {<true>}{<false>} | |
\newrobustcmd*{\lbx@ifutfinput}{\ifboolexpr{% | |
test {\ifdefstring\inputencodingname{utf8}} | |
or | |
test {\ifdefstring\inputencodingname{utf8x}} | |
or | |
test {\ifdefstring\inputencodingname{lutf8}} | |
or | |
( test {\ifundef\inputencodingname} | |
and | |
( not test {\ifundef\XeTeXrevision} | |
or | |
not test {\ifundef\luatexversion} | |
) | |
) | |
}} | |
%% User feedback | |
\protected\def\blx@error#1#2{% | |
\begingroup | |
\blx@safe@actives | |
\PackageError{biblatex}{#1}{#2.}% | |
\endgroup} | |
\protected\def\blx@warning@noline#1{% | |
\begingroup | |
\blx@safe@actives | |
\PackageWarningNoLine{biblatex}{#1}% | |
\endgroup} | |
\let\blx@warning\blx@warning@noline | |
\AtEndOfPackage{ | |
\protected\def\blx@warning#1{% | |
\begingroup | |
\blx@safe@actives | |
\PackageWarning{biblatex}{#1}% | |
\endgroup}} | |
\protected\def\blx@warning@entry#1{% | |
\ifdef\abx@field@entrykey | |
{\blx@warning{#1\MessageBreak at entry '\abx@field@entrykey'}} | |
{\blx@warning{#1}}} | |
\protected\def\blx@info@noline#1{% | |
\begingroup | |
\blx@safe@actives | |
\PackageInfo{biblatex}{#1\@gobble}% | |
\endgroup} | |
\let\blx@info\blx@info@noline | |
\AtEndOfPackage{ | |
\protected\def\blx@info#1{% | |
\begingroup | |
\blx@safe@actives | |
\PackageInfo{biblatex}{#1}% | |
\endgroup}} | |
\let\blx@noline\@gobble | |
\AtEndOfPackage{\let\blx@noline\@empty} | |
\def\blx@imc@BibliographyWarning{\blx@warning@entry} | |
\blx@regimc\BibliographyWarning | |
\protected\def\abx@missing#1{% | |
\mbox{\reset@font\bfseries#1}} | |
\def\blx@err@patch#1{% | |
\blx@error | |
{Patching #1 failed} | |
{This is an internal issue typically caused by a | |
conflict\MessageBreak between biblatex and some | |
other package. Modifying\MessageBreak the package | |
loading order may fix the problem}} | |
\def\blx@err@nolang#1{% | |
\blx@error | |
{Language '#1' not found} | |
{The localization module for '#1' could not be found}} | |
\def\blx@err@invarg#1#2{% | |
\blx@error | |
{Argument '#1' invalid} | |
{\ifblank{#2} | |
{The argument you have supplied is invalid.\MessageBreak | |
See the biblatex manual for details} | |
{#2}}} | |
\def\blx@err@invopt#1#2{% | |
\blx@error | |
{Option '#1' invalid} | |
{\ifblank{#2} | |
{The option you have supplied is invalid.\MessageBreak | |
See the biblatex manual for valid option keys and | |
possible values} | |
{#2}}} | |
\def\blx@err@confopt#1#2{% | |
\blx@error | |
{Conflicting options\ifblank{#1}{}{ (#1)}} | |
{\ifblank{#2} | |
{The option you have supplied conflicts with another one.\MessageBreak | |
See the biblatex manual for valid option keys and possible values} | |
{#2}}} | |
\def\blx@err@optdef#1{% | |
\blx@error | |
{Conflicting options} | |
{The option '#1' is already defined}} | |
\def\blx@err@nodocdiv#1{% | |
\blx@error | |
{\@backslashchar#1 not provided by class} | |
{The document class does not seems to support #1s}} | |
\def\blx@err@nosec#1{% | |
\blx@error | |
{Section '#1' not found} | |
{The reference section '#1' could not be found}} | |
\def\blx@err@nosort#1{% | |
\blx@error | |
{Sorting scheme '#1' not found} | |
{The sorting scheme '#1' does not seem to have been defined anywhere}} | |
\def\blx@err@secfirst{% | |
\blx@error | |
{'section' not first filter} | |
{When passing multiple filter options, | |
the 'section' filter must be given first}} | |
\protected\def\blx@err@nestcite{% | |
\blx@error | |
{Nested citation command} | |
{Citation commands may not be nested}} | |
\def\blx@err@nestenv#1{% | |
\blx@error | |
{Nested '#1' environment} | |
{This environment may not be nested}} | |
\protected\def\blx@err@citecmd#1{% | |
\begingroup | |
\escapechar\m@ne | |
\blx@error | |
{Command '\@backslashchar\string#1' undefined} | |
{The citation command '\@backslashchar\string#1' | |
has not been defined\MessageBreak by the | |
selected citation style}% | |
\endgroup} | |
\def\blx@err@endnote#1{% | |
\blx@error | |
{Missing or incomplete endnote support} | |
{There does not seem to be endnote support available\MessageBreak | |
or the available support is incomplete.\MessageBreak | |
If you continue, I will fall back to '\string#1'}% | |
#1} | |
\def\blx@err@matchparen#1{% | |
\blx@error | |
{Unbalanced parentheses or brackets} | |
{\iftoggle{blx@footnote}{#1 in foot or endnote}{#1}.\MessageBreak | |
This error is triggered if \string\bibopenparen\space and | |
\string\bibcloseparen\MessageBreak or | |
\string\bibopenbracket\space and \string\bibclosebracket\space | |
are unbalanced\MessageBreak or mismatched}} | |
\def\blx@err@nestparen#1{% | |
\blx@error | |
{Too deeply nested parentheses or brackets} | |
{#1 nested too deeply% | |
\iftoggle{blx@footnote}{\space in foot or endnote}{}.\MessageBreak | |
This error may also be triggered if \string\mkbibparens\MessageBreak | |
or \string\mkbibbrackets\space are nested too deeply}} | |
\def\blx@err@filter{% | |
\blx@error | |
{Invalid filter expression} | |
{The filter expression you have supplied is invalid.\MessageBreak | |
See the biblatex manual for details}} | |
\def\blx@warn@nohyph#1{% | |
\blx@warning{No hyphenation patterns for '#1'}} | |
\protected\def\blx@warn@citecmd#1#2{% | |
\blx@warning{% | |
'\string#1' not defined by citation style.\MessageBreak | |
Falling back to '\string#2'}% | |
#2} | |
\protected\def\blx@warn@nostring#1{% | |
\blx@warning@entry{Bibliography string '#1' undefined}% | |
\abx@missing{#1}} | |
\def\blx@warn@conflopt#1{% | |
\blx@warning{Conflicting options.\MessageBreak#1}} | |
\def\blx@warn@badoptdt#1{% | |
\blx@warning{Invalid option datatype '#1'.\MessageBreak Defaulting to 'boolean'}} | |
\def\blx@warn@depropt#1{% | |
\blx@warning{Deprecated option.\MessageBreak Ignoring '#1'}} | |
\def\blx@warn@bibempty{% | |
\@latex@warning{Empty bibliography}} | |
\def\blx@warn@biblistempty#1{% | |
\@latex@warning{Empty biblist '#1'}} | |
\def\blx@inf@refsec{% | |
\blx@info{Reference section=\the\c@refsection}}% | |
\def\blx@warn@delimdeclare#1#2{% | |
\blx@warning{Delimiter '#1' in context '#2' already defined, overwriting}} | |
\def\blx@warn@delimuse#1#2{% | |
\blx@warning{Delimiter '#1' in context '#2' undefined}} | |
\def\blx@inf@refseg{% | |
\ifnum\c@refsection=\z@ | |
\blx@info{Reference segment=\the\c@refsegment}% | |
\else | |
\blx@info{% | |
Reference section/segment=% | |
\the\c@refsection/\the\c@refsegment}% | |
\fi} | |
\def\blx@inf@creset{% | |
\blx@info{Resetting trackers}}% | |
\def\blx@msg@cundef#1{% | |
Citation '#1' undefined} | |
\def\blx@msg@cundefon#1{% | |
Citation '#1' on page \the\c@page\space undefined} | |
% Dummy as backend is biber by default. Some style may still use this to | |
% check though. | |
\newrobustcmd*{\RequireBiber}[1][2]{} | |
% \blx@list@active active aux files (basename) | |
% [internal list] | |
% \blx@list@inactive inactive aux files (basename) | |
% [internal list] | |
% \blx@list@bibfiles@<auxfile> aux file -> bib file mapping (refsections) | |
% aux file (basename) -> bib files (full) | |
% [internal list] | |
\let\blx@list@active\@empty | |
\let\blx@list@inactive\@empty | |
\listeadd\blx@list@inactive{\jobname} | |
\protected\def\blx@regbibfiles#1#2{% | |
\forlistloop{\blx@regbibfile{#1}}{#2}} | |
\def\blx@regbibfile#1#2{% | |
\ifcsundef{blx@res@loca@#2} | |
{\blx@regbibfile@i{#1}{#2}} | |
{\ifcsstring{blx@res@loca@#2}{local} | |
{\blx@regbibfile@i{#1}{#2}} | |
{}}} | |
\def\blx@regbibfile@i#1#2{% | |
\ifinlistcs{#2}{blx@list@bibfiles@#1} | |
{} | |
{\listcsxadd{blx@list@bibfiles@#1}{#2}}} | |
\def\blx@check@logreq{% | |
\begingroup | |
\ltxrequest{biblatex}{{\iftoggle{blx@runltx}{1}{0}}}{% | |
\provides[type=dynamic]{ | |
\file{\jobname.bcf} | |
} | |
\requires[type=dynamic]{ | |
\file{\jobname.bbl} | |
} | |
\ifdef\blx@list@req@edit | |
{\requires[type=editable]{ | |
\forlistloop\file\blx@list@req@edit | |
}} | |
{} | |
\ifdef\blx@list@req@stat | |
{\requires[type=static]{ | |
\forlistloop\file\blx@list@req@stat | |
}} | |
{} | |
}% | |
\logrequest[package=biblatex,priority=5,active={{\iftoggle{blx@runbiber}{1}{0}}}]{% | |
\generic{biber} | |
\cmdline{ | |
\binary{biber} | |
\infile{\jobname} | |
} | |
\input{ | |
\file{\jobname.bcf} | |
} | |
\output{ | |
\file{\jobname.bbl} | |
} | |
\provides[type=dynamic]{ | |
\file{\jobname.bbl} | |
} | |
\requires[type=dynamic]{ | |
\file{\jobname.bcf} | |
} | |
\ifcsdef{blx@list@bibfiles@\jobname} | |
{\requires[type=editable]{ | |
\def\do{\file} | |
\dolistcsloop{blx@list@bibfiles@\jobname} | |
}} | |
{} | |
}% | |
\endgroup} | |
\def\blx@logreq@active#1{% | |
\ifblank{#1} | |
{} | |
{\@latex@warning{#1}}% | |
\blx@rerun@latex | |
\blx@rerun@biber} | |
\def\blx@rerun@latex{% | |
\G@refundefinedtrue | |
\global\toggletrue{blx@runltx}% | |
\global\let\blx@rerun@latex\relax} | |
\def\blx@rerun@biber{% | |
\global\toggletrue{blx@runbiber}% | |
\global\let\blx@rerun@biber\relax} | |
\let\blx@checksum@old\@empty | |
\let\blx@checksum@new\@empty | |
\let\blx@pagesum@old\@empty | |
\let\blx@pagesum@new\@empty | |
\def\blx@checksum#1#2#3{% | |
\begingroup | |
\blx@tempcnta\the\numexpr0#2*0#3\relax | |
\blx@tempcntb\blx@tempcnta | |
\divide\blx@tempcntb10 | |
\multiply\blx@tempcntb10 | |
\advance\blx@tempcnta-\blx@tempcntb | |
\xdef#1{#1\the\blx@tempcnta}% | |
\endgroup} | |
\def\blx@addchecksum{\blx@checksum\blx@checksum@old} | |
\def\blx@addpagesum{\blx@checksum\blx@pagesum@old} | |
\AtEndDocument{% | |
\def\blx@addchecksum{\blx@checksum\blx@checksum@new}% | |
\def\blx@addpagesum{\blx@checksum\blx@pagesum@new}} | |
\protected\def\blx@check@rerun{% | |
\begingroup | |
\blx@tempcnta\z@ | |
\iftoggle{blx@runltx} | |
{\blx@tempcnta\@ne} | |
{\ifx\blx@checksum@old\blx@checksum@new | |
\ifx\blx@pagesum@old\blx@pagesum@new | |
\else | |
\blx@tempcnta\@ne | |
\fi | |
\else | |
\blx@tempcnta\@ne | |
\fi}% | |
\iftoggle{blx@runbiber} | |
{\advance\blx@tempcnta\tw@} | |
{}% | |
\ifcase\blx@tempcnta | |
\or | |
\blx@rerun@latex | |
\blx@warning@noline{% | |
Please rerun LaTeX% | |
\ifx\blx@pagesum@old\blx@pagesum@new\else | |
.\MessageBreak Page breaks have changed% | |
\fi}% | |
\else | |
\blx@rerun@latex | |
\blx@warn@auxlist | |
\fi | |
\endgroup} | |
\def\blx@warn@auxlist{% | |
\begingroup | |
\edef\blx@tempa{% | |
Please (re)run Biber on the file:\MessageBreak | |
\jobname}% | |
\blx@warning@noline{% | |
\blx@tempa\MessageBreak | |
and rerun LaTeX afterwards}% | |
\endgroup} | |
\AfterEndDocument{% | |
\blx@check@rerun | |
\blx@check@logreq} | |
%% Punctuation and capitalization | |
% 1001 prefix sep for names (e.g. d'Argent ... \printnames only) | |
% 1002 abbreviation period (dot) | |
% 1003/1250 comma | |
% 1004/1500 semicolon | |
% 1005/2000 colon | |
% 1006/3000 period | |
% 1007/3001 exclamation mark | |
% 1008/3002 question mark | |
% 1009 suppress punctuation | |
% 1010 new paragaph | |
\mathchardef\blx@sf@prefixchar=1001% e.g. apostrophe or equivalent for prefix handling | |
\mathchardef\blx@sf@dot=1002 | |
\mathchardef\blx@sf@comma=1003 | |
\mathchardef\blx@sf@semicolon=1004 | |
\mathchardef\blx@sf@colon=1005 | |
\mathchardef\blx@sf@period=1006 | |
\mathchardef\blx@sf@exclam=1007 | |
\mathchardef\blx@sf@question=1008 | |
\mathchardef\blx@sf@nopunct=1009 | |
\mathchardef\blx@sf@par=1010 | |
\mathchardef\blx@sf@threshold@low=1002 | |
\mathchardef\blx@sf@threshold@high=1009 | |
\csdef{blx@sf@1250}{\the\blx@sf@comma} | |
\csdef{blx@sf@1500}{\the\blx@sf@semicolon} | |
\csdef{blx@sf@2000}{\the\blx@sf@colon} | |
\csdef{blx@sf@3000}{\the\blx@sf@period} | |
\csdef{blx@sf@3001}{\the\blx@sf@exclam} | |
\csdef{blx@sf@3002}{\the\blx@sf@question} | |
\csdef{blx@pm@,}{comma} | |
\csdef{blx@pm@;}{semicolon} | |
\csdef{blx@pm@:}{colon} | |
\csdef{blx@pm@.}{period} | |
\csdef{blx@pm@!}{exclam} | |
\csdef{blx@pm@?}{question} | |
\def\blx@setsfcodes{% | |
\let\blx@setsfcodes\relax | |
\let\frenchspacing\blx@setfrcodes | |
\let\nonfrenchspacing\blx@setencodes | |
\ifnum\sfcode`\.>2000 | |
\blx@setencodes | |
\else | |
\blx@setfrcodes | |
\fi | |
\@setquotesfcodes | |
\sfcode`\(=\z@ | |
\sfcode`\)=\z@ | |
\sfcode`\[=\z@ | |
\sfcode`\]=\z@ | |
\sfcode`\<=\z@ | |
\sfcode`\>=\z@} | |
\def\blx@setfrcodes{% | |
\ifnum\sfcode`\A=\@m | |
\else | |
\blx@setazcodes | |
\fi | |
\sfcode`\,=\blx@sf@comma | |
\sfcode`\;=\blx@sf@semicolon | |
\sfcode`\:=\blx@sf@colon | |
\sfcode`\.=\blx@sf@period | |
\sfcode`\!=\blx@sf@exclam | |
\sfcode`\?=\blx@sf@question | |
} | |
\def\blx@setencodes{% | |
\sfcode`\,=1250 | |
\sfcode`\;=1500 | |
\sfcode`\:=2000 | |
\sfcode`\.=3000 | |
\sfcode`\!=3001 | |
\sfcode`\?=3002 | |
} | |
% Defining characters that count as prefices in names like d'Argent | |
% Code from moewe | |
\let\blx@prefchars\@empty | |
\def\blx@defprefchars@loop#1{% | |
\ifx#1\relax | |
\else | |
\listadd{\blx@prefchars}{#1}% | |
\expandafter\blx@defprefchars@loop | |
\fi} | |
\def\blx@defprefchars#1{% | |
\expandafter\blx@defprefchars@loop\detokenize{#1}\relax} | |
\newrobustcmd*{\DeclarePrefChars}{% | |
\@ifstar | |
{\blx@defprefchars} | |
{\let\blx@prefchars\@empty | |
\blx@defprefchars}} | |
\DeclarePrefChars{'} | |
\protected\def\blx@imc@ifprefchar{% | |
\ifhmode | |
\begingroup | |
\ifnum\spacefactor=\blx@sf@prefixchar | |
\endgroup | |
\expandafter\expandafter | |
\expandafter\@firstoftwo | |
\else | |
\endgroup | |
\expandafter\expandafter | |
\expandafter\@secondoftwo | |
\fi | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
\blx@regimcs{\ifprefchar} | |
\def\blx@namecodes{% | |
\ifnum\sfcode`\A=\@m | |
\else | |
\blx@setazcodes | |
\fi | |
\def\do##1{\sfcode`##1=\blx@sf@prefixchar}% | |
\dolistloop\blx@prefchars | |
} | |
\begingroup | |
\let\blx@setazcodes\@empty | |
\def\blx@tempa{% | |
\xdef\blx@setazcodes{% | |
\blx@setazcodes | |
\sfcode\the\blx@tempcnta=\@m} | |
\ifnum\blx@tempcnta<\blx@tempcntb | |
\advance\blx@tempcnta\@ne | |
\expandafter\blx@tempa | |
\fi} | |
\blx@tempcnta`\A | |
\blx@tempcntb`\Z | |
\blx@tempa | |
\ifnum\inputlineno=\m@ne\else | |
\blx@tempcnta"80 | |
\blx@tempcntb"9C | |
\blx@tempa | |
\blx@tempcnta"C0 | |
\blx@tempcntb"DF | |
\blx@tempa | |
\fi | |
\ifx\Umathcode\undefined | |
\else | |
\openin\blx@bcfin=UnicodeData.txt % | |
\ifeof\blx@bcfin | |
\else | |
\let\blx@setazcodes\@empty | |
\def\Lu{Lu} | |
\def\storedpar{\par} | |
\def\blx@tempa#1;#2;#3;#4\relax{% | |
\def\temp{#3}% | |
\ifx\temp\Lu | |
\xdef\blx@setazcodes{% | |
\blx@setazcodes | |
\sfcode"#1=\@m | |
} | |
\fi | |
} | |
\loop\unless\ifeof\blx@bcfin | |
\read\blx@bcfin to \blx@tempb | |
\unless\ifx\blx@tempb\storedpar | |
\expandafter\blx@tempa\blx@tempb\relax | |
\fi | |
\repeat | |
\fi | |
\closein\blx@bcfin | |
\fi | |
\endgroup | |
\def\blx@spacefactor{% | |
\ifhmode | |
\ifcsundef{blx@sf@\the\spacefactor} | |
{\the\spacefactor} | |
{\csname blx@sf@\the\spacefactor\endcsname}% | |
\else | |
\the\blx@sf@par | |
\fi} | |
\protected\def\blx@leavevmode{% | |
\ifhmode | |
\else | |
\leavevmode\spacefactor\blx@sf@par | |
\fi} | |
\protected\def\blx@leavevmode@cite{% | |
\ifhmode | |
\ifnum\spacefactor=\blx@sf@par | |
\else | |
\spacefactor\@m | |
\fi | |
\else | |
\leavevmode | |
\fi} | |
\protected\def\blx@imc@setpunctfont#1{% | |
\blx@ifpuncthook | |
{\gdef\abx@puncthook{% | |
\ifdim\lastkern>\z@\unkern\fi | |
\blx@imc@resetpunctfont#1}} | |
{}} | |
\protected\def\blx@imc@resetpunctfont{% | |
\blx@ifpuncthook | |
{\global\let\abx@puncthook\@firstofone} | |
{}} | |
\protected\def\blx@setpostpunct#1{% | |
\blx@ifuspunct | |
{\global\let\blx@postpunct\blx@dopostpunct | |
\ifdef\blx@thepostpunct | |
{\gappto\blx@thepostpunct{#1}} | |
{\gdef\blx@thepostpunct{#1}}} | |
{}} | |
\def\blx@dopostpunct{% | |
\blx@thepostpunct | |
\global\let\blx@postpunct\@empty | |
\global\undef\blx@thepostpunct} | |
\protected\def\blx@postpunct@agroup{% | |
\aftergroup\blx@postpunct | |
\let\blx@postpunct@agroup\@empty} | |
% {<characters>} | |
\newrobustcmd*{\DeclareCapitalPunctuation}[1]{% | |
\cslet{blx@cap@\the\blx@sf@par}\@empty | |
\csundef{blx@cap@\the\blx@sf@comma}% | |
\csundef{blx@cap@\the\blx@sf@semicolon}% | |
\csundef{blx@cap@\the\blx@sf@colon}% | |
\csundef{blx@cap@\the\blx@sf@period}% | |
\csundef{blx@cap@\the\blx@sf@exclam}% | |
\csundef{blx@cap@\the\blx@sf@question}% | |
\ifblank{#1} | |
{} | |
{\expandafter\blx@defcapstring\detokenize{#1}\relax}} | |
\def\blx@defcapstring#1{% | |
\ifx#1\relax | |
\else | |
\begingroup | |
\blx@setfrcodes | |
\ifcsdef{blx@pm@#1} | |
{\expandafter\endgroup | |
\expandafter\let | |
\csname blx@cap@\the\sfcode`#1\endcsname\@empty} | |
{\blx@warning{Ignoring invalid punctuation mark '#1'}% | |
\endgroup}% | |
\expandafter\blx@defcapstring | |
\fi} | |
% {<characters>} | |
\newrobustcmd*{\DeclareQuotePunctuation}[1]{% | |
\csdef{blx@qp@comma}{\blx@postpunct}% | |
\csdef{blx@qp@semicolon}{\blx@postpunct}% | |
\csdef{blx@qp@colon}{\blx@postpunct}% | |
\csdef{blx@qp@period}{\blx@postpunct}% | |
\csdef{blx@qp@exclam}{\blx@postpunct}% | |
\csdef{blx@qp@question}{\blx@postpunct}% | |
\cslet{blx@pq@comma}\@empty | |
\cslet{blx@pq@semicolon}\@empty | |
\cslet{blx@pq@colon}\@empty | |
\cslet{blx@pq@period}\@empty | |
\cslet{blx@pq@exclam}\@empty | |
\cslet{blx@pq@question}\@empty | |
\let\blx@quotepunct\@empty | |
\ifblank{#1} | |
{\let\blx@ifuspunct\@secondoftwo} | |
{\let\blx@ifuspunct\@firstoftwo | |
\expandafter\blx@defquotepunct\detokenize{#1}&}} | |
\def\blx@defquotepunct#1{% | |
\ifx\relax | |
\else | |
\ifcsdef{blx@pm@#1} | |
{\appto\blx@quotepunct{#1}% | |
\cslet{blx@qp@\csuse{blx@pm@#1}}\@empty | |
\csdef{blx@pq@\csuse{blx@pm@#1}}{\blx@postpunct}} | |
{\blx@warning{Ignoring invalid punctuation mark '#1'}}% | |
\expandafter\blx@defquotepunct | |
\fi} | |
% {<mark>}{<characters>} | |
\newrobustcmd*{\DeclarePunctuationPairs}[2]{% | |
\ifcsdef{blx@sf@\detokenize{#1}} | |
{\ifnum\csname blx@sf@\detokenize{#1}\endcsname>\blx@sf@prefixchar | |
\ifnum\csname blx@sf@\detokenize{#1}\endcsname<\blx@sf@nopunct | |
\expandafter\blx@defpunctpairs | |
\expandafter{\the\csname blx@sf@\detokenize{#1}\endcsname}{#2}% | |
\else | |
\blx@err@invarg{\detokenize{#1}{}}% | |
\fi | |
\else | |
\blx@err@invarg{\detokenize{#1}{}}% | |
\fi} | |
{\blx@err@invarg{\detokenize{#1}{}}}} | |
\def\blx@defpunctpairs#1#2{% | |
\blx@undefpair{#1}{\the\blx@sf@dot}% | |
\blx@undefpair{#1}{\the\blx@sf@comma}% | |
\blx@undefpair{#1}{\the\blx@sf@semicolon}% | |
\blx@undefpair{#1}{\the\blx@sf@colon}% | |
\blx@undefpair{#1}{\the\blx@sf@period}% | |
\blx@undefpair{#1}{\the\blx@sf@exclam}% | |
\blx@undefpair{#1}{\the\blx@sf@question}% | |
\ifblank{#2} | |
{} | |
{\begingroup | |
\def\blx@tempa{#1}% | |
\let\blx@tempb\@empty | |
\blx@setfrcodes | |
\sfcode`\*=\blx@sf@dot | |
\expandafter\blx@defpair\detokenize{#2}&% | |
\expandafter\endgroup\blx@tempb}} | |
\def\blx@defpair#1{% | |
\ifx% | |
\else | |
\ifnum\the\sfcode`#1>\blx@sf@prefixchar | |
\ifnum\the\sfcode`#1<\blx@sf@nopunct | |
\eappto\blx@tempb{% | |
\cslet{blx@pp@\blx@tempa @\the\sfcode`#1}\noexpand\@empty}% | |
\else | |
\blx@err@invarg{#1}{}% | |
\fi | |
\else | |
\blx@err@invarg{#1}{}% | |
\fi | |
\expandafter\blx@defpair | |
\fi} | |
\def\blx@undefpair#1#2{% | |
\ifcsdef{blx@pp@#1@#2} | |
{\csundef{blx@pp@#1@#2}} | |
{}} | |
\protected\def\blx@resetpunct{% | |
\DeclareCapitalPunctuation{.!?}% | |
\DeclarePunctuationPairs{dot}{}% | |
\DeclarePunctuationPairs{comma}{*!?}% | |
\DeclarePunctuationPairs{semicolon}{*!?}% | |
\DeclarePunctuationPairs{colon}{*!?}% | |
\DeclarePunctuationPairs{period}{}% | |
\DeclarePunctuationPairs{exclam}{*}% | |
\DeclarePunctuationPairs{question}{*}% | |
\DeclareQuotePunctuation{}% | |
\def\abx@dot{\ifdim\lastkern>\z@\unkern\fi.\spacefactor\blx@sf@dot}% | |
\def\abx@comma{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{,}}% | |
\def\abx@semicolon{\abx@puncthook{;}}% | |
\def\abx@colon{\abx@puncthook{:}}% | |
\def\abx@period{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{.}}% | |
\def\abx@exclam{\abx@puncthook{!}}% | |
\def\abx@question{\abx@puncthook{?}}% | |
\global\let\abx@puncthook\@firstofone | |
\global\let\blx@postpunct\@empty} | |
\blx@resetpunct | |
% {<character>}{<true>}{<false>} | |
\protected\def\blx@imc@ifpunctmark#1{% | |
\ifhmode | |
\begingroup | |
\sfcode`\*=\blx@sf@dot | |
\ifnum\sfcode`#1=\spacefactor | |
\endgroup | |
\expandafter\expandafter | |
\expandafter\@firstoftwo | |
\else | |
\endgroup | |
\expandafter\expandafter | |
\expandafter\@secondoftwo | |
\fi | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<true>}{<false>} | |
\protected\def\blx@imc@ifterm{% | |
\ifhmode | |
\expandafter\blx@imc@ifcapital | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<true>}{<false>} | |
\protected\def\blx@imc@ifcapital{% | |
\ifcsdef{blx@cap@\blx@spacefactor}} | |
% {<true>}{<false>} | |
\protected\def\blx@imc@ifpunct{% | |
\ifnum\blx@spacefactor>\blx@sf@threshold@low | |
\ifnum\blx@spacefactor<\blx@sf@threshold@high | |
\expandafter\expandafter | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\expandafter | |
\expandafter\@secondoftwo | |
\fi | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<character>} | |
\newrobustcmd*{\autocap}[1]{#1} | |
\protected\def\blx@imc@autocap{% | |
\blx@imc@ifcapital\MakeUppercase\@firstofone} | |
\protected\def\blx@imc@nopunct{% | |
\leavevmode\spacefactor\blx@sf@nopunct} | |
\protected\def\blx@imc@isdot{% | |
\ifnum\blx@spacefactor=\blx@sf@period | |
\spacefactor\blx@sf@dot | |
\fi} | |
\protected\def\blx@imc@adddot{% | |
\blx@addpunct{dot}% | |
\ifnum\blx@spacefactor=\blx@sf@period | |
\spacefactor\blx@sf@dot | |
\fi} | |
\protected\def\blx@imc@addperiod{% | |
\blx@addpunct{period}% | |
\ifnum\blx@spacefactor=\blx@sf@dot | |
\spacefactor\blx@sf@period | |
\fi} | |
\protected\def\blx@imc@addcomma{\blx@addpunct{comma}} | |
\protected\def\blx@imc@addsemicolon{\blx@addpunct{semicolon}} | |
\protected\def\blx@imc@addcolon{\blx@addpunct{colon}} | |
\protected\def\blx@imc@addexclam{\blx@addpunct{exclam}} | |
\protected\def\blx@imc@addquestion{\blx@addpunct{question}} | |
\def\blx@addpunct#1{% | |
\unspace | |
\ifnum\blx@spacefactor<\blx@sf@threshold@low | |
\csuse{blx@qp@#1}\csuse{abx@#1}% | |
\else | |
\ifnum\blx@spacefactor>\blx@sf@threshold@high | |
\csuse{blx@qp@#1}\csuse{abx@#1}% | |
\else | |
\ifcsdef{blx@pp@\the\csname blx@sf@#1\endcsname @\blx@spacefactor} | |
{\csuse{blx@qp@#1}\csuse{abx@#1}} | |
{\csuse{blx@qp@#1}}% | |
\fi | |
\fi | |
\csuse{blx@pq@#1}} | |
\providerobustcmd*{\unspace}{% | |
\ifbool{hmode} | |
{\ifdimgreater\lastskip\z@ | |
{\unskip\unspace} | |
{\ifnumgreater\lastpenalty\z@ | |
{\unpenalty\unspace} | |
{}}} | |
{}} | |
\newrobustcmd*{\bibsentence}{% | |
\leavevmode\spacefactor\blx@sf@par | |
\ignorespaces} | |
\newrobustcmd*{\midsentence}{% | |
\leavevmode | |
\@ifstar | |
{\ifnum\spacefactor=\blx@sf@dot | |
\else | |
\spacefactor\@m | |
\fi} | |
{\spacefactor\@m}} | |
\newrobustcmd*{\addslash}{% | |
\unspace/\penalty\hyphenpenalty\hskip\z@skip} | |
\newrobustcmd*{\addspace}{% | |
\unspace\blx@postpunct | |
\space\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addnbspace}{% | |
\unspace\blx@postpunct | |
\nobreak\space\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addthinspace}{% | |
\unspace\blx@postpunct | |
\hskip0.16667em\relax | |
\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addnbthinspace}{% | |
\unspace\blx@postpunct | |
\nobreak\hskip0.16667em\relax | |
\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addlowpenspace}{% | |
\unspace\blx@postpunct | |
\penalty\value{lownamepenalty}\space | |
\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addhighpenspace}{% | |
\unspace\blx@postpunct | |
\penalty\value{highnamepenalty}\space | |
\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addlpthinspace}{% | |
\unspace\blx@postpunct | |
\penalty\value{lownamepenalty}% | |
\hskip0.16667em\relax\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addhpthinspace}{% | |
\unspace\blx@postpunct | |
\penalty\value{highnamepenalty}% | |
\hskip0.16667em\relax\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addabbrvspace}{% | |
\unspace\blx@postpunct | |
\penalty\value{abbrvpenalty}% | |
\space\blx@imc@resetpunctfont} | |
\newrobustcmd*{\addabthinspace}{% | |
\unspace\blx@postpunct | |
\penalty\value{abbrvpenalty}% | |
\hskip0.16667em\relax | |
\blx@imc@resetpunctfont} | |
\newrobustcmd*{\adddotspace}{% | |
\unspace\adddot\blx@postpunct | |
\penalty\value{abbrvpenalty}% | |
\space\blx@imc@resetpunctfont} | |
\providerobustcmd*{\noligature}{% | |
\penalty\@M\discretionary{-}{}{\kern0.03em}% | |
\nobreak\hskip\z@skip} | |
\providerobustcmd*{\hyphen}{% | |
\nobreak-\nobreak\hskip\z@skip} | |
\providerobustcmd*{\nbhyphen}{% | |
\nobreak\mbox{-}\nobreak\hskip\z@skip} | |
\providerobustcmd*{\hyphenate}{% | |
\nobreak\-\nobreak\hskip\z@skip} | |
\providerobustcmd*{\allowhyphens}{% | |
\nobreak\hskip\z@skip} | |
\providerobustcmd*{\nohyphenation}{% | |
\lefthyphenmin\@m} | |
\providerobustcmd*{\textnohyphenation}[1]{% | |
\bgroup\nohyphenation#1\egroup} | |
\blx@regimcs{% | |
\setpunctfont \resetpunctfont \ifcapital \autocap \ifpunctmark | |
\ifpunct \ifterm \nopunct \isdot \adddot \addperiod \addcomma | |
\addsemicolon \addcolon \addexclam \addquestion} | |
\appto\blx@blxinit{% | |
\appto\nocorrlist{\isdot\adddot\addperiod\addcomma}} | |
%% Style definition | |
% {<bibstyle>} | |
\newrobustcmd*{\RequireBibliographyStyle}[1]{% | |
\blx@inputonce{#1.bbx}{bibliography style '#1'}{}{}{} | |
{\blx@error | |
{Style '#1' not found} | |
{The bibliography style '#1' could not be found}}} | |
\@onlypreamble\RequireBibliographyStyle | |
% {<code>} | |
\newrobustcmd*{\InitializeBibliographyStyle}{\appto\blx@hook@bbxinit} | |
\@onlypreamble\InitializeBibliographyStyle | |
% {<entry type>}{<driverdef>} | |
\newrobustcmd*{\DeclareBibliographyDriver}[1]{% | |
\long\csdef{blx@bbx@#1}} | |
\@onlypreamble\DeclareBibliographyDriver | |
% {<entry type>} | |
\def\blx@driver#1{% | |
\ifcsdef{blx@bbx@#1} | |
{\csuse{blx@bbx@#1}} | |
{\ifcsdef{blx@bbx@*} | |
{\blx@warning{% | |
No driver for entry type '#1'.\MessageBreak | |
Using fallback driver}% | |
\csuse{blx@bbx@*}} | |
{\blx@error | |
{No driver found} | |
{I can't find a driver for the entry type | |
'\abx@field@entrytype'\MessageBreak | |
and there is no fallback driver either}}}} | |
% {<type>}{<true>}{<false>} | |
\def\blx@imc@ifdriver#1{\ifcsdef{blx@bbx@#1}} | |
% {<alias>}{<type>} | |
\newrobustcmd*{\DeclareBibliographyAlias}[2]{% | |
\csedef{blx@bbx@#1}{% | |
\expandafter\noexpand\csname blx@bbx@#2\endcsname}} | |
\@onlypreamble\DeclareBibliographyAlias | |
%% Auxiliary commands | |
\newrobustcmd*{\citereset}{% | |
\csuse{blx@hook@cbxinit}% | |
\@ifstar | |
{} | |
{\global\cslet{blx@bsee@\the\c@refsection}\@empty | |
\global\cslet{blx@fsee@\the\c@refsection}\@empty | |
\blx@ibidreset@force | |
\blx@idemreset@force | |
\blx@opcitreset@force | |
\blx@loccitreset@force}} | |
\def\blx@save#1{% | |
\ifcsdef{blx@saved@#1} | |
{} | |
{\blx@safe@actives | |
\csletcs{blx@saved@#1}{#1}% | |
\blx@rest@actives}} | |
\def\blx@restore#1{% | |
\ifcsdef{blx@saved@#1} | |
{\blx@safe@actives | |
\csletcs{#1}{blx@saved@#1}% | |
\csundef{blx@saved@#1}% | |
\blx@rest@actives} | |
{}} | |
\newrobustcmd*{\savecommand}[1]{% | |
\ifcsdef{blx@saved@cmd@\detokenize{#1}} | |
{} | |
{\cslet{blx@saved@cmd@\detokenize{#1}}{#1}}} | |
\newrobustcmd*{\restorecommand}[1]{% | |
\ifcsdef{blx@saved@cmd@\detokenize{#1}} | |
{\letcs{#1}{blx@saved@cmd@\detokenize{#1}}% | |
\csundef{blx@saved@cmd@\detokenize{#1}}} | |
{}} | |
% {<name>} | |
\newrobustcmd*{\savebibmacro}[1]{% | |
\blx@save{abx@macro@\detokenize{#1}}} | |
\newrobustcmd*{\restorebibmacro}[1]{% | |
\blx@restore{abx@macro@\detokenize{#1}}} | |
% {<name>}[<args>][<optarg>]{<definition>} | |
\newrobustcmd*{\newbibmacro}{% | |
\@star@or@long\blx@newbibmacro} | |
\def\blx@newbibmacro#1{% | |
\ifcsundef{abx@macro@\detokenize{#1}} | |
{\blx@defbibmacro\new@command{#1}} | |
{\blx@warning{% | |
Macro '\detokenize{#1}' already defined.\MessageBreak | |
Using \string\renewbibmacro} | |
\blx@defbibmacro\renew@command{#1}}} | |
\newrobustcmd*{\renewbibmacro}{% | |
\@star@or@long\blx@renewbibmacro} | |
\def\blx@renewbibmacro#1{% | |
\ifcsundef{abx@macro@\detokenize{#1}} | |
{\blx@warning{% | |
Macro '\detokenize{#1}' undefined.\MessageBreak | |
Using \string\newbibmacro} | |
\blx@defbibmacro\new@command{#1}} | |
{\blx@defbibmacro\renew@command{#1}}} | |
\newrobustcmd*{\providebibmacro}{% | |
\@star@or@long{\blx@defbibmacro\provide@command}} | |
\def\blx@defbibmacro#1#2{% | |
\expandafter#1\csname abx@macro@\detokenize{#2}\endcsname} | |
% {<name>} | |
\newrobustcmd*{\usebibmacro}{% | |
\@ifstar | |
{\blx@usebibmacro@i} | |
{\blx@usebibmacro}} | |
\def\blx@usebibmacro#1{% | |
\blx@usebibmacro@i{\detokenize{#1}}} | |
\def\blx@usebibmacro@i#1{% | |
\ifcsundef{abx@macro@#1} | |
{\blx@error | |
{Bibliography macro '#1' undefined} | |
{Use '\string\newbibmacro' to define this macro}} | |
{\csuse{abx@macro@#1}}} | |
% {<name>}{<true>}{<false>} | |
\def\blx@imc@ifbibmacroundef#1{% | |
\ifcsundef{abx@macro@#1}} | |
% {<field>} | |
\def\blx@imc@thefield#1{\csuse{abx@field@#1}} | |
\def\blx@imc@strfield#1{% | |
\ifcsdef{abx@field@#1} | |
{\detokenize\expandafter\expandafter\expandafter | |
{\csname abx@field@#1\endcsname}} | |
{}} | |
\def\blx@imc@csfield#1{\usefield{\unexpanded}{#1}} | |
% {<command>}{<field>} | |
\def\blx@imc@usefield#1#2{% | |
\expandafter\expandafter\expandafter#1% | |
\expandafter\expandafter\expandafter{\csname abx@field@#2\endcsname}} | |
% {<plainlist>} | |
\def\blx@imc@thelist#1{\csuse{abx@list@#1}} | |
\def\blx@imc@strlist#1{% | |
\ifcsdef{abx@list@#1} | |
{\detokenize\expandafter\expandafter\expandafter | |
{\csname abx@list@#1\endcsname}} | |
{}} | |
% {<namelist>} | |
\def\blx@imc@thename#1{\csuse{abx@name@#1}} | |
\def\blx@imc@strname#1{% | |
\ifcsdef{abx@name@#1} | |
{\detokenize\expandafter\expandafter\expandafter | |
{\csname abx@name@#1\endcsname}} | |
{}} | |
% We have to save cleared fields/lists/names in case a related entry | |
% needs them for tests | |
\let\abx@dorelfields\@empty | |
\let\abx@dorellists\@empty | |
\let\abx@dorelnames\@empty | |
% {<field>} | |
% If there is a related field in the entry, save a special copy in case | |
% the related entry needs it for tests. See the corresponding tests in | |
% \blx@save{field,list,name} | |
\protected\def\blx@imc@clearfield#1{% | |
\ifdef\abx@field@related | |
{\csletcs{abx@field@relsaved#1}{abx@field@#1}% | |
\listadd\abx@dorelfields{#1}} | |
{}% | |
\csundef{abx@field@#1}} | |
% {<plainlist>} | |
% If there is a related field in the entry, save a special copy in case | |
% the related entry needs it for tests. See the corresponding tests in | |
% \blx@save{field,list,name} | |
\protected\def\blx@imc@clearlist#1{% | |
\ifcsundef{abx@list@#1} | |
{} | |
{\ifdef\abx@field@related | |
{\csletcs{abx@list@relsaved#1}{abx@list@#1}% | |
\csletcs{etb@tgl@abx@bool@morerelsaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{c@relsaved#1}{c@#1}% | |
\listadd\abx@dorellists{#1}} | |
{}% | |
\togglefalse{abx@bool@more#1}% | |
\csundef{abx@list@#1}% | |
\csname c@#1\endcsname\z@}} | |
% {<namelist>} | |
% If there is a related field in the entry, save a special copy in case | |
% the related entry needs it for tests. See the corresponding tests in | |
% \blx@save{field,list,name} | |
\protected\def\blx@imc@clearname#1{% | |
\ifcsundef{abx@name@#1} | |
{} | |
{\ifdef\abx@field@related | |
{\csletcs{abx@name@relsaved#1}{abx@name@#1}% | |
\csletcs{etb@tgl@abx@bool@morerelsaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{c@relsaved#1}{c@#1}% | |
\listadd\abx@dorelnames{#1}} | |
{}% | |
\togglefalse{abx@bool@more#1}% | |
\csundef{abx@name@#1}% | |
\csname c@#1\endcsname\z@}} | |
% {<field>}{<macro>} | |
\protected\def\blx@imc@restorefield#1{\cslet{abx@field@#1}} | |
% {<plainlist>}{<macro>} | |
\protected\def\blx@imc@restorelist#1{\cslet{abx@list@#1}} | |
% {<namelist>}{<macro>} | |
\protected\def\blx@imc@restorename#1{\cslet{abx@name@#1}} | |
% {<field>}{<macro>} | |
\protected\def\blx@imc@savefield{% | |
\@ifstar{\blx@savedata{field}}{\global\blx@savedata{field}}} | |
\def\blx@savedata#1#2#3{\letcs#3{abx@#1@#2}} | |
% {<plainlist>}{<macro>} | |
\protected\def\blx@imc@savelist{% | |
\@ifstar{\blx@savedata{list}}{\global\blx@savedata{list}}} | |
% {<namelist>}{<macro>} | |
\protected\def\blx@imc@savename{% | |
\@ifstar{\blx@savedata{name}}{\global\blx@savedata{name}}} | |
% {<field>}{<csname>} | |
\protected\def\blx@imc@savefieldcs{% | |
\@ifstar{\blx@savedatacs{field}}{\global\blx@savedatacs{field}}} | |
\def\blx@savedatacs#1#2#3{\csletcs{#3}{abx@#1@#2}} | |
% {<plainlist>}{<csname>} | |
\protected\def\blx@imc@savelistcs{% | |
\@ifstar{\blx@savedatacs{list}}{\global\blx@savedatacs{list}}} | |
% {<namelist>}{<csname>} | |
\protected\def\blx@imc@savenamecs{% | |
\@ifstar{\blx@savedatacs{name}}{\global\blx@savedatacs{name}}} | |
% {<field>}{<true>}{<false>} | |
\def\blx@imc@iffieldundef#1{% | |
\ifcsundef{abx@field@#1}} | |
% {<plainlist>}{<true>}{<false>} | |
\def\blx@imc@iflistundef#1{% | |
\ifcsundef{abx@list@#1}} | |
% {<namelist>}{<true>}{<false>} | |
\def\blx@imc@ifnameundef#1{% | |
\ifcsundef{abx@name@#1}} | |
% {<field1>}{<field2>}{<true>}{<false>} | |
\def\blx@imc@iffieldsequal#1#2{% | |
\ifcsequal{abx@field@#1}{abx@field@#2}} | |
% {<plainlist1>}{<plainlist2>}{<true>}{<false>} | |
\def\blx@imc@iflistsequal#1#2{% | |
\ifcsequal{abx@list@#1}{abx@list@#2}} | |
% {<namelist1>}{<namelist2>}{<true>}{<false>} | |
\def\blx@imc@ifnamesequal#1#2{% | |
\ifcsundef{abx@name@#1} | |
{\@secondoftwo} | |
{\ifcsundef{abx@name@#2} | |
{\@secondoftwo} | |
{\blx@ifnamesequal{#1}{#2}}}} | |
\def\blx@ifnamesequal#1#2{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\expandafter\expandafter | |
\expandafter\blx@ifnamesequal@i\csname abx@name@#2\endcsname | |
\let\blx@tempb\blx@tempa | |
\let\blx@tempa\@empty | |
\expandafter\expandafter | |
\expandafter\blx@ifnamesequal@i\csname abx@name@#1\endcsname | |
\expandafter\endgroup | |
\ifx\blx@tempa\blx@tempb | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
\def\blx@ifnamesequal@i#1#2{% | |
\expandafter\blx@ifnamesequal@ii#2{}&} | |
\def\blx@ifnamesequal@ii#1{% | |
\ifblank{#1} | |
{\blx@namebreak} | |
{\blx@ifnamesequal@iii#1% | |
\blx@ifnamesequal@ii}} | |
% These explicit nameparts are alright as they are for bibtex only | |
% biber names will always have a hash generated from all nameparts in datamodel | |
\def\blx@ifnamesequal@iii#1#2{% | |
\setkeys{blx@opt@name}{#1}% | |
\setkeys{blx@opt@namepart}{#2}% | |
\ifdef\abx@field@hash | |
{\eappto\blx@tempa{{\abx@field@hash}}} | |
{\eappto\blx@tempa{{{\namepartfamily}{\namepartgiven}{\namepartprefix}{\namepartsuffix}}}}} | |
% {<field>}{<macro>}{<true>}{<false>} | |
\def\blx@imc@iffieldequals#1#2{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\ifundef#2% | |
{\@secondoftwo} | |
{\expandafter\ifx\csname abx@field@#1\endcsname#2% | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<plainlist>}{<macro>}{<true>}{<false>} | |
\def\blx@imc@iflistequals#1#2{% | |
\blx@imc@iflistundef{#1} | |
{\@secondoftwo} | |
{\ifundef#2% | |
{\@secondoftwo} | |
{\expandafter\ifx\csname abx@list@#1\endcsname#2% | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<namelist>}{<macro>}{<true>}{<false>} | |
\def\blx@imc@ifnameequals#1#2{% FIXME | |
\blx@imc@ifnameundef{#1} | |
{\@secondoftwo} | |
{\ifundef#2% | |
{\@secondoftwo} | |
{\expandafter\ifx\csname abx@name@#1\endcsname#2% | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<field>}{<csname>}{<true>}{<false>} | |
\def\blx@imc@iffieldequalcs#1{% | |
\ifcsequal{abx@field@#1}} | |
% {<plainlist>}{<csname>}{<true>}{<false>} | |
\def\blx@imc@iflistequalcs#1{% | |
\ifcsequal{abx@list@#1}} | |
% {<namelist>}{<csname>}{<true>}{<false>} | |
\def\blx@imc@ifnameequalcs#1{% FIXME | |
\ifcsequal{abx@name@#1}} | |
% {<field>}{<string>}{<true>}{<false>} | |
\protected\long\def\blx@imc@iffieldequalstr#1#2{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter\expandafter\ifstrequal | |
\expandafter\expandafter\expandafter{% | |
\csname abx@field@#1\endcsname}{#2}}} | |
% {<field>}{<true>}{<false>} | |
\protected\def\blx@imc@iffieldxref#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\blx@whichxref | |
{\blx@iffieldxref{#1}} | |
{\@secondoftwo}}} | |
\def\blx@iffieldxref#1#2{% | |
\begingroup | |
\letcs\blx@tempa{abx@field@#2}% | |
\letcs\blx@tempb{abx@field@#1}% | |
\csundef{abx@field@#1}% | |
\blx@getdata{\blx@tempa}% | |
\blx@imc@iffieldequals{#1}\blx@tempb | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\endgroup} | |
\def\blx@whichxref#1#2{% | |
\blx@imc@iffieldundef{crossref} | |
{\blx@imc@iffieldundef{xref} | |
{#2} | |
{#1{xref}}} | |
{#1{crossref}}} | |
% {<plainlist>}{<true>}{<false>} | |
\protected\def\blx@imc@iflistxref#1{% | |
\blx@imc@iflistundef{#1} | |
{\@secondoftwo} | |
{\blx@whichxref | |
{\blx@iflistxref{#1}} | |
{\@secondoftwo}}} | |
\def\blx@iflistxref#1#2{% | |
\begingroup | |
\letcs\blx@tempa{abx@field@#2}% | |
\letcs\blx@tempb{abx@list@#1}% | |
\csundef{abx@list@#1}% | |
\blx@getdata{\blx@tempa}% | |
\blx@imc@iflistequals{#1}\blx@tempb | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\endgroup} | |
% {<namelist>}{<true>}{<false>} | |
\protected\def\blx@imc@ifnamexref#1{% | |
\blx@imc@ifnameundef{#1} | |
{\@secondoftwo} | |
{\blx@whichxref | |
{\blx@ifnamexref{#1}} | |
{\@secondoftwo}}} | |
\def\blx@ifnamexref#1#2{% | |
\begingroup | |
\letcs\blx@tempa{abx@field@#2}% | |
\letcs\blx@tempb{abx@name@#1}% | |
\csundef{abx@name@#1}% | |
\blx@getdata{\blx@tempa}% | |
\blx@imc@ifnameequals{#1}\blx@tempb | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcurrentfield#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\currentfield\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcurrentlist#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\currentlist\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcurrentname#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\currentname\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifentrytype#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\abx@field@entrytype\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<true>}{<false>} | |
\def\blx@imc@ifmorenames{% | |
\ifundef\currentname | |
{\@secondoftwo} | |
{\iftoggle{abx@bool@more\currentname} | |
{\@firstoftwo} | |
{\ifnum\c@listtotal>\c@liststop | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<true>}{<false>} | |
\def\blx@imc@ifmoreitems{% | |
\ifundef\currentlist | |
{\@secondoftwo} | |
{\iftoggle{abx@bool@more\currentlist} | |
{\@firstoftwo} | |
{\ifnum\c@listtotal>\c@liststop | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<true>}{<false>} | |
\def\blx@imc@iffirstcitekey{% | |
\ifboolexpr{ ( test {\ifnumequal\c@multicitetotal\z@} | |
and test {\ifnumequal\c@citecount\@ne} ) | |
or ( test {\ifnumgreater\c@multicitetotal\z@} | |
and test {\ifnumequal\c@multicitecount\@ne} | |
and test {\ifnumequal\c@citecount\@ne} ) }} | |
\def\blx@imc@iflastcitekey{% | |
\ifboolexpr{ test {\ifnumequal\c@citecount\c@citetotal} | |
and test {\ifnumequal\c@multicitecount\c@multicitetotal} }} | |
% {<category>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcategory{% | |
\ifdef\abx@field@entrykey | |
{\blx@imc@ifentrycategory\abx@field@entrykey} | |
{\expandafter\@secondoftwo\@gobble}} | |
% {<entrykey>}{<category>}{<true>}{<false>} | |
\protected\def\blx@imc@ifentrycategory{% | |
\blx@xsanitizeafter\blx@imc@ifentrycategory@i} | |
\def\blx@imc@ifentrycategory@i#1#2{% | |
\ifcsdef{blx@catg@\detokenize{#2}} | |
{\ifinlistcs{#1}{blx@catg@\detokenize{#2}}} | |
{\@secondoftwo}} | |
% {<keyword>}{<true>}{<false>} | |
\protected\def\blx@imc@ifkeyword{% | |
\ifdef\abx@field@entrykey | |
{\blx@imc@ifentrykeyword\abx@field@entrykey} | |
{\expandafter\@secondoftwo\@gobble}} | |
% {<entrykey>}{<keyword>}{<true>}{<false>} | |
\protected\def\blx@imc@ifentrykeyword{% | |
\blx@xsanitizeafter\blx@imc@ifentrykeyword@i} | |
\def\blx@imc@ifentrykeyword@i#1#2{% | |
\ifcsdef{blx@keyw@\the\c@refsection @\detokenize{#2}} | |
{\ifinlistcs{#1}{blx@keyw@\the\c@refsection @\detokenize{#2}}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\protected\def\blx@ifciteseen@global{% | |
\ifbool{citetracker} | |
{\ifdef\abx@field@entrykey | |
{\expandafter\blx@ifseen@global | |
\expandafter{\abx@field@entrykey}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\protected\def\blx@ifciteseen@context{% | |
\ifbool{citetracker} | |
{\ifdef\abx@field@entrykey | |
{\expandafter\blx@ifseen@context | |
\expandafter{\abx@field@entrykey}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\protected\def\blx@ifciteseen@context{% | |
\ifbool{citetracker} | |
{\ifdef\abx@field@entrykey | |
{\expandafter\blx@ifseen@context | |
\expandafter{\abx@field@entrykey}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
% {<entrykey>}{<true>}{<false>} | |
\protected\def\blx@ifentryseen@global{% | |
\blx@xsanitizeafter\blx@ifseen@global} | |
\protected\def\blx@ifentryseen@context{% | |
\blx@xsanitizeafter\blx@ifseen@context} | |
\def\blx@ifseen@global#1{% | |
\ifbool{citetracker} | |
{\ifinlistcs{#1}{blx@bsee@\the\c@refsection}} | |
{\@secondoftwo}} | |
\def\blx@ifseen@context#1{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\ifinlistcs{#1}{blx@fsee@\the\c@refsection}} | |
{\ifinlistcs{#1}{blx@bsee@\the\c@refsection}}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifciteibid@global{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text} | |
{\@secondoftwo}} | |
\def\blx@ifciteibid@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}} | |
{\@secondoftwo}} | |
\def\blx@ifciteibid@strict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@ifciteibid@global} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@ifciteibid@constrict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot} | |
{\@secondoftwo}} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifciteidem@global{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@text} | |
{\@secondoftwo}} | |
\def\blx@ifciteidem@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}} | |
{\@secondoftwo}} | |
\let\blx@ifciteidem@strict\blx@ifciteidem@global | |
\def\blx@ifciteidem@constrict{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot} | |
{\@secondoftwo}} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifopcit@global{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldundef{namehash} | |
{\@secondoftwo} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}} | |
{\@secondoftwo}} | |
\def\blx@ifopcit@context{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldundef{namehash} | |
{\@secondoftwo} | |
{\iftoggle{blx@footnote} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}} | |
{\@secondoftwo}} | |
\def\blx@ifopcit@strict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@ifopcit@global} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@ifopcit@constrict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@imc@iffieldundef{namehash} | |
{\@secondoftwo} | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}} | |
{\@secondoftwo}} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifloccit@global{% | |
\ifbool{citetracker} | |
{\blx@loccit@check{text}} | |
{\@secondoftwo}} | |
\def\blx@ifloccit@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@loccit@check{foot}} | |
{\blx@loccit@check{text}}} | |
{\@secondoftwo}} | |
\def\blx@ifloccit@strict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@loccit@numcheck{text}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@ifloccit@constrict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@loccit@numcheck{foot}} | |
{\@secondoftwo}} | |
{\blx@loccit@numcheck{text}}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@loccit@check#1{% | |
\blx@imc@iffieldundef{postnote} | |
{\@secondoftwo} | |
{\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}}} | |
\def\blx@loccit@numcheck#1{% | |
\blx@imc@iffieldundef{postnote} | |
{\@secondoftwo} | |
{\expandafter\blx@imc@ifpages | |
\expandafter{\abx@field@postnote} | |
{\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}} | |
{\@secondoftwo}}} | |
% {<true>}{<false>} | |
\def\blx@ifmpfncheck{% | |
\ifnum\numexpr\value\@mpfn-\blx@lastmpfn<\tw@ | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
\def\blx@mpfnsave{% | |
\xdef\blx@lastmpfn{\the\value\@mpfn}} | |
\def\blx@mpfnreset{% | |
\global\let\blx@lastmpfn\z@} | |
\blx@mpfnreset | |
% {<true>}{<false>} | |
\def\blx@imc@iffirstonpage{% | |
\ifbool{pagetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@iffirstonpage{fnpage}} | |
{\blx@iffirstonpage{page}}} | |
{\@secondoftwo}} | |
\def\blx@iffirstonpage#1{% | |
\ifcsundef{blx@#1@\number\c@instcount} | |
{\@secondoftwo} | |
{\expandafter\blx@iffirstonpage@i | |
\expandafter{\number\numexpr\c@instcount-1}{#1}}} | |
\def\blx@iffirstonpage@i#1#2{% | |
\ifcsundef{blx@#2@#1} | |
{\ifnum#1>\@ne | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\expandafter\blx@iffirstonpage@i | |
\expandafter{\number\numexpr#1-1}{#2}} | |
{\@firstoftwo}} | |
{\ifnum\csuse{blx@#2@\number\c@instcount}=% | |
\csuse{blx@#2@#1} % | |
\expandafter\@secondoftwo | |
\else | |
\expandafter\@firstoftwo | |
\fi}} | |
% {<count1>}{<count2>}{<true>}{<false>} | |
\def\blx@imc@ifsamepage#1#2{% | |
\ifbool{pagetracker} | |
{\ifcsundef{blx@page@\number\numexpr#1} | |
{\ifcsundef{blx@fnpage@\number\numexpr#1} | |
{\@secondoftwo} | |
{\blx@ifsamepage{#1}{#2}{fnpage}}} | |
{\blx@ifsamepage{#1}{#2}{page}}} | |
{\@secondoftwo}} | |
\def\blx@ifsamepage#1#2#3{% | |
\ifcsundef{blx@page@\number\numexpr#2} | |
{\ifcsundef{blx@fnpage@\number\numexpr#2} | |
{\@secondoftwo} | |
{\blx@ifsamepage@i{#1}{#2}{#3}{fnpage}}} | |
{\blx@ifsamepage@i{#1}{#2}{#3}{page}}} | |
\def\blx@ifsamepage@i#1#2#3#4{% | |
\ifnum\csuse{blx@#3@\number\numexpr#1}=% | |
\csuse{blx@#4@\number\numexpr#2} % | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<string>}{<true>}{<false>} | |
\protected\long\def\blx@imc@ifinteger#1{% | |
\begingroup | |
\def\do##1{\uccode`##1=`\%}% | |
\do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9% | |
\makeatletter | |
\catcode`\%=9 | |
\endlinechar\m@ne | |
\uppercase{\scantokens{\def\blx@tempa{#1}}}% | |
\ifx\blx@tempa\@empty | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<field>}{<true>}{<false>} | |
\protected\def\blx@imc@iffieldint#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\ifinteger | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifnumeral{% | |
\blx@ifnum\blx@hook@ifnum} | |
\protected\def\blx@imc@ifnumerals{% | |
\blx@ifnum\blx@hook@ifnums} | |
\protected\def\blx@imc@ifpages{% | |
\blx@ifnum\blx@hook@ifpages} | |
\long\def\blx@ifnum#1#2{% | |
\begingroup | |
\let\protect\@unexpandable@protect | |
\uppercase{\edef\blx@tempa{#2}}% | |
\ifx\blx@tempa\@empty | |
\aftergroup\@secondoftwo | |
\else | |
\makeatletter | |
\catcode`\%=9 | |
\endlinechar\m@ne | |
\everyeof{\noexpand}#1% | |
\uppercase{\edef\blx@tempa{\scantokens{#2}}}% | |
\ifx\blx@tempa\@empty | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\fi | |
\endgroup} | |
\def\blx@hook@ifnum{% | |
\def\do##1{\uccode`##1=`\%}% | |
\do\ \do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9% | |
\do\i\do\v\do\x\do\l\do\c\do\d\do\m | |
\do\I\do\V\do\X\do\L\do\C\do\D\do\M | |
\blx@donumchars | |
\let\RN\@firstofone | |
\let\Rn\@firstofone} | |
\def\blx@hook@ifnums{% | |
\blx@hook@ifnum | |
\def\do##1{\uccode`##1=`\%}% | |
\blx@dorangechars | |
\def\do##1{\let##1\@empty}% | |
\blx@dorangecmds} | |
\def\blx@hook@ifpages{% | |
\blx@hook@ifnum | |
\blx@hook@ifnums | |
\def\do##1{\let##1\@empty}% | |
\blx@dopagecmds} | |
% {<field>}{<true>}{<false>} | |
\protected\def\blx@imc@iffieldnum#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\blx@imc@ifnumeral | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
\protected\def\blx@imc@iffieldnums#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\blx@imc@ifnumerals | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
\protected\def\blx@imc@iffieldpages#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\blx@imc@ifpages | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
% {<chars>} | |
\newrobustcmd*{\DeclareNumChars}{% | |
\@ifstar | |
{\blx@defnumchars} | |
{\global\let\blx@donumchars\@empty | |
\blx@defnumchars}} | |
\def\blx@defnumchars#1{% | |
\ifblank{#1} | |
{} | |
{\expandafter\blx@defdochars | |
\expandafter\blx@donumchars | |
\detokenize{#1}\relax}} | |
% {<chars>} | |
\newrobustcmd*{\DeclareRangeChars}{% | |
\@ifstar | |
{\blx@defrangechars} | |
{\global\let\blx@dorangechars\@empty | |
\blx@defrangechars}} | |
\def\blx@defrangechars#1{% | |
\ifblank{#1} | |
{} | |
{\expandafter\blx@defdochars | |
\expandafter\blx@dorangechars | |
\detokenize{#1}\relax}} | |
\def\blx@defdochars#1#2{% | |
\ifx#2\relax | |
\else | |
\xdef#1{% | |
\expandonce#1\noexpand\do | |
\expandafter\noexpand\csname#2\endcsname}% | |
\expandafter\blx@defdochars | |
\expandafter#1% | |
\fi} | |
% {<cstokens>} | |
\newrobustcmd*{\DeclareRangeCommands}{% | |
\@ifstar | |
{\blx@defrangecmds} | |
{\global\let\blx@dorangecmds\@empty | |
\blx@defrangecmds}} | |
\def\blx@defrangecmds#1{% | |
\ifblank{#1} | |
{} | |
{\blx@defrangecmds@i#1&}} | |
\def\blx@defrangecmds@i#1{% | |
\ifx% | |
\else | |
\gappto\blx@dorangecmds{\do#1}% | |
\expandafter\blx@defrangecmds@i | |
\fi} | |
% {<cstokens>} | |
\newrobustcmd*{\DeclarePageCommands}{% | |
\@ifstar | |
{\blx@defpagecmds} | |
{\global\let\blx@dopagecmds\@empty | |
\blx@defpagecmds}} | |
\def\blx@defpagecmds#1{% | |
\ifblank{#1} | |
{} | |
{\blx@defpagecmds@i#1&}} | |
\def\blx@defpagecmds@i#1{% | |
\ifx% | |
\else | |
\gappto\blx@dopagecmds{\do#1}% | |
\expandafter\blx@defpagecmds@i | |
\fi} | |
\DeclareNumChars{.} | |
\DeclareRangeChars{~,;-+/} | |
\DeclareRangeCommands{% | |
\ \,\space\nobreakspace\addspace\addnbspace | |
\addthinspace\addnbthinspace\addlowpenspace | |
\addhighpenspace\addlpthinspace\addhpthinspace | |
\adddotspace\addabbrvspace\&\psq\psqq | |
\bibrangedash\bibdaterangesep\bibtimerangesep\textendash\textemdash\bibrangessep} | |
\DeclarePageCommands{\pno\ppno} | |
% *{<code>} | |
\newrobustcmd*{\NumCheckSetup}{\appto\blx@hook@ifnum} | |
\newcommand*{\NumcheckSetup}{\NumCheckSetup} | |
% [<pagination>][<postpro>]{<string>} | |
\newrobustcmd*{\blx@imc@mkpageprefix}[1][pagination]{% | |
\begingroup | |
\def\blx@tempa{\blx@mkpageprefix{page}}% | |
\iffieldundef{#1} | |
{} | |
{\iffieldequalstr{#1}{none} | |
{\def\blx@tempa{\blx@mkpageprefix@i}} | |
{\iffieldbibstring{#1} | |
{\edef\blx@tempa{\blx@mkpageprefix{\thefield{#1}}}} | |
{\blx@warning@entry{% | |
Unknown pagination type '\strfield{#1}'}}}}% | |
\@ifnextchar[%] | |
{\blx@tempa} | |
{\blx@tempa[\@firstofone]}} | |
\protected\long\def\blx@mkpageprefix#1[#2]#3{% | |
\ifnumeral{#3} | |
{\bibstring{#1}\ppspace} | |
{\ifnumerals{#3} | |
{\bibstring{#1s}\ppspace} | |
{\def\pno{\bibstring{#1}}% | |
\def\ppno{\bibstring{#1s}}}}% | |
\blx@mkpageprefix@i[#2]{#3}} | |
\long\def\blx@mkpageprefix@i[#1]#2{#1{#2}\endgroup} | |
% [<pagination>][<postpro>]{<string>} | |
\newrobustcmd*{\blx@imc@mkpagetotal}[1][bookpagination]{% | |
\begingroup | |
\def\blx@tempa{\blx@mkpagetotal{page}}% | |
\iffieldundef{#1} | |
{} | |
{\iffieldequalstr{#1}{none} | |
{\def\blx@tempa{\blx@mkpagetotal@i}} | |
{\iffieldbibstring{#1} | |
{\edef\blx@tempa{\blx@mkpagetotal{\thefield{#1}}}} | |
{\blx@warning@entry{% | |
Unknown pagination type '\strfield{#1}'}}}}% | |
\@ifnextchar[%] | |
{\blx@tempa} | |
{\blx@tempa[\@firstofone]}} | |
\protected\long\def\blx@mkpagetotal#1[#2]#3{% | |
\ifnumeral{#3} | |
{\setbox\@tempboxa=\hbox{% | |
\blx@tempcnta0#3\relax | |
\ifnum\blx@tempcnta=\@ne | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi}% | |
{#2{#3}\ppspace\bibstring{#1}} | |
{#2{#3}\ppspace\bibstring{#1s}}} | |
{\def\pno{\bibstring{#1}}% | |
\def\ppno{\bibstring{#1s}}% | |
#2{#3}}% | |
\endgroup} | |
\long\def\blx@mkpagetotal@i[#1]#2{#1{#2}\endgroup} | |
\newcounter{mincomprange} | |
\newcounter{maxcomprange} | |
\newcounter{mincompwidth} | |
\setcounter{mincomprange}{10} | |
\setcounter{maxcomprange}{100000} | |
\setcounter{mincompwidth}{1} | |
\def\abx@rangeproclimit{100000} | |
% {<rangefield>} | |
\newcommand*{\rangelen}[1]{% | |
\ifcsdef{abx@range@#1} | |
{\csuse{abx@range@#1}} | |
{}} | |
\let\frangelen\rangelen % Legacy name for \rangelen | |
% <*>[<postpro>]{<string>} | |
\newrobustcmd*{\mkcomprange}{% | |
\begingroup | |
\@ifstar | |
{\blx@comprange\blx@comprange@ii} | |
{\blx@comprange\blx@comprange@i}} | |
\def\blx@comprange#1{% | |
\@ifnextchar[{#1}{#1[\@firstofone]}} | |
\def\blx@comprange@i[#1]#2{% | |
\let\blx@tempa\@empty | |
\protected\def\blx@range@out@value{\appto\blx@tempa}% | |
\let\blx@range@out@delim\blx@range@out@value | |
\let\blx@range@split\blx@comprange@split | |
\blx@range@chunk{#2}% | |
\edef\blx@tempa{\endgroup | |
\unexpanded{#1}{\expandonce\blx@tempa}}% | |
\blx@tempa} | |
\def\blx@comprange@ii[#1]#2{% | |
\protected\def\blx@range@out@value{#1}% | |
\let\blx@range@out@delim\@firstofone | |
\let\blx@range@split\blx@comprange@split | |
\blx@range@chunk{#2}% | |
\endgroup} | |
\def\blx@comprange@split#1{% | |
\def\blx@comprange@abort{\blx@range@out@value{#1}}% | |
\blx@imc@ifpages{#1} | |
{\blx@comprange@range#1\bibrangedash\bibrangedash&} | |
{\blx@comprange@abort}} | |
\def\blx@comprange@range#1\bibrangedash#2\bibrangedash#3&{% | |
\ifblank{#3} | |
{\blx@comprange@hyphen#1--&} | |
{\ifblank{#2} | |
{\blx@range@out@value{#1\bibrangedash}} | |
{\ifblank{#1} | |
{\blx@range@out@value{\bibrangedash#2}} | |
{\blx@comprange@check{#1}{#2}}}}} | |
\def\blx@comprange@hyphen#1-#2-#3&{% | |
\ifblank{#3} | |
{\blx@comprange@abort} | |
{\ifblank{#2} | |
{\ifblank{#1} | |
{\let\blx@tempb\@empty} | |
{\def\blx@tempb{#1}}% | |
\blx@comprange@hyphen@i#3&} | |
{\ifblank{#1} | |
{\blx@range@out@value{\bibrangedash#2}} | |
{\blx@comprange@check{#1}{#2}}}}} | |
\def\blx@comprange@hyphen@i#1-#2&{% | |
\ifblank{#1#2} | |
{\expandafter\blx@range@out@value | |
\expandafter{\blx@tempb\bibrangedash}} | |
{\notblank{#1} | |
{\ifdefempty\blx@tempb | |
{\blx@range@out@value{\bibrangedash#1}} | |
{\expandafter\blx@comprange@check | |
\expandafter{\blx@tempb}{#1}}} | |
{\blx@comprange@hyphen@i#2&}}} | |
\def\blx@comprange@check#1#2{% | |
\blx@imc@ifinteger{#1} | |
{\blx@imc@ifinteger{#2} | |
{\blx@comprange@comp{#1}{#2}} | |
{\blx@range@out@value{#1\bibrangedash#2}}} | |
{\blx@range@out@value{#1\bibrangedash#2}}} | |
\def\blx@comprange@comp#1#2{% | |
\def\blx@tempb{#1}% | |
\def\blx@tempc{#2}% | |
\let\blx@tempd\blx@tempc | |
\ifnum\c@maxcomprange<\abx@rangeproclimit\relax | |
\numdef\blx@tempe\abx@rangeproclimit | |
\else | |
\numdef\blx@tempe\c@maxcomprange | |
\fi | |
\blx@tempcntc=\blx@tempe\relax | |
\ifnum | |
\ifnum\c@mincompwidth<1\space1\fi | |
\ifnum\c@maxcomprange<10\space1\fi | |
\ifnum\c@mincomprange<\blx@tempb\space\else1\fi | |
\ifnum\blx@tempb<\numexpr\blx@tempcntc*10\relax\else1\fi | |
0=\z@ | |
\expandafter\blx@comprange@comp@div | |
\else | |
\expandafter\blx@comprange@end | |
\fi} | |
\def\blx@comprange@end{% | |
\numdef\blx@tempb\blx@tempb | |
\ifnum\blx@tempe>\c@maxcomprange\relax | |
\numdef\blx@tempc\blx@tempc | |
\else | |
\numdef\blx@tempc\blx@tempd | |
\fi | |
\edef\blx@tempb{% | |
\blx@range@out@value{\blx@tempb\noexpand\bibrangedash\blx@tempc}}% | |
\blx@tempb} | |
\def\blx@comprange@comp@div{% | |
\unless\ifnum\blx@tempb<\blx@tempcntc | |
\blx@tempcnta\blx@tempb\relax | |
\blx@tempcntb\blx@tempc\relax | |
\divide\blx@tempcnta\blx@tempcntc | |
\divide\blx@tempcntb\blx@tempcntc | |
\ifnum\blx@tempcnta=\blx@tempcntb | |
\edef\blx@tempd{\expandafter\@gobble\blx@tempd}% | |
\numdef\blx@tempe\blx@tempcntc | |
\fi | |
\fi | |
\divide\blx@tempcntc10\relax | |
\ifnum | |
\ifnum\blx@tempcntc<10 1\fi | |
\ifnum\blx@tempcntc>\c@mincompwidth\else 1\fi | |
0=\z@ | |
\expandafter\blx@comprange@comp@div | |
\else | |
\expandafter\blx@comprange@end | |
\fi} | |
\def\blx@range@chunk#1{% | |
\blx@range@chunk@semcol#1;&} | |
\def\blx@range@chunk@semcol#1;#2&{% | |
\notblank{#1} | |
{\blx@range@chunk@comma#1,&} | |
{}% | |
\notblank{#2} | |
{\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}% | |
\blx@range@chunk@semcol#2&} | |
{}} | |
\def\blx@range@chunk@comma#1,#2&{% | |
\notblank{#1} | |
{\blx@range@chunk@sep#1\bibrangessep&} | |
{}% | |
\notblank{#2} | |
{\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}% | |
\blx@range@chunk@comma#2&} | |
{}} | |
\def\blx@range@chunk@sep#1\bibrangessep#2&{% | |
\notblank{#1} | |
{\expandafter\blx@range@split | |
\expandafter{\@firstofone#1}} | |
{}% | |
\notblank{#2} | |
{\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}% | |
\blx@range@chunk@sep#2&} | |
{}} | |
% <*>[<postpro>]{<string>} | |
\newrobustcmd*{\mkfirstpage}{% | |
\begingroup | |
\@ifstar | |
{\blx@firstpage\blx@firstpage@ii} | |
{\blx@firstpage\blx@firstpage@i}} | |
\def\blx@firstpage#1{% | |
\@ifnextchar[{#1}{#1[\@firstofone]}} | |
\def\blx@firstpage@i[#1]#2{% | |
\let\blx@tempa\@empty | |
\protected\def\blx@range@out@value{\appto\blx@tempa}% | |
\let\blx@range@out@delim\blx@range@out@value | |
\let\blx@range@split\blx@firstpage@split | |
\blx@range@chunk{#2}% | |
\edef\blx@tempa{\endgroup | |
\unexpanded{#1}{\expandonce\blx@tempa}}% | |
\blx@tempa} | |
\def\blx@firstpage@ii[#1]#2{% | |
\protected\def\blx@range@out@value{#1}% | |
\let\blx@range@out@delim\@firstofone | |
\let\blx@range@split\blx@firstpage@split | |
\blx@range@chunk{#2}% | |
\endgroup} | |
\def\blx@firstpage@split#1{% | |
\def\blx@firstpage@abort{\blx@range@out@value{#1}}% | |
\blx@firstpage@range#1\bibrangedash\bibrangedash&} | |
\def\blx@firstpage@range#1\bibrangedash#2\bibrangedash#3&{% | |
\ifblank{#3} | |
{\blx@firstpage@hyphen#1--&} | |
{\ifblank{#1} | |
{\blx@range@out@value{\bibrangedash#2}} | |
{\blx@range@out@value{#1}}}} | |
\def\blx@firstpage@hyphen#1-#2-#3&{% | |
\ifblank{#3} | |
{\blx@firstpage@abort} | |
{\ifblank{#1} | |
{\ifblank{#2} | |
{\blx@firstpage@hyphen@i#3&} | |
{\blx@range@out@value{\bibrangedash#2}}} | |
{\blx@range@out@value{#1}}}} | |
\def\blx@firstpage@hyphen@i#1-#2&{% | |
\ifblank{#1} | |
{\ifblank{#2} | |
{\blx@firstpage@abort} | |
{\blx@firstpage@hyphen@i#2&}} | |
{\blx@range@out@value{\bibrangedash#1}}} | |
\newcommand*{\ppspace}{\addnbspace} | |
\newcommand*{\sqspace}{\addnbspace} | |
\newrobustcmd*{\RN}[1]{% | |
\begingroup | |
\expandafter\RNfont | |
\expandafter{\romannumeral#1}% | |
\endgroup} | |
\newrobustcmd*{\Rn}[1]{% | |
\begingroup | |
\expandafter\Rnfont | |
\expandafter{\romannumeral#1}% | |
\endgroup} | |
\newcommand*{\RNfont}{\uppercase} | |
\newcommand*{\Rnfont}{} | |
% Delimiter interface | |
% [<contextname, ...>]{<name, ...>}{<code>} | |
\newrobustcmd*{\DeclareDelimFormat}{% | |
\@ifstar | |
{\blx@declaredelimclear} | |
{\blx@declaredelim}} | |
\newrobustcmd*{\blx@declaredelimclear}[3][]{% | |
\def\do##1{\global\cslet{blx@printdelim@##1@#2}=\undefined}% | |
\dolistcsloop{blx@declaredelimcontexts@#2}% | |
\ifblank{#1} | |
{\blx@declaredelim{#2}{#3}} | |
{\blx@declaredelim[#1]{#2}{#3}}} | |
\newrobustcmd*{\blx@declaredelim}[3][]{% | |
\ifblank{#1} | |
{\blx@declaredelim@i{}{}{#2}{#3}} | |
{\def\do##1{% | |
\listcsgadd{blx@declaredelimcontexts@#2}{##1}% | |
\blx@declaredelim@i{blx@printdelim@##1@}{##1}{#2}{#3}} | |
\docsvlist{#1}}}% | |
\def\blx@declaredelim@i#1#2#3#4{% | |
\begingroup | |
\def\do##1{% | |
\ifcsdef{#1##1} | |
{\blx@warn@delimdeclare{##1}{#2}} | |
{}% | |
\csgdef{#1##1}{#4}}% | |
\docsvlist{#3} | |
\endgroup} | |
\def\blx@delimcontext{none} | |
\newcommand*{\printdelim}[2][]{% | |
\ifblank{#1} | |
{\ifcsdef{blx@printdelim@\blx@delimcontext @#2} | |
{\csuse{blx@printdelim@\blx@delimcontext @#2}} | |
{\ifcsdef{#2}% fall back on legacy macros | |
{\csuse{#2}} | |
{\blx@warn@delimuse{#2}{*}}}} | |
{\ifcsdef{blx@printdelim@#1@#2} | |
{\csuse{blx@printdelim@#1@#2}} | |
{\blx@warn@delimuse{#2}{#1}}}} | |
\newcommand*{\delimcontext}[1]{% | |
\edef\blx@delimcontext{\blx@delimcontextalias{#1}}} | |
\def\blx@delimcontextalias#1{% | |
\ifcsdef{blx@delimcontextalias@#1} | |
{\csuse{blx@delimcontextalias@#1}} | |
{#1}} | |
\newcommand*{\DeclareDelimcontextAlias}[2]{% | |
\csgdef{blx@delimcontextalias@#1}{#2}} | |
% {<init>}{<entrytype>} | |
\protected\def\blx@imc@usedriver#1#2{% | |
\begingroup | |
\let\finentry\blx@finentry@usedrv | |
\let\newblock\relax | |
\let\abx@macro@bibindex\@empty | |
\let\abx@macro@pageref\@empty | |
\csuse{blx@hook@bbxinit}#1% | |
\delimcontext{bib}% | |
\blx@beglangbib | |
\blx@driver{#2}% | |
\blx@endlangbib | |
\endgroup} | |
% Punctuation | |
\protected\def\blx@initunit{% | |
\global\togglefalse{blx@block}% | |
\global\togglefalse{blx@unit}% | |
\global\togglefalse{blx@insert}% | |
\global\togglefalse{blx@lastins}% | |
\global\togglefalse{blx@keepunit}% | |
\global\let\blx@unitpunct\newunitpunct | |
\blx@imc@resetpunctfont} | |
\def\blx@begunit{% | |
\toggletrue{blx@tempa}% | |
\iftoggle{blx@insert} | |
{\iftoggle{blx@unit} | |
{\begingroup | |
\let\blx@begunit\@empty | |
\let\blx@endunit\@empty | |
\let\blx@endnounit\@empty | |
\blx@unitpunct\blx@postpunct | |
\endgroup | |
\global\togglefalse{blx@unit}% | |
\togglefalse{blx@tempa}} | |
{\blx@postpunct}% | |
\iftoggle{blx@block} | |
{\begingroup | |
\let\blx@begunit\@empty | |
\let\blx@endunit\@empty | |
\let\blx@endnounit\@empty | |
\newblockpunct | |
\endgroup | |
\global\togglefalse{blx@block}% | |
\togglefalse{blx@tempa}} | |
{}} | |
{}% | |
\blx@postpunct | |
\blx@imc@resetpunctfont | |
\iftoggle{blx@tempa} | |
{} | |
{\global\togglefalse{blx@insert}}% | |
\blx@leavevmode | |
\begingroup} | |
\def\blx@endunit{% | |
\endgroup | |
\global\toggletrue{blx@insert}% | |
\global\toggletrue{blx@lastins}} | |
\def\blx@nounit{% | |
\global\togglefalse{blx@lastins}} | |
\def\blx@endnounit{% | |
\endgroup\blx@nounit} | |
\protected\def\blx@imc@newblock{% | |
\global\toggletrue{blx@block}}% | |
\protected\def\blx@imc@newunit{% | |
\iftoggle{blx@keepunit} | |
{} | |
{\global\let\blx@unitpunct\newunitpunct | |
\global\toggletrue{blx@unit}}} | |
\protected\def\blx@imc@setunit{% | |
\@ifstar\blx@setunit@i\blx@setunit} | |
\long\def\blx@setunit#1{% | |
\iftoggle{blx@keepunit} | |
{} | |
{\long\gdef\blx@unitpunct{#1}% | |
\global\toggletrue{blx@unit}}} | |
\def\blx@setunit@i{% | |
\iftoggle{blx@lastins} | |
{\blx@setunit} | |
{\@gobble}} | |
\protected\def\blx@imc@printunit{% | |
\@ifstar\blx@printunit@i\blx@printunit} | |
\def\blx@printunit#1{% | |
\long\gdef\blx@unitpunct{#1\global\togglefalse{blx@keepunit}}% | |
\global\toggletrue{blx@keepunit}% | |
\global\toggletrue{blx@unit}} | |
\def\blx@printunit@i{% | |
\iftoggle{blx@lastins} | |
{\blx@printunit} | |
{\@gobble}} | |
\protected\def\blx@imc@finentry{% | |
\unspace\finentrypunct | |
\blx@postpunct | |
\blx@initunit} | |
\protected\def\blx@finentry@usedrv{% | |
\blx@setunit\relax} | |
\protected\def\blx@finentry@inset{% | |
\blx@setunit\entrysetpunct | |
\global\toggletrue{blx@block}} | |
\blx@regimcs{% | |
\ifdriver \thefield \strfield \csfield \usefield \thelist \strlist \thename \strname | |
\clearfield \clearlist \clearname \restorefield \restorelist \restorename | |
\ifcategory \ifentrycategory \ifkeyword \ifentrykeyword | |
\ifciteseen \ifentryseen \ifentryinbib \ifciteibid \ifciteidem \ifopcit \ifloccit | |
\ifcurrentfield \ifcurrentlist \ifcurrentname \ifentrytype | |
\iffieldequalcs \iffieldequals \iffieldequalstr \iffieldsequal | |
\ifbibmacroundef \iffieldundef \iffieldxref \iflistequalcs \iflistequals | |
\iflistsequal \iflistundef \iflistxref | |
\ifmorenames \ifmoreitems \iffirstcitekey \iflastcitekey | |
\ifnameequalcs \ifnameequals \ifnamesequal \ifnameundef \ifnamexref | |
\iffirstonpage \ifsamepage \savefield \savefieldcs \savelist | |
\savelistcs \savename \savenamecs \usedriver | |
\ifinteger \ifnumeral \ifnumerals \ifpages | |
\iffieldint \iffieldnum \iffieldnums \iffieldpages | |
\mkpageprefix \mkpagetotal | |
\newblock \newunit \setunit \printunit \finentry} | |
\appto\blx@blxinit{% | |
\def\ifnatbibmode{\iftoggle{blx@natbib}}% | |
\def\ifcitation{\iftoggle{blx@citation}}% | |
\def\ifbibliography{\iftoggle{blx@bibliography}}% | |
\def\ifciteindex{\iftoggle{blx@citeindex}}% | |
\def\ifbibindex{\iftoggle{blx@bibindex}}% | |
\def\iffootnote{\iftoggle{blx@footnote}}% | |
\def\ifuseprefix{\iftoggle{blx@useprefix}}% | |
\def\ifterseinits{\iftoggle{blx@terseinits}}% | |
\def\ifcrossrefsource{\iftoggle{abx@bool@crossrefsource}}% | |
\def\ifxrefsource{\iftoggle{abx@bool@xrefsource}}% | |
\def\ifsingletitle{\iftoggle{abx@bool@singletitle}}% | |
\def\ifuniquetitle{\iftoggle{abx@bool@uniquetitle}}% | |
\def\ifuniquebaretitle{\iftoggle{abx@bool@uniquebaretitle}}% | |
\def\ifuniquework{\iftoggle{abx@bool@uniquework}}% | |
\def\ifuniqueprimaryauthor{\iftoggle{abx@bool@uniqueprimaryauthor}}% | |
\def\ifandothers#1{\iftoggle{abx@bool@more#1}}% | |
\protected\def\pno{\bibstring{page}}% | |
\protected\def\ppno{\bibstring{pages}}% | |
\let\nopp\relax | |
\protected\def\psq{\sqspace\bibstring{sequens}}% | |
\protected\def\psqq{\sqspace\bibstring{sequentes}}} | |
% Make sure that commands which might pop up inside an \edef will be defined | |
% as something. If they are taken \AtBeginDocument then we assume that all will | |
% be well. If not, then provide a definition which will give an error outside | |
% of a citation context. | |
\AtBeginDocument{% | |
\protected\def\do#1{% | |
\ifdefined#1% | |
\else | |
\protected\def#1{\ERROR}% | |
\fi | |
}% | |
\docsvlist{\pno,\ppno,\nopp,\psq,\psqq}% | |
} | |
%% Global formatting hooks | |
% capitalization | |
% {<text>} | |
\newrobustcmd{\MakeCapital}[1]{% | |
\begingroup | |
\blx@mkcp@init | |
\protected@edef\blx@tempa{#1}% | |
\expandafter\blx@mkcp@parse\blx@tempa\@empty\blx@mkcp@end} | |
\def\blx@mkcp@init{% | |
\def\blx@mkcp@iec{\noexpand\blx@mkcp@iec\noexpand}% | |
\def\blx@mkcp@bbl{\noexpand\blx@mkcp@bbl\noexpand}% | |
\def\blx@mkcp@sgl{\noexpand\blx@mkcp@sgl\noexpand}% | |
\def\blx@mkcp@dbl{\noexpand\blx@mkcp@dbl\noexpand}% | |
\def\do##1{\def##1{\blx@mkcp@sgl##1}}\abx@dosingleaccents | |
\def\do##1{\def##1{\blx@mkcp@dbl##1}}\abx@dodoubleaccents | |
\def\IeC##1{\blx@mkcp@iec\IeC{##1}}% | |
\def\@tabacckludge##1{% | |
\expandafter\blx@mkcp@sgl\csname\string##1\endcsname}} | |
\begingroup | |
\catcode`\"=\active | |
\gappto\blx@mkcp@init{% | |
\ifnum\catcode`\"=\active | |
\def"#1{\blx@mkcp@bbl"\noexpand#1}% | |
\fi} | |
\endgroup | |
\def\blx@mkcp@parse{% | |
\futurelet\@let@token\blx@mkcp@eval} | |
\long\def\blx@mkcp@eval{% | |
\ifx\@let@token\blx@mkcp@iec | |
\expandafter\blx@mkcp@getiec | |
\fi | |
\ifx\@let@token\blx@mkcp@bbl | |
\expandafter\blx@mkcp@gettwo | |
\fi | |
\ifx\@let@token\blx@mkcp@sgl | |
\expandafter\blx@mkcp@gettwo | |
\fi | |
\ifx\@let@token\blx@mkcp@dbl | |
\expandafter\blx@mkcp@getthree | |
\fi | |
\blx@mkcp@case} | |
\def\blx@mkcp@getiec#1\blx@mkcp@case#2#3#4{% | |
\blx@mkcp@case{#2#3{#4}}} | |
\def\blx@mkcp@gettwo#1\blx@mkcp@case#2#3#4{% | |
\blx@mkcp@case{#2#3#4}} | |
\def\blx@mkcp@getthree#1\blx@mkcp@case#2#3#4#5{% | |
\blx@mkcp@case{#2#3#4#5}} | |
\long\def\blx@mkcp@case#1{% | |
\begingroup | |
\def\i{I}\def\j{J}% | |
\def\do##1##2{\let##1##2\do}% | |
\expandafter\do\@uclclist\relax{\relax\@gobble}% | |
\uppercase{\protected@edef\blx@tempa{\endgroup\blx@mkcp@end#1}}% | |
\blx@tempa} | |
\protected\long\def\blx@mkcp@end#1\blx@mkcp@end{% | |
\let\blx@mkcp@iec\noexpand | |
\let\blx@mkcp@bbl\noexpand | |
\let\blx@mkcp@sgl\noexpand | |
\let\blx@mkcp@dbl\noexpand | |
\protected@edef\blx@tempa{\endgroup#1}% | |
\blx@tempa} | |
\def\abx@dosingleaccents{% | |
\do\"\do\'\do\`\do\^\do\~\do\=\do\.% | |
\do\H\do\b\do\c\do\d\do\r\do\u\do\v} | |
\def\abx@dodoubleaccents{% | |
\do\t} | |
% {<text>} | |
\newrobustcmd*{\MakeSentenceCase}{% | |
\@ifstar\blx@mksc@i\blx@mksc@ii} | |
% Check, in order: | |
% * explicit option language=<lang>, which overrides everything | |
% * langid field of entry | |
% * babel/polyglossia lang | |
% * main document lang | |
\def\blx@mksc@i{% | |
\ifdef\blx@forcelanguagename | |
{\xifinlist\blx@forcelanguagename\blx@cmksc@lang | |
{\blx@mksc@ii} | |
{\@firstofone}} | |
{\ifdef\abx@field@langid | |
{\xifinlist\abx@field@langid\blx@cmksc@lang | |
{\blx@mksc@ii} | |
{\@firstofone}} | |
{\ifdef\bbl@main@language | |
{\xifinlist\bbl@main@language\blx@cmksc@lang | |
{\blx@mksc@ii} | |
{\@firstofone}} | |
{\xifinlist\blx@languagename\blx@cmksc@lang | |
{\blx@mksc@ii} | |
{\@firstofone}}}}} | |
\long\def\blx@mksc@ii#1{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\let\blx@tempb\@empty | |
\blx@mksc@init | |
\protected@edef\@tempa{#1}% | |
\expandafter\blx@mksc@parse\@tempa\blx@mksc@end} | |
\def\blx@mksc@init{% | |
\blx@mkcp@init | |
\def\blx@mkcp@nil{\noexpand\blx@mkcp@nil\noexpand}% | |
\def\i{\blx@mkcp@nil\i}\def\j{\blx@mkcp@nil\j}% | |
\def\do##1{% | |
\ifx##1\relax | |
\else | |
\def##1{\blx@mkcp@nil##1}% | |
\expandafter\do | |
\fi}% | |
\expandafter\do\@uclclist\relax} | |
\def\blx@mksc@parse{% | |
\futurelet\@let@token\blx@mksc@eval} | |
\def\blx@mksc@eval{% | |
\ifx\@let@token\blx@mksc@end | |
\expandafter\blx@mksc@end | |
\fi | |
\ifx\@let@token\bgroup | |
\expandafter\blx@mksc@group | |
\fi | |
\ifx\@let@token\@sptoken | |
\expandafter\blx@mksc@space | |
\fi | |
\ifx\@let@token\blx@mkcp@nil | |
\expandafter\blx@mksc@getone | |
\fi | |
\ifx\@let@token\blx@mkcp@iec | |
\expandafter\blx@mksc@getiec | |
\fi | |
\ifx\@let@token\blx@mkcp@bbl | |
\expandafter\blx@mksc@gettwo | |
\fi | |
\ifx\@let@token\blx@mkcp@sgl | |
\expandafter\blx@mksc@gettwo | |
\fi | |
\ifx\@let@token\blx@mkcp@dbl | |
\expandafter\blx@mksc@getthree | |
\fi | |
\if\noexpand\@let@token\relax | |
\expandafter\blx@mksc@cs | |
\fi | |
\blx@mksc@other} | |
\def\blx@mksc@end#1\blx@mksc@end{% | |
\blx@mksc@eject | |
\let\blx@mkcp@nil\noexpand | |
\let\blx@mkcp@iec\noexpand | |
\let\blx@mkcp@bbl\noexpand | |
\let\blx@mkcp@sgl\noexpand | |
\let\blx@mkcp@dbl\noexpand | |
\let\MakeUppercase\relax | |
\let\MakeLowercase\relax | |
\protected@edef\blx@tempa{\endgroup\blx@tempa}% | |
\blx@tempa} | |
\long\def\blx@mksc@group#1\blx@mksc@other#2{% | |
\futurelet\@let@token\blx@mksc@ingroup#2&{#2}% | |
\blx@mksc@endhead | |
\blx@mksc@parse} | |
\long\def\blx@mksc@ingroup#1{% | |
\if\noexpand\@let@token\relax | |
\blx@mksc@locase{{#2}}% | |
\else | |
\blx@mksc@nocase{{#2}}% | |
\fi} | |
\def\blx@mksc@space{\def\blx@mksc@space##1\blx@mksc@other} | |
\csuse{blx@mksc@space} {% | |
\blx@mksc@anycase{ }% | |
\blx@mksc@endhead | |
\blx@mksc@parse} | |
\long\def\blx@mksc@cs#1\blx@mksc@other#2{% | |
\ifcat\noexpand~\noexpand#2% | |
\blx@mksc@locase{#2}% | |
\else | |
\blx@mksc@nocase{#2}% | |
\fi | |
\blx@mksc@endhead | |
\blx@mksc@parse} | |
\def\blx@mksc@getiec#1\blx@mksc@other#2#3#4{% | |
\blx@mksc@other{#2#3{#4}}} | |
\def\blx@mksc@getone#1\blx@mksc@other#2#3{% | |
\blx@mksc@other{#2#3}} | |
\def\blx@mksc@gettwo#1\blx@mksc@other#2#3#4{% | |
\blx@mksc@other{#2#3#4}} | |
\def\blx@mksc@getthree#1\blx@mksc@other#2#3#4#5{% | |
\blx@mksc@other{#2#3#4#5}} | |
\long\def\blx@mksc@other#1{% | |
\blx@mksc@locase{#1}% | |
\blx@mksc@endhead | |
\blx@mksc@parse} | |
\def\blx@mksc@locase{% | |
\appto\blx@tempb} | |
\def\blx@mksc@nocase{% | |
\blx@mksc@eject | |
\appto\blx@tempa} | |
\def\blx@mksc@anycase{% | |
\ifx\blx@tempb\@empty | |
\expandafter\appto | |
\expandafter\blx@tempa | |
\else | |
\expandafter\appto | |
\expandafter\blx@tempb | |
\fi} | |
\def\blx@mksc@eject{% | |
\ifx\blx@tempb\@empty | |
\else | |
\eappto\blx@tempa{\noexpand\MakeLowercase{\expandonce\blx@tempb}}% | |
\let\blx@tempb\@empty | |
\fi} | |
\def\blx@mksc@endhead{% | |
\ifx\blx@tempb\@empty | |
\else | |
\eappto\blx@tempa{\noexpand\MakeCapital{\expandonce\blx@tempb}}% | |
\let\blx@tempb\@empty | |
\fi | |
\let\blx@mksc@endhead\relax} | |
% {<language,language,...>} | |
\newrobustcmd*{\DeclareCaseLangs}{% | |
\@ifstar | |
{\blx@defcaselangs} | |
{\global\let\blx@cmksc@lang\@empty | |
\blx@defcaselangs}} | |
\def\blx@defcaselangs#1{% | |
\ifblank{#1} | |
{} | |
{\forcsvlist{\listgadd\blx@cmksc@lang}{#1}}} | |
\DeclareCaseLangs{% | |
american,british,canadian, | |
english,USenglish,UKenglish, | |
australian,newzealand} | |
\newrobustcmd*{\ifcaselang}[1][]{% | |
\ifblank{#1} | |
{\xifinlist\blx@languagename\blx@cmksc@lang} | |
{\xifinlist{#1}\blx@cmksc@lang}} | |
%% Main formatting commands | |
% The work by creating a \let alias: | |
% \abx@<class>@<entrytype>@<formatname> -> \blx@defformat@d | |
% for later use in \print* | |
% Then, \blx@defformat@d is defined by calling | |
% \def\blx@defformat@d#1{format body} | |
% [<entrytype>]{<name>}{<definiton>} | |
\newrobustcmd*{\DeclareNameFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defnameformat{nfd}*} | |
{\blx@defformat\blx@defnameformat{nfd}{}}} | |
\newrobustcmd*{\DeclareIndexNameFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defnameformat{nid}*} | |
{\blx@defformat\blx@defnameformat{nid}{}}} | |
\newrobustcmd*{\DeclareListFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{lfd}*} | |
{\blx@defformat\blx@defplainformat{lfd}{}}} | |
\newrobustcmd*{\DeclareIndexListFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{lid}*} | |
{\blx@defformat\blx@defplainformat{lid}{}}} | |
\newrobustcmd*{\DeclareFieldFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{ffd}*} | |
{\blx@defformat\blx@defplainformat{ffd}{}}} | |
\newrobustcmd*{\DeclareIndexFieldFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{fid}*} | |
{\blx@defformat\blx@defplainformat{fid}{}}} | |
% {<macro>}{<class>}{<*>} | |
\def\blx@defformat#1#2#3{% | |
\@ifnextchar[%] | |
{\blx@defformat@i{#1}{#2}{#3}} | |
{\blx@defformat@i{#1}{#2}{#3}[*]}} | |
% {<macro>}{<class>}{<*>}[<entrytype>]{<name>} | |
\def\blx@defformat@i#1#2#3[#4]#5{% | |
\notblank{#3} | |
{\blx@resetformat{#2}{#5}} | |
{}% | |
\def\blx@defformat@a{#2}% | |
\def\blx@defformat@b{#4}% | |
\blx@xsanitizeafter{\def\blx@defformat@c}{#5}% | |
\afterassignment\blx@defformat@ii | |
#1} | |
\def\blx@defformat@ii{% | |
\expandafter\forcsvlist | |
\expandafter\blx@defformat@iii | |
\expandafter{\blx@defformat@b}} | |
\def\blx@defformat@iii#1{% | |
\cslet{abx@\blx@defformat@a @#1@\blx@defformat@c}\blx@defformat@d} | |
\def\blx@defplainformat{% | |
\long\def\blx@defformat@d##1} | |
\def\blx@defnameformat{% | |
\long\def\blx@defformat@d##1} | |
\def\blx@resetformat#1#2{% | |
\let\blx@saved@do\do | |
\def\do##1{\blx@resetformat@i{#1}{#2}{##1}}% | |
\blx@safe@actives | |
\abx@doentrytypes | |
\blx@rest@actives | |
\let\do\blx@saved@do} | |
\def\blx@resetformat@i#1#2#3{% | |
\ifcsdef{abx@#1@#3@#2} | |
{\csundef{abx@#1@#3@#2}} | |
{}} | |
% {<name>}{<name>} | |
\def\blx@letformat#1#2{% | |
\blx@safe@actives | |
\afterassignment\blx@rest@actives | |
\csletcs{#1}{#2}} | |
% [aliastype]{aliasname}[formattype]{formatname} | |
\def\blx@defalias#1{% | |
\@ifnextchar[%] | |
{\blx@defalias@i{#1}} | |
{\blx@defalias@i{#1}[*]}} | |
\def\blx@defalias@i#1[#2]#3{% | |
\@ifnextchar[%] | |
{\blx@defalias@ii{#1}{#2}{#3}} | |
{\blx@defalias@ii{#1}{#2}{#3}[*]}} | |
\def\blx@defalias@ii#1#2#3[#4]#5{% | |
\blx@safe@actives | |
\afterassignment\blx@rest@actives | |
\csedef{abx@#1@#2@#3}{% | |
\expandonce{\csname abx@#1@#4@#5\endcsname}}} | |
% {<macro>}{<class>}{<name>}{<field>} | |
\def\blx@getformat#1#2#3#4{% | |
\blx@safe@actives | |
\afterassignment\blx@rest@actives | |
\ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#3} | |
{\ifcsundef{abx@#2@*@#3} | |
{\ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#4} | |
{\ifcsundef{abx@#2@*@#4} | |
{\letcs#1{abx@#2@*@default}} | |
{\letcs#1{abx@#2@*@#4}}} | |
{\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#4}}} | |
{\letcs#1{abx@#2@*@#3}}} | |
{\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#3}}} | |
% [<entrytype>]{<name>} | |
\newrobustcmd*{\savefieldformat}[2][*]{\blx@save{abx@ffd@#1@#2}} | |
\newrobustcmd*{\savelistformat}[2][*]{\blx@save{abx@lfd@#1@#2}} | |
\newrobustcmd*{\savenameformat}[2][*]{\blx@save{abx@nfd@#1@#2}} | |
\newrobustcmd*{\restorefieldformat}[2][*]{\blx@restore{abx@ffd@#1@#2}} | |
\newrobustcmd*{\restorelistformat}[2][*]{\blx@restore{abx@lfd@#1@#2}} | |
\newrobustcmd*{\restorenameformat}[2][*]{\blx@restore{abx@nfd@#1@#2}} | |
% [<entrytype>]{<name>}{<true>}{<false>} | |
\newrobustcmd*{\iffieldformatundef}[2][*]{\ifcsundef{abx@ffd@#1@#2}} | |
\newrobustcmd*{\iflistformatundef}[2][*]{\ifcsundef{abx@lfd@#1@#2}} | |
\newrobustcmd*{\ifnameformatundef}[2][*]{\ifcsundef{abx@nfd@#1@#2}} | |
% [<entrytype>]{<alias>}[<entrytype>]{<name>} | |
\newrobustcmd*{\DeclareNameAlias}{\blx@defalias{nfd}} | |
\newrobustcmd*{\DeclareIndexNameAlias}{\blx@defalias{nid}} | |
\newrobustcmd*{\DeclareListAlias}{\blx@defalias{lfd}} | |
\newrobustcmd*{\DeclareIndexListAlias}{\blx@defalias{lid}} | |
\newrobustcmd*{\DeclareFieldAlias}{\blx@defalias{ffd}} | |
\newrobustcmd*{\DeclareIndexFieldAlias}{\blx@defalias{fid}} | |
% [<format>]{<text>} | |
\newrobustcmd{\blx@imc@printtext}[2][]{% | |
\ifblank{#2} | |
{\blx@nounit} | |
{\ifblank{#1} | |
{\let\blx@theformat\@firstofone} | |
{\blx@getformat\blx@theformat{ffd}{#1}{}}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\blx@theformat{#2}% | |
\blx@endunit}}} | |
% [<format>]{<field>} | |
\newrobustcmd*{\blx@imc@printfield}[2][]{% | |
\blx@imc@iffieldundef{#2} | |
{\blx@nounit} | |
{\blx@getformat\blx@theformat{ffd}{#1}{#2}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\edef\currentfield{#2}% | |
\expandafter\expandafter | |
\expandafter\blx@theformat | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#2\endcsname}% | |
\blx@endunit}}} | |
% [<format>]{<field>} | |
\newcommand*{\blx@imc@indexfield}[2][]{% | |
\blx@imc@iffieldundef{#2} | |
{} | |
{\blx@getformat\blx@theformat{fid}{#1}{#2}% | |
\ifdefvoid\blx@theformat | |
{} | |
{\begingroup | |
\edef\currentfield{#2}% | |
\letcs\blx@tempa{abx@field@#2}% | |
\expandafter\blx@theformat\expandafter{\blx@tempa}% | |
\endgroup}}} | |
% [<format>]{<file>} | |
\newrobustcmd*{\blx@imc@printfile}[2][]{% | |
\iftoggle{blx@loadfiles} | |
{\IfFileExists{#2} | |
{\listxadd\blx@list@req@edit{#2}% | |
\blx@imc@printtext[#1]{\input{#2}\unspace}} | |
{\blx@nounit}} | |
{\blx@nounit}} | |
% {<macro>}[<format>][<start>-<stop>] | |
% => <macro>{<format>}{<start>}{<stop>} | |
\def\blx@listargs#1{% | |
\@ifnextchar[%] | |
{\blx@listargs@i{#1}} | |
{#1{}{}{}}} | |
\def\blx@listargs@i#1[#2]{% | |
\@ifnextchar[%] | |
{\blx@listargs@ii{#1}{#2}} | |
{#1{#2}{}{}}} | |
\def\blx@listargs@ii#1#2[#3]{% | |
\blx@listargs@iii{#1}{#2}#3&} | |
\def\blx@listargs@iii#1#2#3-#4&{% | |
#1{#2}{#3}{#4}} | |
% [<format>][<start>-<stop>]{<namelist>} | |
\protected\def\blx@imc@printnames{% | |
\blx@listargs\blx@printnames} | |
% {<format>}{<start>}{<stop>}{<namelist>} | |
\def\blx@printnames#1#2#3#4{% | |
\blx@imc@ifnameundef{#4} | |
{\blx@nounit} | |
{\blx@getformat\blx@theformat{nfd}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\blx@namesetup{#2}{#3}{#4}% | |
\expandafter\blx@nameparser\blx@thedata{}&% | |
\blx@endunit}}} | |
\def\blx@namesetup#1#2#3{% | |
\def\currentname{#3}% | |
\c@listcount\@ne | |
\c@listtotal\csname c@#3\endcsname | |
\blx@namesetup@i{#3}% | |
\ifblank{#1} | |
{\c@liststart\@ne} | |
{\ifnum#1<\@ne | |
\c@liststart\@ne | |
\else | |
\c@liststart#1\relax | |
\fi}% | |
\ifblank{#2} | |
{\c@liststop\c@listtotal | |
\ifnum\c@liststop>\c@maxnames | |
\c@liststop\c@minnames | |
\ifnum\c@uniquelist>\c@liststop | |
\c@liststop\c@uniquelist | |
\fi | |
\fi} | |
{\ifnum#2>\c@listtotal | |
\c@liststop\c@listtotal | |
\else | |
\ifnum#2<\@ne | |
\c@liststop\@ne | |
\else | |
\c@liststop#2\relax | |
\fi | |
\fi}% | |
\blx@namecodes} | |
\def\blx@namesetup@i#1{% | |
\expandafter\expandafter | |
\expandafter\blx@namesetup@ii\csname abx@name@#1\endcsname} | |
\def\blx@namesetup@ii#1#2{% | |
\c@uniquelist\z@ | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@opt@namelist}{#1}}% | |
\def\blx@thedata{#2}} | |
% Per-namelist options | |
\define@key{blx@opt@namelist}{uniquelist}{\c@uniquelist#1\relax} | |
\define@key{blx@opt@namelist}{useprefix}{\settoggle{blx@useprefix}{#1}} | |
\define@key{blx@opt@namelist}{sortnamekeyscheme}{\def\blx@refcontext@sortingnamekey{#1}} | |
% Per-name options | |
\define@key{blx@opt@name}{uniquename}{\c@uniquename#1\relax} | |
\define@key{blx@opt@name}{hash}{\edef\abx@field@hash{\detokenize{#1}}} | |
\define@key{blx@opt@name}{useprefix}{\settoggle{blx@useprefix}{#1}} | |
\define@key{blx@opt@name}{sortnamekeyscheme}{\def\blx@refcontext@sortingnamekey{#1}} | |
\newrobustcmd*{\bibinitperiod}{\adddot} | |
\newrobustcmd*{\bibinitdelim}{\addnbspace} | |
\newrobustcmd*{\bibinithyphendelim}{.\mbox{-}} | |
\newrobustcmd*{\bibnamedelima}{\addhighpenspace} | |
\newrobustcmd*{\bibnamedelimb}{\addlowpenspace} | |
\newrobustcmd*{\bibnamedelimc}{\addhighpenspace} | |
\newrobustcmd*{\bibnamedelimd}{\addlowpenspace} | |
\newrobustcmd*{\bibnamedelimi}{\addnbspace} | |
% [<format>][<start>-<stop>]{<namelist>} | |
\protected\def\blx@imc@indexnames{% | |
\blx@listargs\blx@indexnames} | |
% {<format>}{<start>}{<stop>}{<namelist>} | |
\def\blx@indexnames#1#2#3#4{% | |
\blx@imc@ifnameundef{#4} | |
{} | |
{\blx@getformat\blx@theformat{nid}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{} | |
{\begingroup | |
\blx@namesetup{#2}{#3}{#4}% | |
\blx@indexnamesetup | |
\expandafter\blx@nameparser\blx@thedata{}&% | |
\endgroup}}} | |
\def\blx@indexnamesetup{% | |
\let\bibinitperiod\bibindexinitperiod | |
\let\bibinitdelim\bibindexinitdelim | |
\let\bibinithyphendelim\bibindexinithyphendelim | |
\let\bibnamedelima\bibindexnamedelima | |
\let\bibnamedelimb\bibindexnamedelimb | |
\let\bibnamedelimc\bibindexnamedelimc | |
\let\bibnamedelimd\bibindexnamedelimd | |
\let\bibnamedelimi\bibindexnamedelimi} | |
% {<name1>}{<name2>}{...} | |
\long\def\blx@nameparser#1{% | |
\ifblank{#1} | |
{\blx@namebreak} | |
{\ifnum\c@listcount<\c@liststart | |
\else | |
\blx@nameparser@i#1% | |
\fi | |
\advance\c@listcount\@ne | |
\ifnum\c@listcount>\c@liststop | |
\expandafter\blx@namebreak | |
\fi | |
\blx@nameparser}} | |
% {name opts}{nameparts} | |
\long\def\blx@nameparser@i#1#2{% | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@opt@name}{#1}}% | |
% reset all the nameparts to empty between names | |
\def\do##1{% | |
\cslet{namepart##1}\@empty | |
\cslet{namepart##1i}\@empty}% | |
\expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}% | |
\setkeys{blx@opt@namepart}{#2}% Extract nameparts information | |
% Still pass the nameparts forward for backwards compat | |
% When \nameparts is finally removed, remove the "{2}" and remove the | |
% arg to \blx@defformat@d in def of \blx@defnameformat | |
\blx@theformat{#2}} | |
\long\def\blx@namebreak#1&{} | |
% [<format>][<start>-<stop>]{<plainlist>} | |
\protected\def\blx@imc@printlist{% | |
\blx@listargs\blx@printlist} | |
% {<format>}{<start>}{<stop>}{<plainlist>} | |
\def\blx@printlist#1#2#3#4{% | |
\blx@imc@iflistundef{#4} | |
{\blx@nounit} | |
{\blx@getformat\blx@theformat{lfd}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\blx@listsetup{#2}{#3}{#4}% | |
\expandafter\blx@listparser\blx@thedata{}&% | |
\blx@endunit}}} | |
\def\blx@listsetup#1#2#3{% | |
\def\currentlist{#3}% | |
\c@listcount\@ne | |
\expandafter\c@listtotal\csname c@#3\endcsname | |
\letcs\blx@thedata{abx@list@#3}% | |
\ifblank{#1} | |
{\c@liststart\@ne} | |
{\ifnum#1<\@ne | |
\c@liststart\@ne | |
\else | |
\c@liststart#1\relax | |
\fi}% | |
\ifblank{#2} | |
{\c@liststop\c@listtotal | |
\ifnum\c@listtotal>\c@maxitems | |
\c@liststop\c@minitems | |
\fi} | |
{\ifnum#2>\c@listtotal | |
\c@liststop\c@listtotal | |
\else | |
\ifnum#2<\@ne | |
\c@liststop\@ne | |
\else | |
\c@liststop#2\relax | |
\fi | |
\fi}} | |
% [<format>][<start>-<stop>]{<plainlist>} | |
\protected\def\blx@imc@indexlist{% | |
\blx@listargs\blx@indexlist} | |
% {<format>}{<start>}{<stop>}{<plainlist>} | |
\def\blx@indexlist#1#2#3#4{% | |
\blx@imc@iflistundef{#4} | |
{} | |
{\blx@getformat\blx@theformat{lid}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{} | |
{\begingroup | |
\blx@listsetup{#2}{#3}{#4}% | |
\expandafter\blx@listparser\blx@thedata{}&% | |
\endgroup}}} | |
% {<item1>}{<item2>}{...} | |
\long\def\blx@listparser#1{% | |
\ifblank{#1} | |
{\blx@listbreak} | |
{\ifnum\c@listcount<\c@liststart | |
\else | |
\blx@theformat{#1}% | |
\fi | |
\advance\c@listcount\@ne | |
\ifnum\c@listcount>\c@liststop | |
\expandafter\blx@listbreak | |
\fi | |
\blx@listparser}} | |
\long\def\blx@listbreak#1&{} | |
% <*>{<key>}{<code>} | |
\protected\def\blx@imc@entrydata{% | |
\@ifstar | |
{\blx@xsanitizeafter{\blx@imc@entrydata@i\blx@saveentry}} | |
{\blx@xsanitizeafter{\blx@imc@entrydata@i{}}}} | |
\long\def\blx@imc@entrydata@i#1#2#3{% | |
\blx@getrefcontext{#2}% | |
\blx@ifdata{#2} | |
{\begingroup | |
#1% | |
\blx@resetdata | |
\blx@getdata{#2}% | |
\blx@entrysetcount | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\addtocounter{instcount}\@ne | |
\blx@execute | |
\blx@beglangbib#3\blx@endlangbib | |
\endgroup} | |
{}} | |
\protected\def\blx@imc@entryset#1#2{% | |
\blx@imc@iffieldundef{entrykey} | |
{} | |
{\begingroup | |
\long\def\blx@entryset@precode{#1}% | |
\long\def\blx@entryset@postcode{#2}% | |
\let\finentry\blx@finentry@inset | |
\let\do\blx@entryset | |
\blx@imc@docsvfield{entryset}% | |
\endgroup}} | |
\def\blx@entryset#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@imc@clearlist{pageref}% | |
\blx@getdata{#1}% | |
\blx@setoptions@type\abx@field@entrytype | |
\def\abx@field@entrysetcount{1}% | |
\blx@entryset@precode | |
\blx@driver{\blx@imc@thefield{entrytype}}% | |
\blx@entryset@postcode | |
\endgroup} | |
{}% | |
\let\do\blx@entryset@i} | |
\def\blx@entryset@i#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@resetdata | |
\blx@getdata{#1}% | |
\blx@entrysetcount | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\addtocounter{instcount}\@ne | |
\blx@execute | |
\blx@beglangbib | |
\blx@begunit | |
\blx@entryset@precode | |
\blx@driver{\blx@imc@thefield{entrytype}} | |
\blx@entryset@postcode | |
\blx@endunit | |
\blx@endlangbib | |
\endgroup} | |
{\blx@nounit}} | |
\blx@regimcs{% | |
\printtext \printfield \printlist \printnames \printfile | |
\indexfield \indexlist \indexnames \entrydata \entryset} | |
%% Localization | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@bibstring}[2][\@firstofone]{% | |
\blx@bibstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@biblstring}[2][\@firstofone]{% | |
\blx@bibstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@bibsstring}[2][\@firstofone]{% | |
\blx@bibstring{#1}{abx@sstr}{#2}} | |
\protected\def\blx@bibstring#1#2#3{% | |
\blx@begunit | |
\blx@hyphenreset | |
\let\bibstring\blx@imc@bibxstring | |
\let\biblstring\blx@imc@bibxlstring | |
\let\bibsstring\blx@imc@bibxsstring | |
\lowercase{\edef\blx@tempa{#3}}% | |
\ifcsundef{#2@\blx@tempa} | |
{\blx@warn@nostring\blx@tempa | |
\blx@endnounit} | |
{\blx@imc@ifcapital | |
{#1{\MakeCapital{\csuse{#2@\blx@tempa}}}} | |
{#1{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@bibcpstring}[2][\@firstofone]{% | |
\blx@bibcpstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@bibcplstring}[2][\@firstofone]{% | |
\blx@bibcpstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@bibcpsstring}[2][\@firstofone]{% | |
\blx@bibcpstring{#1}{abx@sstr}{#2}} | |
\protected\def\blx@bibcpstring#1#2#3{% | |
\blx@begunit | |
\blx@hyphenreset | |
\let\bibstring\blx@imc@bibxstring | |
\let\biblstring\blx@imc@bibxlstring | |
\let\bibsstring\blx@imc@bibxsstring | |
\lowercase{\edef\blx@tempa{#3}}% | |
\ifcsundef{#2@\blx@tempa} | |
{\blx@warn@nostring\blx@tempa | |
\blx@endnounit} | |
{#1{\MakeCapital{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@biblcstring}[2][\@firstofone]{% | |
\blx@biblcstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@biblclstring}[2][\@firstofone]{% | |
\blx@biblcstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@biblcsstring}[2][\@firstofone]{% | |
\blx@biblcstring{#1}{abx@sstr}{#2}} | |
\protected\def\blx@biblcstring#1#2#3{% | |
\blx@begunit | |
\blx@hyphenreset | |
\let\bibstring\blx@imc@bibxstring | |
\let\biblstring\blx@imc@bibxlstring | |
\let\bibsstring\blx@imc@bibxsstring | |
\lowercase{\edef\blx@tempa{#3}}% | |
\ifcsundef{#2@\blx@tempa} | |
{\blx@warn@nostring\blx@tempa | |
\blx@endnounit} | |
{#1{\MakeLowercase{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@bibucstring}[2][\@firstofone]{% | |
\blx@bibucstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@bibuclstring}[2][\@firstofone]{% | |
\blx@bibucstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@bibucsstring}[2][\@firstofone]{% | |
\blx@bibucstring{#1}{abx@sstr}{#2}} | |
\protected\def\blx@bibucstring#1#2#3{% | |
\blx@begunit | |
\blx@hyphenreset | |
\let\bibstring\blx@imc@bibxstring | |
\let\biblstring\blx@imc@bibxlstring | |
\let\bibsstring\blx@imc@bibxsstring | |
\lowercase{\edef\blx@tempa{#3}}% | |
\ifcsundef{#2@\blx@tempa} | |
{\blx@warn@nostring\blx@tempa | |
\blx@endnounit} | |
{#1{\MakeUppercase{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% {<string>} | |
\def\blx@imc@bibxstring#1{% | |
\blx@bibxstring{\abx@str}{#1}} | |
\def\blx@imc@bibxlstring#1{% | |
\blx@bibxstring{abx@lstr}{#1}} | |
\def\blx@imc@bibxsstring#1{% | |
\blx@bibxstring{abx@sstr}{#1}} | |
\def\blx@bibxstring#1#2{% | |
\ifcsundef{#1@#2} | |
{\protect\blx@warn@nostring{#2}} | |
{\csuse{#1@#2}}} | |
% {<string>}{<true>}{<false>} | |
\def\blx@imc@ifbibstring#1{% | |
\ifcsundef{\abx@str @\detokenize{#1}} | |
{\@secondoftwo} | |
{\@firstoftwo}} | |
\def\blx@imc@ifbibxstring#1{% | |
\blx@xsanitizeafter\ifcsundef{\abx@str @#1} | |
{\@secondoftwo} | |
{\@firstoftwo}} | |
% {<field>}{<true>}{<false>} | |
\def\blx@imc@iffieldbibstring#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\ifcsundef{\abx@str @\detokenize\expandafter | |
\expandafter\expandafter{% | |
\csname abx@field@#1\endcsname}} | |
{\@secondoftwo} | |
{\@firstoftwo}}} | |
\blx@regimcs{% | |
\bibstring \biblstring \bibsstring | |
\bibxstring \bibxlstring \bibxsstring | |
\bibcpstring \bibcplstring \bibcpsstring | |
\biblcstring \biblclstring \biblcsstring | |
\bibucstring \bibuclstring \bibucsstring | |
\ifbibstring \ifbibxstring \iffieldbibstring} | |
\let\blx@hook@uc\relax | |
\let\blx@hook@lc\relax | |
\AtEndPreamble{% | |
\toggletrue{blx@tempa}% | |
\toggletrue{blx@tempb}% | |
\expandafter\patchcmd\csname MakeUppercase \endcsname | |
{\protected@edef} | |
{\blx@hook@uc\protected@edef} | |
{\togglefalse{blx@tempa}} | |
{}% | |
\expandafter\patchcmd\csname MakeLowercase \endcsname | |
{\protected@edef} | |
{\blx@hook@lc\protected@edef} | |
{\togglefalse{blx@tempb}} | |
{}% | |
\@ifpackageloaded{textcase} | |
{\expandafter\patchcmd\csname MakeUppercase \endcsname | |
{\def\i} | |
{\blx@hook@uc\def\i} | |
{\togglefalse{blx@tempa}} | |
{}% | |
\expandafter\patchcmd\csname MakeLowercase \endcsname | |
{\@uclcnotmath{}} | |
{\@uclcnotmath{\blx@hook@lc}} | |
{\togglefalse{blx@tempb}} | |
{}% | |
\expandafter\patchcmd\csname MakeTextUppercase \endcsname | |
{\def\i} | |
{\blx@hook@uc\def\i} | |
{} | |
{}% | |
\expandafter\patchcmd\csname MakeTextLowercase \endcsname | |
{\@uclcnotmath{}} | |
{\@uclcnotmath{\blx@hook@lc}} | |
{} | |
{}} | |
{}% | |
\iftoggle{blx@tempa}{\blx@err@patch{\string\MakeUppercase}}{}% | |
\iftoggle{blx@tempb}{\blx@err@patch{\string\MakeLowercase}}{}% | |
} | |
\appto\blx@blxinit{% | |
\def\blx@hook@uc{% | |
\def\bibstring{\blx@imc@bibucstring}% | |
\def\biblstring{\blx@imc@bibuclstring}% | |
\def\bibsstring{\blx@imc@bibucsstring}% | |
\def\biblcstring{\blx@imc@bibucstring}% | |
\def\biblclstring{\blx@imc@bibuclstring}% | |
\def\biblcsstring{\blx@imc@bibucsstring}% | |
\def\bibcpstring{\blx@imc@bibucstring}% | |
\def\bibcplstring{\blx@imc@bibuclstring}% | |
\def\bibcpsstring{\blx@imc@bibucsstring}}% | |
\def\blx@hook@lc{% | |
\def\bibstring{\blx@imc@biblcstring}% | |
\def\biblstring{\blx@imc@biblclstring}% | |
\def\bibsstring{\blx@imc@biblcsstring}% | |
\def\bibucstring{\blx@imc@biblcstring}% | |
\def\bibuclstring{\blx@imc@biblclstring}% | |
\def\bibucsstring{\blx@imc@biblcsstring}% | |
\def\bibcpstring{\blx@imc@biblcstring}% | |
\def\bibcplstring{\blx@imc@biblclstring}% | |
\def\bibcpsstring{\blx@imc@biblcsstring}}} | |
\def\abx@dostrings{% | |
\do{bibliography}% | |
\do{references}% | |
\do{shorthands}% | |
\do{editor}% | |
\do{editors}% | |
\do{compiler}% | |
\do{compilers}% | |
\do{redactor}% | |
\do{redactors}% | |
\do{reviser}% | |
\do{revisers}% | |
\do{founder}% | |
\do{founders}% | |
\do{continuator}% | |
\do{continuators}% | |
\do{collaborator}% | |
\do{collaborators}% | |
\do{translator}% | |
\do{translators}% | |
\do{commentator}% | |
\do{commentators}% | |
\do{annotator}% | |
\do{annotators}% | |
\do{commentary}% | |
\do{annotations}% | |
\do{introduction}% | |
\do{foreword}% | |
\do{afterword}% | |
\do{editortr}% | |
\do{editorstr}% | |
\do{editorco}% | |
\do{editorsco}% | |
\do{editoran}% | |
\do{editorsan}% | |
\do{editorin}% | |
\do{editorsin}% | |
\do{editorfo}% | |
\do{editorsfo}% | |
\do{editoraf}% | |
\do{editorsaf}% | |
\do{editortrco}% | |
\do{editorstrco}% | |
\do{editortran}% | |
\do{editorstran}% | |
\do{editortrin}% | |
\do{editorstrin}% | |
\do{editortrfo}% | |
\do{editorstrfo}% | |
\do{editortraf}% | |
\do{editorstraf}% | |
\do{editorcoin}% | |
\do{editorscoin}% | |
\do{editorcofo}% | |
\do{editorscofo}% | |
\do{editorcoaf}% | |
\do{editorscoaf}% | |
\do{editoranin}% | |
\do{editorsanin}% | |
\do{editoranfo}% | |
\do{editorsanfo}% | |
\do{editoranaf}% | |
\do{editorsanaf}% | |
\do{editortrcoin}% | |
\do{editorstrcoin}% | |
\do{editortrcofo}% | |
\do{editorstrcofo}% | |
\do{editortrcoaf}% | |
\do{editorstrcoaf}% | |
\do{editortranin}% | |
\do{editorstranin}% | |
\do{editortranfo}% | |
\do{editorstranfo}% | |
\do{editortranaf}% | |
\do{editorstranaf}% | |
\do{translatorco}% | |
\do{translatorsco}% | |
\do{translatoran}% | |
\do{translatorsan}% | |
\do{translatorin}% | |
\do{translatorsin}% | |
\do{translatorfo}% | |
\do{translatorsfo}% | |
\do{translatoraf}% | |
\do{translatorsaf}% | |
\do{translatorcoin}% | |
\do{translatorscoin}% | |
\do{translatorcofo}% | |
\do{translatorscofo}% | |
\do{translatorcoaf}% | |
\do{translatorscoaf}% | |
\do{translatoranin}% | |
\do{translatorsanin}% | |
\do{translatoranfo}% | |
\do{translatorsanfo}% | |
\do{translatoranaf}% | |
\do{translatorsanaf}% | |
\do{byauthor}% | |
\do{byeditor}% | |
\do{bycompiler}% | |
\do{byredactor}% | |
\do{byreviser}% | |
\do{byreviewer}% | |
\do{byfounder}% | |
\do{bycontinuator}% | |
\do{bycollaborator}% | |
\do{bytranslator}% | |
\do{bycommentator}% | |
\do{byannotator}% | |
\do{withcommentator}% | |
\do{withannotator}% | |
\do{withintroduction}% | |
\do{withforeword}% | |
\do{withafterword}% | |
\do{byeditortr}% | |
\do{byeditorco}% | |
\do{byeditoran}% | |
\do{byeditorin}% | |
\do{byeditorfo}% | |
\do{byeditoraf}% | |
\do{byeditortrco}% | |
\do{byeditortran}% | |
\do{byeditortrin}% | |
\do{byeditortrfo}% | |
\do{byeditortraf}% | |
\do{byeditorcoin}% | |
\do{byeditorcofo}% | |
\do{byeditorcoaf}% | |
\do{byeditoranin}% | |
\do{byeditoranfo}% | |
\do{byeditoranaf}% | |
\do{byeditortrcoin}% | |
\do{byeditortrcofo}% | |
\do{byeditortrcoaf}% | |
\do{byeditortranin}% | |
\do{byeditortranfo}% | |
\do{byeditortranaf}% | |
\do{bytranslatorco}% | |
\do{bytranslatoran}% | |
\do{bytranslatorin}% | |
\do{bytranslatorfo}% | |
\do{bytranslatoraf}% | |
\do{bytranslatorcoin}% | |
\do{bytranslatorcofo}% | |
\do{bytranslatorcoaf}% | |
\do{bytranslatoranin}% | |
\do{bytranslatoranfo}% | |
\do{bytranslatoranaf}% | |
\do{and}% | |
\do{andothers}% | |
\do{andmore}% | |
\do{volume}% | |
\do{volumes}% | |
\do{involumes}% | |
\do{part}% | |
\do{jourvol}% | |
\do{jourser}% | |
\do{newseries}% | |
\do{oldseries}% | |
\do{edition}% | |
\do{reprint}% | |
\do{reprintof}% | |
\do{reprintas}% | |
\do{reprintfrom}% | |
\do{reviewof}% | |
\do{translationof}% | |
\do{translationas}% | |
\do{translationfrom}% | |
\do{origpubas}% | |
\do{origpubin}% | |
\do{astitle}% | |
\do{bypublisher}% | |
\do{page}% | |
\do{pages}% | |
\do{column}% | |
\do{columns}% | |
\do{line}% | |
\do{lines}% | |
\do{nodate}% | |
\do{verse}% | |
\do{verses}% | |
\do{section}% | |
\do{sections}% | |
\do{paragraph}% | |
\do{paragraphs}% | |
\do{in}% | |
\do{inseries}% | |
\do{ofseries}% | |
\do{book}% | |
\do{issue}% | |
\do{number}% | |
\do{chapter}% | |
\do{mathesis}% | |
\do{phdthesis}% | |
\do{candthesis}% | |
\do{resreport}% | |
\do{techreport}% | |
\do{software}% | |
\do{datacd}% | |
\do{audiocd}% | |
\do{version}% | |
\do{url}% | |
\do{urlfrom}% | |
\do{urlseen}% | |
\do{file}% | |
\do{inpreparation}% | |
\do{submitted}% | |
\do{inpress}% | |
\do{prepublished}% | |
\do{forthcoming}% | |
\do{library}% | |
\do{abstract}% | |
\do{annotation}% | |
\do{citedas}% | |
\do{seenote}% | |
\do{quotedin}% | |
\do{opcit}% | |
\do{loccit}% | |
\do{ibidem}% | |
\do{idem}% | |
\do{idemsf}% | |
\do{idemsm}% | |
\do{idemsn}% | |
\do{idempf}% | |
\do{idempm}% | |
\do{idempn}% | |
\do{idempp}% | |
\do{confer}% | |
\do{sequens}% | |
\do{sequentes}% | |
\do{passim}% | |
\do{see}% | |
\do{seealso}% | |
\do{backrefpage}% | |
\do{backrefpages}% | |
\do{thiscite}% | |
\do{january}% | |
\do{february}% | |
\do{march}% | |
\do{april}% | |
\do{may}% | |
\do{june}% | |
\do{july}% | |
\do{august}% | |
\do{september}% | |
\do{october}% | |
\do{november}% | |
\do{december}% | |
\do{langamerican}% | |
\do{langbrazilian}% | |
\do{langcatalan}% | |
\do{langcroatian}% | |
\do{langczech}% | |
\do{langdanish}% | |
\do{langdutch}% | |
\do{langenglish}% | |
\do{langestonian}% | |
\do{langfinnish}% | |
\do{langfrench}% | |
\do{langgerman}% | |
\do{langgreek}% | |
\do{langitalian}% | |
\do{langjapanese}% | |
\do{langlatin}% | |
\do{langnorwegian}% | |
\do{langpolish}% | |
\do{langportuguese}% | |
\do{langrussian}% | |
\do{langslovak}% | |
\do{langslovene}% | |
\do{langspanish}% | |
\do{langswedish}% | |
\do{fromamerican}% | |
\do{frombrazilian}% | |
\do{fromcatalan}% | |
\do{fromcroatian}% | |
\do{fromczech}% | |
\do{fromdanish}% | |
\do{fromdutch}% | |
\do{fromenglish}% | |
\do{fromestonian}% | |
\do{fromfinnish}% | |
\do{fromfrench}% | |
\do{fromgerman}% | |
\do{fromgreek}% | |
\do{fromitalian}% | |
\do{fromjapanese}% | |
\do{fromlatin}% | |
\do{fromnorwegian}% | |
\do{frompolish}% | |
\do{fromportuguese}% | |
\do{fromrussian}% | |
\do{fromslovak}% | |
\do{fromslovene}% | |
\do{fromspanish}% | |
\do{fromswedish}% | |
\do{countryde}% | |
\do{countryep}% | |
\do{countryeu}% | |
\do{countryfr}% | |
\do{countryuk}% | |
\do{countryus}% | |
\do{patent}% | |
\do{patentde}% | |
\do{patenteu}% | |
\do{patentfr}% | |
\do{patentuk}% | |
\do{patentus}% | |
\do{patreq}% | |
\do{patreqde}% | |
\do{patreqeu}% | |
\do{patreqfr}% | |
\do{patrequk}% | |
\do{patrequs}% | |
\do{commonera}% | |
\do{beforecommonera}% | |
\do{annodomini}% | |
\do{beforechrist}% | |
\do{circa}% | |
\do{spring}% | |
\do{summer}% | |
\do{autumn}% | |
\do{winter}% | |
\do{am}% | |
\do{pm}% | |
} | |
\newrobustcmd*{\NewBibliographyString}[1]{% | |
\forcsvlist\blx@newstring{#1}} | |
\def\blx@newstring#1{% | |
\ifcsundef{KV@blx@lbx@#1} | |
{\gappto\abx@dostrings{\do{#1}}% | |
\csgdef{KV@blx@lbx@#1}##1{\blx@defstring{#1}{##1}}} | |
{}} | |
% in *.cbx/bbx/tex: <key> = {<string>}, | |
% in *.lbx: <key> = {{<longstring>}{<abbrevstring>}}, | |
\def\do#1{\define@key{blx@lbx}{#1}{\blx@defstring{#1}{##1}}} | |
\abx@dostrings | |
% in *.cbx/bbx/tex: (implicit) | |
% in *.lbx: inherit = {<language>}, | |
\define@key{blx@lbx}{inherit}{% | |
\blx@lbxinput{#1}{}{\blx@err@nolang{#1}}% | |
\csuse{abx@strings@#1}} | |
\def\blx@cfg@defstring#1#2{% | |
\csdef{abx@lstr@#1}{#2}% | |
\csdef{abx@sstr@#1}{#2}} | |
\def\blx@lbx@defstring#1#2{% | |
\blx@lbx@defstring@i{#1}#2} | |
\def\blx@lbx@defstring@i#1#2#3{% | |
\csdef{abx@lstr@#1}{#2}% | |
\csdef{abx@sstr@#1}{#3}} | |
% {<language>} | |
\def\blx@lbxcheck#1{% | |
\ifcsdef{blx@lng@#1} | |
{\expandafter\expandafter\expandafter\IfFileExists | |
\expandafter\expandafter\expandafter{% | |
\csname blx@lng@#1\endcsname.lbx} | |
{} | |
{\blx@err@nolang{#1}}} | |
{\IfFileExists{#1.lbx} | |
{} | |
{\blx@err@nolang{#1}}}} | |
% {<language>}{<definitions>} | |
\newrobustcmd*{\DefineBibliographyExtras}[2]{% | |
\blx@lbxcheck{#1}% | |
\csgappto{blx@hook@extras@#1}{% | |
\blx@defbibextras{#1}{#2}}} | |
\@onlypreamble\DefineBibliographyExtras | |
\newrobustcmd*{\UndefineBibliographyExtras}[2]{% | |
\blx@lbxcheck{#1}% | |
\csgappto{blx@hook@noextras@#1}{% | |
\blx@undefbibextras{#1}{#2}}} | |
\@onlypreamble\UndefineBibliographyExtras | |
\def\blx@defbibextras#1{\csgappto{abx@extras@#1}} | |
\def\blx@undefbibextras#1{\csgappto{abx@noextras@#1}} | |
% {<language>}{<language>} | |
\def\blx@letbibextras#1#2{% | |
\blx@lbxinput{#2}{}{\blx@err@nolang{#2}}% | |
\global\csletcs{abx@extras@#1}{abx@extras@#2} | |
\global\csletcs{abx@noextras@#1}{abx@noextras@#2}}% | |
% {<language>}{<strings>} | |
\newrobustcmd*{\DefineBibliographyStrings}[2]{% | |
\blx@lbxcheck{#1}% | |
\csgappto{blx@hook@strings@#1}{% | |
\begingroup | |
\let\blx@defstring\blx@cfg@defstring | |
\blx@defbibstrings{#1}{#2}% | |
\endgroup}} | |
\@onlypreamble\DefineBibliographyStrings | |
\def\blx@defbibstrings#1#2{% | |
\def\do##1{\csundef{abx@lstr@##1}\csundef{abx@sstr@##1}}% | |
\abx@dostrings | |
\csuse{abx@strings@#1}% | |
\setkeys{blx@lbx}{#2}% | |
\let\do\blx@defbibstrings@i | |
\csxdef{abx@strings@#1}{\abx@dostrings}% | |
\csgappto{abx@strings@#1}{% | |
\ifcsdef{\abx@str @bibliography} | |
{\letcs\bibname{\abx@str @bibliography}} | |
{\let\bibname\@empty}% | |
\ifcsdef{\abx@str @references} | |
{\letcs\refname{\abx@str @references}} | |
{\let\refname\@empty}% | |
\ifcsdef{\abx@str @shorthands} | |
{\letcs\biblistname{\abx@str @shorthands}} | |
{\let\biblistname\@empty}}} | |
\def\blx@defbibstrings@i#1{% | |
\ifcsdef{abx@lstr@#1} | |
{\def\expandafter\noexpand\csname abx@lstr@#1\endcsname{% | |
\csexpandonce{abx@lstr@#1}}} | |
{\undef\expandafter\noexpand\csname abx@lstr@#1\endcsname}% | |
\ifcsdef{abx@sstr@#1} | |
{\def\expandafter\noexpand\csname abx@sstr@#1\endcsname{% | |
\csexpandonce{abx@sstr@#1}}} | |
{\undef\expandafter\noexpand\csname abx@sstr@#1\endcsname}} | |
% {<language>}{<language>} | |
\def\blx@letbibstrings#1#2{% | |
\blx@lbxinput{#2}{}{\blx@err@nolang{#2}}% | |
\global\csletcs{abx@strings@#1}{abx@strings@#2}}% | |
% {<language>}{<exceptions>} | |
\newrobustcmd*{\DefineHyphenationExceptions}[2]{% | |
\ifcsundef{l@#1} | |
{\blx@warn@nohyph{#1}} | |
{}% | |
\csgappto{blx@hook@hyph@#1}{\blx@hyphexcept{#1}{#2}}} | |
\@onlypreamble\DefineHyphenationExceptions | |
\def\blx@hyphexcept#1#2{% | |
\ifcsundef{l@#1} | |
{\blx@warn@nohyph{#1}} | |
{\begingroup | |
\language\csname l@#1\endcsname\relax | |
\hyphenation{#2}% | |
\endgroup}} | |
% {<language>}{<mapping>} | |
\newrobustcmd*{\DeclareLanguageMapping}[2]{% | |
\csgdef{blx@lng@#1}{#2}} | |
\@onlypreamble\DeclareLanguageMapping | |
% {<language>}{<success>}{<failure>} | |
\def\blx@lbxinput#1{% | |
\ifcsdef{blx@lng@#1} | |
{\expandafter\expandafter\expandafter\blx@lbxinput@i | |
\expandafter\expandafter\expandafter{% | |
\csname blx@lng@#1\endcsname}{#1}} | |
{\blx@lbxinput@ii{#1}{#1}{language '#1'}}} | |
% {<mapping>}{<language>} | |
\def\blx@lbxinput@i#1#2{% | |
\global\csundef{blx@lng@#2}% | |
\IfFileExists{#1.lbx} | |
{\blx@lbxinput@ii{#2}{#1}{language '#2' -> '#1'}} | |
{\blx@warning@noline{% | |
File '#1.lbx' not found!\MessageBreak | |
Ignoring mapping '#2' -> '#1'}% | |
\blx@lbxinput{#2}}} | |
% {<language>}{<lbxfile>}{<message>} | |
\def\blx@lbxinput@ii#1#2#3{% | |
\begingroup | |
\setbox\@tempboxa=\hbox\bgroup | |
\aftergroup\endgroup | |
\blx@inputonce{#2.lbx}{#3} | |
{\global\cslet{abx@strings@#1}\@empty | |
\global\cslet{abx@extras@#1}\@empty | |
\global\cslet{abx@noextras@#1}\@empty | |
\blx@maplang{#1}{#1}% | |
\def\InheritBibliographyStrings{% | |
\blx@letbibstrings{#1}}% | |
\def\DeclareBibliographyStrings####1{% | |
\begingroup | |
\let\blx@defstring\blx@lbx@defstring | |
\blx@defbibstrings{#1}{####1}% | |
\endgroup}% | |
\def\InheritBibliographyExtras{\blx@letbibextras{#1}}% | |
\def\DeclareBibliographyExtras{\blx@defbibextras{#1}}% | |
\def\UndeclareBibliographyExtras{\blx@undefbibextras{#1}}% | |
\def\DeclareHyphenationExceptions{\blx@hyphexcept{#1}}% | |
\begingroup | |
\blx@saneccodes | |
\makeatletter} | |
{\endgroup | |
\csuse{blx@hook@strings@#1}% | |
\csuse{blx@hook@strings@#2}% | |
\csuse{blx@hook@extras@#1}% | |
\csuse{blx@hook@extras@#2}% | |
\csuse{blx@hook@noextras@#1}% | |
\csuse{blx@hook@noextras@#2}% | |
\csuse{blx@hook@hyph@#1}% | |
\csuse{blx@hook@hyph@#2}} | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\egroup} | |
% {<language>} | |
\def\blx@langsetup#1{% | |
\blx@lbxinput{#1} | |
{\edef\blx@languagename{#1}} | |
{\blx@warning | |
{Language '#1' not supported.\MessageBreak | |
Using fallback language '\blx@languagename'}% | |
\blx@lbxinput{\blx@languagename} | |
{\blx@maplang{#1}{\blx@languagename}} | |
{\blx@err@nolang{\blx@languagename}}}} | |
% auxiliary macros | |
% {<field base name>} | |
\newrobustcmd*{\mkdaterangeshort}{% | |
\mkdaterangefull{short}} | |
\newrobustcmd*{\mkdaterangelong}{% | |
\mkdaterangefull{long}} | |
\newrobustcmd*{\mkdaterangeterse}{% | |
\mkdaterangetrunc{short}} | |
\newrobustcmd*{\mkdaterangecomp}{% | |
\mkdaterangetrunc{long}} | |
\newrobustcmd*{\mkdaterangeshortextra}{% | |
\mkdaterangefullextra{short}} | |
\newrobustcmd*{\mkdaterangelongextra}{% | |
\mkdaterangefullextra{long}} | |
\newrobustcmd*{\mkdaterangeterseextra}{% | |
\mkdaterangetruncextra{short}} | |
\newrobustcmd*{\mkdaterangecompextra}{% | |
\mkdaterangetruncextra{long}} | |
\def\blx@metadateinfo#1{% | |
\letcs\ifdateera{if#1dateera}% | |
\letcs\ifenddateera{if#1enddateera}% | |
\letcs\ifdatecirca{if#1datecirca}% | |
\letcs\ifenddatecirca{if#1enddatecirca}% | |
\letcs\ifdatejulian{if#1datejulian}% | |
\letcs\ifenddatejulian{if#1enddatejulian}% | |
\letcs\ifdateuncertain{if#1dateuncertain}% | |
\letcs\ifenddateuncertain{if#1enddateuncertain}} | |
\expandafter\newrobustcmd\expandafter*\csname mktimerange24h\endcsname{% | |
\mktimerange{24h}} | |
\expandafter\newrobustcmd\expandafter*\csname mktimerange12h\endcsname{% | |
\mktimerange{12h}} | |
\expandafter\newrobustcmd\expandafter*\csname mktimerange24hcomp\endcsname[1]{% | |
\iffieldundef{#1hour}{} | |
{\ifboolexpr{test {\iffieldundef{#1endhour}} | |
or | |
test {\iffieldequalstr{#1endhour}{}}} | |
{\mktimerange{24h}{#1}} | |
{\iffieldsequal{#1hour}{#1endhour} | |
% 14:xx:xx 14:xx:xx | |
{\iffieldsequal{#1minute}{#1endminute} | |
% 14:13:xx 14:13:xx | |
{\toggletrue{blx@seconds}% | |
\printtext[#1time]{\csuse{mkbibtime24h}{#1hour}{#1minute}{#1second}{}% | |
\bibtimerangesep | |
\csuse{mkbibtime24h}{}{}{#1endsecond}{}}} | |
% 14:13:xx 14:14:xx | |
{\toggletrue{blx@seconds}% | |
\printtext[#1time]{\csuse{mkbibtime24h}{#1hour}{#1minute}{}{}% | |
\bibtimerangesep | |
\csuse{mkbibtime24h}{}{#1endminute}{}{}}}} | |
% 14:xx:xx 15:xx:xx | |
{\mktimerange{24h}{#1}}}}} | |
% {<24h|24hcomp|12h>}{<datetype>} | |
\newrobustcmd*{\mktimerange}[2]{% | |
\iffieldundef{#2hour}{} | |
{\blx@timepre{#2}{}% | |
\printtext[#2time]{\csuse{mkbibtime#1}{#2hour}{#2minute}{#2second}{#2timezone}% | |
\iffieldundef{#2endhour} | |
{} | |
{\blx@timepre{#2}{end}% | |
\iffieldequalstr{#2endhour}{} | |
{\mbox{\bibtimerangesep}} | |
{\bibtimerangesep | |
\csuse{mkbibtime#1}{#2endhour}{#2endminute}{#2endsecond}{#2endtimezone}}}}}} | |
% {<datetype>}{''|end} | |
\newrobustcmd*{\blx@timepre}[2]{% | |
\iftoggle{blx@timezones}{} | |
{\blx@imc@clearfield{#1#2timezone}}% | |
\iftoggle{blx@seconds}{} | |
{\blx@imc@clearfield{#1#2second}}} | |
% {<short|long>}{<datetype>} | |
\newrobustcmd*{\mkdaterangefull}[2]{% | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{} | |
{\datecircaprint | |
\printtext[#2date]{% | |
% Such a season component can only come from an EDTF 5.1.5 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season}}% | |
\dateuncertainprint | |
\dateeraprint{#2year}% | |
\iffieldundef{#2endyear} | |
{} | |
{\iffieldequalstr{#2endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{end}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}}} | |
\newrobustcmd*{\mkdaterangetrunc}[2]{% | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{} | |
{\datecircaprint | |
\printtext[#2date]{% | |
% Such a season component can only come from an EDTF 5.1.5 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\iffieldsequal{#2year}{#2endyear} | |
{\iffieldsequal{#2month}{#2endmonth} | |
{\csuse{mkbibdate#1}{}{}{#2day}} | |
{\csuse{mkbibdate#1}{}{#2month}{#2day}}} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}} | |
{\iffieldsequal{#2year}{#2endyear} | |
{\csuse{mkbibseasondate#1}{}{#2season}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season}% | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}}% | |
\dateuncertainprint | |
\iffieldundef{#2endyear} | |
{} | |
{\iffieldequalstr{#2endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}}} | |
\newrobustcmd*{\mkdaterangefullextra}[2]{% | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{} | |
{\datecircaprint | |
\printtext[#2date]{% | |
\printtext{% | |
% Such a season component can only come from an EDTF 5.1.5 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season}}% | |
\dateuncertainprint | |
\dateeraprint{#2year}% | |
\iffieldundef{#2endyear} | |
{\printfield{extrayear}} | |
{\iffieldequalstr{#2endyear}{} | |
{\printfield{extrayear}% | |
\printtext{\mbox{\bibdaterangesep}}} | |
{\printtext{% | |
\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{end}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}% | |
\printfield{extrayear}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}}}} | |
\newrobustcmd*{\mkdaterangetruncextra}[2]{% | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{} | |
{\datecircaprint | |
\printtext[#2date]{% | |
\printtext{% | |
% Such a season component can only come from an EDTF 5.1.5 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\iffieldsequal{#2year}{#2endyear} | |
{\iffieldsequal{#2month}{#2endmonth} | |
{\csuse{mkbibdate#1}{}{}{#2day}} | |
{\csuse{mkbibdate#1}{}{#2month}{#2day}}} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}} | |
{\iffieldsequal{#2year}{#2endyear} | |
{\csuse{mkbibseasondate#1}{}{#2season}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season} | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}}% | |
\dateuncertainprint | |
\iffieldundef{#2endyear} | |
{\printfield{extrayear}} | |
{\iffieldequalstr{#2endyear}{} | |
{\printfield{extrayear}% | |
\printtext{\mbox{\bibdaterangesep}}} | |
{\printtext{% | |
\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}% | |
\printfield{extrayear}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}}}} | |
\newrobustcmd*{\mkdaterangeyear}[1]{% | |
\blx@imc@clearfield{#1month}% | |
\blx@imc@clearfield{#1day}% | |
\blx@imc@clearfield{#1season}% | |
\blx@imc@clearfield{#1endmonth}% | |
\blx@imc@clearfield{#1endday}% | |
\blx@imc@clearfield{#1endseason}% | |
\iffieldsequal{#1year}{#1endyear} | |
{\blx@imc@clearfield{#1endyear}} | |
{}% | |
\mkdaterangefull{short}{#1}} | |
% {<datetype>} | |
\newrobustcmd*{\mkdaterangeymd}[1]{% | |
\blx@metadateinfo{#1}% | |
\iffieldundef{#1year} | |
{} | |
{\datecircaprint | |
\printtext[#1date]{% | |
% Such a season component can only come from an EDTF 5.1.5 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#1season} | |
{\blx@ymddate{#1}{}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{}} | |
{\csuse{mkbibseasondateshort}{#1year}{#1season}}% | |
\dateuncertainprint | |
\dateeraprint{#1year}% | |
\iffieldundef{#1endyear} | |
{} | |
{\iffieldequalstr{#1endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#1season} | |
{\blx@ymddate{#1}{end}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{end}} | |
{\csuse{mkbibseasondateshort}{#1endyear}{#1endseason}}% | |
\enddateuncertainprint | |
\dateeraprint{#1endyear}}}}}} | |
% {<datetype>} | |
\newrobustcmd*{\mkdaterangeymdextra}[1]{% | |
\blx@metadateinfo{#1}% | |
\iffieldundef{#1year} | |
{} | |
{\datecircaprint | |
\printtext[#1date]{% | |
% Such a season component can only come from an EDTF 5.1.5 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#1season} | |
{\blx@ymddate[extrayear]{#1}{}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{}} | |
{\csuse{mkbibseasondateshort}{#1year}{#1season}}% | |
\dateuncertainprint | |
\dateeraprint{#1year}% | |
\iffieldundef{#1endyear} | |
{} | |
{\iffieldequalstr{#1endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\printtext{% | |
\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#1season} | |
{\blx@ymddate{#1}{end}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{end}} | |
{\csuse{mkbibseasondateshort}{#1endyear}{#1endseason}}}% | |
\enddateuncertainprint | |
\dateeraprint{#1endyear}}}}}} | |
% [extrayear]{<datetype>}{''|end} | |
\newrobustcmd*{\blx@ymddate}[3][]{% | |
\dateeraprintpre{#2#3year}% | |
\mkyearzeros{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}% | |
\iffieldundef{#2#3month}{}{\bibdatesep\mkmonthzeros{\thefield{#2#3month}}}% | |
\iffieldundef{#2#3day}{}{\bibdatesep\mkdayzeros{\thefield{#2#3day}}}} | |
\newrobustcmd*{\mkdaterangeyearextra}[1]{% | |
\blx@imc@clearfield{#1month}% | |
\blx@imc@clearfield{#1day}% | |
\blx@imc@clearfield{#1season}% | |
\blx@imc@clearfield{#1endmonth}% | |
\blx@imc@clearfield{#1endday}% | |
\blx@imc@clearfield{#1endseason}% | |
\iffieldsequal{#1year}{#1endyear} | |
{\blx@imc@clearfield{#1endyear}} | |
{}% | |
\mkdaterangefullextra{short}{#1}} | |
% {<datetype>}{'' | end} | |
\newrobustcmd*{\blx@printtime}[2]{% | |
\ifboolexpr{% | |
togl {blx@#1dateusetime} | |
and | |
not test {\iffieldundef{#1#2hour}}} | |
{\blx@timepre{#1}{#2}% | |
\printtext{\bibdatetimesep}% | |
\printtext[#1time]{\csuse{mkbibtime\csuse{blx@timeformat@#1time}}{#1#2hour}{#1#2minute}{#1#2second}{#1#2timezone}}} | |
{}} | |
\newrobustcmd*{\mkdaterangeedtf}[1]{% | |
\blx@metadateinfo{#1}% | |
\def\bibdatetimesep{T}% | |
\iffieldundef{#1year} | |
{} | |
{\printtext[#1date]{% | |
\blx@edtfdate{#1}{}% | |
\ifboolexpr{% | |
togl {blx@#1dateusetime} | |
and | |
not test {\iffieldundef{#1hour}}} | |
{\printtext{\bibdatetimesep}% | |
\blx@edtftime{#1}{}} | |
{}% | |
\dateuncertainprint | |
\datecircaprintedtf | |
\iffieldundef{#1endyear} | |
{} | |
{\addslash | |
\blx@edtfdate{#1}{end}% | |
\ifboolexpr{% | |
togl {blx@#1dateusetime} | |
and | |
not test {\iffieldundef{#1endhour}}} | |
{\printtext{\bibdatetimesep}% | |
\blx@edtftime{#1}{end}} | |
{}% | |
\enddateuncertainprint | |
\enddatecircaprintedtf}}}} | |
\cslet{mkdaterangeiso8601}\mkdaterangeedtf% Legacy option support | |
\newrobustcmd*{\mkdaterangeedtfextra}[1]{% | |
\blx@metadateinfo{#1}% | |
\def\bibdatetimesep{T}% | |
\iffieldundef{#1year} | |
{} | |
{\printtext[#1date]{% | |
\blx@edtfdate[extrayear]{#1}{}% | |
\ifboolexpr{% | |
togl {blx@#1dateusetime} | |
and | |
not test {\iffieldundef{#1hour}}} | |
{\printtext{\bibdatetimesep}% | |
\blx@edtftime{#1}{}} | |
{}% | |
\dateuncertainprint | |
\datecircaprintedtf | |
\iffieldundef{#1endyear} | |
{} | |
{\addslash | |
\blx@edtfdate{#1}{end}}% | |
\ifboolexpr{% | |
togl {blx@#1dateusetime} | |
and | |
not test {\iffieldundef{#1endhour}}} | |
{\printtext{\bibdatetimesep}% | |
\blx@edtftime{#1}{end}} | |
{}% | |
\enddateuncertainprint | |
\enddatecircaprintedtf}}} | |
\cslet{mkdaterangeiso8601extra}\mkdaterangeedtfextra% Legacy option support | |
% [extrayear]{<datetype>}{''|end} | |
\newrobustcmd*{\blx@edtfdate}[3][]{% | |
\dateeraprintpre{#2#3year}% | |
\blx@imc@forcezerosy{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}% | |
% Such a season component can only come from an EDTF 5.1.5 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2#3season} | |
{\iffieldundef{#2#3month}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3month}}}% | |
\iffieldundef{#2#3day}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3day}}}} | |
{\hyphen\blx@seasonmap{\thefield{#2#3season}}}} | |
\def\blx@seasonmap#1{% | |
\blx@xifstrcmp{#1}{spring}{21} | |
{\blx@xifstrcmp{#1}{summer}{22} | |
{\blx@xifstrcmp{#1}{autumn}{23} | |
{\blx@xifstrcmp{#1}{winter}{24}{}}}}} | |
\newrobustcmd*{\blx@edtftime}[2]{% | |
\blx@imc@forcezerosmdt{\thefield{#1#2hour}}% | |
:\blx@imc@forcezerosmdt{\thefield{#1#2minute}}% | |
:\blx@imc@forcezerosmdt{\thefield{#1#2second}}% | |
\iftoggle{blx@timezones} | |
{\mkbibtimezone{\thefield{#1#2timezone}}} | |
{}} | |
% times | |
\newrobustcmd*{\bibtimesep}{:} | |
\newrobustcmd*{\bibtimerangesep}{\textendash} | |
\newrobustcmd*{\bibutctimezone}{Z} | |
\newrobustcmd*{\bibtimezonesep}{} | |
\newrobustcmd*{\bibtzminsep}{\bibtimesep} | |
% dates | |
\newrobustcmd*{\bibdateuncertain}{?} | |
% \textminus is only guaranteed for non-PDFTeX | |
\newrobustcmd*{\bibdateeraprefix}{\ifdef\textminus\textminus\textendash} | |
\newrobustcmd*{\bibdateeraendprefix}{\,\bibdateeraprefix} | |
\newrobustcmd*{\bibdatesep}{\hyphen} | |
\newrobustcmd*{\bibdaterangesep}{\bibrangedash} | |
\newrobustcmd*{\bibdatedash}{\bibrangedash}%LEGACY(<3.5) | |
% date+times | |
\newrobustcmd*{\bibdatetimesep}{\space} | |
% ranges | |
\newrobustcmd*{\bibrangedash}{\textendash} | |
\newrobustcmd*{\bibrangessep}{,\space} | |
% formatters | |
\newrobustcmd*{\mkbibtimezone}[1]{\blx@xifstrcmp{#1}{UTC}{\bibutctimezone}{#1}} | |
\newrobustcmd*{\mkbibdatelong}[3]{} | |
\newrobustcmd*{\mkbibdateshort}[3]{} | |
\newrobustcmd*{\mkbibseasondateshort}[2]{} | |
\newrobustcmd*{\mkbibseasondatelong}[2]{} | |
\expandafter\newrobustcmd\expandafter*\csname mkbibtime24h\endcsname[4]{} | |
\expandafter\newrobustcmd\expandafter*\csname mkbibtime12h\endcsname[4]{} | |
\newrobustcmd*{\finalandcomma}{} | |
\newrobustcmd*{\finalandsemicolon}{} | |
\newrobustcmd*{\mkbibordinal}[1]{#1} | |
\newrobustcmd*{\mkbibmascord}{\mkbibordinal} | |
\newrobustcmd*{\mkbibfemord}{\mkbibordinal} | |
\newrobustcmd*{\mkbibneutord}{\mkbibordinal} | |
\newrobustcmd*{\mkbibseason}[1]{\abx@bibseason{#1}} | |
\newrobustcmd*{\mkbibmonth}[1]{% | |
\ifcase0#1\relax | |
\blx@warning@entry{Month out of range or not an integer}% | |
\or\abx@bibmonth{january}% | |
\or\abx@bibmonth{february}% | |
\or\abx@bibmonth{march}% | |
\or\abx@bibmonth{april}% | |
\or\abx@bibmonth{may}% | |
\or\abx@bibmonth{june}% | |
\or\abx@bibmonth{july}% | |
\or\abx@bibmonth{august}% | |
\or\abx@bibmonth{september}% | |
\or\abx@bibmonth{october}% | |
\or\abx@bibmonth{november}% | |
\or\abx@bibmonth{december}% | |
\else | |
\blx@warning@entry{Month out of range}#1% | |
\fi} | |
% strip leading zeros and prepend zero for month/day/timeparts | |
% Allow for non numeric labelyear values | |
\protected\def\blx@imc@forcezerosmdt#1{% | |
\IfInteger{#1} | |
{\ifnumless{#1}{10} | |
{0\the\numexpr(#1)\relax} | |
{#1}} | |
{#1}} | |
% strip leading zeros and prepend zero(s) for year | |
% Allow for non numeric labelyear values | |
\protected\def\blx@imc@forcezerosy#1{% | |
\IfInteger{#1} | |
{\ifnumless{#1}{10}% 1-digit year | |
{000\the\numexpr(#1)\relax} | |
{\ifnumless{#1}{100}% 2-digit year | |
{00\the\numexpr(#1)\relax} | |
{\ifnumless{#1}{1000}% 3-digit year | |
{0\the\numexpr(#1)\relax} | |
{#1}}}} | |
{#1}} | |
\let\blx@imc@mkyearzeros\blx@imc@forcezerosy | |
\let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt | |
\let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt | |
\protected\def\blx@imc@stripzeros#1{% | |
\begingroup | |
\setbox\@tempboxa=\hbox\bgroup | |
\aftergroup\endgroup | |
\abx@hook@xsanitize | |
\if0#1\relax | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\@tempcnta#1\relax | |
\expandafter\egroup | |
\number\@tempcnta | |
\@tempcnta#1\relax} | |
{\egroup#1}} | |
\let\blx@imc@printlabeldate\@empty | |
\let\blx@imc@printlabeltime\@empty | |
\let\blx@imc@printlabeldateextra\@empty | |
\blx@regimcs{\printlabeldate \printlabeltime \printlabeldateextra \stripzeros \forcezerosy \forcezerosmdt \mkyearzeros \mkmonthzeros \mkdayzeros \mktimezeros} | |
\protected\def\mkdatezeros{% | |
\blx@warning@noline{% | |
'\string\mkdatezeros' is deprecated, please use '\string\mkyearzeros',\MessageBreak | |
'\string\mkmonthzeros' or '\string\mkdayzeros' as appropriate. \MessageBreak | |
falling back to '\string\mkmonthzeros'}% | |
\mkmonthzeros} | |
\protected\def\printdatelabel{% | |
\blx@warning@noline{% | |
'\string\printdatelabel' is deprecated, please use '\string\printlabeldate'}% | |
\blx@imc@printlabeldate} | |
\protected\def\printdatelabelextra{% | |
\blx@warning@noline{% | |
'\string\printdatelabelextra' is deprecated, please use '\string\printlabeldateextra'}% | |
\blx@imc@printlabeldateextra} | |
% User macro for retrieving currrent language | |
\def\currentlang{\blx@languagename} | |
% {<language>}{<strings>} | |
\def\blx@maplang#1#2{% | |
\csxappto{extras#1}{% | |
\noexpand\blx@resetpunct | |
\expandafter\noexpand\csname abx@extras@#2\endcsname | |
\expandafter\noexpand\csname abx@strings@#2\endcsname}% | |
\csxappto{noextras#1}{% | |
\noexpand\blx@resetpunct | |
\expandafter\noexpand\csname abx@noextras@#2\endcsname}} | |
%% babel/polyglossia interface | |
\def\blx@beglang{\blx@clearlang\begingroup} | |
\def\blx@endlang{\endgroup} | |
\let\blx@beglangbib\blx@beglang | |
\let\blx@endlangbib\blx@endlang | |
\let\blx@beglangcite\blx@beglang | |
\let\blx@endlangcite\blx@endlang | |
\let\blx@hook@endlang\@empty | |
\let\blx@hook@initlang\@empty | |
\let\blx@imc@mainlang\@empty | |
\def\blx@hyphenreset{% | |
\ifcsundef{l@\blx@languagename} | |
{} | |
{\language\csname l@\blx@languagename\endcsname\relax}% | |
\ifcsundef{\blx@languagename hyphenmins} | |
{\blx@sethyphenmins\tw@\thr@@} | |
{\expandafter\expandafter\expandafter\blx@sethyphenmins | |
\csname\blx@languagename hyphenmins\endcsname}} | |
\def\blx@sethyphenmins#1#2{% | |
\lefthyphenmin#1\relax | |
\righthyphenmin#2\relax} | |
\begingroup | |
\@makeother\# | |
\gdef\blx@mkautolangbabel{% | |
\ifundef\bbl@main@language | |
{\blx@error | |
{No default babel language defined} | |
{You must define a default language for babel}} | |
{}% | |
\pretocmd\select@language{\blx@langsetup{#1}} | |
{\ifdef\blx@thelangenv | |
{\def\blx@beglang{% | |
\blx@clearlang | |
\begingroup | |
% Need to override all entries, regardless of if there is a langid | |
% if language=<language> option is given | |
\ifboolexpr { test {\ifdef\abx@field@langid } | |
or | |
test {\ifdef\blx@forcelanguagename} } | |
% override local langid if we forced it with | |
% language=<language> option | |
{\ifdef\blx@forcelanguagename | |
{\let\abx@field@langid\blx@forcelanguagename} | |
{}% | |
\let\blx@languagename\abx@field@langid% track global language | |
\ifcsundef{l@\abx@field@langid} | |
{\blx@warn@nohyph{\abx@field@langid}} | |
{\blx@hook@initlang | |
\def\blx@endlang{% | |
\blx@hook@endlang | |
\csname end\blx@thelangenv\endcsname | |
\endgroup}% | |
\iftoggle{blx@autolangbib} | |
{\let\blx@endlangbib\blx@endlang} | |
{}% | |
\iftoggle{blx@autolangcite} | |
{\let\blx@endlangcite\blx@endlang} | |
{}% | |
\csname\blx@thelangenv\expandafter\endcsname | |
\expandafter{\abx@field@langid}}} | |
{}}} | |
{}% | |
\def\blx@langstrings{}% | |
\def\blx@imc@mainlang{\select@language{\bbl@main@language}}% | |
\blx@langsetup\bbl@main@language} | |
{\blx@err@patch{'babel' package}% | |
\blx@mknoautolang}} | |
\gdef\blx@mkautolangpoly{% | |
\ifundef\bbl@main@language | |
{\blx@error | |
{No default polyglossia language defined} | |
{You must define a default language for polyglossia}} | |
{}% | |
\catcode`\_=11% polyglossia uses "_" as a letter | |
\pretocmd\select@language{\blx@langsetup{#1}} | |
{\ifdef\blx@thelangenv | |
{\def\blx@beglang{% | |
\blx@clearlang | |
\begingroup | |
% Need to override all entries, regardless of if there is a langid | |
% if language=<language> option is given | |
\ifboolexpr { test {\ifdef\abx@field@langid } | |
or | |
test {\ifdef\blx@forcelanguagename} } | |
% override local langid if we forced it with | |
% language=<language> option | |
{\ifdef\blx@forcelanguagename | |
{\let\abx@field@langid\blx@forcelanguagename} | |
{}% | |
\let\blx@languagename\abx@field@langid% track global language | |
\ifcsundef{l@\abx@field@langid} | |
{\blx@warn@nohyph{\abx@field@langid}} | |
{\blx@hook@initlang | |
\def\blx@endlang{% | |
\blx@hook@endlang | |
% Polyglossia language envs are \<lang>[] | |
\ifcsstring{blx@thelangenv}{langname} | |
{\csname end\abx@field@langid\endcsname} | |
{\csname end\blx@thelangenv\endcsname}% | |
\endgroup}% | |
\iftoggle{blx@autolangbib} | |
{\let\blx@endlangbib\blx@endlang} | |
{}% | |
\iftoggle{blx@autolangcite} | |
{\let\blx@endlangcite\blx@endlang} | |
{}% | |
\ifcsstring{blx@thelangenv}{langname} | |
{\ifdef\abx@field@langidopts | |
{\csname\abx@field@langid\expandafter\endcsname\expandafter[\abx@field@langidopts]} | |
{\csname\abx@field@langid\endcsname}} | |
{\csname\blx@thelangenv\expandafter\endcsname\expandafter{\abx@field@langid}}% | |
% These lines are equal to \blx@maplang | |
\blx@resetpunct | |
\csuse{abx@extras@\abx@field@langid}% | |
\csuse{abx@strings@\abx@field@langid}}} | |
{}}} | |
{}% | |
% polyglossia needs this - it doesn't get the | |
% strings automatically set for some reason | |
\def\blx@langstrings{% | |
\csuse{abx@extras@\languagename}% | |
\csuse{abx@strings@\languagename}}% | |
\def\blx@imc@mainlang{% | |
\select@language{\bbl@main@language}% | |
% These lines are equal to \blx@maplang | |
\blx@resetpunct | |
\csuse{abx@extras@\bbl@main@language}% | |
\csuse{abx@strings@\bbl@main@language}}% | |
\blx@langsetup\bbl@main@language} | |
{\blx@err@patch{'polyglossia' package}% | |
\blx@mknoautolang}% | |
\catcode`\_=8} | |
\endgroup | |
\def\blx@mknoautolang{% | |
\blx@lbxinput{\blx@languagename} | |
{} | |
{\blx@err@nolang{\blx@languagename}}} | |
\blx@regimcs{\mainlang} | |
\newrobustcmd*{\DeclareRedundantLanguages}[2]{% | |
\begingroup | |
\ifblank{#2} | |
{\def\do##1{% | |
\global\csundef{blx@rlm@##1}% | |
\global\csundef{blx@rlm@lang##1}}} | |
{\def\do##1{% | |
\csxdef{blx@rlm@##1}{#2}% | |
\csxdef{blx@rlm@lang##1}{#2}}}% | |
\docsvlist{#1}% | |
\endgroup} | |
\def\blx@clearlang{% | |
\iftoggle{blx@clearlang} | |
{\iflistundef{language} | |
{} | |
{\ifnumgreater{\value{language}}{1} | |
{} | |
{\expandafter\blx@clearlang@i\abx@list@language}}} | |
{}} | |
\def\blx@clearlang@i#1{% | |
\ifcsdef{blx@rlm@#1} | |
{\expandafter\expandafter\expandafter\forcsvlist | |
\expandafter\expandafter\expandafter\blx@clearlang@ii | |
\expandafter\expandafter\expandafter{% | |
\csname blx@rlm@#1\endcsname}} | |
{}} | |
\def\blx@clearlang@ii#1{% | |
\ifdefstring\languagename{#1} | |
{\clearlist{language}} | |
{}} | |
%% Biber equivalents to bibtex data interface | |
\def\abx@doentrytypes{\dolistloop\blx@datamodel@entrytypes} | |
% fields which can be used as labels - we auto-create some macros for these | |
\def\abx@dolabelfields{\dolistloop\blx@datamodel@labelfields} | |
\def\abx@donames{\dolistloop\blx@datamodel@names} | |
\def\abx@donameparts{\expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}} | |
\def\abx@dofields{\dolistloop\blx@datamodel@fields} | |
\def\abx@dolists{% | |
\dolistloop\blx@datamodel@lists% | |
\do{pageref}} | |
% Used to pass regexps to .bcf | |
\def\regexp#1{\expandafter\zap@space\detokenize{#1} \@empty} | |
% Have to do this otherwise the '~'s in the .bcf strings are not expanded | |
% This is done for the .bcf later but since we have to do all the | |
% data model things much earlier, have to set this here and reset on finishing | |
\let\blx@tsave~ | |
\let~\space | |
% Data model and supporting macros must be loaded early | |
\blx@inputonce{blx-dm.def}{biblatex default data model}{}{}{}{} | |
\let~\blx@tsave | |
% We need to now load any style data model | |
% Order of precedence is: | |
% <datamodel option>.dbx | |
% <style option>.dbx | |
% <citestyle option>.dbx and <bibstyle option>.dbx | |
% This has to be done before the real options processing so we need to | |
% pick out just these four options to look at. You can't do this with keyval, | |
% you have to use kvoptions. So, pick out these four, pass through all | |
% others and delete datamodel option as we don't care about it when we come | |
% to really set options below | |
\SetupKeyvalOptions{ | |
family=blx@opt@eldt, | |
prefix=blx@opt@eldt@} | |
\DeclareStringOption{datamodel} | |
\DeclareStringOption{style} | |
\DeclareStringOption{citestyle} | |
\DeclareStringOption{bibstyle} | |
\DeclareDefaultOption{} | |
\ProcessLocalKeyvalOptions{blx@opt@eldt} | |
\ifx\blx@opt@eldt@datamodel\@empty | |
\ifx\blx@opt@eldt@style\@empty | |
\ifx\blx@opt@eldt@citestyle\@empty | |
\else | |
\blx@inputonce{\blx@opt@eldt@citestyle.dbx}{biblatex citestyle data model}{}{}{}{} | |
\fi | |
\ifx\blx@opt@eldt@bibstyle\@empty | |
\else | |
\blx@inputonce{\blx@opt@eldt@bibstyle.dbx}{biblatex bibstyle data model}{}{}{}{} | |
\fi | |
\else | |
\blx@inputonce{\blx@opt@eldt@style.dbx}{biblatex style data model}{}{}{}{} | |
\fi | |
\else | |
\blx@inputonce{\blx@opt@eldt@datamodel.dbx}{biblatex style data model}{}{}{}{} | |
\fi | |
\DisableKeyvalOption[action=undef,local]{blx@opt@eldt}{datamodel} | |
% Override with user-defined data model if there is one | |
\blx@inputonce{biblatex-dm.cfg}{biblatex custom data model}{}{}{}{} | |
% Initialise option datatypes lists | |
\global\let\blx@bcf@options@scope@global\@empty | |
\global\let\blx@bcf@options@scope@type\@empty | |
\global\let\blx@bcf@options@scope@entry\@empty | |
\global\let\blx@bcf@options@scope@namelist\@empty | |
\global\let\blx@bcf@options@scope@name\@empty | |
\global\let\blx@globalopts@datatypes\@empty | |
\global\let\blx@typeopts@datatypes\@empty | |
\global\let\blx@entryopts@datatypes\@empty | |
\global\let\blx@namelistopts@datatypes\@empty | |
\global\let\blx@nameopts@datatypes\@empty | |
\def\do#1{% | |
\global\cslet{blx@globalopts@#1}\@empty | |
\global\cslet{blx@typeopts@#1}\@empty | |
\global\cslet{blx@entryopts@#1}\@empty | |
\global\cslet{blx@namelistopts@#1}\@empty | |
\global\cslet{blx@nameopts@#1}\@empty} | |
\expandafter\expandafter\expandafter\docsvlist\expandafter\expandafter\expandafter{\csname blx@datamodel@constant@optiondatatypes\endcsname} | |
% Helper for collecting options and datatypes | |
% {<datatype>}{<scope>}{<name>} | |
\def\blx@collectopts#1#2#3{% | |
\ifinlistcs{#1}{#2@datatypes} | |
{} | |
{\listcsgadd{#2@datatypes}{#1}}% | |
\ifinlistcs{#3}{#2@#1} | |
{} | |
{\listcsgadd{#2@#1}{#3}}} | |
% date, eventdate, urldate etc. | |
\def\abx@dodates{\dolistloop\blx@datamodel@dates} | |
% year, endyear, month, endmonth etc. | |
\def\abx@dodateparts{\expandafter\docsvlist\expandafter{\blx@dateparts}} | |
% '', event, url, orig etc. | |
\def\do#1{% | |
\StrCut{#1}{date}\blx@datetype\blx@tempnull | |
\listxadd\blx@datetypes{\blx@datetype}} | |
\abx@dodates | |
% main date field has an empty prefix (''date) which can't be added to a list | |
% and so do it explicity | |
% This is one of the few (only?) hard-coded datamodel assumptions but it is | |
% very unlikely that anyone would *remove* the main date field in a custom application ... | |
\def\abx@dodatetypes{\do{}\dolistloop\blx@datetypes} | |
% per-entry inheritance blocking option for biber | |
\blx@collectopts{string}{blx@entryopts}{noinherit} | |
% useprefix namelist/name scope | |
\blx@collectopts{boolean}{blx@namelistopts}{useprefix}% for passing to bcf | |
\blx@collectopts{boolean}{blx@nameopts}{useprefix}% for passing to the .bcf | |
% sortnamekeyscheme namelist/name scope | |
\blx@collectopts{string}{blx@namelistopts}{sortnamekeyscheme}% for passing to bcf | |
\blx@collectopts{string}{blx@nameopts}{sortnamekeyscheme}% for passing to the .bcf | |
% Misc globalopts | |
\blx@collectopts{xml}{blx@globalopts}{datamodel}% for passing to the .bcf | |
\blx@collectopts{string}{blx@globalopts}{controlversion}% for passing to the .bcf | |
\newcommand*{\labelalphaothers}{+} | |
\newcommand*{\sortalphaothers}{\labelalphaothers} | |
\blx@collectopts{string}{blx@globalopts}{alphaothers}% for passing to the .bcf | |
\blx@collectopts{string}{blx@typeopts}{alphaothers}% for passing to the .bcf | |
\blx@collectopts{string}{blx@globalopts}{sortalphaothers}% for passing to the .bcf | |
\blx@collectopts{string}{blx@typeopts}{sortalphaothers}% for passing to the .bcf | |
% The Declare*Option macros are for options which need to be visible | |
% to biblatex. For options which only biber needs to see, they can be | |
% passed to the .bcf directly using \blx@collectopts | |
% [<datatype>]{<key>}[<value>]{<code>} | |
\newrobustcmd*{\DeclareBibliographyOption}[2][]{ | |
\ifblank{#1} | |
{\def\blx@tempa{boolean}} | |
{\ifcsundef{blx@globalopts@#1} | |
{\blx@warn@badoptdt{#1}% | |
\def\blx@tempa{boolean}} | |
{\def\blx@tempa{#1}}}% | |
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@globalopts}{#2}% | |
\@ifnextchar[%] | |
{\blx@defbibopt{#2}} | |
{\blx@defbibopt{#2}[]}} | |
\long\def\blx@defbibopt#1[#2]#3{% | |
\ifcsundef{KV@blx@opt@ldt@#1} | |
{\ifcsundef{KV@blx@opt@pre@#1} | |
{\ifblank{#2} | |
{\define@key{blx@opt@pre}{#1}{#3}} | |
{\define@key{blx@opt@pre}{#1}[#2]{#3}}} | |
{\blx@err@optdef{#1}}} | |
{\blx@err@optdef{#1}}} | |
% [<datatype>]{<key>}[<value>]{<code>} | |
\newrobustcmd*{\DeclareTypeOption}[2][]{% | |
\ifblank{#1} | |
{\def\blx@tempa{boolean}} | |
{\ifcsundef{blx@typeopts@#1} | |
{\blx@warn@badoptdt{#1}% | |
\def\blx@tempa{boolean}} | |
{\def\blx@tempa{#1}}}% | |
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@typeopts}{#2}% | |
\@ifnextchar[%] | |
{\blx@deftypeopt{#2}} | |
{\blx@deftypeopt{#2}[]}} | |
\long\def\blx@deftypeopt#1[#2]#3{% | |
\ifcsundef{KV@blx@opt@typ@#1} | |
{\ifblank{#2} | |
{\define@key{blx@opt@typ}{#1}{#3}} | |
{\define@key{blx@opt@typ}{#1}[#2]{#3}}} | |
{\blx@err@optdef{#1}}} | |
% [<datatype>]{<key>}[<value>]{<code>} | |
\newrobustcmd*{\DeclareEntryOption}[2][]{% | |
\ifblank{#1} | |
{\def\blx@tempa{boolean}} | |
{\ifcsundef{blx@entryopts@#1} | |
{\blx@warn@badoptdt{#1}% | |
\def\blx@tempa{boolean}} | |
{\def\blx@tempa{#1}}}% | |
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@entryopts}{#2}% | |
\@ifnextchar[%] | |
{\blx@defentryopt{#2}} | |
{\blx@defentryopt{#2}[]}} | |
\long\def\blx@defentryopt#1[#2]#3{% | |
\ifcsundef{KV@blx@opt@ent@#1} | |
{\ifblank{#2} | |
{\define@key{blx@opt@ent}{#1}{#3}} | |
{\define@key{blx@opt@ent}{#1}[#2]{#3}}} | |
{\blx@err@optdef{#1}}} | |
% Sanity check on date field names - they *must* end in 'date' to make things easier/possible later | |
\def\do#1{% | |
\IfEndWith{#1}{date} | |
{} | |
{\blx@error | |
{Invalid date field name '#1'} | |
{Date fields in the datemodel must end in the string 'date' but '#1' doesn't}}} | |
\abx@dodates | |
% date meta-information option fallbacks | |
\def\do#1{% | |
\cslet{#1datecircaprint}\@empty | |
\cslet{#1enddatecircaprint}\@empty | |
\cslet{#1datecircaprintedtf}\@empty | |
\cslet{#1enddatecircaprintedtf}\@empty | |
\cslet{#1dateuncertainprint}\@empty | |
\cslet{#1enddateuncertainprint}\@empty | |
\cslet{#1dateeraprint}\@gobble | |
\cslet{#1dateeraprintpre}\@gobble | |
\csdef{if#1dateera}##1{\@secondoftwo}% | |
\csdef{if#1enddateera}##1{\@secondoftwo}% | |
\cslet{if#1datecirca}\@secondoftwo | |
\cslet{if#1enddatecirca}\@secondoftwo | |
\cslet{if#1datejulian}\@secondoftwo | |
\cslet{if#1enddatejulian}\@secondoftwo | |
\cslet{if#1dateuncertain}\@secondoftwo | |
\cslet{if#1enddateuncertain}\@secondoftwo} | |
\abx@dodatetypes | |
\do{labeldate} | |
% These are internal fields/booleans which are not part of the data model but | |
% which need to be dealt with along with data model fields in places | |
\def\do#1{% | |
\listxadd\blx@datemetafields{#1dateera}% | |
\listxadd\blx@datemetafields{#1enddateera}% | |
\listxadd\blx@datemetafields{#1dateunspecified}} | |
\abx@dodatetypes | |
\def\do#1{% | |
\listxadd\blx@datemetabooleans{#1datecirca}% | |
\listxadd\blx@datemetabooleans{#1enddatecirca}% | |
\listxadd\blx@datemetabooleans{#1datejulian}% | |
\listxadd\blx@datemetabooleans{#1enddatejulian}% | |
\listxadd\blx@datemetabooleans{#1dateuncertain}% | |
\listxadd\blx@datemetabooleans{#1enddateuncertain}} | |
\abx@dodatetypes | |
\def\do#1{% | |
\listxadd\blx@namepartmetafields{#1namehash}% | |
\listxadd\blx@namepartmetafields{#1fullhash}} | |
\abx@donameparts | |
\def\do#1{% | |
\listxadd\blx@labeldatepartfields{label#1}} | |
\abx@dodateparts | |
\def\abx@dointernalfields{% | |
\do{childentrykey}% | |
\do{clonesourcekey}% | |
\do{labeldate}% | |
\do{labeldatesource}% | |
\do{labeldateera}% | |
\do{labelenddateera}% | |
\do{entrykey}% | |
\do{entryset}% | |
\do{entrysetcount}% | |
\do{entrytype}% | |
\do{extraalpha}% | |
\do{extratitle}% | |
\do{extratitleyear}% | |
\do{extrayear}% | |
\do{fullhash}% | |
\do{labelalpha}% | |
\do{labelnumber}% | |
\do{labelprefix}% | |
\do{labeltitleyear}% | |
\do{localnumber}% | |
\do{namehash}% | |
\do{options}% | |
\do{sortinit}% | |
\do{sortinithash}% | |
\forlistloop{\do}\blx@datemetafields | |
\forlistloop{\do}\blx@namepartmetafields | |
\forlistloop{\do}\blx@labeldatepartfields} | |
\def\abx@dobooleans{% | |
\do{crossrefsource}% | |
\do{xrefsource}% | |
\do{singletitle}% | |
\do{uniquetitle}% | |
\do{uniquebaretitle}% | |
\do{uniquework}% | |
\do{uniqueprimaryauthor}% | |
\forlistloop{\do}\blx@datemetabooleans} | |
% Date datatype fields | |
\def\do#1{% | |
\protected\csdef{blx@imc@print#1date}{}% | |
\protected\csdef{blx@imc@print#1dateextra}{}% | |
\protected\csdef{blx@imc@print#1time}{}} | |
\abx@dodatetypes | |
% \blx@regimcs doesn't work in do-lists nicely so use internal macro it calls | |
\def\do#1{% | |
\xappto\blx@blxinit{\csletcs{print#1date}{blx@imc@print#1date}}% | |
\xappto\blx@blxinit{\csletcs{print#1time}{blx@imc@print#1time}}% | |
\xappto\blx@blxinit{\csletcs{print#1dateextra}{blx@imc@print#1dateextra}}} | |
\abx@dodatetypes | |
% Set up circa, julian and uncertain date internals | |
\def\blx@imc@ifdatemeta@i#1#2{% | |
\appto\blx@blxinit{% | |
\csdef{if#1date#2}{\iftoggle{abx@bool@#1date#2}}% | |
\csdef{if#1enddate#2}{\iftoggle{abx@bool@#1enddate#2}}% | |
\appto\blx@TE@hook{% | |
\csdef{if#1date#2}{\blx@TE{\iftoggle{abx@bool@#1date#2}}}% | |
\csdef{if#1enddate#2}{\blx@TE{\iftoggle{abx@bool@#1enddate#2}}}}}} | |
% Set up date era internals | |
\def\blx@imc@ifdatemeta@ii#1{% | |
\appto\blx@blxinit{% | |
\csdef{if#1dateera}##1{\ifcsstring{abx@field@#1dateera}{##1}}% | |
\csdef{if#1enddateera}##1{\ifcsstring{abx@field@#1enddateera}{##1}}% | |
\appto\blx@TE@hook{% | |
\csdef{if#1dateera}##1{\blx@TE{\ifcsstring{abx@field@#1dateera}{##1}}}% | |
\csdef{if#1enddateera}##1{\blx@TE{\ifcsstring{abx@field@#1enddateera}{##1}}}}}} | |
% Create date meta information boolean tests | |
\def\do#1{% | |
\blx@imc@ifdatemeta@i{#1}{circa}% | |
\blx@imc@ifdatemeta@i{#1}{julian}% | |
\blx@imc@ifdatemeta@i{#1}{uncertain}} | |
\abx@dodatetypes | |
% Create date meta information field tests | |
\def\do#1{% | |
\blx@imc@ifdatemeta@ii{#1}} | |
\abx@dodatetypes | |
% Resolve date meta information tests and print routines for labeldate | |
% We have to test here, in each \def, whether the labeldatesource | |
% is a real date field or not. If it's not, then we don't want to use | |
% any of the meta-information and so make the conditionals always return false | |
% This can't be neater by testing for the \abx@field@labeldatesource value | |
% earlier because its not available until the tests are in scope. | |
\appto\blx@blxinit{% | |
\ifdefstring\blx@dateera{astronomical} | |
{\protected\def\dateeraprintpre#1{% | |
\iffieldnum{#1} | |
{\begingroup | |
\let\blx@tempa\@empty | |
\IfEndWith{#1}{endyear} | |
{\StrCut{#1}{endyear}\blx@datetype\blx@tempnull | |
\def\blx@tempa{end}} | |
{\StrCut{#1}{year}\blx@datetype\blx@tempnull}% | |
\csuse{if\blx@datetype\blx@tempa dateera}{bce} | |
{\ifnumless{0-\thefield{#1}}{0} | |
{\printtext{\csuse{bibdateera\blx@tempa prefix}}} | |
{}} | |
{}% | |
\endgroup} | |
{}}} | |
{\protected\def\dateeraprint#1{% | |
\iffieldnum{#1} | |
{\begingroup | |
\let\blx@tempa\@empty | |
\IfEndWith{#1}{endyear} | |
{\StrCut{#1}{endyear}\blx@datetype\blx@tempnull | |
\def\blx@tempa{end}} | |
{\StrCut{#1}{year}\blx@datetype\blx@tempnull}% | |
\csuse{if\blx@datetype\blx@tempa dateera}{bce} | |
{\ifnum\numexpr0-\thefield{#1}\relax<\blx@dateeraauto | |
% \midsentence is to suppress automatic capitalisation | |
\printtext{\printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@bce}}\relax | |
\fi} | |
{\ifnumless{\thefield{#1}}\blx@dateeraauto | |
{\printtext{\printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@ce}}} | |
{}}% | |
\endgroup} | |
{}}}% | |
\iftoggle{blx@labeldateparts} | |
{\def\iflabeldateera#1{% start era | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\ifcsstring{abx@field@\abx@field@labeldatesource dateera}{#1}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldateera#1{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\ifcsstring{abx@field@\abx@field@labeldatesource dateera}{#1}}} | |
{\@secondoftwo}}}% | |
% end era | |
\def\iflabelenddateera#1{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\ifcsstring{abx@field@\abx@field@labeldatesource enddateera}{#1}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddateera#1{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\ifcsstring{abx@field@\abx@field@labeldatesource enddateera}{#1}}} | |
{\@secondoftwo}}}% | |
% start circa | |
\def\iflabeldatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource datecirca}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource datecirca}}} | |
{\@secondoftwo}}}% | |
% end circa | |
\def\iflabelenddatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource enddatecirca}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddatecirca}}} | |
{\@secondoftwo}}}% | |
% start julian | |
\def\iflabeldatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource datejulian}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource datejulian}}} | |
{\@secondoftwo}}}% | |
% end julian | |
\def\iflabelenddatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource enddatejulian}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddatejulian}}} | |
{\@secondoftwo}}}% | |
% start uncertain | |
\def\iflabeldateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource dateuncertain}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource dateuncertain}}} | |
{\@secondoftwo}}}% | |
% end uncertain | |
\def\iflabelenddateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource enddateuncertain}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddateuncertain}}} | |
{\@secondoftwo}}}}% | |
{}} | |
% Name toggles like \ifauthor etc. need to be dynamically created for all | |
% name datatypes in the data model and we have to do this here after the | |
% datamodel is available. Need to be careful about expansions here as these | |
% go into hooks to be executed later | |
% toggle to say if we have set any <name>inits to true. Used for conflict | |
% tests with uniquename settings (see \AtEndPreamble below) | |
\newtoggle{abx@bool@xinits} | |
% define <name>inits options and tests (terseinits is global for all initials) | |
\def\do#1{% | |
\newtoggle{abx@bool@#1inits}% | |
\appto\blx@blxinit{% | |
\csdef{if#1inits}{\iftoggle{abx@bool@#1inits}}% | |
\appto\blx@TE@hook{% | |
\csdef{if#1inits}{\blx@TE{\iftoggle{abx@bool@#1inits}}}}}% | |
\DeclareBibliographyOption[boolean]{#1inits}[true]{% | |
\settoggle{abx@bool@#1inits}{##1}}} | |
\abx@donameparts | |
%LEGACY(<3.3) legacy name for \ifgiveninits which is autogenerated now | |
\def\iffirstinits{ | |
\blx@warning@noline{% | |
'\string\iffirstinits' is deprecated, use '\string\ifgiveninits'}% | |
\iftoggle{abx@bool@giveninits}} | |
\def\do#1{% | |
% Define use<name> options scope for biber | |
\blx@collectopts{boolean}{blx@globalopts}{use#1}% | |
\blx@collectopts{boolean}{blx@typeopts}{use#1}% | |
\blx@collectopts{boolean}{blx@entryopts}{use#1}% | |
% Define name toggles | |
\newtoggle{blx@use#1}\toggletrue{blx@use#1}% | |
% Define tests | |
\appto\blx@blxinit{% | |
\csdef{ifuse#1}{\iftoggle{blx@use#1}}% | |
\appto\blx@TE@hook{% | |
\csdef{ifuse#1}{\blx@TE{\iftoggle{blx@use#1}}}}}} | |
\abx@donames | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Since these are bare counters which define \the<string>, save any current values | |
% (memoir, titling, koma etc. have a \theauthor macro, for example) and restore at | |
% end of package | |
\def\do#1{% | |
\csletcs{blx@compat@the#1}{the#1}% | |
\newcounter{#1}% | |
\newcounter{saved#1}% | |
\appto\abx@dobooleans{\do{more#1}}} | |
\abx@donames | |
\abx@dornames | |
\abx@dolists | |
%\abx@dorlists | |
\AtEndOfPackage{% | |
\def\do#1{\csletcs{the#1}{blx@compat@the#1}}% | |
\abx@donames | |
\abx@dornames | |
\abx@dolists} | |
\def\do#1{\newtoggle{abx@bool@#1}} | |
\abx@dobooleans | |
\def\do#1{\expandafter\newlength\expandafter{\csname #1width\endcsname}} | |
\abx@dolabelfields | |
\protected\def\blx@resetdata{% | |
\let\blx@saved@do\do | |
\let\do\blx@imc@clearname | |
\abx@donames | |
\let\do\blx@imc@clearlist | |
\abx@dolists | |
\let\do\blx@imc@clearfield | |
\abx@dofields | |
\abx@dointernalfields | |
\def\do##1{\togglefalse{abx@bool@##1}}% | |
\abx@dobooleans | |
\let\do\blx@saved@do | |
\c@citecounter\z@ | |
\iftoggle{blx@bibliography} | |
{\c@maxnames\blx@maxbibnames\relax | |
\c@minnames\blx@minbibnames\relax} | |
{\c@maxnames\blx@maxcitenames\relax | |
\c@minnames\blx@mincitenames\relax}% | |
\c@maxitems\blx@maxitems\relax | |
\c@minitems\blx@minitems\relax} | |
\protected\def\blx@saveentry{% | |
\let\blx@saved@do\do | |
\let\do\blx@savename | |
\abx@donames | |
\let\do\blx@saverelname | |
\dolistloop\abx@dorelnames | |
\let\do\blx@savelist | |
\abx@dolists | |
\let\do\blx@saverellist | |
\dolistloop\abx@dorellists | |
\let\do\blx@savefield | |
\abx@dofields | |
\let\do\blx@saverelfield | |
\dolistloop\abx@dorelfields | |
\abx@dointernalfields | |
\let\do\blx@savebool | |
\abx@dobooleans | |
\c@savedcitecounter\c@citecounter | |
\let\do\blx@saved@do} | |
\protected\def\blx@savename#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{abx@name@saved#1}{abx@name@#1}% | |
\csname c@saved#1\endcsname\csname c@#1\endcsname} | |
% override with name saved from \clearfield for related processing | |
\protected\def\blx@saverelname#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@morerelsaved#1}% | |
\csletcs{abx@name@saved#1}{abx@name@relsaved#1}% | |
\csname c@saved#1\endcsname\csname c@relsaved#1\endcsname} | |
\protected\def\blx@savelist#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{abx@list@saved#1}{abx@list@#1}% | |
\csname c@saved#1\endcsname\csname c@#1\endcsname} | |
% override with list saved from \clearfield for related processing | |
\protected\def\blx@saverellist#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@morerelsaved#1}% | |
\csletcs{abx@list@saved#1}{abx@list@relsaved#1}% | |
\csname c@saved#1\endcsname\csname c@relsaved#1\endcsname} | |
\protected\def\blx@savefield#1{% | |
\csletcs{abx@field@saved#1}{abx@field@#1}} | |
% override with field saved from \clearfield for related processing | |
\protected\def\blx@saverelfield#1{% | |
\csletcs{abx@field@saved@#1}{abx@field@relsaved#1}} | |
\protected\def\blx@savebool#1{% | |
\csletcs{abx@bool@saved#1}{abx@bool@#1}} | |
% {<code>} | |
\protected\long\def\blx@bbl@preamble#1{% | |
\gappto\abx@preamble{#1}} | |
% {<message>} | |
\protected\def\blx@bbl@warn#1{% | |
\begingroup | |
\def\item{\MessageBreak-\space}% | |
\def\break{\MessageBreak\space\space}% | |
\edef\blx@tempa{% | |
Biber reported the following issues% | |
\ifdef\abx@field@entrykey | |
{\MessageBreak with '\abx@field@entrykey'} | |
{}% | |
:#1}% | |
\blx@warning@noline{\blx@tempa}% | |
\endgroup} | |
% {<field>}{<code>} | |
\newrobustcmd{\DeclareFieldInputHandler}[2]{% | |
\ifblank{#2} | |
{\csundef{blx@fih@#1}} | |
{\long\csdef{blx@fih@#1}##1{#2}}} | |
\@onlypreamble\DeclareFieldInputHandler | |
% {<list>}{<code>} | |
\newrobustcmd*{\DeclareListInputHandler}[2]{% | |
\ifblank{#2} | |
{\csundef{blx@lih@#1}} | |
{\csdef{blx@lih@#1}##1{#2}}} | |
\@onlypreamble\DeclareListInputHandler | |
% {<name>}{<code>} | |
\newrobustcmd*{\DeclareNameInputHandler}[2]{% | |
\ifblank{#2} | |
{\csundef{blx@nih@#1}} | |
{\csdef{blx@nih@#1}##1{#2}}} | |
\@onlypreamble\DeclareNameInputHandler | |
% {<entrykey>}{<refsection>}{<field>}{<refcontext>}{<value>} | |
\long\def\blx@bbl@addentryfield#1#2#3#4#5{% | |
\csxappto{blx@data@#2@#4@#1}{% | |
\def\expandafter\noexpand\csname abx@field@#3\endcsname{#5}}} | |
% {<rangefield>}{<value>} | |
\protected\def\blx@bbl@rangedef#1#2{% | |
\csxappto\blx@bbl@data{% | |
\def\expandafter\noexpand\csname abx@range@#1\endcsname{#2}}} | |
% {<field>}{<value>} | |
\long\def\blx@bbl@addfield#1#2{% | |
\csxappto\blx@bbl@data{% | |
\def\expandafter\noexpand\csname abx@field@#1\endcsname{#2}}} | |
\protected\long\def\blx@bbl@fielddef#1#2{% | |
\def\NewValue{#2}% | |
\ifcsdef{blx@fih@#1} | |
{\csname blx@fih@#1\endcsname{#2}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\blx@bbl@addfield{#1}{\expandonce\NewValue}}} | |
\protected\long\def\blx@bbl@fieldedef#1#2{% | |
\edef\NewValue{#2}% | |
\ifcsdef{blx@fih@#1} | |
{\csname blx@fih@#1\expandafter | |
\endcsname\expandafter{\NewValue}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\blx@bbl@addfield{#1}{\NewValue}}} | |
\protected\long\def\blx@bbl@stringdef#1#2{% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\blx@bbl@fielddef{#1}{\detokenize{#2}}}% | |
\blx@tempa} | |
% Verbatim lists | |
% {<list>}{<listcount>} | |
\protected\def\blx@bbl@verbldef#1#2{% | |
\begingroup | |
\let\lverb\blx@bbl@verbladd | |
\def\blx@tempa{#1}% | |
\def\blx@tempb{#2}% | |
\let\blx@tempc\@empty | |
\let\NewValue\@empty} | |
\protected\def\blx@bbl@verblend{% | |
\expandafter\blx@bbl@listdef\expandafter{\expandafter\blx@tempa\expandafter}\expandafter{\expandafter\blx@tempb\expandafter}\expandafter{\blx@tempc}% | |
\endgroup} | |
\protected\def\blx@bbl@verbladd{% | |
\begingroup | |
\let\do\@makeother | |
\dospecials | |
\catcode\endlinechar=12\relax | |
\blx@bbl@verbladd@i} | |
% Verbatim fields | |
% {<field>} | |
\protected\def\blx@bbl@verbdef#1{% | |
\begingroup | |
\let\verb\blx@bbl@verbadd | |
\def\blx@tempa{#1}% | |
\let\NewValue\@empty} | |
\protected\def\blx@bbl@verbend{% | |
\ifcsdef{blx@fih@\blx@tempa} | |
{\csname blx@fih@\blx@tempa\expandafter | |
\endcsname\expandafter{\NewValue}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\blx@bbl@addfield{\blx@tempa}{\NewValue}}% | |
\endgroup} | |
\protected\def\blx@bbl@verbadd{% | |
\begingroup | |
\let\do\@makeother | |
\dospecials | |
\catcode\endlinechar=12\relax | |
\blx@bbl@verbadd@i} | |
% {<scope>}{<field>}{<itemcount>}{<part>}{<value>} | |
\protected\def\blx@bbl@annotationdef#1#2#3#4#5{% | |
\ifboolexpr { test {\ifstrequal{#1}{field}} } | |
{\csxappto\blx@bbl@data{% | |
\def\do####1{\listcsadd{abx@annotation@#1@#2}{####1}}% | |
\docsvlist{#5}}} | |
{}% | |
\ifboolexpr { test {\ifstrequal{#1}{item}} } | |
{\csxappto\blx@bbl@data{% | |
\def\do####1{\listcsadd{abx@annotation@#1@#2@#3}{####1}}% | |
\docsvlist{#5}}} | |
{}% | |
\ifboolexpr { test {\ifstrequal{#1}{part}} } | |
{\csxappto\blx@bbl@data{% | |
\def\do####1{\listcsadd{abx@annotation@#1@#2@#3@#4}{####1}}% | |
\docsvlist{#5}}} | |
{}} | |
% {<annotation>} | |
\newcommand*{\iffieldannotation}[1]{% | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\blx@resolve@annotation@label{\blx@tempa}% | |
\ifinlistcs{#1}{abx@annotation@field@\blx@tempa}} | |
% {<annotation>} | |
\newcommand*{\ifitemannotation}[1]{% | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\blx@resolve@annotation@label{\blx@tempa}% | |
\ifinlistcs{#1}{abx@annotation@item@\blx@tempa @\the\value{listcount}}} | |
% {<part>}{<annotation>} | |
\newcommand*{\ifpartannotation}[2]{% | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\blx@resolve@annotation@label{\blx@tempa}% | |
\ifinlistcs{#2}{abx@annotation@part@\blx@tempa @\the\value{listcount}@#1}} | |
% {<fieldname>} | |
\def\blx@resolve@annotation@label#1{% | |
\ifcsundef{abx@field@#1source} | |
{}% | |
{\letcs\blx@tempa{abx@field@#1source}}} | |
\begingroup | |
\catcode`\<=12 | |
\catcode`\>=12 | |
\uccode`\<=`\ % | |
\uccode`\>=\endlinechar | |
\uppercase{\gdef\blx@bbl@verbadd@i<#1>}{% | |
\endgroup | |
\edef\NewValue{\NewValue\detokenize{#1}}} | |
\uppercase{\gdef\blx@bbl@verbladd@i<#1>}{% | |
\endgroup | |
\eappto\blx@tempc{{\detokenize{#1}}}}% | |
\endgroup | |
% {<counter>}{<value>} | |
\protected\long\def\blx@bbl@cntdef#1#2{% | |
\csxappto\blx@bbl@data{% | |
\csname c@#1\endcsname#2\relax}} | |
% {<boolean>} | |
\protected\def\blx@bbl@booltrue#1{% | |
\csgappto\blx@bbl@data{% | |
\toggletrue{abx@bool@#1}}} | |
\protected\def\blx@bbl@boolfalse#1{% | |
\csgappto\blx@bbl@data{% | |
\togglefalse{abx@bool@#1}}} | |
% {<list>}{<itemcount>}{<value>} | |
\protected\def\blx@bbl@listdef#1#2#3{% | |
\def\NewCount{#2}% | |
\def\NewValue{#3}% | |
\ifcsdef{blx@lih@#1} | |
{\csname blx@lih@#1\endcsname{#3}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\csxappto\blx@bbl@data{% | |
\csname c@#1\endcsname\NewCount\relax | |
\def\expandafter\noexpand\csname abx@list@#1\endcsname | |
{\expandonce\NewValue}}}} | |
% {<name>}{<itemcount>}{<nameoptions>}{<value>} | |
\protected\def\blx@bbl@namedef#1#2#3#4{% | |
\def\NewCount{#2}% | |
\def\NewOption{#3}% | |
\def\NewValue{#4}% | |
\ifcsdef{blx@nih@#1} | |
{\csname blx@nih@#1\endcsname{#4}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\csxappto\blx@bbl@data{% | |
\csname c@#1\endcsname\NewCount\relax | |
\def\expandafter\noexpand\csname abx@name@#1\endcsname | |
{{\expandonce\NewOption}{\expandonce\NewValue}}}}} | |
% blx@setp@<rs>@<sp> = map of set parent <sp> in a refsection <rs> to csv | |
% of set children | |
% blx@seti@<rs>@<sc> = position of set child <sc> in entry set in | |
% refsection <rs> | |
% blx@setc@<rs>@<sc> = map of set child <sc> in refsection <rs> to set parent | |
% {<entrykey>,...} | |
\protected\def\blx@bbl@set#1{% | |
\blx@bbl@fieldedef{entryset}{\detokenize{#1}}% | |
\csxdef{blx@setp@\the\c@refsection @\abx@field@entrykey}{\detokenize{#1}}% | |
\begingroup | |
\blx@tempcnta\z@ | |
\expandafter\forcsvlist | |
\expandafter\blx@bbl@set@i | |
\expandafter{\detokenize{#1}}% | |
\endgroup} | |
\def\blx@bbl@set@i#1{% | |
\advance\blx@tempcnta\@ne | |
\csxdef{blx@seti@\the\c@refsection @#1}{\the\blx@tempcnta}} | |
% {<entrykey>} | |
\protected\def\blx@bbl@inset#1{% | |
\toggletrue{blx@setonly}% | |
\blx@bbl@fieldedef{entryset}{\detokenize{#1}}% | |
\csxdef{blx@setc@\the\c@refsection @\abx@field@entrykey}{\detokenize{#1}}} | |
% {<entrykey>} | |
\protected\def\blx@bbl@xref#1{}% No-op to avoid an error with BibTeX .bbl | |
% {<keyword>,...} | |
\protected\def\blx@bbl@keyw#1{% | |
\iftoggle{blx@skipbib} | |
{} | |
{\forcsvlist{\blx@addkeyword{\abx@field@entrykey}}{#1}% | |
\blx@bbl@fielddef{keywords}{#1}}} | |
\def\blx@addkeyword#1#2{% | |
\listcsxadd{blx@keyw@\the\c@refsection @\detokenize{#2}}{#1}} | |
% {<options>} | |
\protected\long\def\blx@bbl@options#1{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\forcsvlist\blx@bbl@options@i{#1}% | |
\edef\blx@tempa{% | |
\endgroup | |
\ifx\blx@tempa\@empty | |
\else | |
\def\noexpand\abx@field@options{\expandonce\blx@tempa}% | |
\fi}% | |
\blx@tempa} | |
\long\def\blx@bbl@options@i#1{\blx@bbl@options@ii#1==&} | |
\long\def\blx@bbl@options@ii#1=#2=#3&{% | |
\ifcsundef{KV@blx@opt@ent@#1} | |
{\blx@warning@noline{% | |
Ignoring undefined option '#1'\MessageBreak | |
at entry '\abx@field@entrykey'}} | |
{\eappto\blx@tempa{% | |
\ifx\blx@tempa\@empty\else,\fi | |
\unexpanded{#1}\ifblank{#2}{}{=\unexpanded{#2}}}}} | |
\def\blx@ifdata#1{% | |
\ifcsdef{blx@data@\the\c@refsection @\blx@refcontext@context @#1}} | |
\let\blx@imc@ifentryinbib\blx@ifdata | |
\def\blx@getdata#1{% | |
\csuse{blx@data@\the\c@refsection @\blx@refcontext@context @#1}% | |
\blx@adjustyears | |
\blx@getlabeldata | |
\blx@setcitecounter} | |
\def\blx@adjustyears{% | |
% All dates by default are output from biber in astronomical era with a year 0 | |
% So, if we are ouputting BCE/BC era, we need to adjust the years by +1 | |
\def\do##1{% | |
\ifdefstring\blx@dateera{astronomical} | |
{} | |
{\ifcsdef{abx@field@##1year} | |
{\csuse{if##1dateera}{bce} | |
{\csedef{abx@field@##1year}{\number\numexpr\csuse{abx@field@##1year}+1}} | |
{}} | |
{}% | |
\ifcsdef{abx@field@##1endyear} | |
{\csuse{if##1enddateera}{bce} | |
{\csedef{abx@field@##1endyear}{\number\numexpr\csuse{abx@field@##1endyear}+1}} | |
{}} | |
{}}% | |
{}}% | |
\abx@dodatetypes} | |
\def\blx@getlabeldata{% | |
% Here we resolve label* bib fields to their real fields. In fact, currently biber resolves | |
% the label* fields too, as it needs to do this to generate various internal | |
% counters for tracking things like singletitle etc. internally. However, it does not output | |
% the resolved values to the .bbl. It is conceptually neater to have just the calculated label* | |
% source field in the .bbl and let biblatex resolve the label* field using the label*source | |
% fields. However, currently there is no way/need to vary the label* resolution to pick up a | |
% different target field in biblatex and so practically, this resolution is being done twice, | |
% once by biber, once by biblatex. It is possible in the future that it would be useful to | |
% to change the resolution of the label* fields dynamically in a style/document and so this | |
% biblatex-side resolution remains. | |
% | |
% An unanswered question is whether such dynamic resolution causes problems due to the fact | |
% that biber uses the label* field to generate counters internally and changing the | |
% label* field resolution in biblatex would occur after such counters have been used to | |
% generate the .bbl | |
% This could all be removed from biblatex if necessary and biber could output all resolved | |
% label* fields to the .bbl but then it potentially removes control of such things from | |
% macros | |
% | |
% fields | |
\def\do##1{% | |
\ifcsundef{abx@field@##1source} | |
{}% | |
{\csletcs{abx@field@##1}{abx@field@\csuse{abx@field@##1source}}}}% | |
\dolistloop\abx@rfields% | |
% names | |
\def\do##1{% | |
\ifcsundef{abx@field@##1source} | |
{} | |
{\csname c@##1\expandafter\endcsname\expandafter\the\csname c@\csuse{abx@field@##1source}\endcsname | |
\csletcs{abx@name@##1}{abx@name@\csuse{abx@field@##1source}}}}% | |
\dolistloop\abx@rnames% | |
% Resolve labeldate | |
% Note that here we can't refer to labelyear as this is where we create it, hence the | |
% complications in constructing test names etc. | |
% This also shows why biber shouldn't resolve labeldate fields as we have to add | |
% circa/uncertain/era etc. information to them and that has to be done here. | |
\ifundef\abx@field@labeldatesource | |
{} | |
{\ifcsundef{abx@field@\abx@field@labeldatesource year} | |
% \DeclareLabeldate resolved to a literal/localisation string or a non-date field | |
% in which case we only set labelyear. | |
{\ifcsundef{abx@field@\abx@field@labeldatesource} | |
% \DeclareLabeldate resolved to a literal/localisation string | |
{\edef\abx@field@labelyear{\abx@field@labeldatesource}} | |
% \DeclareLabeldate resolved to a non-date field. Not safe to \edef because | |
% such contents could contain arbitrary macros, unlike ETDF sourced labeldatesource values | |
{\letcs\abx@field@labelyear{abx@field@\abx@field@labeldatesource}}} | |
% \DeclareLabeldate resolved to a date field name prefix like '', 'event', 'url' | |
% or 'orig' | |
{% labeldateera/labelenddateera | |
\ifcsdef{abx@field@\abx@field@labeldatesource dateera} | |
{\edef\abx@field@labeldateera{\csuse{abx@field@\abx@field@labeldatesource dateera}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource enddateera} | |
{\edef\abx@field@labelenddateera{\csuse{abx@field@\abx@field@labeldatesource enddateera}}} | |
{}% | |
% labelyear/labelendyear | |
\ifcsdef{abx@field@\abx@field@labeldatesource year} | |
{\edef\abx@field@labelyear{\csuse{abx@field@\abx@field@labeldatesource year}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endyear} | |
{\edef\abx@field@labelendyear{\csuse{abx@field@\abx@field@labeldatesource endyear}}} | |
{}% | |
% labelmonth | |
\ifcsdef{abx@field@\abx@field@labeldatesource month} | |
{\edef\abx@field@labelmonth{\csuse{abx@field@\abx@field@labeldatesource month}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endmonth} | |
{\edef\abx@field@labelendmonth{\csuse{abx@field@\abx@field@labeldatesource endmonth}}} | |
{}% | |
% labelday/labelendday | |
\ifcsdef{abx@field@\abx@field@labeldatesource day} | |
{\edef\abx@field@labelday{\csuse{abx@field@\abx@field@labeldatesource day}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endday} | |
{\edef\abx@field@labelendday{\csuse{abx@field@\abx@field@labeldatesource endday}}} | |
{}% | |
% labelhour/labelendhour | |
\ifcsdef{abx@field@\abx@field@labeldatesource hour} | |
{\edef\abx@field@labelhour{\csuse{abx@field@\abx@field@labeldatesource hour}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endhour} | |
{\edef\abx@field@labelendhour{\csuse{abx@field@\abx@field@labeldatesource endhour}}} | |
{}% | |
% labelminute/labelendminute | |
\ifcsdef{abx@field@\abx@field@labeldatesource minute} | |
{\edef\abx@field@labelminute{\csuse{abx@field@\abx@field@labeldatesource minute}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endminute} | |
{\edef\abx@field@labelendminute{\csuse{abx@field@\abx@field@labeldatesource endminute}}} | |
{}% | |
% labelsecond/labelendsecond | |
\ifcsdef{abx@field@\abx@field@labeldatesource second} | |
{\edef\abx@field@labelsecond{\csuse{abx@field@\abx@field@labeldatesource second}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endsecond} | |
{\edef\abx@field@labelendsecond{\csuse{abx@field@\abx@field@labeldatesource endsecond}}} | |
{}% | |
% labeltimezone/labelendtimezone | |
\ifcsdef{abx@field@\abx@field@labeldatesource timezone} | |
{\edef\abx@field@labeltimezone{\csuse{abx@field@\abx@field@labeldatesource timezone}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endtimezone} | |
{\edef\abx@field@labelendtimezone{\csuse{abx@field@\abx@field@labeldatesource endtimezone}}} | |
{}% | |
% labelseason/labelendseason | |
\ifcsdef{abx@field@\abx@field@labeldatesource season} | |
{\edef\abx@field@labelseason{\csuse{abx@field@\abx@field@labeldatesource season}}} | |
{}% | |
\ifcsdef{abx@field@\abx@field@labeldatesource endseason} | |
{\edef\abx@field@labelendseason{\csuse{abx@field@\abx@field@labeldatesource endseason}}} | |
{}}}} | |
\def\blx@getdata@cite#1{% | |
\ifcsdef{blx@setc@\the\c@refsection @#1} | |
{\expandafter\expandafter\expandafter\blx@getdata | |
\expandafter\expandafter\expandafter{% | |
\csname blx@setc@\the\c@refsection @#1\endcsname}% | |
\blx@ifdata{#1} | |
{\def\abx@field@childentrykey{#1}% | |
\begingroup | |
\blx@getdata{#1}% | |
\edef\blx@tempa{\endgroup | |
\def\noexpand\abx@field@childentrytype{\abx@field@entrytype}}% | |
\blx@tempa} | |
{}} | |
{\blx@getdata{#1}}% | |
\ifcsdef{blx@seti@\the\c@refsection @#1} | |
{\letcs\abx@field@entrysetcount{blx@seti@\the\c@refsection @#1}} | |
{}} | |
\def\blx@execute{% | |
\blx@imc@thefield{execute}} | |
\def\blx@setoptions@entry{% | |
\blx@imc@iffieldundef{options} | |
{} | |
{\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\setkeys{blx@opt@ent}{\abx@field@options}}% | |
\blx@tempa | |
\blx@checkoptions@entry}} | |
\def\blx@setoptions@type#1{% | |
\ifcsdef{blx@opts@type@#1} | |
{\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\setkeys{blx@opt@typ}{\csuse{blx@opts@type@#1}}}% | |
\blx@tempa} | |
{}} | |
\def\blx@checkoptions@global{} | |
\def\blx@checkoptions@type{} | |
\def\blx@checkoptions@entry{} | |
\def\blx@entrysetcount{% | |
\ifdef\abx@field@entrykey | |
{\ifcsdef{blx@seti@\the\c@refsection @\abx@field@entrykey} | |
{\letcs\abx@field@entrysetcount{% | |
blx@seti@\the\c@refsection @\abx@field@entrykey}} | |
{}} | |
{}} | |
% {<section>} | |
\def\blx@bbl@refsection#1{% | |
\begingroup | |
\c@refsection#1\relax} | |
\def\blx@bbl@endrefsection{% | |
\iftoggle{blx@addset} | |
{\blx@addset | |
\global\togglefalse{blx@addset}} | |
{}% | |
\endgroup} | |
% {<entrykey>} | |
\protected\def\blx@bbl@missing#1{% | |
\listcsxadd{blx@miss@\the\c@refsection}{\detokenize{#1}}% | |
\blx@warning@noline{% | |
The following entry could not be found\MessageBreak | |
in the database% | |
\ifnumgreater\c@refsection\z@ | |
{ (refsection \the\c@refsection)} | |
{}:\MessageBreak | |
\detokenize{#1}\MessageBreak | |
Please verify the spelling and rerun\MessageBreak | |
LaTeX afterwards}} | |
% We create an alias resolving macro and also a list of aliases | |
% which we need to add to the .bcf. We need to resolve the aliases | |
% for internal use but we always want the aliases themselves in the .bcf | |
% so that biber can correctly use and resolve them too. | |
\protected\def\blx@bbl@keyalias#1#2{% | |
\csgdef{blx@keyalias@\the\c@refsection @#1}{\detokenize{#2}}% | |
\listcsgadd{blx@keyaliases@\the\c@refsection}{#1}} | |
% blx@slist@list@<section>@<scheme> - a list of list items in a scheme in a | |
% section (for tracking bibliography lists, | |
% obeys skipbiblist) | |
% blx@slist@entry@<section>@<scheme> - a list of normal entries in a scheme in a | |
% section (for tracking bibliographies, | |
% obeys skipbib) | |
% blx@slist@centry@<section>@<scheme> - a list of normal entries in a scheme in a | |
% section (for tracking citations, | |
% obeys skipbib). Same as @entry@ but | |
% with added set children | |
% {<entrykey>}{<entrytype>}{<options>} | |
\protected\def\blx@bbl@entry#1#2#3{% | |
\begingroup | |
\edef\abx@field@entrykey{\detokenize{#1}}% | |
\blx@setoptions@type{#2}% | |
\blx@bbl@options{#3}% | |
\blx@setoptions@entry | |
\edef\blx@bbl@data{blx@data@\the\c@refsection @\blx@slist@name @\abx@field@entrykey}% | |
\csuse\blx@bbl@data | |
\blx@bbl@addfield{entrykey}{\abx@field@entrykey}% | |
\blx@bbl@addfield{entrytype}{#2}% | |
\blx@imc@iffieldundef{options} | |
{} | |
{\blx@bbl@fieldedef{options}{\expandonce\abx@field@options}}} | |
\protected\def\blx@bbl@endentry{% | |
\csuse\blx@bbl@data | |
\ifcsundef{blx@pref@\the\c@refsection @\abx@field@entrykey} | |
{} | |
{\blx@addpageref{\abx@field@entrykey}}% | |
\nottoggle{blx@setonly} | |
{} | |
{\global\toggletrue{blx@addset}% | |
\toggletrue{blx@skipbib}% | |
\toggletrue{blx@skipbiblist}% | |
\toggletrue{blx@skiplab}}% | |
\nottoggle{blx@skipbib} | |
{\expandafter\ifstrequal\expandafter{\blx@slist@type}{entry} | |
{\listcsxadd{blx@slist@entry@\the\c@refsection @\blx@slist@name}{\abx@field@entrykey}% | |
\listcsxadd{blx@slist@centry@\the\c@refsection @\blx@slist@name}{\abx@field@entrykey}% | |
\listcsxadd{blx@type@\the\c@refsection @\abx@field@entrytype}{\abx@field@entrykey}% | |
\ifdef\abx@field@entrysubtype | |
{\listcsxadd{blx@subt@\the\c@refsection @\abx@field@entrysubtype}{\abx@field@entrykey}} | |
{}} | |
{}}% | |
{}% | |
\nottoggle{blx@skipbiblist} | |
{\expandafter\ifstrequal\expandafter{\blx@slist@type}{list} | |
{\blx@bbl@labelfields | |
\listcsxadd{blx@slist@\blx@slist@type @\the\c@refsection @\blx@slist@name}{\abx@field@entrykey}} | |
{}}% | |
{}% | |
\nottoggle{blx@skiplab} | |
{\iftoggle{blx@labelnumber} | |
{\blx@bbl@labelnumber} | |
{}% | |
\iftoggle{blx@labelalpha} | |
{\blx@bbl@labelalpha} | |
{}% | |
\iftoggle{blx@labeltitle} | |
{\blx@bbl@labeltitle} | |
{}% | |
\iftoggle{blx@labeltitleyear} | |
{\blx@bbl@labeltitleyear} | |
{}% | |
\iftoggle{blx@labeldateparts} | |
{\blx@bbl@labeldate} | |
{}} | |
{}% | |
\blx@bbl@titles | |
\blx@bbl@hooks | |
\endgroup} | |
% This, at the end of the .bbl, puts any set parent children into the | |
% current context sort list of citations (a separate list *@centry@* to the | |
% bibliography *@entry@* which doesn't want the children adding if they weren't | |
% cited) as this is needed for the subentry citing | |
% when sortcites is enabled as for sortcites, the current context sorting list | |
% is used and the parent set of a subentry is not necessarily | |
% available in the current context sortlist. | |
\def\blx@addset{% | |
\begingroup | |
\letcs\blx@tempa{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}% | |
\global\cslet{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}\@empty | |
\forlistloop\blx@addset@i\blx@tempa | |
\endgroup} | |
\def\blx@addset@i#1{% | |
\listcsgadd{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}{#1}% | |
\ifcsdef{blx@setp@\the\c@refsection @#1} | |
{\expandafter\expandafter\expandafter\forcsvlist | |
\expandafter\expandafter\expandafter\blx@addset@ii | |
\expandafter\expandafter\expandafter{% | |
\csname blx@setp@\the\c@refsection @#1\endcsname}} | |
{}} | |
\def\blx@addset@ii#1{% | |
\listcsgadd{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}{#1}} | |
\def\blx@bbl@labelfields{% | |
\def\do##1{% | |
\ifcsundef{abx@field@##1} | |
{} | |
{\blx@setlabwidth{\csname ##1width\endcsname}{% | |
\csuse{abx@ffd@*@##1width}{\csname abx@field@##1\endcsname}}}}% | |
\abx@dolabelfields} | |
\def\blx@bbl@labelnumber{% | |
% Used at endentry, when reading .bbl | |
% only do this for the global sorting list otherwise we increment | |
% the labelnumbers for each sortlist | |
\ifdefempty\abx@field@localnumber | |
{}% only if omitnumbers=true | |
{\ifcsundef{abx@ffd@\blx@imc@thefield{entrytype}@labelnumberwidth} | |
{\letcs{\@lnw@labelnumberwidth}{abx@ffd@*@labelnumberwidth}} | |
{\letcs{\@lnw@labelnumberwidth}{abx@ffd@\blx@imc@thefield{entrytype}@labelnumberwidth}}% | |
\ifcsundef{abx@ffd@\blx@imc@thefield{entrytype}@labelprefix} | |
{\letcs{\@lnw@labelprefix}{abx@ffd@*@labelprefix}} | |
{\letcs{\@lnw@labelprefix}{abx@ffd@\blx@imc@thefield{entrytype}@labelprefix}}% | |
\ifcsundef{abx@ffd@\blx@imc@thefield{entrytype}@labelnumber} | |
{\letcs{\@lnw@labelnumber}{abx@ffd@*@labelnumber}} | |
{\letcs{\@lnw@labelnumber}{abx@ffd@\blx@imc@thefield{entrytype}@labelnumber}}% | |
\ifundef\abx@field@shorthand | |
{\iftoggle{blx@defernumbers} | |
% only if defernumbers=true, we have to define localnumber to | |
% something to stop labelnumberwidth def complaining on first | |
% post-backend run since there will be nothing in the .aux yet | |
% for defernums localnumbers. On the second post-backend run, | |
% it will have a value correct for generating labelnumberwidth | |
% We also have to define a dummy value for labelnumber here for | |
% first post-backend runs otherwise references to labelnumber | |
% in cite styles like numeric-comp will die. | |
{\ifundef\abx@field@localnumber | |
{\numdef\abx@field@localnumber{0}% | |
\blx@bbl@fielddef{labelnumber}{0}}% | |
{}} | |
{\csnumgdef{blx@labelnumber@\the\c@refsection}{% | |
\csuse{blx@labelnumber@\the\c@refsection}+1}% | |
\edef\abx@field@localnumber{% | |
\csuse{blx@labelnumber@\the\c@refsection}}% | |
\blx@bbl@fieldedef{labelnumber}{\abx@field@localnumber}}% | |
\iftoggle{blx@skipbib} | |
{} | |
{\blx@setlabwidth{\labelnumberwidth}{% | |
\csuse{@lnw@labelnumberwidth}{% | |
\ifdef\abx@field@labelprefix | |
{\csuse{@lnw@labelprefix}{\abx@field@labelprefix}} | |
{}% | |
\csuse{@lnw@labelnumber}{\abx@field@localnumber}}}}} | |
{\csgappto\blx@bbl@data{\let\abx@field@labelnumber\abx@field@shorthand}% | |
\iftoggle{blx@skipbib} | |
{} | |
{\blx@setlabwidth{\labelnumberwidth}{% | |
\csuse{@lnw@labelnumberwidth}{\abx@field@shorthand}}}}}} | |
\def\blx@bbl@labelalpha{% | |
\ifundef\abx@field@labelalpha | |
{} | |
{\ifundef\abx@field@extraalpha | |
{} | |
{\ifnum\abx@field@extraalpha>\c@maxextraalpha | |
\global\c@maxextraalpha\abx@field@extraalpha\relax | |
\fi}% | |
\iftoggle{blx@skipbib} | |
{} | |
{\blx@setlabwidth{\labelalphawidth}{% | |
\csuse{abx@ffd@*@labelalphawidth}{% | |
\ifdef\abx@field@labelprefix | |
{\csuse{abx@ffd@*@labelprefix}{\abx@field@labelprefix}} | |
{}% | |
\csuse{abx@ffd@*@labelalpha}{\abx@field@labelalpha}% | |
\ifundef\abx@field@extraalpha | |
{} | |
{\csuse{abx@ffd@*@extraalpha}{\abx@field@extraalpha}}}}}}} | |
\def\blx@bbl@labeltitle{% | |
\ifundef\abx@field@extratitle | |
{} | |
{\ifnum\abx@field@extratitle>\c@maxextratitle | |
\global\c@maxextratitle\abx@field@extratitle\relax | |
\fi}} | |
\def\blx@bbl@labeltitleyear{% | |
\ifundef\abx@field@extratitleyear | |
{} | |
{\ifnum\abx@field@extratitleyear>\c@maxextratitleyear | |
\global\c@maxextratitleyear\abx@field@extratitleyear\relax | |
\fi}} | |
\def\blx@bbl@labeldate{% | |
\ifundef\abx@field@extrayear | |
{} | |
{\ifnum\abx@field@extrayear>\c@maxextrayear | |
\global\c@maxextrayear\abx@field@extrayear\relax | |
\fi}} | |
\def\blx@bbl@titles{% | |
\ifundef\abx@field@indextitle | |
{\csgappto\blx@bbl@data{% | |
\let\abx@field@indextitle\abx@field@title}} | |
{}% | |
\ifundef\abx@field@indexsorttitle | |
{\csgappto\blx@bbl@data{% | |
\let\abx@field@indexsorttitle\abx@field@indextitle}} | |
{}} | |
\def\blx@bbl@hooks{% | |
\ifcsundef{blx@hook@bblitem@*} | |
{\ifcsundef{blx@hook@bblitem@\abx@field@entrytype} | |
{} | |
{\csuse\blx@bbl@data | |
\csuse{blx@hook@bblitem@\abx@field@entrytype}}} | |
{\csuse\blx@bbl@data | |
\csuse{blx@hook@bblitem@*}% | |
\csuse{blx@hook@bblitem@\abx@field@entrytype}}} | |
\newrobustcmd*{\AtDataInput}[1][*]{\csgappto{blx@hook@bblitem@#1}} | |
\@onlypreamble\AtDataInput | |
\def\blx@setlabwidth#1#2{% | |
\begingroup | |
\settowidth{\@tempdima}{\bibfont#2}% | |
\ifnum\@tempdima>#1% | |
\global#1\@tempdima | |
\fi | |
\endgroup} | |
\def\blx@bblstart{% | |
\let\preamble\blx@bbl@preamble | |
\let\warn\blx@bbl@thewarn | |
\let\refsection\blx@bbl@refsection | |
\let\endrefsection\blx@bbl@endrefsection | |
\let\entry\blx@bbl@entry | |
\let\endentry\blx@bbl@endentry | |
\let\missing\blx@bbl@missing | |
\let\keyalias\blx@bbl@keyalias | |
\let\sortlist\blx@bbl@slist | |
\let\endsortlist\blx@bbl@endslist | |
\let\set\blx@bbl@set | |
\let\inset\blx@bbl@inset | |
\let\xref\blx@bbl@xref % A No-op for Biber | |
\let\keyw\blx@bbl@keyw | |
\let\name\blx@bbl@namedef | |
\let\list\blx@bbl@listdef | |
\let\field\blx@bbl@fielddef | |
\let\range\blx@bbl@rangedef | |
\let\strng\blx@bbl@stringdef | |
\let\cnt\blx@bbl@cntdef | |
\let\true\blx@bbl@booltrue | |
\let\false\blx@bbl@boolfalse | |
\let\verb\blx@bbl@verbdef | |
\let\endverb\blx@bbl@verbend | |
\let\lverb\blx@bbl@verbldef | |
\let\endlverb\blx@bbl@verblend | |
\let\annotation\blx@bbl@annotationdef} | |
\def\blx@bblend{} | |
% {<entrykey>} | |
% Get the saved information on which citations were mentioned last run | |
\protected\def\abx@aux@cite#1{% | |
\listxadd\blx@lastcites{\detokenize{#1}}} | |
% {<sortschemename>} | |
% Get the saved information on which sorting schemes were mentioned last run | |
\protected\def\abx@aux@sortscheme#1{% | |
\listgadd\blx@lastsortschemes{#1}} | |
% {<refcontext>} | |
% Get the saved information on which refcontexts were mentioned last run | |
\protected\def\abx@aux@refcontext#1{% | |
\listgadd\blx@lastrefcontexts{#1}} | |
% {<sortschemename>} | |
% Get the saved information on which shorthand sorting schemes were mentioned last run | |
\protected\def\abx@aux@biblist#1{% | |
\listgadd\blx@lastbiblists{#1}} | |
% Here we mustn't change the checksum if we used localnumbers from the | |
% .aux file as this means that deferred numbering is | |
% complete. Otherwise we get in an endless rerun loop because the | |
% checksum due to number changes is always different. | |
\AtEndDocument{% | |
\def\abx@aux@number#1#2#3#4#5{% | |
\ifblank{#5} | |
{} | |
{\nottoggle{blx@localnumber} | |
{\blx@addchecksum{#1}{#5}} | |
{}}}} | |
\AtEndDocument{% | |
% Here we run some tests to decide if we need to issue re-run | |
% messages in certain circumstances. In general, if we add/remove | |
% any citations or add/remove any sorting schemes, we need to re-run | |
% biber. Also, if we have to re-run biber, we need to defer writing | |
% the defernumbers .aux information because it will not yet be correct. | |
% Test to see if we *removed* any citations since last run | |
% (adding citations is dealt with naturally in \blx@citation@entry) | |
% If so, give a rerun biber message. This also sets the | |
% rerun biber toggle so defernums doesn't consume the localnumbers | |
% in the .aux but instead, re-writes them, which is what we need. | |
\begingroup | |
\def\do#1{\ifinlist{#1}\blx@cites{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@lastcites | |
% Special case - if we are using sortscheme "none" anywhere, then changes | |
% in citation order matter and we need to re-run biber. So a special test | |
% to see if the cites from last run are identical in order. We have | |
% already tested for more or less cites between runs by now, we are | |
% testing here for exactly the same cites by treating the cite and | |
% lastcite lists as strings and comparing them. This doesn't apply | |
% to biblist sortschemes as nobody wants to sort biblists with | |
% "none", since it makes no sense | |
\ifinlist{none}\blx@sortschemes | |
{\ifdefstrequal{\blx@cites}{\blx@lastcites} | |
{} | |
{\blx@logreq@active{}}} | |
{}% | |
% Test if we removed any mention of a reference context since last run | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@refcontexts{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@lastrefcontexts | |
% Test if we added any mention of a reference context since last run | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@lastrefcontexts{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@refcontexts | |
% Test if we removed any mention of a biblist since last run. | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@biblists{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@lastbiblists | |
% Test to see if we added any mention of a biblist since last run. | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@lastbiblists{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@biblists | |
% If we have to run biber or latex again and we are using defernumbers, | |
% don't write the localnumber information to the .aux file yet as we will | |
% potentially have to regenerate sorting order first in biber | |
\iftoggle{blx@defernumbers} | |
{\iftoggle{blx@runbiber} | |
{} | |
{\def\do#1{\blx@auxwrite\@mainaux{}{#1}} | |
\dolistloop\blx@localnumaux}} | |
{}% | |
\endgroup} | |
% {<instcount>}{<entrykey>}{<refsection>}{<refcontext>}{<labelnumber>} | |
\protected\def\blx@aux@number#1#2#3#4#5{% | |
\blx@bbl@addentryfield{\detokenize{#2}}{#3}{localnumber}{#4}{#5}% | |
\blx@bbl@addentryfield{\detokenize{#2}}{#3}{labelnumber}{#4}{#5}% | |
\global\toggletrue{blx@localnumber}% | |
\ifblank{#5} | |
{} | |
{\csgdef{blx@labelnumber@#3}{#5}}} | |
% Called as part of bib output for an entry | |
% Only used when defernumbers=true | |
\def\blx@addlabelnumber{% | |
\begingroup | |
\nottoggle{blx@skiplab} | |
{\iftoggle{blx@labelnumber} | |
{\ifundef\abx@field@shorthand | |
% Need to know if we set any localnumber from .aux file, not | |
% just current item. Otherwise, we may just write new | |
% localnumbers but not existing ones | |
% Also, don't want to regenerate localnumber for any key in a | |
% refsection which we've already seen because this has the nasty | |
% side-effect of incrementing the localnum counter | |
{\ifboolexpr { not togl {blx@localnumber} | |
and | |
not test {\ifcsdef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}} } | |
{\iftoggle{blx@omitnumbers} | |
{\let\abx@field@localnumber\@empty} | |
{\csnumgdef{blx@labelnumber@\the\c@refsection}{% | |
\csuse{blx@labelnumber@\the\c@refsection}+1}% | |
\edef\abx@field@localnumber{% | |
\csuse{blx@labelnumber@\the\c@refsection}}% | |
\blx@bbl@addentryfield{\abx@field@entrykey}{\the\c@refsection}% | |
{localnumber}{\blx@refcontext@context}{\abx@field@localnumber}}} | |
{}% | |
% If localnumbers were already in the .aux, add them | |
% again from the .aux. This prevents some cycling | |
% problems where pagebreaks change after localnumber | |
% settles down and then we need another run which then | |
% regenerates localnumber requiring another run but then | |
% the pagebreaks change back again ... etc. | |
\ifcsundef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey} | |
{\listxadd\blx@localnumaux{% | |
\string\abx@aux@number% | |
{\the\c@instcount}% | |
{\abx@field@entrykey}% | |
{\the\c@refsection}% | |
{\blx@refcontext@context}% | |
{\abx@field@localnumber}}% | |
% record that we have already generated and output localnum | |
% for this key in this refsection/refcontext | |
\csgdef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}{}} | |
{}} | |
{}}% | |
{}} | |
{}% | |
\endgroup} | |
% {<sortlistname>} | |
\def\blx@bbl@slist[#1]#2{% | |
\begingroup | |
\def\blx@slist@type{#1}% | |
\def\blx@slist@name{#2}} | |
\def\blx@bbl@endslist{% | |
\csnumgdef{blx@labelnumber@\the\c@refsection}{0}% | |
\endgroup} | |
\def\blx@addpageref#1{% | |
\begingroup | |
\blx@tempcnta\z@ | |
\let\blx@tempa\@empty | |
\def\do##1{% | |
\appto\blx@tempa{{##1}}% | |
\advance\blx@tempcnta\@ne}% | |
\dolistcsloop{blx@pref@\the\c@refsection @#1}% | |
\edef\blx@tempa{\endgroup\noexpand\blx@bbl@listdef | |
{pageref}{\the\blx@tempcnta}{\blx@tempa}}% | |
\blx@tempa} | |
%% Data input | |
\def\blx@bblinput{% | |
\begingroup | |
\blx@info@noline{Trying to load bibliographic data..}% | |
\blx@blxinit | |
\blx@bblfile | |
\endgroup} | |
\def\blx@bblfile{% | |
\blx@secinit | |
\begingroup | |
\blx@bblstart | |
\blx@ifsigned{\jobname}{bbl} | |
{\InputIfFileExists{\jobname.bbl} | |
{\blx@info@noline{... file '\jobname.bbl' found}% | |
\global\toggletrue{blx@bbldone}} | |
{\blx@info@noline{... file '\jobname.bbl' not found}% | |
\typeout{No file \jobname.bbl.}}} | |
{}% | |
\blx@bblend | |
\endgroup | |
% global sorting as this is called at BeginDocument | |
\csnumgdef{blx@labelnumber@\the\c@refsection}{0}} | |
%% Bibliography | |
% {<name>}{<start code>}[<end code>]{<item code>} | |
\newrobustcmd*{\defbibenvironment}[4]{% | |
\long\csdef{blx@env@#1}{#2}% | |
\long\csdef{blx@endenv@#1}{#3}% | |
\long\csdef{blx@item@#1}{#4}} | |
\defbibenvironment{bibliography} | |
{\list{}{% | |
\leftmargin\bibhang | |
\itemindent-\leftmargin | |
\itemsep\bibitemsep | |
\parsep\bibparsep}} | |
{\endlist} | |
{\item} | |
\def\do#1{% | |
\defbibenvironment{#1} | |
{\list{\thefield{#1}}{% | |
\labelwidth\csname #1width\endcsname | |
\labelsep\biblabelsep | |
\leftmargin\labelwidth | |
\advance\leftmargin\labelsep | |
\itemsep\bibitemsep | |
\parsep\bibparsep | |
\def\makelabel####1{####1\hss}}} | |
{\endlist} | |
{\item}} | |
\abx@dolabelfields | |
% {<name>}[<default>]{<code>} | |
\newrobustcmd*{\defbibheading}[1]{% | |
\@ifnextchar[%] | |
{\blx@defbibheading{blx@head@#1}} | |
{\blx@defbibheading{blx@head@#1}[\bibname]}} | |
\def\blx@defbibheading#1[#2]{% | |
\csundef{#1}% | |
\expandafter\newcommand\csname#1\endcsname[1][#2]} | |
% {<name>}{<text>} | |
\newrobustcmd*{\defbibnote}[1]{% | |
\long\csdef{blx@note@#1}} | |
% {<name>}{<code>} | |
\newrobustcmd*{\defbibfilter}[2]{% | |
\begingroup | |
\def\blx@flt@error{\csname blx@flt@errortrue\endcsname}% | |
\let\not\blx@flt@not \let\NOT\not | |
\let\and\blx@flt@and \let\AND\and | |
\let\or\blx@flt@or \let\OR\or | |
\letcs\({blx@flt@(} \letcs\){blx@flt@)}% | |
\def\section##1{\blx@flt@error}% | |
\def\segment##1{segment=##1}% | |
\def\type##1{type=##1}% | |
\def\subtype##1{subtype=##1}% | |
\def\keyword##1{keyword={##1}}% | |
\def\category##1{category={##1}}% | |
\edef\blx@tempa{\noexpand\blx@defbibfilter{#2}}% | |
\ifdef\blx@flt@errortrue | |
{\blx@err@filter} | |
{\let\the\relax | |
\let\blx@flt@item\relax | |
\edef\blx@tempa{\blx@tempa}% | |
\ifdef\blx@flt@errortrue | |
{\blx@err@filter} | |
{\csxdef{blx@filter@#1}{\blx@tempa}}}% | |
\endgroup} | |
\def\blx@defbibfilter#1{% | |
\blx@defbibfilter@i#1 &} | |
\def\blx@defbibfilter@i#1 #2&{% | |
\blx@defbibfilter@ii#1==&% | |
\ifblank{#2}{}{\blx@defbibfilter@i#2 &}} | |
\def\blx@defbibfilter@ii#1=#2=#3&{% | |
\ifblank{#2} | |
{\ifblank{#1} | |
{} | |
{\ifcsdef{blx@flt@#1} | |
{\csname blx@flt@#1\endcsname} | |
{\blx@flt@error}}} | |
{\ifcsdef{blx@flt@#1} | |
{\csname blx@flt@#1\endcsname{\detokenize{#2}}} | |
{\blx@flt@error}}} | |
\def\blx@flt@and{ and } | |
\def\blx@flt@or{ or } | |
\def\blx@flt@not{ not } | |
\csdef{blx@flt@(}{ ( } | |
\csdef{blx@flt@)}{ ) } | |
\def\blx@flt@segment#1{% | |
test {\xifinlistcs\blx@flt@item{blx@segm@\the\c@refsection @#1}}} | |
\def\blx@flt@type#1{% | |
test {\xifinlistcs\blx@flt@item{blx@type@\the\c@refsection @#1}}} | |
\def\blx@flt@subtype#1{% | |
test {\xifinlistcs\blx@flt@item{blx@subt@\the\c@refsection @#1}}} | |
\def\blx@flt@keyword#1{% | |
test {\xifinlistcs\blx@flt@item{blx@keyw@\the\c@refsection @#1}}} | |
\def\blx@flt@category#1{% | |
test {\xifinlistcs\blx@flt@item{blx@catg@#1}}} | |
% {<name>}{<code>} | |
\newrobustcmd*{\defbibcheck}[2]{% | |
\csdef{blx@bibcheck@#1}{% | |
\togglefalse{blx@skipentry}% | |
\def\skipentry{\toggletrue{blx@skipentry}}% | |
#2\undef\skipentry}} | |
% options | |
% We need a 2-pass structure for options in \printbibliography and | |
% \printbiblist because the section has to be set before any | |
% other options and this partly determines which list to use for later filtering | |
\define@key{blx@bib1}{segment}{} | |
\define@key{blx@bib1}{type}{} | |
\define@key{blx@bib1}{nottype}{} | |
\define@key{blx@bib1}{subtype}{} | |
\define@key{blx@bib1}{notsubtype}{} | |
\define@key{blx@bib1}{keyword}{} | |
\define@key{blx@bib1}{notkeyword}{} | |
\define@key{blx@bib1}{category}{} | |
\define@key{blx@bib1}{notcategory}{} | |
\define@key{blx@bib1}{filter}{} | |
\define@key{blx@bib1}{check}{} | |
\define@key{blx@bib1}{heading}{} | |
\define@key{blx@bib1}{env}{} | |
\define@key{blx@bib1}{title}{} | |
\define@key{blx@bib1}{prenote}{} | |
\define@key{blx@bib1}{postnote}{} | |
\define@key{blx@bib1}{omitnumbers}[]{} | |
\define@key{blx@bib1}{prefixnumbers}{}%LEGACY(<3.4) legacy name for labelprefix | |
% Here we are using the first pass to see if there is an explicit setting for resetnumbers | |
% If there isn't we will use the default behaviour where if there is a labelprefix, | |
% resetnumbers will default to "true" | |
\define@key{blx@bib1}{resetnumbers}[true]{% | |
\toggletrue{blx@resetnumsexplicit}} | |
\define@key{blx@bib2}{section}{} | |
\define@key{blx@bib2}{sorting}{} | |
\define@key{blx@biblist1}{segment}{} | |
\define@key{blx@biblist1}{type}{} | |
\define@key{blx@biblist1}{nottype}{} | |
\define@key{blx@biblist1}{subtype}{} | |
\define@key{blx@biblist1}{notsubtype}{} | |
\define@key{blx@biblist1}{keyword}{} | |
\define@key{blx@biblist1}{notkeyword}{} | |
\define@key{blx@biblist1}{category}{} | |
\define@key{blx@biblist1}{notcategory}{} | |
\define@key{blx@biblist1}{filter}{} | |
\define@key{blx@biblist1}{check}{} | |
\define@key{blx@biblist1}{heading}{} | |
\define@key{blx@biblist1}{env}{} | |
\define@key{blx@biblist1}{title}{} | |
\define@key{blx@biblist1}{prenote}{} | |
\define@key{blx@biblist1}{postnote}{} | |
\define@key{blx@biblist2}{section}{} | |
\define@key{blx@biblist2}{sorting}{} | |
\define@key{blx@bib1}{sorting}{% | |
\blx@warning@noline{% | |
sorting option to \string\printbibliography\space is no longer supported, use 'sorting' option to \string\newrefcontext}} | |
\define@key{blx@bib1}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax | |
\def\blx@tempe{#1}}} | |
\define@key{blx@biblist1}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax | |
\def\blx@tempe{#1}}} | |
\define@key{blx@biblist1}{sorting}{% | |
\blx@warning@noline{% | |
sorting option to \string\printbiblist\space is no longer supported, use 'sorting' option to \string\newrefcontext}} | |
\define@key{blx@bbg}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax}} | |
\define@key{blx@bbc}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax}} | |
\define@key{blx@bib2}{segment}{\blx@key@segment{#1}} | |
\define@key{blx@biblist2}{segment}{\blx@key@segment{#1}} | |
\def\blx@key@segment#1{% | |
\ifcsundef{blx@segm@\the\c@refsection @#1} | |
{\blx@warning{Segment '#1' not found in section '\the\c@refsection'}} | |
{\c@refsegment#1\relax | |
\blx@printbibchecks | |
\blx@filter\blx@tempa{blx@segm@\the\c@refsection @#1}}} | |
\define@key{blx@bib2}{type}{\blx@key@type{#1}} | |
\define@key{blx@biblist2}{type}{\blx@key@type{#1}} | |
\def\blx@key@type#1{% | |
\ifcsundef{blx@type@\the\c@refsection @#1} | |
{\blx@warning{Type '#1' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\iftoggle{blx@tempb} | |
{\togglefalse{blx@tempb}% | |
\blx@filter\blx@tempa{blx@type@\the\c@refsection @#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{'type' used multiple times} | |
{When passing multiple filter options, each entry\MessageBreak | |
must satisfy all conditions (AND conjunction),\MessageBreak | |
hence some options may not be used twice.\MessageBreak | |
Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}} | |
\define@key{blx@bib2}{nottype}{\blx@key@nottype{#1}} | |
\define@key{blx@biblist2}{nottype}{\blx@key@nottype{#1}} | |
\def\blx@key@nottype#1{% | |
\ifcsundef{blx@type@\the\c@refsection @#1} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@type@\the\c@refsection @#1}}} | |
\define@key{blx@bib2}{subtype}{\blx@key@subtype{#1}} | |
\define@key{blx@biblist2}{subtype}{\blx@key@subtype{#1}} | |
\def\blx@key@subtype#1{% | |
\ifcsundef{blx@subt@\the\c@refsection @#1} | |
{\blx@warning{Subtype '#1' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\iftoggle{blx@tempb} | |
{\togglefalse{blx@tempb}% | |
\blx@filter\blx@tempa{blx@subt@\the\c@refsection @#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{'subtype' used multiple times} | |
{When passing multiple filter options, each entry\MessageBreak | |
must satisfy all conditions (AND conjunction),\MessageBreak | |
hence some options may not be used twice.\MessageBreak | |
Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}} | |
\define@key{blx@bib2}{notsubtype}{\blx@key@notsubtype{#1}} | |
\define@key{blx@biblist2}{notsubtype}{\blx@key@notsubtype{#1}} | |
\def\blx@key@notsubtype#1{% | |
\ifcsundef{blx@subt@\the\c@refsection @#1} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@subt@\the\c@refsection @#1}}} | |
\define@key{blx@bib2}{keyword}{\blx@key@keyword{#1}} | |
\define@key{blx@biblist2}{keyword}{\blx@key@keyword{#1}} | |
\def\blx@key@keyword#1{% | |
\ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}} | |
{\blx@warning{Keyword '\detokenize{#1}' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\blx@filter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}} | |
\define@key{blx@bib2}{notkeyword}{\blx@key@notkeyword{#1}} | |
\define@key{blx@biblist2}{notkeyword}{\blx@key@notkeyword{#1}} | |
\def\blx@key@notkeyword#1{% | |
\ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}} | |
\define@key{blx@bib2}{category}{\blx@key@category{#1}} | |
\define@key{blx@biblist2}{category}{\blx@key@category{#1}} | |
\def\blx@key@category#1{% | |
\ifcsundef{blx@catg@\detokenize{#1}} | |
{\blx@warning{Category '\detokenize{#1}' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\blx@filter\blx@tempa{blx@catg@\detokenize{#1}}}} | |
\define@key{blx@bib2}{notcategory}{\blx@key@notcategory{#1}} | |
\define@key{blx@biblist2}{notcategory}{\blx@key@notcategory{#1}} | |
\def\blx@key@notcategory#1{% | |
\ifcsundef{blx@catg@#1} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@catg@#1}}} | |
\define@key{blx@bib2}{filter}{\blx@key@filter{#1}} | |
\define@key{blx@biblist2}{filter}{\blx@key@filter{#1}} | |
\def\blx@key@filter#1{% | |
\ifcsdef{blx@filter@#1} | |
{\blx@printbibchecks | |
\blx@bibfilter\blx@tempa{blx@filter@#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{Filter '#1' not found} | |
{The filter '#1' could not be found.\MessageBreak | |
Use \string\defbibfilter\space to define it}}} | |
\define@key{blx@bib2}{check}{\blx@key@bibcheck{#1}} | |
\define@key{blx@biblist2}{check}{\blx@key@bibcheck{#1}} | |
\def\blx@key@bibcheck#1{% | |
\ifcsdef{blx@bibcheck@#1} | |
{\letcs\blx@bibcheck{blx@bibcheck@#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{Check '#1' not found} | |
{The check '#1' could not be found.\MessageBreak | |
Use \string\defbibcheck\space to define it}}} | |
\define@key{blx@bhd}{heading}{\blx@key@heading{#1}} | |
\define@key{blx@bib2}{heading}{\blx@key@heading{#1}} | |
\define@key{blx@biblist2}{heading}{\blx@key@heading{#1}} | |
\define@key{blx@bbs}{heading}{\blx@key@heading{#1}} | |
\define@key{blx@bbg}{heading}{\blx@key@heading{#1}} | |
\def\blx@key@heading#1{% | |
\ifcsundef{blx@head@#1} | |
{\blx@error | |
{Heading '#1' not found} | |
{The heading '#1' could not be found.\MessageBreak | |
Use \string\defbibheading\space to define it}} | |
{\def\blx@theheading{#1}}} | |
\define@key{blx@bib2}{env}{\blx@key@env{#1}} | |
\define@key{blx@biblist2}{env}{\blx@key@env{#1}} | |
\define@key{blx@bbs}{env}{\blx@key@env{#1}} | |
\define@key{blx@bbg}{env}{\blx@key@env{#1}} | |
\define@key{blx@bbc}{env}{\blx@key@env{#1}} | |
\def\blx@key@env#1{% | |
\ifcsundef{blx@env@#1} | |
{\blx@error | |
{Environment '#1' not found} | |
{The environment '#1' could not be found.\MessageBreak | |
Use \string\defbibenvironment\space to define it}} | |
{\def\blx@theenv{#1}}} | |
\define@key{blx@bhd}{title}{\def\blx@thetitle{#1}} | |
\define@key{blx@bib2}{title}{\def\blx@thetitle{#1}} | |
\define@key{blx@biblist2}{title}{\def\blx@thetitle{#1}} | |
\define@key{blx@bib2}{prenote}{\blx@key@prenote{#1}} | |
\define@key{blx@biblist2}{prenote}{\blx@key@prenote{#1}} | |
\define@key{blx@bbs}{prenote}{\blx@key@prenote{#1}} | |
\define@key{blx@bbg}{prenote}{\blx@key@prenote{#1}} | |
\define@key{blx@bbc}{prenote}{\blx@key@prenote{#1}} | |
\def\blx@key@prenote#1{% | |
\ifcsundef{blx@note@#1} | |
{\blx@error | |
{Note '#1' not found} | |
{The note '#1' could not be found.\MessageBreak | |
Use \string\defbibnote\space to define it}} | |
{\def\blx@theprenote{#1}}} | |
\define@key{blx@bib2}{postnote}{\blx@key@postnote{#1}} | |
\define@key{blx@biblist2}{postnote}{\blx@key@postnote{#1}} | |
\define@key{blx@bbs}{postnote}{\blx@key@postnote{#1}} | |
\define@key{blx@bbg}{postnote}{\blx@key@postnote{#1}} | |
\define@key{blx@bbc}{postnote}{\blx@key@postnote{#1}} | |
\def\blx@key@postnote#1{% | |
\ifcsundef{blx@note@#1} | |
{\blx@error | |
{Note '#1' not found} | |
{The note '#1' could not be found.\MessageBreak | |
Use \string\defbibnote\space to define it}} | |
{\def\blx@thepostnote{#1}}} | |
\define@key{blx@bib2}{resetnumbers}[true]{% | |
\iftoggle{blx@defernumbers} | |
{\ifstrequal{#1}{true} | |
{\csnumdef{blx@labelnumber@\the\c@refsection}{0}} | |
{\ifstrequal{#1}{false} | |
{} | |
{\csnumdef{blx@labelnumber@\the\c@refsection}{#1-1}}}} | |
{\blx@warning{% | |
Option 'resetnumbers' requires 'defernumbers=true'.\MessageBreak | |
Ignoring 'resetnumbers=true'}}} | |
\define@key{blx@bib2}{omitnumbers}[true]{% | |
\ifstrequal{#1}{true} | |
{\iftoggle{blx@defernumbers} | |
{\toggletrue{blx@omitnumbers}} | |
{\blx@warning{% | |
Option 'omitnumbers' requires 'defernumbers=true'.\MessageBreak | |
Ignoring 'omitnumbers=true'}}} | |
{}} | |
\define@key{blx@bib2}{prefixnumbers}{% | |
\blx@warning@noline{% | |
prefixnumbers option to \string\printbibliography\space is no longer supported, use 'labelprefix' option to \string\newrefcontext}} | |
% [<options>] | |
\newrobustcmd*{\printbibheading}{% | |
\begingroup | |
\edef\on@line{\on@line}% | |
\@ifnextchar[%] | |
{\blx@printbibheading} | |
{\blx@printbibheading[]}} | |
\def\blx@printbibheading[#1]{% | |
\def\blx@theheading{bibliography}% | |
\let\blx@thetitle\@empty | |
\blx@safe@actives | |
\setkeys{blx@bhd}{#1}% | |
\blx@rest@actives | |
\blx@langstrings | |
\blx@bibheading\blx@theheading\blx@thetitle | |
\endgroup} | |
% We use this to determine whether an explicit value for resetnumbers is passed to | |
% \printbibliography, if not, then we use the default behaviour where a labelprefix forces | |
% a reset. It is useful that we have a 2-pass structure for \printbibliography keys anyway. | |
\newtoggle{blx@resetnumsexplicit} | |
% [<options>] | |
\newrobustcmd*{\printbibliography}{% | |
\begingroup | |
\delimcontext{bib}% | |
\edef\on@line{\on@line}% | |
\@ifnextchar[%] | |
{\blx@printbibliography} | |
{\blx@printbibliography[]}} | |
\def\blx@printbibliography[#1]{% | |
\toggletrue{blx@tempa}% | |
\toggletrue{blx@tempb}% | |
\def\blx@theheading{bibliography}% | |
\def\blx@theenv{bibliography}% | |
\let\blx@theprenote\@empty | |
\let\blx@thepostnote\@empty | |
\let\blx@thetitle\@empty | |
% defaults | |
\let\blx@tempa\@empty% before there is a .bbl, this must not be undef | |
\edef\blx@tempd{% | |
\blx@xml@sorting{% | |
\ifcsdef{blx@sortdef@locale@\blx@refcontext@sorting} | |
{ locale="\csuse{blx@sortdef@locale@\blx@refcontext@sorting}"} | |
{}}{% | |
\csuse{blx@sorting@\blx@refcontext@sorting}}}% default to context | |
\edef\blx@tempe{\the\c@refsection}% default refsection is current | |
\blx@safe@actives | |
\edef\blx@tempd{% | |
\blx@xml@sorting{% | |
\ifcsdef{blx@sortdef@locale@\blx@refcontext@sorting} | |
{ locale="\csuse{blx@sortdef@locale@\blx@refcontext@sorting}"} | |
{}}{% | |
\csuse{blx@sorting@\blx@refcontext@sorting}}}% | |
% | |
\togglefalse{blx@resetnumsexplicit}% | |
\setkeys{blx@bib1}{#1}% First pass options keys - section and resetnumbers | |
% Is there a user-specified option for resetnumbers? If so, this overrides the default | |
% "labelprefix implies resetnumbers" behaviour | |
\iftoggle{blx@resetnumsexplicit} | |
{} | |
{\ifdefempty\blx@refcontext@labelprefix | |
{} | |
{\setkeys{blx@bib2}{resetnumbers}}}% | |
\blx@rest@actives | |
\ifcsvoid{blx@slist@entry@\blx@tempe @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@slist@entry@\blx@tempe @\blx@refcontext@context}}% | |
\blx@safe@actives | |
% Must reset omitnumbers as it's a global macro and if we don't, any | |
% \printbibliography following one with this set will inherit any | |
% previous "true" value | |
\togglefalse{blx@omitnumbers}% | |
\setkeys{blx@bib2}{#1}% ... now we have correct \blx@tempa, set rest of options | |
\blx@rest@actives | |
\csxappto{blx@slists}{% | |
\blx@xml@slist{\blx@refcontext@context}{entry}{\blx@tempe}{\blx@refcontext@sorting}{\blx@refcontext@sortingnamekey}{\blx@refcontext@labelprefix}{\blx@tempd}{}}% | |
\ifdefvoid\blx@tempa | |
{\blx@warn@bibempty\endgroup} | |
{\blx@bibliography\blx@tempa}} | |
% [<options>] | |
\newrobustcmd*{\bibbysection}{% | |
\begingroup | |
\delimcontext{bib}% | |
\ifnum\blx@maxsection=\z@ | |
\blx@warning{No reference sections found}% | |
\fi | |
\edef\on@line{\on@line}% | |
\@ifnextchar[%] | |
{\blx@bibbysection} | |
{\blx@bibbysection[]}} | |
\def\blx@bibbysection[#1]{% | |
\def\blx@theheading{bibliography}% | |
\def\blx@theenv{bibliography}% | |
\let\blx@theprenote\@empty | |
\let\blx@thepostnote\@empty | |
\let\blx@thetitle\@empty | |
\c@refsection\z@ | |
\blx@safe@actives | |
\setkeys{blx@bbs}{#1}% | |
\blx@rest@actives | |
\togglefalse{blx@tempa}% | |
\blx@refsections} | |
\def\blx@refsections{% | |
\ifcsvoid{blx@slist@entry@\the\c@refsection @\blx@refcontext@context} | |
{} | |
{\toggletrue{blx@tempa}% | |
\begingroup | |
\expandafter\blx@bibliography\csname blx@slist@entry@\the\c@refsection @\blx@refcontext@context\endcsname}% | |
\ifnum\c@refsection<\blx@maxsection | |
\advance\c@refsection\@ne | |
\expandafter\blx@refsections | |
\else | |
\iftoggle{blx@tempa}{}{\blx@warn@bibempty}% | |
\endgroup | |
\fi} | |
% [<options>] | |
\newrobustcmd*{\bibbysegment}{% | |
\begingroup | |
\delimcontext{bib}% | |
\edef\on@line{\on@line}% | |
\ifnum\csname blx@maxsegment@\the\c@refsection\endcsname=\z@ | |
\blx@warning{No reference segments found}% | |
\fi | |
\@ifnextchar[%] | |
{\blx@bibbysegment} | |
{\blx@bibbysegment[]}} | |
\def\blx@bibbysegment[#1]{% | |
\def\blx@theheading{bibliography}% | |
\def\blx@theenv{bibliography}% | |
\let\blx@theprenote\@empty | |
\let\blx@thepostnote\@empty | |
\let\blx@thetitle\@empty | |
\c@refsegment\@ne | |
\blx@safe@actives | |
\setkeys{blx@bbg}{#1}% | |
\blx@rest@actives | |
\togglefalse{blx@tempa}% | |
\blx@refsegments} | |
\def\blx@refsegments{% | |
\ifcsvoid{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{} | |
{\toggletrue{blx@tempa}% | |
\begingroup | |
\let\blx@tempa\@empty | |
\ifcsvoid{blx@slist@entry@\the\c@refsection @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@slist@entry@\the\c@refsection @\blx@refcontext@context}}% | |
\blx@filter\blx@tempa{blx@segm@\the\c@refsection @\the\c@refsegment}% | |
\blx@bibliography\blx@tempa}% | |
\ifnum\c@refsegment<\csname blx@maxsegment@\the\c@refsection\endcsname | |
\advance\c@refsegment\@ne | |
\expandafter\blx@refsegments | |
\else | |
\iftoggle{blx@tempa}{}{\blx@warn@bibempty}% | |
\endgroup | |
\fi} | |
% [<options>] | |
\newrobustcmd*{\bibbycategory}{% | |
\begingroup | |
\delimcontext{bib}% | |
\edef\on@line{\on@line}% | |
\ifx\blx@categories\@empty | |
\blx@warning{No categories found}% | |
\fi | |
\@ifnextchar[%] | |
{\blx@bibbycategory} | |
{\blx@bibbycategory[]}} | |
\def\blx@bibbycategory[#1]{% | |
\def\blx@theheading{bibliography}% | |
\def\blx@theenv{bibliography}% | |
\let\blx@theprenote\@empty | |
\let\blx@thepostnote\@empty | |
\let\blx@thetitle\@empty | |
\c@refsection\z@ | |
\blx@safe@actives | |
\setkeys{blx@bbc}{#1}% | |
\blx@rest@actives | |
\togglefalse{blx@tempa}% | |
\forlistloop\blx@bibcategory\blx@categories | |
\blx@endbibcategory} | |
\def\blx@bibcategory#1{% | |
\ifcsvoid{blx@catg@#1} | |
{} | |
{\toggletrue{blx@tempa}% | |
\begingroup | |
\blx@key@heading{#1}% | |
\let\blx@tempa\@empty | |
\ifcsvoid{blx@slist@entry@\the\c@refsection @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@slist@entry@\the\c@refsection @\blx@refcontext@context}}% | |
\blx@filter\blx@tempa{blx@catg@#1}% | |
\blx@bibliography\blx@tempa}}% | |
\def\blx@endbibcategory{% | |
\iftoggle{blx@tempa}{}{\blx@warn@bibempty}% | |
\endgroup} | |
% {<entrykey>,...} | |
\def\blx@bibliography{% | |
\blx@langstrings | |
\blx@bibheading\blx@theheading\blx@thetitle | |
\blx@bibnote\blx@theprenote | |
\begingroup | |
\blx@bibinit | |
\let\@noitemerr\@empty | |
\let\blx@noitem\blx@warn@bibempty | |
\ifnum\bibinitsep=\z@ | |
\let\blx@initsep\relax | |
\fi | |
\ifnum\bibnamesep=\z@ | |
\let\blx@namesep\relax | |
\fi | |
\csuse{blx@env@\blx@theenv}% | |
\csuse{blx@hook@bibinit}% | |
\csuse{blx@hook@bibinit@next}% | |
\let\blx@do\blx@bibitem | |
\let\blx@done\blx@endbibliography | |
\blx@listloop} | |
\def\blx@endbibliography{% | |
\csuse{blx@endenv@\blx@theenv}% | |
\blx@noitem | |
\endgroup | |
\blx@bibnote\blx@thepostnote | |
\endgroup} | |
\def\blx@bibheading#1#2{% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@bibheading@i{\expandonce#1}{\expandonce#2}}% | |
\blx@tempa} | |
\def\blx@bibheading@i#1#2{% | |
\let\newrefsection\relax | |
\let\newrefsegment\relax | |
\ifblank{#2} | |
{\csuse{blx@head@#1}} | |
{\csuse{blx@head@#1}[#2]}% | |
\let\newrefsection\blx@newrefsection | |
\let\newrefsegment\blx@newrefsegment} | |
\def\blx@bibnote#1{% | |
\ifdefempty#1 | |
{} | |
{\begingroup | |
\let\newrefsection\relax | |
\let\newrefsegment\relax | |
\noindent | |
\csuse{blx@note@#1}\par\nobreak | |
\endgroup}} | |
\def\blx@bibinit{% | |
\iftoggle{blx@citation} | |
{} | |
{\toggletrue{blx@bibliography}}% | |
\blx@blxinit | |
\blx@resetdata | |
\csuse{blx@hook@bbxinit}% | |
\bibsetup\bibfont | |
\blx@setsfcodes | |
\csuse{blx@bibsetup}} | |
% {<entrykey>} | |
% output a bib item, this is why \blx@thelabelnumber is here so that | |
% labelnumber is deferred if defernumbers=true | |
\def\blx@bibitem#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@getdata{#1}% | |
\blx@bibcheck | |
\iftoggle{blx@skipentry}{}{% | |
\blx@setdefaultrefcontext{#1}% | |
\global\let\blx@noitem\@empty | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\blx@thelabelnumber | |
\addtocounter{instcount}\@ne | |
\csuse{blx@item@\blx@theenv}\relax | |
\blx@initsep | |
\blx@namesep | |
\csuse{blx@hook@bibitem}% | |
\blx@execute | |
\blx@initunit | |
\blx@anchor | |
\blx@beglangbib | |
\bibsentence | |
\blx@pagetracker | |
\blx@driver\abx@field@entrytype | |
\blx@postpunct | |
\blx@endlangbib}% | |
\endgroup} | |
{}} | |
\let\blx@bibcheck\relax | |
% This sets and saves to the .aux the default refcontext for an entry. The | |
% default refcontext for an entry is the refcontext of the last | |
% bibliography in the refsection in which it is actually printed. This | |
% allows citations to default to selecting data from the correct | |
% bibliography list in standard cases where entries are not listed in | |
% multiple bibliographies | |
\def\blx@setdefaultrefcontext#1{% | |
\ifbool{refcontextdefaults} | |
{\blx@rerun@latex}% | |
{}% | |
\ifinlistcs{#1}{blx@defaultrefcontexts@\the\c@refsection} | |
{} | |
{\listcsgadd{blx@defaultrefcontexts@\the\c@refsection}{#1}}% | |
\csxdef{blx@assignedrefcontextbib@\the\c@refsection @#1}{\blx@refcontext@context}} | |
% <refsection><key><refcontext> | |
\def\abx@aux@defaultrefcontext#1#2#3{% | |
\global\boolfalse{refcontextdefaults}% | |
\csxdef{blx@assignedrefcontextbib@#1@#2}{#3}} | |
\def\abx@aux@refcontextdefaultsdone{% | |
\global\boolfalse{refcontextdefaults}} | |
\AtEndDocument{% | |
% write the .aux to say we don't need to re-run to consume refcontext defaults | |
\ifbool{refcontextdefaults} | |
{} | |
{\blx@auxwrite\@mainaux{}{\string\abx@aux@refcontextdefaultsdone}}% | |
% always add default refcontext declarations to .aux after biber run | |
\iftoggle{blx@bbldone} | |
{\def\do#1{% | |
\begingroup | |
\def\do##1{% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@defaultrefcontext{#1}{##1}{\csuse{blx@assignedrefcontextbib@#1@##1}}}}% | |
\dolistcsloop{blx@defaultrefcontexts@#1}% | |
\endgroup} | |
\dolistloop\blx@allrefsections} | |
{}} | |
\def\blx@initsep{% | |
\blx@imc@iffieldundef{sortinithash} | |
{} | |
{\ifnum\c@instcount>\@ne | |
\blx@imc@iffieldequals{sortinithash}\blx@previnithash | |
{} | |
{\addvspace{\bibinitsep}}% | |
\fi | |
\global\let\blx@previnithash\abx@field@sortinithash}} | |
\def\blx@namesep{% | |
\ifnum\c@instcount>\@ne | |
\blx@imc@iffieldequals{fullhash}\blx@prevhash | |
{} | |
{\addvspace{\bibnamesep}}% | |
\fi | |
\global\let\blx@prevhash\abx@field@fullhash} | |
\newrobustcmd*{\AtBeginBibliography}{\gappto\blx@hook@bibinit} | |
\newrobustcmd*{\AtEveryBibitem}{\gappto\blx@hook@bibitem} | |
\@onlypreamble\AtBeginBibliography | |
\@onlypreamble\AtEveryBibitem | |
\def\blx@imc@UseBibitemHook{\csuse{blx@hook@bibitem}} | |
\blx@regimcs{\UseBibitemHook} | |
\newrobustcmd*{\AtNextBibliography}{% | |
\ifundef\blx@hook@bibinit@next | |
{\gdef\blx@hook@bibinit@next{\global\undef\blx@hook@bibinit@next}} | |
{}% | |
\gappto\blx@hook@bibinit@next} | |
% page tracker | |
\def\blx@pagetracker@context{% | |
\blx@leavevmode | |
\ifbool{@filesw} | |
{\ifbool{pagetracker} | |
{\protected@write\@mainaux{}{% | |
\iftoggle{blx@footnote} | |
{\string\abx@aux@fnpage} | |
{\string\abx@aux@page}% | |
{\the\c@instcount}{\noexpand\the\c@page}}} | |
{}} | |
{}} | |
% {<instcount>}{<page>} | |
\protected\def\blx@aux@page#1#2{% | |
\csgdef{blx@page@#1}{#2}% | |
\blx@addpagesum{#1}{#2}} | |
\protected\def\blx@aux@spread#1#2{% | |
\ifodd#2\relax | |
\csxdef{blx@page@#1}{\number\numexpr#2-1}% | |
\else | |
\csgdef{blx@page@#1}{#2}% | |
\fi | |
\blx@addpagesum{#1}{#2}} | |
\protected\def\blx@aux@fnpage#1#2{% | |
\csgdef{blx@fnpage@#1}{#2}% | |
\blx@addpagesum{#1}{#2}} | |
\protected\def\blx@aux@fnspread#1#2{% | |
\ifodd#2\relax | |
\csxdef{blx@fnpage@#1}{\number\numexpr#2-1}% | |
\else | |
\csgdef{blx@fnpage@#1}{#2}% | |
\fi | |
\blx@addpagesum{#1}{#2}} | |
\AtEndDocument{% | |
\def\abx@aux@page#1#2{\blx@addpagesum{#1}{#2}}% | |
\def\abx@aux@fnpage#1#2{\blx@addpagesum{#1}{#2}}} | |
% hyperref interface | |
\appto\blx@mkhyperref{% | |
\let\blx@anchors\@empty | |
\ifundef\hyper@natanchorstart | |
{\protected\def\blx@anchor{% | |
\xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors} | |
{} | |
{\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}% | |
\hypertarget{cite.\the\c@refsection @\abx@field@entrykey}{}}}} | |
{\protected\def\blx@anchor{% | |
\xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors} | |
{} | |
{\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}% | |
\hyper@natanchorstart{\the\c@refsection @\abx@field@entrykey}% | |
\hyper@natanchorend}}}} | |
\appto\blx@mknohyperref{\let\blx@anchor\relax} | |
% Legacy alias for \printshorthands | |
\def\printshorthands{% | |
\@ifnextchar[%] | |
{\blx@printshorthands} | |
{\blx@printshorthands[]}} | |
\def\blx@printshorthands[#1]{\printbiblist[#1]{shorthand}} | |
% Custom bibliography list | |
% [<otions>]{biblistname} | |
\newrobustcmd*{\printbiblist}[2][]{% | |
\begingroup | |
\delimcontext{biblist}% | |
\edef\on@line{\on@line}% | |
\toggletrue{blx@tempa}% | |
\toggletrue{blx@tempb}% | |
\def\blx@theheading{biblist}% default to biblist heading | |
\def\blx@theenv{#2}% default to list name | |
\def\blx@thebiblist{#2}% | |
\let\blx@theprenote\@empty | |
\let\blx@thepostnote\@empty | |
\let\blx@thetitle\@empty | |
% defaults | |
\let\blx@tempa\@empty% before there is a .bbl, this must not be undef | |
% default sorting scheme and scheme name for list is same name as list | |
% name, then current context if not found | |
\edef\blx@tempc{% | |
\ifcsdef{blx@sorting@#2} | |
{#2} | |
{\blx@refcontext@sorting}}% | |
% locally define this since we want to fetch data from the slist named | |
% after the list we are printing rather than the data in refcontext list | |
\edef\blx@refcontext@context{\blx@tempc/\blx@refcontext@sortingnamekey/\blx@refcontext@labelprefix}% | |
\edef\blx@tempd{% | |
\blx@xml@sorting | |
{\ifcsdef{blx@sortdef@locale@#2} | |
{ locale="\csuse{blx@sortdef@locale@#2}"} | |
{}} | |
{\csuse{blx@sorting@\blx@tempc}}}% | |
\let\blx@printbibchecks\relax | |
\edef\blx@tempe{\the\c@refsection}% default refsection is current | |
\blx@safe@actives | |
\blx@printbibchecks | |
% Add the sortscheme to the list of sortschemes for this biblist | |
% so we can compare on next run | |
\xifinlist\blx@tempc\blx@biblists | |
{} | |
{\listxadd\blx@biblists\blx@tempc | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@biblist{\blx@tempc}}}% | |
\edef\blx@tempd{% | |
\blx@xml@sorting{% | |
\ifcsdef{blx@sortdef@locale@\blx@tempc} | |
{ locale="\csuse{blx@sortdef@locale@\blx@tempc}"} | |
{}}{% | |
\csuse{blx@sorting@\blx@tempc}}}% | |
\setkeys{blx@biblist1}{#1}% Set section only, if present ... | |
\blx@rest@actives | |
\ifcsvoid{blx@slist@list@\blx@tempe @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@slist@list@\blx@tempe @\blx@refcontext@context}}% | |
\blx@safe@actives | |
\setkeys{blx@biblist2}{#1}% ... now we have correct \blx@tempa, set rest of options | |
\ifundef\blx@bibcheck | |
{\ifcsdef{blx@bibcheck@#2} | |
{\letcs\blx@bibcheck{blx@bibcheck@#2}} | |
{}} | |
{}% | |
\blx@rest@actives | |
\csxappto{blx@slists}{% | |
\blx@xml@slist{\blx@refcontext@context}{list}{\blx@tempe}{\blx@tempc}{\blx@refcontext@sortingnamekey}{\blx@refcontext@labelprefix}{\blx@tempd}{\csuse{blx@biblistfilters@#2}}}% | |
\ifdefvoid\blx@tempa | |
{\blx@warn@biblistempty{#2}\endgroup} | |
{\blx@biblist\blx@tempa}} | |
\def\blx@printbibchecks{% | |
\togglefalse{blx@tempa}% | |
\iftoggle{blx@defernumbers} | |
{\global\let\blx@printbibchecks\relax} | |
{\iftoggle{blx@labelnumber} | |
{} | |
{\global\let\blx@printbibchecks\relax}}} | |
% {<entrykey>,...} | |
\def\blx@biblist{% | |
\if@twocolumn | |
\@restonecoltrue\onecolumn | |
\else | |
\@restonecolfalse | |
\fi | |
\blx@langstrings | |
\blx@bibheading\blx@theheading\blx@thetitle | |
\blx@bibnote\blx@theprenote | |
\begingroup | |
\blx@bibinit | |
\let\@noitemerr\@empty | |
\def\blx@noitem{\blx@warn@biblistempty{\blx@thebiblist}}% | |
\csuse{blx@env@\blx@theenv}% | |
\csuse{blx@hook@biblistinit@\blx@thebiblist}% | |
\let\blx@do\blx@biblistitem | |
\let\blx@done\blx@endbiblist | |
\blx@listloop} | |
\def\blx@endbiblist{% | |
\csuse{blx@endenv@\blx@theenv}% | |
\blx@noitem | |
\endgroup | |
\blx@bibnote\blx@thepostnote | |
\endgroup | |
\if@restonecol\twocolumn\fi} | |
% Legacy aliases | |
\def\AtBeginShorthands{\AtBeginBiblist{shorthand}} | |
\def\AtEveryLositem{\AtEveryBiblistitem{shorthand}} | |
\@onlypreamble\AtBeginShorthands | |
\@onlypreamble\AtEveryLositem | |
% {<biblistname>} | |
\newrobustcmd*{\AtBeginBiblist}[1]{\csgappto{blx@hook@biblistinit@#1}} | |
\newrobustcmd*{\AtEveryBiblistitem}[1]{\csgappto{blx@hook@biblistitem@#1}} | |
\@onlypreamble\AtBeginBiblist | |
\@onlypreamble\AtEveryBiblistitem | |
% {<entrykey>} | |
\def\blx@biblistitem#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@getdata{#1}% | |
\blx@bibcheck | |
\iftoggle{blx@skipentry}{}{% | |
\blx@setdefaultrefcontext{#1}% | |
\global\let\blx@noitem\@empty | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\addtocounter{instcount}\@ne | |
\csuse{blx@item@\blx@theenv}\relax | |
\csuse{blx@hook@biblistitem@\blx@thebiblist}% | |
\blx@execute | |
\blx@initunit | |
\blx@beglangbib | |
\bibsentence | |
\blx@pagetracker | |
\blx@driver{\blx@thebiblist}% | |
\blx@postpunct | |
\blx@endlangbib}% | |
\endgroup} | |
{}} | |
% Just a default in case .bbx doesn't define it. standard.bbx defines | |
% it to print a complete entry, like the bibliography. | |
\DeclareBibliographyDriver{shorthand}{% | |
\iffieldundef{shorttitle} | |
{\printfield{title}} | |
{\printfield{shorttitle}}} | |
% Reference contexts | |
\newcommand*{\DeclareRefcontext}[2]{% | |
\csgdef{blx@refcontext@name@#1}{#2}} | |
\@onlypreamble\DeclareRefcontext | |
\def\newrefcontext{% | |
\endrefcontext | |
\refcontext} | |
% Backwards compat for older \refcontext[] format | |
\def\refcontext{% | |
\@ifnextchar[%] | |
{\refcontext@i} | |
{\refcontext@i[]}} | |
\def\refcontext@i[#1]{% | |
\@ifnextchar\bgroup | |
{\refcontext@ii[#1]} | |
{\refcontext@ii[#1]{}}} | |
\newcommand*{\refcontext@ii}[2][]{% | |
\iftoggle{blx@refcontext} | |
{\blx@err@nestenv{refcontext}% | |
\endrefcontext} | |
{\toggletrue{blx@refcontext}% | |
% Set refcontext from named refcontext, if given | |
\ifblank{#2} | |
{} | |
{\edef\z{\noexpand\setkeys{blx@refcontext}{\csuse{blx@refcontext@name@#2}}}\z}% | |
% Override with explicit refcontext keyvals, if given | |
\setkeys{blx@refcontext}{#1}% | |
% Add the sortscheme to the list of sortschemes so we can track | |
% special cases like sorting=none which need cite order change detection | |
\xifinlist\blx@refcontext@sorting\blx@sortschemes | |
{} | |
{\listxadd\blx@sortschemes\blx@refcontext@sorting | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@sortscheme{\blx@refcontext@sorting}}}% | |
\xdef\blx@refcontext@context{\blx@refcontext@sorting/\blx@refcontext@sortingnamekey/\blx@refcontext@labelprefix}% | |
% Add the refcontext to the list of refcontexts so we can compare on next run | |
\xifinlist\blx@refcontext@context\blx@refcontexts | |
{} | |
{\listxadd\blx@refcontexts\blx@refcontext@context | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}}}% | |
\ifcsundef{blx@sorting@\blx@refcontext@sorting} | |
{\blx@err@invopt{sorting=\blx@refcontext@sorting}{}} | |
{}% | |
\ifcsundef{blx@sortingnamekey@\blx@refcontext@sortingnamekey} | |
{\blx@err@invopt{sortingnamekeyscheme=\blx@refcontext@sortingnamekey}{}} | |
{}}} | |
% Reset to global sorting etc. when we leave a ref context (since they can't be nested) | |
\protected\def\endrefcontext{% | |
\togglefalse{blx@refcontext}% | |
\global\let\blx@refcontext@labelprefix\@empty | |
\xdef\blx@refcontext@sorting{\blx@sorting}% | |
\gdef\blx@refcontext@sortingnamekey{global}% | |
\xdef\blx@refcontext@context{\blx@refcontext@sorting/\blx@refcontext@sortingnamekey/}} | |
\define@key{blx@refcontext}{sorting}{\gdef\blx@refcontext@sorting{#1}} | |
\define@key{blx@refcontext}{sortingnamekeyscheme}{\gdef\blx@refcontext@sortingnamekey{#1}} | |
\define@key{blx@refcontext}{labelprefix}{% | |
\gdef\blx@refcontext@labelprefix{#1}% | |
\iftoggle{blx@defernumbers} | |
{}% | |
{\iftoggle{blx@labelnumber} | |
{\blx@warning{% | |
Option 'labelprefix' requires global\MessageBreak | |
'defernumbers=true'}} | |
{}}} | |
\define@key{blx@refcontext}{prefixnumbers}{%LEGACY(<3.3) | |
\blx@warning@noline{% | |
prefixnumbers option to \string\newrefcontext\space has been renamed, | |
use 'labelprefix' option instead}% | |
\setkeys{blx@refcontext}{labelprefix=#1}} | |
% [refcontext keys]{<keyword1>,<keyword2>,...} | |
\newcommand*{\assignrefcontextkeyws}{% | |
\@ifstar | |
{\blx@assignrefcontextkeyws[*]} | |
{\blx@assignrefcontextkeyws[]}} | |
\def\blx@assignrefcontextkeyws[#1][#2]#3{% | |
\edef\blx@tempa{\blx@sorting}% | |
\def\blx@tempb{global}% | |
\let\blx@tempc\@empty% | |
\setkeys{blx@assignrefcontext}{#2}% | |
\def\do##1{% | |
\listxadd\blx@assignedrefcontextkeywlist{##1}% | |
\csxdef{blx@assignedrefcontextkeyws#1@\the\c@refsection @##1}{\blx@tempa/\blx@tempb/\blx@tempc}} | |
\docsvlist{#3}} | |
% [refcontext keys]{<category1>,<category2>,...} | |
\newcommand*{\assignrefcontextcats}{% | |
\@ifstar | |
{\blx@assignrefcontextcats[*]} | |
{\blx@assignrefcontextcats[]}} | |
\def\blx@assignrefcontextcats[#1][#2]#3{% | |
\edef\blx@tempa{\blx@sorting}% | |
\def\blx@tempb{global}% | |
\let\blx@tempc\@empty% | |
\setkeys{blx@assignrefcontext}{#2}% | |
\def\do##1{% | |
\listxadd\blx@assignedrefcontextcatlist{##1}% | |
\csxdef{blx@assignedrefcontextcats#1@\the\c@refsection @##1}{\blx@tempa/\blx@tempb/\blx@tempc}} | |
\docsvlist{#3}} | |
% [refcontext keys]{<entrykey1>,<entrykey2>,...} | |
\newcommand*{\assignrefcontextentries}{% | |
\@ifstar | |
{\blx@assignrefcontextentries[*]} | |
{\blx@assignrefcontextentries[]}} | |
\def\blx@assignrefcontextentries[#1][#2]#3{% | |
\edef\blx@tempa{\blx@sorting}% | |
\def\blx@tempb{global}% | |
\let\blx@tempc\@empty% | |
\setkeys{blx@assignrefcontext}{#2}% | |
\def\do##1{% | |
\csxdef{blx@assignedrefcontextkeys#1@\the\c@refsection @##1}{\blx@tempa/\blx@tempb/\blx@tempc}}% | |
\docsvlist{#3}} | |
\define@key{blx@assignrefcontext}{sorting}{\def\blx@tempa{#1}} | |
\define@key{blx@assignrefcontext}{sortingnamekeyscheme}{\def\blx@tempb{#1}} | |
\define@key{blx@assignrefcontext}{labelprefix}{\def\blx@tempc{#1}} | |
% Reference sections | |
\newrobustcmd*{\newrefsection}{% | |
\ifnum\c@refsection>\z@ | |
\endrefsection | |
\fi | |
\refsection} | |
\let\blx@newrefsection\newrefsection | |
\newrobustcmd*{\refsection}{% | |
\begingroup | |
\edef\on@line{\on@line}% | |
\ifnum\c@refsection>\z@ | |
\blx@err@nestenv{refsection}% | |
\blx@endrefsection | |
\fi | |
\ifnum\c@refsegment>\z@ | |
\blx@err@nestenv{refsection}% | |
\blx@endrefsegment | |
\fi | |
\@ifnextchar[%] | |
{\blx@refsection} | |
{\blx@refsection[]}} | |
\def\blx@refsection{% | |
\begingroup | |
\blx@hook@fileverb | |
\blx@refsection@i} | |
\def\blx@refsection@i[#1]{% | |
\endgroup | |
\global\advance\blx@maxsection\@ne | |
\global\c@refsection\blx@maxsection | |
\xifinlist{\the\c@refsection}\blx@allrefsections | |
{} | |
{\listxadd\blx@allrefsections{\the\c@refsection}}% | |
\ifcsdef{blx@defaultrefcontexts@\the\c@refsection} | |
{} | |
{\global\cslet{blx@defaultrefcontexts@\the\c@refsection}\@empty}% | |
\expandafter\newcount\csname blx@maxsegment@\the\c@refsection\endcsname | |
\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname | |
\blx@inf@refsec | |
\blx@secinit | |
\if@filesw | |
\blx@auxwrite\@mainaux{}{% | |
\string\abx@aux@refsection{\the\c@refsection}{\the\c@page}}% | |
\ifblank{#1} | |
{} | |
{\let\blx@bibfiles\@empty | |
% globals should be first as it might contain macros needed for others | |
\forlistloop{\listadd\blx@bibfiles}\blx@bibfiles@global}% | |
\blx@xsanitizeafter{\forcsvlist\blx@refsection@addfile}{#1}% | |
\blx@refsection@ii | |
\fi | |
\blx@info{Setting label 'refsection:\the\c@refsection'}% | |
\label{refsection:\the\c@refsection}% | |
\endgroup} | |
\def\blx@refsection@addfile#1{% | |
\ifcsdef{blx@res@labl@#1} | |
{\blx@refsection@addfile@i{\csuse{blx@res@labl@#1}}} | |
{\blx@refsection@addfile@i{#1}}} | |
\def\blx@refsection@addfile@i#1{% | |
\ifcsdef{blx@res@loca@#1} | |
{\listeadd\blx@bibfiles{#1}} | |
{\listeadd\blx@bibfiles{\blx@stripbib{#1}\detokenize{.bib}}}} | |
\def\blx@refsection@ii{% | |
\blx@regbibfiles\jobname\blx@bibfiles | |
\begingroup | |
\let\blx@tempa\@empty | |
\blx@bibdata\blx@tempa\blx@bibfiles | |
\blx@auxwrite\blx@bcfout | |
{\let\do\blx@datasource} | |
{\blx@xml@endsection\blx@nl | |
\blx@xml@comment{SECTION \the\c@refsection}% | |
\blx@xml@bibdata{\the\c@refsection}{\blx@tempa}% | |
\blx@xml@section{\the\c@refsection}}% | |
\endgroup} | |
\protected\def\endrefsection{% | |
\blx@endrefsection | |
\blx@inf@refsec} | |
\def\blx@endrefsection{% | |
\blx@endrefsegment | |
% make sure we always output aliases to the .bcf otherwise after their | |
% first resolution by biber, they will be invisible to subsequent biber | |
% runs since biblatex will resolve the \keyalias{} macro to the main | |
% entry key, biber won't put \keyalias{}in the .bbl on subsequent runs | |
% and biblatex will report a missing citekey | |
\def\do##1{% | |
% Make sure this counter exists. Sometimes it might not when using, e.g: | |
% refsection=chapter and \includeonly to put in the chapters or when | |
% inserting citations into table of contents | |
\ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else | |
\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname | |
\fi | |
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne | |
\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{##1}{\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}}}% | |
\dolistcsloop{blx@keyaliases@\the\c@refsection}% | |
\ifnum\c@refsection>\z@ | |
\blx@auxwrite\blx@bcfout{}{% | |
\blx@xml@endsection\blx@nl | |
\blx@xml@comment{SECTION 0 (cont.)}% | |
\blx@xml@section{0}}% | |
\fi | |
\global\c@refsection\z@} | |
\AtEndDocument{% | |
\endrefcontext | |
\blx@endrefsection | |
\def\abx@aux@refsection#1#2{\blx@addchecksum{#1}{#2}}} | |
\protected\def\abx@aux@refsection#1#2{% | |
\ifnum#1>\blx@maxsection | |
\global\blx@maxsection#1\relax | |
\fi | |
\blx@addchecksum{#1}{#2}} | |
% Reference segments | |
\newrobustcmd*{\newrefsegment}{% | |
\ifnum\c@refsegment>\z@ | |
\blx@endrefsegment | |
\fi | |
\refsegment} | |
\let\blx@newrefsegment\newrefsegment | |
\newrobustcmd*{\refsegment}{% | |
\ifnum\c@refsegment>\z@ | |
\blx@err@nestenv{refsegment}% | |
\blx@endrefsegment | |
\fi | |
\global\advance\csname blx@maxsegment@\the\c@refsection\endcsname\@ne | |
\global\c@refsegment\csname blx@maxsegment@\the\c@refsection\endcsname | |
\blx@inf@refseg | |
\blx@info{Setting label 'refsegment:\the\c@refsection\the\c@refsegment'}% | |
\label{refsegment:\the\c@refsection\the\c@refsegment}% | |
\ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty} | |
{}} | |
\protected\def\endrefsegment{% | |
\blx@endrefsegment | |
\blx@inf@refseg} | |
\def\blx@endrefsegment{% | |
\global\c@refsegment\z@} | |
% Reference section/segment auto-reset | |
% we are prepending to the commands so that the resets happen before | |
% the part title is typeset otherwise \cites in there could be "ibid" | |
% which makes no sense | |
\def\blx@refpatch@part#1{% | |
\ifundef\part | |
{\blx@err@nodocdiv{part}} | |
{\toggletrue{blx@tempa}% | |
\def\do##1{% | |
\pretocmd##1{#1} | |
{\togglefalse{blx@tempa}\listbreak} | |
{}}% | |
\docsvlist{% | |
\H@old@part,% hyperref | |
\NR@part,% nameref | |
\@part}% latex/koma-script/memoir | |
\iftoggle{blx@tempa} | |
{\blx@err@patch{\string\@part}} | |
{}% | |
\let\do\noexpand}} | |
\def\blx@refpatch@chapter#1{% | |
\ifundef\chapter | |
{\blx@err@nodocdiv{chapter}} | |
{\pretocmd\@makechapterhead{#1} | |
{} | |
{\blx@err@patch{\string\@makechapterhead}} | |
\pretocmd\@makeschapterhead{#1} | |
{} | |
{\blx@err@patch{\string\@makeschapterhead}}}} | |
\def\blx@refpatch@sect#1{% | |
\ifcsundef{#1} | |
{\blx@err@nodocdiv{#1}\@gobbletwo} | |
{\blx@refpatch@sect@i}} | |
\edef\blx@refpatch@sect@i#1#2{% | |
\def\noexpand\do##1{% | |
\pretocmd##1% | |
{\noexpand\blx@refpatch@sect@ii{#1}{#2}{\string#2}} | |
{\togglefalse{blx@tempa}\noexpand\listbreak} | |
{}}% | |
\noexpand\blx@refpatch@sect@iii} | |
\def\blx@refpatch@sect@ii#1#2#3{% | |
\ifnumequal{#2}{#3}{#1}{}} | |
\def\blx@refpatch@sect@iii{% | |
\toggletrue{blx@tempa}% | |
\docsvlist{% order does matter: | |
\H@old@sectm@m,% memoir+hyperref (what a mess...) | |
\M@sect,% memoir | |
\H@old@sect,% hyperref | |
\NR@sect,% nameref | |
\scr@sect,% koma-script 3.x | |
\@startsection}% latex | |
\iftoggle{blx@tempa} | |
{\blx@err@patch{\string\@sect}} | |
{}% | |
\let\do\noexpand} | |
% Bibliography categories | |
\let\blx@categories\@empty | |
% {<category>} | |
\newrobustcmd*{\DeclareBibliographyCategory}[1]{% | |
\ifcsundef{blx@catg@#1} | |
{\global\cslet{blx@catg@#1}\@empty | |
\listgadd\blx@categories{#1}} | |
{\blx@error | |
{Category '#1' already declared} | |
{The bibliography category '#1'\MessageBreak | |
has already been declared}}} | |
\@onlypreamble\DeclareBibliographyCategory | |
% {<category>}{<entrykey>,...} | |
\newrobustcmd*{\addtocategory}[2]{% | |
\ifcsundef{blx@catg@#1} | |
{\blx@error | |
{Category '#1' not declared} | |
{Use \string\DeclareBibliographyCategory\space to declare}} | |
{\AfterPreamble{% | |
\blx@xsanitizeafter{\forcsvlist{\blx@addtocategory{#1}}}{#2}}}} | |
% {<category>}{<entrykey>,...} | |
\def\blx@addtocategory#1#2{% | |
% If we are adding a set member to a category, make sure we also add the | |
% set parent if it is cited. If it is cited, we should be using the set | |
% parent in the category, not the set child member. blx@setc@... will | |
% only exist if the set parent is also cited as it is only defined when a | |
% member contains \inset which only happens when the set parent is cited. | |
\ifcsdef{blx@setc@\the\c@refsection @#2} | |
{\blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}}% | |
\abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}} | |
{}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{#2}}% | |
\abx@aux@category{#1}{#2}} | |
% {<category>}{<entrykey>,...} | |
\protected\def\abx@aux@category#1#2{% | |
\xifinlistcs{\detokenize{#2}}{blx@catg@#1} | |
{} | |
{\listcsxadd{blx@catg@#1}{\detokenize{#2}}}} | |
\AtEndDocument{\let\abx@aux@category\@gobbletwo} | |
% [<options>]{<resource>,...} | |
\renewrobustcmd*{\bibliography}[1]{% | |
\begingroup | |
\def\blx@tempa{file}% | |
\def\blx@tempb{bibtex}% | |
\def\blx@tempc{local}% | |
\blx@xsanitizeafter{\forcsvlist\blx@addbib@legacy}{#1}% | |
\endgroup} | |
\@onlypreamble\bibliography | |
\def\blx@addbib@legacy#1{% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@addbib@resource{\blx@stripbib{#1}\detokenize{.bib}}}% | |
\blx@tempa} | |
\def\blx@stripbib#1{% | |
\expandafter\blx@stripbib@i\detokenize{#1.bib}&} | |
\edef\blx@stripbib@i{% | |
\def\noexpand\blx@stripbib@i##1\detokenize{.bib}##2&} | |
\blx@stripbib@i{#1} | |
% [<options>]{<resource>,...} | |
\newrobustcmd*{\addbibresource}{% | |
\blx@addbib\blx@addbib@resource} | |
\@onlypreamble\addbibresource | |
\newrobustcmd*{\addglobalbib}{% | |
\blx@addbib\blx@addbib@global} | |
\@onlypreamble\addglobalbib | |
\newrobustcmd*{\addsectionbib}{% | |
\blx@addbib\blx@addbib@register} | |
\@onlypreamble\addsectionbib | |
\def\blx@addbib#1{% | |
\@ifnextchar[%] | |
{\blx@addbib@i{#1}} | |
{\blx@addbib@i{#1}[]}} | |
\def\blx@addbib@i#1[#2]{% | |
\begingroup | |
\blx@hook@fileverb | |
\blx@addbib@ii{#1}{#2}} | |
\def\blx@addbib@ii#1#2#3{% | |
\endgroup | |
\begingroup | |
\def\blx@tempa{file}% | |
\def\blx@tempb{bibtex}% | |
\def\blx@tempc{local}% | |
\undef\blx@tempd | |
\setkeys{blx@addbib}{#2}% | |
\blx@xsanitizeafter{#1}{#3}% | |
\endgroup} | |
\def\blx@hook@fileverb{% | |
\let\do\@makeother | |
\dospecials | |
\catcode`\\=\z@ | |
\catcode`\{=\@ne | |
\catcode`\}=\tw@} | |
\define@key{blx@addbib}{type}{\def\blx@tempa{#1}} | |
\define@key{blx@addbib}{datatype}{\def\blx@tempb{#1}} | |
\define@key{blx@addbib}{location}{\def\blx@tempc{#1}} | |
\define@key{blx@addbib}{label}{\edef\blx@tempd{\detokenize{#1}}} | |
% \blx@res@type@<resource> resource -> type | |
% \blx@res@data@<resource> resource -> datatype | |
% \blx@res@loca@<resource> resource -> datatype | |
% \blx@res@labl@<resource> label -> resource | |
\def\blx@addbib@register#1{% | |
\csxdef{blx@res@type@#1}{\blx@tempa}% | |
\csxdef{blx@res@data@#1}{\blx@tempb}% | |
\csxdef{blx@res@loca@#1}{\blx@tempc}% | |
\ifdef\blx@tempd | |
{\csxdef{blx@res@labl@\blx@tempd}{#1}} | |
{}} | |
\def\blx@addbib@resource#1{% | |
\blx@addbib@register{#1}% | |
\listgadd\blx@bibfiles{#1}% | |
\blx@regbibfile\jobname{#1}} | |
\def\blx@addbib@global#1{% | |
\blx@addbib@resource{#1}% | |
\listgadd\blx@bibfiles@global{#1}} | |
\let\blx@bibfiles\@empty | |
\let\blx@bibfiles@global\@empty | |
\def\blx@bibdata#1#2{% | |
\forlistloop{\blx@bibdata@i{#1}}#2} | |
\def\blx@bibdata@i#1#2{% | |
\blx@xmlsanitizeafter{\blx@bibdata@ii{#1}{#2}}{#2}} | |
\def\blx@bibdata@ii#1#2#3{% | |
\eappto#1{% | |
\blx@xml@datasource | |
{\ifcsdef{blx@res@type@#2} | |
{\csuse{blx@res@type@#2}} | |
{file}} | |
{\ifcsdef{blx@res@data@#2} | |
{\csuse{blx@res@data@#2}} | |
{bibtex}} | |
{#3}}} | |
%% Citations | |
\newrobustcmd*{\AtEveryCite}{\gappto\blx@hook@cite} | |
\newrobustcmd*{\AtEveryCitekey}{\gappto\blx@hook@citekey} | |
\newrobustcmd*{\AtEveryMultiCite}{\gappto\blx@hook@mcite} | |
\@onlypreamble\AtEveryCite | |
\@onlypreamble\AtEveryCitekey | |
\@onlypreamble\AtEveryMultiCite | |
\newrobustcmd*{\AtEachCitekey}{% | |
\iftoggle{blx@citation}{\appto\blx@hook@citekey}{\@gobble}} | |
\def\blx@imc@UseEveryCiteHook{\csuse{blx@hook@cite}} | |
\def\blx@imc@UseEveryCitekeyHook{\csuse{blx@hook@citekey}} | |
\def\blx@imc@UseEveryMultiCiteHook{\csuse{blx@hook@mcite}} | |
\newrobustcmd*{\AtNextCite}{% | |
\ifundef\blx@hook@cite@next | |
{\gdef\blx@hook@cite@next{\global\undef\blx@hook@cite@next}} | |
{}% | |
\gappto\blx@hook@cite@next} | |
\newrobustcmd*{\AtNextCitekey}{% | |
\ifundef\blx@hook@citekey@next | |
{\gdef\blx@hook@citekey@next{\global\undef\blx@hook@citekey@next}} | |
{}% | |
\gappto\blx@hook@citekey@next} | |
\newrobustcmd*{\AtNextMultiCite}{% | |
\ifundef\blx@hook@mcite@next | |
{\gdef\blx@hook@mcite@next{\global\undef\blx@hook@mcite@next}} | |
{}% | |
\gappto\blx@hook@mcite@next} | |
\def\blx@imc@UseNextCiteHook{\csuse{blx@hook@cite@next}} | |
\def\blx@imc@UseNextCitekeyHook{\csuse{blx@hook@citekey@next}} | |
\def\blx@imc@UseNextMultiCiteHook{\csuse{blx@hook@mcite@next}} | |
\def\blx@imc@DeferNextCitekeyHook{\undef\blx@hook@citekey@next} | |
\blx@regimcs{% | |
\UseEveryCiteHook \UseEveryCitekeyHook \UseEveryMultiCiteHook | |
\UseNextCiteHook \UseNextCitekeyHook \UseNextMultiCiteHook | |
\DeferNextCitekeyHook} | |
% {<style>} | |
\newrobustcmd*{\RequireCitationStyle}[1]{% | |
\blx@inputonce{#1.cbx}{citation style '#1'}{}{}{} | |
{\blx@error | |
{Style '#1' not found} | |
{The citation style '#1' could not be found}}} | |
\@onlypreamble\RequireCitationStyle | |
% {<code>} | |
\newrobustcmd*{\InitializeCitationStyle}{\appto\blx@hook@cbxinit} | |
\@onlypreamble\InitializeCitationStyle | |
% {<code>} | |
\newrobustcmd*{\OnManualCitation}{\appto\blx@hook@mancite} | |
\@onlypreamble\OnManualCitation | |
\newrobustcmd*{\mancite}{% | |
\csuse{blx@hook@mancite}% | |
\blx@ibidreset | |
\blx@idemreset | |
\blx@opcitreset | |
\blx@loccitreset} | |
% {<entrykey>}{<message>} | |
% Just a wrapper to suppress citation tracking in toc/lof etc. | |
\def\blx@citation#1#2{% | |
\ifbool{citerequest} | |
{\blx@citation@entry{#1}{#2}} | |
{}} | |
\def\blx@citation@entry#1#2{% | |
\blx@bibreq{#1}% | |
\ifinlist{#1}\blx@cites | |
{} | |
{\listgadd{\blx@cites}{#1}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@cite{#1}}}% | |
\ifinlistcs{#1}{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{} | |
{\listcsgadd{blx@segm@\the\c@refsection @\the\c@refsegment}{#1}}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@segm{\the\c@refsection}{\the\c@refsegment}{\detokenize{#1}}}% | |
\blx@ifdata{#1} | |
{} | |
{\ifcsdef{blx@miss@\the\c@refsection} | |
{\ifinlistcs{#1}{blx@miss@\the\c@refsection} | |
{} | |
{\blx@logreq@active{#2{#1}}}} | |
{\blx@logreq@active{#2{#1}}}}} | |
\protected\def\abx@aux@segm#1#2#3{% | |
\listcsxadd{blx@segm@#1@#2}{\detokenize{#3}}} | |
\def\blx@citation@set#1#2{% | |
\blx@citation@entry{#1}{#2}% | |
\begingroup | |
\def\do##1{\blx@citation@entry{##1}\blx@msg@cundef}% | |
\expandafter\expandafter\expandafter\docsvlist | |
\expandafter\expandafter\expandafter{% | |
\csname blx@setp@\the\c@refsection @#1\endcsname}% | |
\endgroup} | |
\def\blx@citation@inset#1#2{% | |
\blx@citation@entry{#1}{#2}% | |
\expandafter\expandafter\expandafter\blx@citation@inset@i | |
\expandafter\expandafter\expandafter{% | |
\csname blx@setc@\the\c@refsection @#1\endcsname}\blx@msg@cundef} | |
\def\blx@citation@inset@i#1{% | |
\ifcsdef{blx@setp@\the\c@refsection @#1} | |
{\blx@citation@set{#1}} | |
{\blx@citation@entry{#1}}} | |
\def\blx@citation@all{% | |
\ifbool{citerequest} | |
{\blx@bibreq{*}% | |
\global\csletcs | |
{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{blx@slist@entry@\the\c@refsection @\blx@refcontext@context}% | |
\ifcsvoid{blx@slist@entry@\the\c@refsection @\blx@refcontext@context} | |
{\blx@logreq@active{}} | |
{}} | |
{}} | |
\protected\def\blx@bibreq#1{% | |
\begingroup | |
\blx@xmlsanitizeafter{\def\blx@tempa}{#1}% | |
% citeall is always order "0" - this makes no real difference as biber | |
% ignores all other citekeys in the section if citeall is present | |
\ifstrequal{*}{#1} | |
{\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{0}}} | |
{\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}}}% | |
\endgroup} | |
% {<set>}{<key1,key2,key3>} | |
\newrobustcmd*{\defbibentryset}[2]{% | |
\@bsphack | |
\begingroup | |
\blx@xsanitizeafter{\def\blx@tempa}{#1}% | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\blx@xsanitizeafter{\forcsvlist\blx@defentryset@add}{#2}% | |
\ifcsdef{blx@set@\the\c@refsection @\blx@tempa} | |
{\expandafter\ifdefequal | |
\csname blx@set@\the\c@refsection @\blx@tempa\endcsname | |
\blx@tempb | |
{} | |
{\blx@error | |
{Conflicting definitions of '\blx@tempa'} | |
{The entry set '\blx@tempa' been defined before.\MessageBreak | |
old: \blx@tempa\space = % | |
\csuse{blx@set@\the\c@refsection @\blx@tempa}\MessageBreak | |
new: \blx@tempa\space = \blx@tempb\MessageBreak | |
I'm ignoring the new definition}}} | |
{\global\cslet{blx@set@\the\c@refsection @\blx@tempa}\blx@tempb | |
\edef\blx@tempa{% | |
\AfterPreamble{\blx@setreq{\blx@tempa}{\blx@tempb}}}% | |
\blx@tempa}% | |
\endgroup | |
\@esphack} | |
\def\blx@defentryset@add#1{% | |
\edef\blx@tempb{\blx@tempb\blx@tempc#1}% | |
\def\blx@tempc{,}} | |
\protected\def\blx@setreq#1#2{% | |
\begingroup | |
\blx@xmlsanitizeafter{\def\blx@tempa}{#1}% | |
\blx@xmlsanitizeafter{\def\blx@tempb}{#2}% | |
\blx@auxwrite\blx@bcfout{}{\blx@xml@citeset{\blx@tempa}{\blx@tempb}}% | |
\endgroup} | |
% {<entrykey>,...} | |
\protected\def\blx@citeloop#1{% | |
\begingroup | |
% This must be here and not after \blx@citeadd as this changes the refcontext | |
\letcs\blx@tempb{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}% | |
% Make sure this counter exists. Sometimes it might not when using, e.g: | |
% refsection=chapter and \includeonly to put in the chapters or when | |
% inserting citations into table of contents | |
\ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else | |
\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname | |
\fi | |
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne | |
\blx@tempcnta\z@ | |
\blx@tempcntb\z@ | |
\let\blx@tempa\@empty | |
\forcsvlist\blx@citeadd{#1}% adds to \blx@tempa | |
\blx@thenotecheck | |
\ifnum\blx@tempcnta>\z@ | |
\ifnum\blx@tempcntb>\z@ | |
\multicitedelim | |
\fi | |
\else | |
\blx@postpunct@saved | |
\fi | |
% \blx@tempb is a sorted list of all cites, \blx@tempa is the list of cites to | |
% sort using this list | |
\blx@thecitesort | |
\edef\blx@tempa{\endgroup | |
\c@citecount\z@ | |
\c@citetotal\the\blx@tempcnta\relax | |
\unexpanded{\forlistloop\blx@citeprint}{\blx@tempb}}% | |
\blx@tempa} | |
\def\blx@notecheck{% | |
\ifnum\blx@tempcnta>\@ne | |
\blx@warning{% | |
Package option 'sortcites' enabled.\MessageBreak | |
Verify postnote placement}% | |
\fi} | |
\def\blx@citesort{% | |
\ifnum\blx@tempcnta>\@ne | |
\blx@filtercitesort\blx@tempb{blx@tempa}% | |
\else | |
\blx@citenosort | |
\fi} | |
\def\blx@citenosort{% | |
\let\blx@tempb\blx@tempa} | |
% {<entrykey>} | |
\def\blx@citeadd#1{% | |
\ifcsdef{blx@keyalias@\the\c@refsection @#1} | |
{\edef\blx@realkey{\csuse{blx@keyalias@\the\c@refsection @#1}}} | |
{\def\blx@realkey{#1}}% | |
\expandafter\blx@getrefcontext\expandafter{\blx@realkey}% needed for \ifdata | |
\expandafter\blx@citation\expandafter{\blx@realkey}\blx@msg@cundefon | |
\expandafter\blx@ifdata\expandafter{\blx@realkey} | |
{\advance\blx@tempcnta\@ne | |
\listeadd\blx@tempa{\blx@realkey}} | |
{\ifnum\blx@tempcntb>\z@\multicitedelim\fi | |
\expandafter\abx@missing\expandafter{\blx@realkey}% | |
\advance\blx@tempcntb\@ne}} | |
% set default refcontext for one citation key | |
% and then override with data from auto-assign \assignrefcontext* macros, if any | |
% <entrykey> | |
\def\blx@getrefcontext#1{% | |
% Save refcontext for restoration at end of \citeprint | |
\let\blx@refcontext@context@saved\blx@refcontext@context | |
% Get the default refcontext | |
% If there was one due to appearance in a bib/biblist, use it | |
% otherwise fall back on global refcontext. This can happen for cites | |
% made (a bit strangely but some styles do this) inside a biblist | |
% which never appear in any printed bib/biblist and therefore have no default | |
% refcontext defined | |
\ifcsdef{blx@assignedrefcontextbib@\the\c@refsection @#1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextbib@\the\c@refsection @#1}} | |
{\edef\blx@refcontext@context{\blx@sorting/global/}}% | |
% assignment via keyword list | |
\ifdef\blx@assignedrefcontextkeywlist | |
{\def\do##1{% | |
\blx@imc@ifentrykeyword{#1}{##1} | |
{% weak version | |
\ifboolexpr{test {\ifcsdef{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}} | |
and | |
not togl {blx@refcontext}}% inside explicit non-global refcontext | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}} | |
{}% | |
% strong version | |
\ifcsdef{blx@assignedrefcontextkeyws@\the\c@refsection @##1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws@\the\c@refsection @##1}} | |
{}} | |
{}}% | |
\dolistloop\blx@assignedrefcontextkeywlist} | |
{}% | |
% assignment via category | |
\ifdef\blx@assignedrefcontextcatlist | |
{\def\do##1{% | |
\blx@imc@ifentrycategory{#1}{##1} | |
{% weak version | |
\ifboolexpr{test {\ifcsdef{blx@assignedrefcontextcats*@\the\c@refsection @##1}} | |
and | |
not togl {blx@refcontext}}% inside explicit non-global refcontext | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextcats*@\the\c@refsection @##1}} | |
{}% | |
% strong version | |
\ifcsdef{blx@assignedrefcontextcats@\the\c@refsection @##1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextcats@\the\c@refsection @##1}} | |
{}} | |
{}}% | |
\dolistloop\blx@assignedrefcontextcatlist} | |
{}% | |
% assignment via entrykeys | |
% weak version | |
\nottoggle{blx@refcontext} | |
{\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @*} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @*}} | |
{\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @#1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @#1}} | |
{}}} | |
{}% | |
% strong version | |
\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @*} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @*}} | |
{\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @#1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @#1}} | |
{}}} | |
% {<entrykey>} | |
\protected\def\blx@citeprint#1{% | |
\blx@getrefcontext{#1}% | |
\advance\c@citecount\@ne | |
\addtocounter{instcount}\@ne | |
\ifnum\c@citecount=\@ne | |
\blx@getdata@cite{#1}% | |
\blx@precode | |
\ifnum\c@citetotal>\@ne | |
\blx@resetdata | |
\fi | |
\else | |
\blx@dlimcode | |
\fi | |
\begingroup | |
\ifnum\c@citetotal>\@ne | |
\blx@getdata@cite{#1}% | |
\fi | |
\blx@entrysetcount | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\blx@backref{#1}% | |
\blx@pagetracker | |
\csuse{blx@hook@citekey}% | |
\csuse{blx@hook@citekey@next}% | |
\blx@beglangcite | |
\blx@execute | |
\blx@loopcode | |
\blx@citecounter | |
\blx@citetracker | |
\blx@ibidtracker | |
\blx@idemtracker | |
\blx@opcittracker | |
\blx@loccittracker | |
\ifnum\c@citecount=\c@citetotal | |
\def\blx@thecheckpunct{\blx@err@nestcite\@gobble}% | |
\blx@postcode | |
\blx@postpunct@saved | |
\fi | |
\blx@endlangcite | |
\endgroup | |
\let\blx@refcontext@context\blx@refcontext@context@saved} | |
% cite counter | |
\def\blx@citecounter@global{% | |
\ifbool{@filesw} | |
{\ifbool{citetracker} | |
{\immediate\write\@mainaux{% | |
\string\abx@aux@count | |
{\the\c@refsection}{\abx@field@entrykey}}} | |
{}} | |
{}} | |
\def\blx@citecounter@context{% | |
\ifbool{@filesw} | |
{\ifbool{citetracker} | |
{\immediate\write\@mainaux{% | |
\iftoggle{blx@footnote} | |
{\string\abx@aux@fncount} | |
{\string\abx@aux@count}% | |
{\the\c@refsection}{\abx@field@entrykey}}} | |
{}} | |
{}} | |
% {<refsection>}{<entrykey>} | |
\protected\def\blx@aux@count#1#2{% | |
\csnumgdef{blx@count@#1@\detokenize{#2}}{\csuse{blx@count@#1@\detokenize{#2}}+1}} | |
\protected\def\blx@aux@fncount#1#2{% | |
\csnumgdef{blx@fncount@#1@\detokenize{#2}}{\csuse{blx@fncount@#1@\detokenize{#2}}+1}} | |
\let\abx@aux@count\@gobbletwo | |
\let\abx@aux@fncount\@gobbletwo | |
\AtEndDocument{% | |
\let\abx@aux@count\@gobbletwo | |
\let\abx@aux@fncount\@gobbletwo} | |
\protected\def\blx@setcitecounter@global{% | |
\c@citecounter0% | |
\csuse{blx@count@\the\c@refsection @\abx@field@entrykey}% | |
\relax} | |
\protected\def\blx@setcitecounter@context{% | |
\c@citecounter0% | |
\iftoggle{blx@footnote} | |
{\csuse{blx@fncount@\the\c@refsection @\abx@field@entrykey}} | |
{\csuse{blx@count@\the\c@refsection @\abx@field@entrykey}}% | |
\relax} | |
% cite tracker | |
\def\blx@citetracker@global{% | |
\ifbool{citetracker} | |
{\xifinlistcs\abx@field@entrykey{blx@bsee@\the\c@refsection} | |
{} | |
{\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}} | |
{}} | |
\def\blx@citetracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\xifinlistcs\abx@field@entrykey{blx@fsee@\the\c@refsection} | |
{} | |
{\listcsxadd{blx@fsee@\the\c@refsection}\abx@field@entrykey}} | |
{\xifinlistcs{\abx@field@entrykey}{blx@bsee@\the\c@refsection} | |
{} | |
{\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}}} | |
{}} | |
\protected\appto\abx@savetrackers{% | |
\global\csletcs{blx@saved@bsee@\the\c@refsection}{blx@bsee@\the\c@refsection}% | |
\global\csletcs{blx@saved@fsee@\the\c@refsection}{blx@fsee@\the\c@refsection}} | |
\protected\appto\abx@resttrackers{% | |
\global\csletcs{blx@bsee@\the\c@refsection}{blx@saved@bsee@\the\c@refsection}% | |
\global\csletcs{blx@fsee@\the\c@refsection}{blx@saved@fsee@\the\c@refsection}} | |
\protected\appto\abx@cleartrackers{% | |
\global\cslet{blx@saved@bsee@\the\c@refsection}\@empty | |
\global\cslet{blx@saved@fsee@\the\c@refsection}\@empty} | |
% ibidem tracker | |
\def\blx@ibidtracker@global{% | |
\ifbool{citetracker} | |
{\global\let\blx@lastkey@text\abx@field@entrykey} | |
{}} | |
\def\blx@ibidtracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\global\let\blx@lastkey@foot\abx@field@entrykey} | |
{\global\let\blx@lastkey@text\abx@field@entrykey}} | |
{}} | |
\def\blx@ibidtracker@strict{% | |
\blx@ifcitesingle | |
{\blx@ibidtracker@global} | |
{\blx@ibidreset@global}}% | |
\def\blx@ibidtracker@constrict{% | |
\blx@ifcitesingle | |
{\blx@mpfnsave | |
\blx@ibidtracker@context} | |
{\blx@ibidreset@context}}% | |
\def\blx@ibidreset@force{% | |
\global\undef\blx@lastkey@text | |
\global\undef\blx@lastkey@foot | |
\blx@mpfnreset} | |
\def\blx@ibidreset@global{% | |
\global\undef\blx@lastkey@text} | |
\def\blx@ibidreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@mpfnreset | |
\global\undef\blx@lastkey@foot} | |
{\global\undef\blx@lastkey@text}} | |
\protected\appto\abx@savetrackers{% | |
\global\let\blx@saved@lastkey@text\blx@lastkey@text | |
\global\let\blx@saved@lastkey@foot\blx@lastkey@foot} | |
\protected\appto\abx@resttrackers{% | |
\global\let\blx@lastkey@text\blx@saved@lastkey@text | |
\global\let\blx@lastkey@foot\blx@saved@lastkey@foot} | |
\protected\appto\abx@cleartrackers{% | |
\global\undef\blx@saved@lastkey@text | |
\global\undef\blx@saved@lastkey@foot} | |
% idem tracker | |
\def\blx@idemtracker@global{% | |
\ifbool{citetracker} | |
{\global\let\blx@lasthash@text\abx@field@fullhash} | |
{}} | |
\def\blx@idemtracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\global\let\blx@lasthash@foot\abx@field@fullhash} | |
{\global\let\blx@lasthash@text\abx@field@fullhash}} | |
{}} | |
\let\blx@idemtracker@strict\blx@idemtracker@global | |
\def\blx@idemtracker@constrict{% | |
\blx@mpfnsave | |
\blx@idemtracker@context} | |
\def\blx@idemreset@force{% | |
\global\undef\blx@lasthash@text | |
\global\undef\blx@lasthash@foot | |
\blx@mpfnreset} | |
\def\blx@idemreset@global{% | |
\global\undef\blx@lasthash@text} | |
\def\blx@idemreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@mpfnreset | |
\global\undef\blx@lasthash@foot} | |
{\global\undef\blx@lasthash@text}} | |
\protected\appto\abx@savetrackers{% | |
\global\let\blx@saved@lasthash@text\blx@lasthash@text | |
\global\let\blx@saved@lasthash@text\blx@lasthash@text} | |
\protected\appto\abx@resttrackers{% | |
\global\let\blx@lasthash@text\blx@saved@lasthash@text | |
\global\let\blx@lasthash@text\blx@saved@lasthash@text} | |
\protected\appto\abx@cleartrackers{% | |
\global\undef\blx@saved@lasthash@text | |
\global\undef\blx@saved@lasthash@foot} | |
% opcit tracker | |
\def\blx@opcittracker@global{% | |
\ifbool{citetracker} | |
{\blx@opcit@tracker{text}} | |
{}} | |
\def\blx@opcittracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@opcit@tracker{foot}} | |
{\blx@opcit@tracker{text}}} | |
{}} | |
\def\blx@opcittracker@strict{% | |
\blx@ifcitesingle | |
{\blx@opcittracker@global} | |
{\blx@opcitreset@global}}% | |
\def\blx@opcittracker@constrict{% | |
\blx@ifcitesingle | |
{\blx@mpfnsave | |
\blx@opcittracker@context} | |
{\blx@opcitreset@context}}% | |
\def\blx@opcit@tracker#1{% | |
\blx@imc@iffieldundef{namehash} | |
{} | |
{\global\cslet{blx@lastkey@#1@\abx@field@namehash}\abx@field@entrykey | |
\xifinlistcs\abx@field@namehash{blx@trackhash@#1} | |
{} | |
{\listcsxadd{blx@trackhash@#1}\abx@field@namehash}}} | |
\def\blx@opcit@reset#1{% | |
\begingroup | |
\def\do##1{\global\csundef{blx@lastkey@#1@##1}}% | |
\dolistcsloop{blx@trackhash@#1}% | |
\global\cslet{blx@trackhash@#1}\@empty | |
\endgroup} | |
\def\blx@opcitreset@force{% | |
\blx@opcit@reset{text}% | |
\blx@opcit@reset{foot}% | |
\blx@mpfnreset} | |
\def\blx@opcitreset@global{% | |
\blx@opcit@reset{text}} | |
\def\blx@opcitreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@opcit@reset{foot}% | |
\blx@mpfnreset} | |
{\blx@opcit@reset{text}}} | |
\let\blx@trackhash@text\@empty | |
\let\blx@trackhash@foot\@empty | |
\protected\appto\abx@savetrackers{% | |
\begingroup | |
\def\do#1{\global\csletcs{blx@saved@lastkey@text@#1}{blx@lastkey@text@#1}}% | |
\dolistloop\blx@trackhash@text | |
\global\let\blx@saved@trackhash@text\blx@trackhash@text | |
\def\do#1{\global\csletcs{blx@saved@lastkey@foot@#1}{blx@lastkey@foot@#1}}% | |
\dolistloop\blx@trackhash@foot | |
\global\let\blx@saved@trackhash@foot\blx@trackhash@foot | |
\endgroup} | |
\protected\appto\abx@resttrackers{% | |
\begingroup | |
\blx@opcit@reset{text}% | |
\global\let\blx@trackhash@text\blx@saved@trackhash@text | |
\def\do#1{\global\csletcs{blx@lastkey@text@#1}{blx@saved@lastkey@text@#1}}% | |
\dolistloop\blx@trackhash@text | |
\blx@opcit@reset{foot}% | |
\global\let\blx@trackhash@foot\blx@saved@trackhash@foot | |
\def\do#1{\global\csletcs{blx@lastkey@foot@#1}{blx@saved@lastkey@foot@#1}}% | |
\dolistloop\blx@trackhash@foot | |
\endgroup} | |
\protected\appto\abx@cleartrackers{% | |
\begingroup | |
\def\do#1{\global\csundef{blx@saved@lastkey@text@#1}}% | |
\dolistloop\blx@saved@trackhash@text | |
\global\undef\blx@saved@trackhash@text | |
\def\do#1{\global\csundef{blx@saved@lastkey@foot@#1}}% | |
\dolistloop\blx@saved@trackhash@foot | |
\global\undef\blx@saved@trackhash@foot | |
\endgroup} | |
% loccit tracker | |
\def\blx@loccittracker@global{% | |
\ifbool{citetracker} | |
{\blx@loccit@tracker{text}} | |
{}} | |
\def\blx@loccittracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@loccit@tracker{foot}} | |
{\blx@loccit@tracker{text}}} | |
{}} | |
\def\blx@loccittracker@strict{% | |
\ifbool{citetracker} | |
{\blx@loccit@stricttracker{text}} | |
{}} | |
\def\blx@loccittracker@constrict{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@mpfnsave | |
\blx@loccit@stricttracker{foot}} | |
{\blx@loccit@stricttracker{text}}} | |
{}} | |
\def\blx@loccit@tracker#1{% | |
\global\csundef{blx@lastnote@#1@\abx@field@entrykey}% | |
\blx@imc@iffieldundef{postnote} | |
{} | |
{\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote | |
\xifinlistcs\abx@field@entrykey{blx@trackkeys@#1} | |
{} | |
{\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}} | |
\def\blx@loccit@stricttracker#1{% | |
\global\csundef{blx@lastnote@#1@\abx@field@entrykey}% | |
\blx@imc@iffieldundef{postnote} | |
{} | |
{\blx@ifcitesingle | |
{\expandafter\blx@imc@ifpages | |
\expandafter{\abx@field@postnote} | |
{\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote | |
\xifinlistcs\abx@field@entrykey{blx@trackkeys@#1} | |
{} | |
{\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}} | |
{}} | |
{}}} | |
\def\blx@loccit@reset#1{% | |
\begingroup | |
\def\do##1{\global\csundef{blx@lastnote@#1@##1}}% | |
\dolistcsloop{blx@trackkeys@#1}% | |
\global\cslet{blx@trackkeys@#1}\@empty | |
\endgroup} | |
\def\blx@loccitreset@force{% | |
\blx@loccit@reset{text}% | |
\blx@loccit@reset{foot}% | |
\blx@mpfnreset} | |
\def\blx@loccitreset@global{% | |
\blx@loccit@reset{text}} | |
\def\blx@loccitreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@loccit@reset{foot}% | |
\blx@mpfnreset} | |
{\blx@loccit@reset{text}}} | |
\let\blx@trackkeys@text\@empty | |
\let\blx@trackkeys@foot\@empty | |
\protected\appto\abx@savetrackers{% | |
\begingroup | |
\def\do#1{\global\csletcs{blx@saved@lastnote@text@#1}{blx@lastnote@text@#1}}% | |
\dolistloop\blx@trackkeys@text | |
\global\let\blx@saved@trackkeys@text\blx@trackkeys@text | |
\def\do#1{\global\csletcs{blx@saved@lastnote@foot@#1}{blx@lastnote@foot@#1}}% | |
\dolistloop\blx@trackkeys@foot | |
\global\let\blx@saved@trackkeys@foot\blx@trackkeys@foot | |
\endgroup} | |
\protected\appto\abx@resttrackers{% | |
\begingroup | |
\blx@loccit@reset{text}% | |
\global\let\blx@trackkeys@text\blx@saved@trackkeys@text | |
\def\do#1{\global\csletcs{blx@lastnote@text@#1}{blx@saved@lastnote@text@#1}}% | |
\dolistloop\blx@trackkeys@text | |
\blx@loccit@reset{foot}% | |
\global\let\blx@trackkeys@foot\blx@saved@trackkeys@foot | |
\def\do#1{\global\csletcs{blx@lastnote@foot@#1}{blx@saved@lastnote@foot@#1}}% | |
\dolistloop\blx@trackkeys@foot | |
\endgroup} | |
\protected\appto\abx@cleartrackers{% | |
\begingroup | |
\def\do#1{\global\csundef{blx@saved@lastnote@text@#1}}% | |
\dolistloop\blx@saved@trackkeys@text | |
\global\undef\blx@saved@trackkeys@text | |
\def\do#1{\global\csundef{blx@saved@lastnote@foot@#1}}% | |
\dolistloop\blx@saved@trackkeys@foot | |
\global\undef\blx@saved@trackkeys@foot | |
\endgroup} | |
\def\blx@addbackref#1{% | |
\ifcsdef{blx@setp@\the\c@refsection @#1} | |
{\ifcase\blx@backrefsetstyle | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@ii{setp}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setp}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setp}{#1}% | |
\fi} | |
{\ifcsdef{blx@setc@\the\c@refsection @#1} | |
{\ifcase\blx@backrefsetstyle | |
\blx@addbackref@ii{setc}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setc}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setc}{#1}% | |
\fi} | |
{\blx@addbackref@i{#1}}}} | |
\def\blx@addbackref@i#1{% | |
\ifbacktracker | |
\blx@leavevmode | |
\if@filesw | |
\protected@write\@mainaux{}{\string\abx@aux@backref | |
{\the\c@instcount}{#1}{\the\c@refsection}% | |
{\thepage}{\noexpand\the\c@page}}% | |
\fi | |
\fi} | |
\def\blx@addbackref@ii#1#2{% | |
\expandafter\expandafter\expandafter\forcsvlist | |
\expandafter\expandafter\expandafter\blx@addbackref@i | |
\expandafter\expandafter\expandafter{% | |
\csname blx@#1@\the\c@refsection @#2\endcsname}} | |
% {<instcount>}{<entrykey>}{<refsection>}{<page>}{<page int>} | |
\protected\def\blx@aux@backref#1#2#3#4#5{% | |
\ifcsundef{blx@pref@#3@\detokenize{#2}} | |
{\global\cslet{blx@pref@#3@\detokenize{#2}}\@empty | |
\expandafter\blx@onlypreamble\csname blx@pref@#3@\detokenize{#2}\endcsname} | |
{}% | |
\ifinlistcs{#4}{blx@pref@#3@\detokenize{#2}} | |
{} | |
{\listcsgadd{blx@pref@#3@\detokenize{#2}}{#4}}% | |
\blx@addpagesum{#1}{#5}} | |
\AtEndDocument{% | |
\def\abx@aux@backref#1#2#3#4#5{\blx@addpagesum{#1}{#5}}} | |
% {<true>}{<false>} | |
\def\blx@ifcitesingle{% | |
\ifnum\c@citetotal=\@ne | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% hyperref interface | |
\appto\blx@mkhyperref{% | |
\protected\def\blx@imc@bibhyperref{% | |
\@ifnextchar[%] | |
{\blx@bibhyperref} | |
{\blx@bibhyperref[\abx@field@entrykey]}}% | |
\ifundef\hyper@natanchorstart | |
{\long\def\blx@bibhyperref[#1]#2{% | |
\blx@sfsave\hyperlink{cite.\the\c@refsection @#1}{\blx@sfrest | |
#2% | |
\blx@sfsave}\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhyperlink#1#2{% | |
\blx@sfsave\hyperlink{cite.\the\c@refsection:#1}{\blx@sfrest | |
#2% | |
\blx@sfsave}\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhypertarget#1#2{% | |
\blx@sfsave\hypertarget{cite.\the\c@refsection:#1}{\blx@sfrest | |
#2% | |
\blx@sfsave}\blx@sfrest}}% | |
{\long\def\blx@bibhyperref[#1]#2{% | |
\blx@sfsave\hyper@natlinkstart{\the\c@refsection @#1}\blx@sfrest | |
#2% | |
\blx@sfsave\hyper@natlinkend\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhyperlink#1#2{% | |
\blx@sfsave\hyper@natlinkstart{\the\c@refsection:#1}\blx@sfrest | |
#2% | |
\blx@sfsave\hyper@natlinkend\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhypertarget#1#2{% | |
\blx@sfsave\hyper@natanchorstart{\the\c@refsection:#1}\blx@sfrest | |
#2% | |
\blx@sfsave\hyper@natanchorend\blx@sfrest}} | |
\let\blx@imc@ifhyperref\@firstoftwo | |
\def\blx@sf{\spacefactor}% | |
\def\blx@sfsave{% | |
\blx@leavevmode | |
\numgdef\blx@sf{\spacefactor}}% | |
\def\blx@sfrest{% | |
\ifhmode\spacefactor\blx@sf\relax\fi | |
\gdef\blx@sf{\spacefactor}}} | |
\appto\blx@mknohyperref{% | |
\protected\def\blx@imc@bibhyperref{\@ifnextchar[\blx@nohyperref\@firstofone}% | |
\def\blx@nohyperref[#1]#2{#2}% | |
\let\blx@imc@bibhyperlink\@secondoftwo | |
\let\blx@imc@bibhypertarget\@secondoftwo | |
\let\blx@imc@ifhyperref\@secondoftwo} | |
\blx@regimcs{% | |
\bibhyperref \bibhyperlink \bibhypertarget \ifhyperref} | |
% {<entrykey>,...} | |
\protected\def\nocite#{\blx@nocite} | |
\def\blx@nocite#1{% | |
\@bsphack | |
\AfterPreamble{% | |
\iftoggle{blx@bibliography} | |
{} | |
{\ifstrequal{*}{#1} | |
{\blx@citation@all} | |
{\blx@xsanitizeafter{\forcsvlist\blx@nocite@do}{#1}}}}% | |
\@esphack} | |
\def\blx@nocite@do#1{% | |
% Make sure this counter exists. Sometimes it might not when using, e.g: | |
% refsection=chapter and \includeonly to put in the chapters or when | |
% inserting citations into table of contents | |
\ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else | |
\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname | |
\fi | |
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne | |
\blx@citation{#1}\blx@msg@cundef} | |
% {<macro>}[<arg1>][<arg2>]{<arg3>} | |
% => <macro>{<arg1>}{<arg2>}{<arg3>} | |
\protected\def\blx@citeargs#1{% | |
\@ifnextchar[%] | |
{\blx@citeargs@i{#1}} | |
{\blx@citeargs@iii{#1{}{}}}} | |
\long\def\blx@citeargs@i#1[#2]{% | |
\@ifnextchar[%] | |
{\blx@citeargs@ii{#1{#2}}} | |
{\blx@citeargs@iii{#1{}{#2}}}} | |
\long\def\blx@citeargs@ii#1[#2]{% | |
\blx@citeargs@iii{#1{#2}}} | |
\long\def\blx@citeargs@iii#1#2{% | |
\blx@xsanitizeafter{#1}{#2}} | |
% {<macro>}(<arg1>)(<arg2>) | |
% => <macro>{<arg1>}{<arg2>} | |
\protected\def\blx@multiargs#1{% | |
\@ifnextchar(%) | |
{\blx@multiargs@i{#1}} | |
{#1{}{}}} | |
\long\def\blx@multiargs@i#1(#2){% | |
\@ifnextchar(%) | |
{\blx@multiargs@ii{#1{#2}}} | |
{#1{}{#2}}} | |
\long\def\blx@multiargs@ii#1(#2){#1{#2}} | |
% {<macro>}[<arg1>][<arg2>]{<arg3>}<punct> | |
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<punctcmd>} | |
\protected\def\blx@citepunct#1{% | |
\blx@citeargs{\blx@citepunct@i{#1}}} | |
\long\def\blx@citepunct@i#1#2#3#4{% | |
\blx@thecheckpunct{#1{#2}{#3}{#4}}} | |
% {<csname>}[<arg1>][<arg2>]{arg3}[arg4]{arg5}<punct> | |
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<arg4>}{arg5}{<punctcmd>} | |
\protected\def\blx@citexpunct#1{% | |
\blx@citeargs{\blx@citexpunct@i{#1}}} | |
\long\def\blx@citexpunct@i#1#2#3#4{% | |
\@ifnextchar[%] | |
{\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}} | |
{\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}[#1]}} | |
\long\def\blx@citexpunct@ii#1#2[#3]#4{% | |
\blx@thecheckpunct{\blxcitecmd{#1}#2{#3}{#4}}} | |
% {<code>}<punct> => <code>{<punctcmd>} | |
\long\def\blx@checkpunct#1{% | |
\begingroup | |
\def\blx@tempa{\endgroup#1}% | |
\futurelet\blx@tempb\blx@checkpunct@i} | |
\def\blx@checkpunct@i{% | |
\expandafter\blx@checkpunct@ii\blx@autopunct&} | |
\def\blx@checkpunct@ii#1{% | |
\ifx#1&% | |
\expandafter\blx@checkpunct@iii | |
\fi | |
\ifx#1\blx@tempb | |
\expandafter\blx@checkpunct@iv | |
\fi | |
\blx@checkpunct@ii} | |
\def\blx@checkpunct@iii#1\blx@checkpunct@ii{% | |
\global\undef\abx@field@postpunct | |
\blx@tempa{\blx@postpunct}} | |
\def\blx@checkpunct@iv#1\blx@checkpunct@ii#2{% | |
\gdef\abx@field@postpunct{#3}% | |
\edef\blx@tempa{% | |
\expandonce\blx@tempa{% | |
\ifcsdef{blx@pm@\detokenize{#3}} | |
{\csname blx@imc@add\csname blx@pm@\detokenize{#3}\endcsname | |
\endcsname} | |
{\noexpand#3}}}% | |
\blx@tempa} | |
\long\def\blx@nocheckpunct#1{#1{}} | |
\protected\def\blx@citeinit{% | |
\iftoggle{blx@bibliography} | |
{} | |
{\toggletrue{blx@citation}}% | |
\blx@blxinit | |
\blx@langstrings | |
\citesetup | |
\blx@setsfcodes | |
\blx@postpunct@agroup | |
\blx@resetdata | |
\blx@leavevmode | |
\csuse{blx@hook@cite}% | |
\csuse{blx@hook@cite@next}% | |
\let\blx@citeinit\blx@resetdata} | |
\protected\def\blx@citecmdinit{% | |
\blx@leavevmode@cite | |
\iftoggle{blx@bibliography} | |
{} | |
{\blx@initunit}} | |
% *{<command>}[<wrapper>]{<precode>}{<loopcode>}{<delimcode>}{<postcode>} | |
\newrobustcmd*{\DeclareCiteCommand}{% | |
\@ifstar{\blx@defcitecmd*}{\blx@defcitecmd{}}} | |
\def\blx@defcitecmd#1#2{% | |
\begingroup | |
\escapechar\m@ne | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@defcitecmd@i{#1}{\string#2}}% | |
\blx@tempa} | |
\def\blx@defcitecmd@i#1#2{% | |
\blx@checkcitecmd{#2}{#1}% | |
\protected\csdef{#2}{% | |
\blx@citecmdinit | |
\@ifstar | |
{\blx@citepunct{\blxcitecmd{#2*}}} | |
{\blx@citepunct{\blxcitecmd{#2}}}}% | |
\@ifnextchar[%] | |
{\blx@defcitecmd@iii{#2#1}} | |
{\blx@defcitecmd@ii{#2#1}}} | |
\long\def\blx@defcitecmd@ii#1{% | |
\protected\csedef{blx@cite@#1}{\blxciteicmd{#1}}% | |
\blx@defcitecmd@iv{#1}} | |
\long\def\blx@defcitecmd@iii#1[#2]{% | |
\protected\long\csedef{blx@cite@#1}##1##2##3##4{% | |
\begingroup | |
\blx@citeinit | |
\unexpanded{#2}{\blxciteicmd{#1}{##1}{##2}{##3}{}}% | |
##4\endgroup}% | |
\blx@defcitecmd@iv{#1}} | |
\long\def\blx@defcitecmd@iv#1#2#3#4#5{% | |
\protected\long\csdef{blx@citei@#1}##1##2##3##4{% | |
\ifblank{##1} | |
{} | |
{\def\abx@field@prenote{##1}}% | |
\ifblank{##2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{##2}}% | |
\def\blx@precode{\delimcontext{#1}#2}% | |
\def\blx@loopcode{#3}% | |
\def\blx@dlimcode{#4}% | |
\def\blx@postcode{#5}% | |
\def\blx@postpunct@saved{##4}% | |
\blx@citeloop{##3}% | |
\endgroup}} | |
% {<type>}{<name>}{*} | |
\def\blx@checkcitecmd#1#2{% | |
\ifblank{#2} | |
{\ifcsdef{blx@cite@#1} | |
{\blx@info{Redefining '\@backslashchar#1'}} | |
{\ifcsundef{#1} | |
{} | |
{\blx@warning@noline{Redefining '\@backslashchar#1'}}}% | |
\ifcsdef{blx@cite@#1*} | |
{} | |
{\csedef{blx@cite@#1*}{% | |
\expandafter\noexpand\csname blx@cite@#1\endcsname}% | |
\csedef{blx@citei@#1*}{% | |
\expandafter\noexpand\csname blx@citei@#1\endcsname}}} | |
{\ifcsdef{blx@cite@#1} | |
{} | |
{\csdef{blx@cite@#1}{\blx@err@citecmd{#1}}% | |
\csdef{blx@citei@#1}{\blx@err@citecmd{#1}}}}} | |
% {<name>}{prenote}{postnote}{citekey}{punct} | |
\newrobustcmd*{\blxcitecmd}[1]{% | |
\ifcsundef{blx@cite@#1} | |
{\blx@err@citecmd{#1}} | |
{\csuse{blx@cite@#1}}} | |
\newrobustcmd*{\blxciteicmd}[1]{% | |
\begingroup | |
\blx@citeinit | |
\ifcsundef{blx@citei@#1} | |
{\blx@err@citecmd{#1}} | |
{\csuse{blx@citei@#1}}} | |
% {<multicitecount>}{<name>}{prenote}{postnote}{citekey}{punct} | |
\protected\def\blxmciteicmd#1{% | |
\c@multicitecount#1\relax | |
\blxciteicmd} | |
% {<multicitetotal>}{<multiprenote>}{<multipostnote>} | |
\protected\def\blxmcites#1#2#3{% | |
\begingroup | |
\blx@citeinit | |
\c@multicitecount\z@ | |
\c@multicitetotal#1\relax | |
\ifnum\c@multicitetotal>\@ne | |
\let\blx@ifcitesingle\@secondoftwo | |
\fi | |
\csuse{blx@hook@mcite}% | |
\csuse{blx@hook@mcite@next}% | |
\ifblank{#2}% | |
{} | |
{\def\abx@field@multiprenote{#2}}% | |
\ifblank{#3}% | |
{} | |
{\def\abx@field@multipostnote{#3}}% | |
\usebibmacro{multiprenote}} | |
\protected\def\blxendmcites{% | |
\usebibmacro{multipostnote}% | |
\endgroup} | |
% {<command>}[<wrapper>]{<cite>}{<delimiter>} | |
\newrobustcmd{\DeclareMultiCiteCommand}[1]{% | |
\ifundef#1% | |
{} | |
{\blx@info{Redefining '\string#1'}}% | |
\@ifnextchar[%] | |
{\blx@defmcitecmd{#1}} | |
{\blx@defmcitecmd{#1}[\@firstofone]}} | |
\def\blx@defmcitecmd#1[#2]#3#4{% | |
\begingroup | |
\escapechar\m@ne | |
\edef\blx@tempa{\endgroup | |
\protected\def\noexpand#1{% | |
\blx@citecmdinit | |
\noexpand\@ifstar | |
{\expandafter\noexpand | |
\csname blx@mcite@\string#1\endcsname*% | |
\expandafter\noexpand | |
\csname blx@mcitei@\string#1\endcsname} | |
{\expandafter\noexpand | |
\csname blx@mcite@\string#1\endcsname{}% | |
\expandafter\noexpand | |
\csname blx@mcitei@\string#1\endcsname}}% | |
\protected\csdef{blx@mcite@\string#1}####1####2{% | |
\begingroup | |
\blx@citeinit | |
\noexpand\blx@multicite | |
####2% | |
{\unexpanded{#2}}% | |
{\string#3####1}% | |
{\unexpanded{#4}}}% | |
\protected\long\csdef{blx@mcitei@\string#1}}% | |
\blx@tempa##1##2##3{##1{##2}##3\endgroup}} | |
% {<command>}{<wrapper>}{<citecmd>}{<delimiter>} => | |
% <init><command>{<wrapper>}{<cites>}{<punct>} | |
\def\blx@multicite#1#2#3#4{% | |
\begingroup | |
\csuse{blx@hook@mcite@before}% | |
\def\blx@tempa{#1}% | |
\def\blx@tempb{#2}% | |
\def\blx@tempc{#3}% | |
\def\blx@tempd{#4}% | |
\c@multicitetotal\z@ | |
\blx@multiargs\blx@multicite@i} | |
\def\blx@multicite@i#1#2{% | |
\ifblank{#1}% | |
{\let\abx@field@multiprenote\@empty}% | |
{\def\abx@field@multiprenote{#1}}% | |
\ifblank{#2}% | |
{\let\abx@field@multipostnote\@empty}% | |
{\def\abx@field@multipostnote{#2}}% | |
\let\blx@tempe\@empty | |
\let\blx@tempf\@empty | |
\togglefalse{blx@tempa}% | |
\blx@multiparse} | |
\def\blx@multicite@add#1#2#3{% | |
\togglefalse{blx@tempa}% | |
\advance\c@multicitetotal\@ne | |
\eappto\blx@tempe{% | |
\expandonce\blx@tempf | |
\blxmciteicmd{\the\c@multicitetotal}% | |
{\expandonce\blx@tempc}\unexpanded{{#1}{#2}{#3}}{}}% | |
\let\blx@tempf\blx@tempd | |
\blx@multiparse} | |
\def\blx@multicite@end#1{% | |
\edef\blx@tempa{\endgroup | |
\expandonce\blx@tempa | |
{\expandonce\blx@tempb}% | |
{\blxmcites | |
{\the\c@multicitetotal}% | |
{\expandonce\abx@field@multiprenote}% | |
{\expandonce\abx@field@multipostnote}% | |
\expandonce\blx@tempe | |
\blxendmcites}% | |
{#1}% | |
\iftoggle{blx@tempa}{\relax\space}{}}% | |
\blx@tempa} | |
\def\blx@multiparse{% | |
\futurelet\@let@token\blx@multiparse@i} | |
\def\blx@multiparse@i{% | |
\ifx\@let@token\relax | |
\blx@multiparse@ii{\blx@multicite@end{}}% | |
\fi | |
\ifx\@let@token[%] | |
\blx@multiparse@ii{\blx@citeargs\blx@multicite@add}% | |
\fi | |
\ifx\@let@token\bgroup | |
\blx@multiparse@ii{\blx@citeargs\blx@multicite@add}% | |
\fi | |
\ifx\@let@token\@sptoken | |
\blx@multiparse@ii\blx@multiparse@iii | |
\fi | |
\iftrue | |
\iftoggle{blx@tempa} | |
{\blx@multiparse@ii{\blx@multicite@end{}}} | |
{\blx@multiparse@ii{\blx@thecheckpunct\blx@multicite@end}}% | |
\fi | |
&} | |
\def\blx@multiparse@ii#1#2&{\fi#1} | |
\csdef{blx@multiparse@iii} {\toggletrue{blx@tempa}\blx@multiparse} | |
% {<name>}[l|i|r]{<cite>}{<multicite>} | |
\newrobustcmd*{\DeclareAutoCiteCommand}[1]{% | |
\ifcsundef{blx@acite@#1} | |
{} | |
{\blx@info{Redefining autocite command '#1'}}% | |
\@ifnextchar[%] | |
{\blx@defautocmd@i{#1}} | |
{\blx@defautocmd@i{#1}[r]}} | |
\def\blx@defautocmd@i#1[#2]#3#4{% | |
\begingroup | |
\escapechar\m@ne | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@defautocmd@ii{#1}{#2}% | |
{\string#3}{\string#4}}% | |
\blx@tempa} | |
\def\blx@defautocmd@ii#1#2#3#4{% | |
\protected\csedef{blx@acite@#1}{% | |
\blx@citecmdinit | |
\noexpand\@ifstar | |
{\blx@citepunct{\expandafter\noexpand | |
\csname blx@acitei@#1\endcsname*}} | |
{\blx@citepunct{\expandafter\noexpand | |
\csname blx@acitei@#1\endcsname{}}}}% | |
\protected\csedef{blx@acitei@#1}##1##2##3##4##5{% | |
\begingroup | |
\blx@citeinit | |
\if l#2\noexpand\unspace##5\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##5}\fi | |
\blxcitecmd{#3##1}{##2}{##3}{##4}{}% | |
\if r#2##5\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{##5}{}\fi | |
\endgroup}% | |
\protected\csedef{blx@macite@#1}{% | |
\blx@citecmdinit | |
\noexpand\@ifstar | |
{\expandafter\noexpand | |
\csname blx@mcite@#4\endcsname*% | |
\expandafter\noexpand | |
\csname blx@macitei@#1\endcsname} | |
{\expandafter\noexpand | |
\csname blx@mcite@#4\endcsname{}% | |
\expandafter\noexpand | |
\csname blx@macitei@#1\endcsname}}% | |
\protected\csedef{blx@macitei@#1}##1##2##3{% | |
\if l#2\noexpand\unspace##3\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##3}\fi | |
##1{##2}% | |
\if r#2##3\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{##3}{}\fi | |
\endgroup}} | |
% {<characters>} | |
\newrobustcmd*{\DeclareAutoPunctuation}[1]{% | |
\ifblank{#1} | |
{\let\blx@thecheckpunct\blx@nocheckpunct} | |
{\let\blx@thecheckpunct\blx@checkpunct | |
\def\blx@autopunct{#1}}} | |
\AfterEndPreamble{% babel | |
\begingroup | |
\makeatletter | |
\endlinechar\m@ne | |
\scantokens\expandafter{% | |
\expandafter\gdef | |
\expandafter\blx@autopunct | |
\expandafter{\blx@autopunct}}% | |
\endgroup} | |
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<namelist>}<punct> | |
\newrobustcmd*{\citename}{\blx@citexpunct{citename}} | |
\long\csdef{blx@cite@citename}#1#2#3#4#5#6{% | |
\begingroup | |
\blx@citecmdinit | |
\blx@citeinit | |
\ifblank{#1} | |
{} | |
{\def\abx@field@prenote{#1}}% | |
\ifblank{#2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{#2}}% | |
\def\blx@precode{\usebibmacro{prenote}}% | |
\def\blx@loopcode{% | |
\ifnameundef{#5} | |
{\blx@warning@entry{'#5' undefined or not a name list}% | |
\abx@missing{#5}} | |
{\printnames[#4]{#5}}}% | |
\def\blx@dlimcode{\multicitedelim}% | |
\def\blx@postpunct@saved{#6}% | |
\ifblank{#2} | |
{\let\blx@postcode\@empty} | |
{\def\blx@postcode{\usebibmacro{postnote}}}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\blx@citeloop{#3}% | |
\endgroup} | |
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<list>}<punct> | |
\newrobustcmd*{\citelist}{\blx@citexpunct{citelist}} | |
\long\csdef{blx@cite@citelist}#1#2#3#4#5#6{% | |
\begingroup | |
\blx@citecmdinit | |
\blx@citeinit | |
\ifblank{#1} | |
{} | |
{\def\abx@field@prenote{#1}}% | |
\ifblank{#2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{#2}}% | |
\def\blx@precode{\usebibmacro{prenote}}% | |
\def\blx@loopcode{% | |
\iflistundef{#5} | |
{\blx@warning@entry{'#5' undefined or not a literal list}% | |
\abx@missing{#5}} | |
{\printlist[#4]{#5}}}% | |
\def\blx@dlimcode{\multicitedelim}% | |
\def\blx@postpunct@saved{#6}% | |
\ifblank{#2} | |
{\let\blx@postcode\@empty} | |
{\def\blx@postcode{\usebibmacro{postnote}}}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\blx@citeloop{#3}% | |
\endgroup} | |
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<field>}<punct> | |
\newrobustcmd*{\citefield}{\blx@citexpunct{citefield}} | |
\long\csdef{blx@cite@citefield}#1#2#3#4#5#6{% | |
\begingroup | |
\blx@citecmdinit | |
\blx@citeinit | |
\ifblank{#1} | |
{} | |
{\def\abx@field@prenote{#1}}% | |
\ifblank{#2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{#2}}% | |
\def\blx@precode{\usebibmacro{prenote}}% | |
\def\blx@loopcode{% | |
\iffieldundef{#5} | |
{\blx@warning@entry{'#5' undefined or not a field}% | |
\abx@missing{#5}} | |
{\printfield[#4]{#5}}}% | |
\def\blx@dlimcode{\multicitedelim}% | |
\def\blx@postpunct@saved{#6}% | |
\ifblank{#2} | |
{\let\blx@postcode\@empty} | |
{\def\blx@postcode{\usebibmacro{postnote}}}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\blx@citeloop{#3}% | |
\endgroup} | |
\renewrobustcmd*{\cite}{\blx@err@citecmd\cite} | |
\let\blx@cite@cite\relax | |
\newrobustcmd*{\parencite}{\blx@warn@citecmd\parencite\cite} | |
\let\blx@cite@parencite\relax | |
\newrobustcmd*{\footcite}{\blx@warn@citecmd\footcite\cite} | |
\let\blx@cite@footcite\relax | |
\newrobustcmd*{\footcitetext}{\blx@warn@citecmd\footcitetext\cite} | |
\let\blx@cite@footcitetext\relax | |
\newrobustcmd*{\smartcite}{\blx@warn@citecmd\smartcite\cite} | |
\let\blx@cite@smartcite\relax | |
\newrobustcmd*{\textcite}{\blx@warn@citecmd\textcite\cite} | |
\let\blx@cite@textcite\relax | |
\newrobustcmd*{\supercite}{\blx@warn@citecmd\supercite\cite} | |
\let\blx@cite@supercite\relax | |
%% ifthen interface | |
\def\blx@TE#1#2{% | |
\TE@throw | |
\unexpanded{% | |
\iftrue\@nameuse{fi}% | |
#1{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2} | |
\def\blx@xTE#1#2{% | |
\TE@throw | |
\unexpanded{\iftrue\@nameuse{fi}}% | |
#1\unexpanded{{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2} | |
\let\blx@TE@hook\@empty | |
\appto\blx@blxinit{% | |
\appto\blx@TE@hook{% | |
\def\ifhyperref{\blx@TE\blx@imc@ifhyperref}% | |
\def\ifmorenames{\blx@TE\blx@imc@ifmorenames}% | |
\def\ifmoreitems{\blx@TE\blx@imc@ifmoreitems}% | |
\def\iffirstcitekey{\blx@TE\blx@imc@iffirstcitekey}% | |
\def\iflastcitekey{\blx@TE\blx@imc@iflastcitekey}% | |
\def\ifciteseen{\blx@TE\blx@imc@ifciteseen}% | |
\def\ifentryseen{\blx@TE\blx@imc@ifentryseen}% | |
\def\ifentryinbib{\blx@TE\blx@imc@ifentryinbib}% | |
\def\ifciteibid{\blx@TE\blx@imc@ifciteibid}% | |
\def\ifciteidem{\blx@TE\blx@imc@ifciteidem}% | |
\def\ifopcit{\blx@TE\blx@imc@ifopcit}% | |
\def\ifloccit{\blx@TE\blx@imc@ifloccit}% | |
\def\ifsamepage{\blx@TE\blx@imc@ifsamepage}% | |
\def\iffirstonpage{\blx@TE\blx@imc@iffirstonpage}% | |
\def\ifcurrentfield#1{\blx@TE{\blx@imc@ifcurrentfield{#1}}}% | |
\def\ifcurrentlist#1{\blx@TE{\blx@imc@ifcurrentlist{#1}}}% | |
\def\ifcurrentname#1{\blx@TE{\blx@imc@ifcurrentname{#1}}}% | |
\def\ifentrytype#1{\blx@TE{\blx@imc@ifentrytype{#1}}}% | |
\def\iffieldequalcs#1#2{\blx@TE{\blx@imc@iffieldequalcs{#1}{#2}}}% | |
\def\iffieldequals#1#2{\blx@TE{\blx@imc@iffieldequals{#1}{#2}}}% | |
\def\iffieldequalstr#1#2{\blx@TE{\blx@imc@iffieldequalstr{#1}{#2}}}% | |
\def\iffieldsequal#1#2{\blx@TE{\blx@imc@iffieldsequal{#1}{#2}}}% | |
\def\ifbibmacroundef#1{\blx@TE{\blx@imc@ifbibmacroundef{#1}}}% | |
\def\iffieldundef#1{\blx@TE{\blx@imc@iffieldundef{#1}}}% | |
\def\ifnameequalcs#1#2{\blx@TE{\blx@imc@ifnameequalcs{#1}{#2}}}% | |
\def\ifnameequals#1#2{\blx@TE{\blx@imc@ifnameequals{#1}{#2}}}% | |
\def\ifnamesequal#1#2{\blx@TE{\blx@imc@ifnamesequal{#1}{#2}}}% | |
\def\ifnameundef#1{\blx@TE{\blx@imc@ifnameundef{#1}}}% | |
\def\ifcategory#1{\blx@TE{\blx@imc@ifcategory{#1}}}% | |
\def\ifkeyword#1{\blx@TE{\blx@imc@ifkeyword{#1}}}% | |
\def\ifentrycategory#1#2{\blx@TE{\blx@imc@ifentrycategory{#1}{#2}}}% | |
\def\ifentrykeyword#1#2{\blx@TE{\blx@imc@ifentrykeyword{#1}{#2}}}% | |
\def\ifcapital{\blx@TE\blx@imc@ifcapital}% | |
\def\ifinteger#1{\blx@TE{\blx@imc@ifinteger{#1}}}% | |
\def\iffieldint#1{\blx@TE{\blx@imc@iffieldint{#1}}}% | |
\def\ifnumeral#1{\blx@TE{\blx@imc@ifnumeral{#1}}}% | |
\def\ifnumerals#1{\blx@TE{\blx@imc@ifnumerals{#1}}}% | |
\def\ifpages#1{\blx@TE{\blx@imc@ifpages{#1}}}% | |
\def\iffieldnum#1{\blx@TE{\blx@imc@iffieldnum{#1}}}% | |
\def\iffieldnums#1{\blx@TE{\blx@imc@iffieldnums{#1}}}% | |
\def\iffieldpages#1{\blx@TE{\blx@imc@iffieldpages{#1}}}% | |
\def\ifbibstring#1{\blx@TE{\blx@imc@ifbibstring{#1}}}% | |
\def\iffieldbibstring#1{\blx@TE{\blx@imc@iffieldbibstring{#1}}}% | |
\def\ifnatbibmode{\blx@TE{\iftoggle{blx@natbib}}}% | |
\def\ifcitation{\blx@TE{\iftoggle{blx@citation}}}% | |
\def\ifbibliography{\blx@TE{\iftoggle{blx@bibliography}}}% | |
\def\ifciteindex{\blx@TE{\iftoggle{blx@citeindex}}}% | |
\def\ifbibindex{\blx@TE{\iftoggle{blx@bibindex}}}% | |
\def\iffootnote{\blx@TE{\iftoggle{blx@footnote}}}% | |
\def\ifuseprefix{\blx@TE{\iftoggle{blx@useprefix}}}% | |
\def\ifterseinits{\blx@TE{\iftoggle{blx@terseinits}}}% | |
\def\ifsingletitle{\blx@TE{\iftoggle{abx@bool@singletitle}}}% | |
\def\ifuniquetitle{\blx@TE{\iftoggle{abx@bool@uniquetitle}}}% | |
\def\ifuniquebaretitle{\blx@TE{\iftoggle{abx@bool@uniquebaretitle}}}% | |
\def\ifuniquework{\blx@TE{\iftoggle{abx@bool@uniquework}}}% | |
\def\ifuniqueprimaryauthor{\blx@TE{\iftoggle{abx@bool@uniqueprimaryauthor}}}% | |
\def\ifandothers#1{\blx@TE{\iftoggle{abx@bool@more#1}}}}} | |
% {<listmacro>}{<filtercsname>} => matches in <listmacro> | |
\protected\def\blx@bibfilter#1#2{% | |
\begingroup | |
\edef\blx@do##1{% | |
\def\noexpand\blx@flt@item{##1}% | |
\ifboolexpr{\csexpandonce{#2}}% | |
{\listadd\noexpand\blx@tempa{##1}}% | |
{}}% | |
\let\blx@done\relax | |
\edef\blx@tempa{% | |
\let\noexpand\blx@tempa\noexpand\@empty | |
\blx@listloop{#1}}% | |
\blx@tempa | |
\edef\blx@tempa{\endgroup | |
\def\noexpand#1{\blx@tempa}}% | |
\blx@tempa} | |
%% Auxiliary macros | |
\newrobustcmd*{\mkbibquote}{\enquote} | |
\protected\def\blx@imc@mkbibquote{% | |
\blx@ifuspunct\blx@usquote\enquote} | |
\def\blx@usquote{% | |
\ifnum\@quotelevel>\z@ | |
\expandafter\blx@usiquote | |
\else | |
\expandafter\blx@usoquote | |
\fi} | |
\long\def\blx@usoquote#1{% | |
\begingroup | |
\initoquote | |
\textooquote#1% | |
\futurelet\@let@token\blx@usoquote@i} | |
\def\blx@usoquote@i{% | |
\blx@usqcheck | |
{\ifx\blx@postpunct\@empty\else\blx@dopostpunct\fi | |
\textcoquote\endgroup} | |
{\blx@setpostpunct\textcoquote\endgroup}} | |
\long\def\blx@usiquote#1{% | |
\begingroup | |
\initiquote | |
\textoiquote#1% | |
\futurelet\@let@token\blx@usiquote@i} | |
\def\blx@usiquote@i{% | |
\blx@usqcheck | |
{\textciquote\endgroup} | |
{\blx@setpostpunct\textciquote\endgroup}} | |
\long\def\blx@usqcheck#1#2{% | |
\def\blx@tempa{#1}% | |
\def\blx@tempb{#2}% | |
\ifx\@let@token\space | |
\blx@usqcheck@i\blx@tempa | |
\fi | |
\ifx\@let@token\@sptoken | |
\blx@usqcheck@i\blx@tempa | |
\fi | |
\if\noexpand\@let@token\relax | |
\expandafter\blx@usqcheck@iv | |
\fi | |
\expandafter\blx@usqcheck@ii\blx@quotepunct\relax&} | |
\long\def\blx@usqcheck@i#1#2&{\fi#1} | |
\long\def\blx@usqcheck@ii#1{% | |
\if\noexpand#1\relax | |
\blx@usqcheck@i\blx@tempa | |
\fi | |
\if\noexpand#1\noexpand\@let@token | |
\blx@usqcheck@i{\blx@usqcheck@iii\blx@tempa}% | |
\fi | |
\blx@usqcheck@ii | |
} | |
\long\def\blx@usqcheck@iii#1#2{#2#1} | |
\long\def\blx@usqcheck@iv#1{% | |
\begingroup | |
\escapechar=-1 % | |
\edef\blx@tempa{\expandafter\@gobble\string#2}% | |
\expandafter\endgroup | |
\ifx\blx@tempa\@empty | |
\else | |
\blx@usqcheck@i\blx@tempb | |
\fi | |
#1% | |
} | |
\newrobustcmd*{\mkbibemph}{\emph} | |
\protected\long\def\blx@imc@mkbibemph#1{% | |
\emph{#1}\blx@imc@setpunctfont\emph} | |
\newrobustcmd*{\mkbibbold}{\textbf} | |
\protected\long\def\blx@imc@mkbibbold#1{% | |
\textbf{#1}\blx@imc@setpunctfont\textbf} | |
\newrobustcmd*{\mkbibitalic}{\textit} | |
\protected\long\def\blx@imc@mkbibitalic#1{% | |
\textit{#1}\blx@imc@setpunctfont\textit} | |
\blx@regimcs{\mkbibquote \mkbibemph \mkbibbold \mkbibitalic} | |
\newcommand*{\bibleftparen}{\blx@postpunct(} | |
\newcommand*{\bibrightparen}{\blx@postpunct)\midsentence} | |
\newcommand*{\bibleftbracket}{\blx@postpunct[} | |
\newcommand*{\bibrightbracket}{\blx@postpunct]\midsentence} | |
\def\blx@parenlevel{% | |
\iftoggle{blx@footnote} | |
{\blx@parenlevel@foot} | |
{\blx@parenlevel@text}} | |
\newrobustcmd*{\blx@bibopenparen}{% | |
\blx@opencheck\bibopenparen | |
\blx@postpunct | |
\ifnum\blx@parenlevel=\z@ | |
\global\blx@parenlevel\@ne | |
\global\c@parenlevel\@ne | |
\expandafter\bibleftparen | |
\else | |
\expandafter\blx@openparen | |
\fi} | |
\newrobustcmd*{\blx@bibopenbracket}{% | |
\blx@opencheck\bibopenbracket | |
\blx@postpunct | |
\ifnum\blx@parenlevel=\z@ | |
\global\blx@parenlevel1002 | |
\global\c@parenlevel\@ne | |
\expandafter\bibleftbracket | |
\else | |
\expandafter\blx@openparen | |
\fi} | |
\newrobustcmd*{\blx@bibcloseparen}{% | |
\blx@closecheck\bibcloseparen | |
\blx@postpunct\blx@closeparen} | |
\newrobustcmd*{\blx@bibclosebracket}{% | |
\blx@closecheck\bibclosebracket | |
\blx@postpunct\blx@closeparen} | |
\def\blx@openparen{% | |
\ifodd\blx@parenlevel | |
\global\advance\blx@parenlevel\@ne | |
\global\advance\c@parenlevel\@ne | |
\expandafter\bibleftbracket | |
\else | |
\global\advance\blx@parenlevel\@ne | |
\global\advance\c@parenlevel\@ne | |
\expandafter\bibleftparen | |
\fi} | |
\def\blx@closeparen{% | |
\ifodd\blx@parenlevel | |
\blx@closeparen@i | |
\expandafter\bibrightparen | |
\else | |
\blx@closeparen@i | |
\expandafter\bibrightbracket | |
\fi} | |
\def\blx@closeparen@i{% | |
\ifnum\blx@parenlevel=1002 | |
\global\blx@parenlevel\z@ | |
\global\c@parenlevel\z@ | |
\else | |
\global\advance\blx@parenlevel\m@ne | |
\global\advance\c@parenlevel\m@ne | |
\fi} | |
\def\blx@opencheck#1{% | |
\ifnum\numexpr\blx@parenlevel+\@ne | |
\ifnum\blx@parenlevel>\@m -1001\fi | |
>\c@maxparens | |
\blx@err@nestparen{\string#1}% | |
\blx@errormark | |
\fi} | |
\def\blx@closecheck#1{% | |
\ifnum\numexpr\blx@parenlevel | |
\ifnum\blx@parenlevel>\@m -1001\fi | |
>\c@maxparens | |
\blx@err@nestparen{\string#1}% | |
\blx@errormark | |
\fi | |
\ifnum\blx@parenlevel<\@ne | |
\blx@err@matchparen{Unmatched \string#1}% | |
\blx@errormark | |
\fi} | |
\protected\def\blx@errormark{% | |
\rule[0.25ex]{1.25ex}{1.25ex}} | |
\AtEndDocument{% | |
\unless\ifnum\blx@parenlevel@text=\z@ | |
\blx@err@matchparen{% | |
Unbalanced parentheses or brackets in the document body}% | |
\fi | |
\unless\ifnum\blx@parenlevel@foot=\z@ | |
\blx@err@matchparen{% | |
Unbalanced parentheses or brackets in a foot or endnote}% | |
\fi} | |
\newrobustcmd{\mkbibparens}[1]{% | |
\begingroup | |
\blx@blxinit | |
\blx@setsfcodes | |
\bibopenparen#1\bibcloseparen | |
\endgroup} | |
\newrobustcmd{\mkbibbrackets}[1]{% | |
\begingroup | |
\blx@blxinit | |
\blx@setsfcodes | |
\bibopenbracket#1\bibclosebracket | |
\endgroup} | |
\newrobustcmd*{\parentext}{\mkbibparens} | |
\newrobustcmd*{\brackettext}{\mkbibbrackets} | |
\newrobustcmd{\mkbibsuperscript}[1]{% | |
\unspace\allowhyphens\textsuperscript{% | |
\begingroup | |
\protected\long\def\mkbibsuperscript##1{% | |
\blx@warning{Nested superscript}% | |
\mkbibbrackets{##1}}% | |
#1\endgroup}} | |
\newrobustcmd{\mkbibfootnote}{\blx@mkbibfootnote{}} | |
\newrobustcmd{\mkbibfootnotetext}{\blx@mkbibfootnote{text}} | |
\newrobustcmd{\blx@mkbibfootnote}[2]{% | |
\iftoggle{blx@footnote} | |
{\blx@warning{Nested notes}% | |
\addspace\mkbibparens{#2}} | |
{\unspace | |
\ifnum\blx@notetype=\tw@ | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}} | |
{\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}}}} | |
\newrobustcmd{\mkbibendnote}{\blx@mkbibendnote{}} | |
\newrobustcmd{\mkbibendnotetext}{\blx@mkbibendnote{text}} | |
\newrobustcmd{\blx@mkbibendnote}[2]{% | |
\iftoggle{blx@footnote} | |
{\blx@warning{Nested notes}% | |
\addspace\mkbibparens{#2}} | |
{\unspace | |
\ifnum\blx@notetype=\@ne | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}} | |
{\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}}}} | |
\newrobustcmd{\blxmkbibnote}[2]{% | |
\begingroup | |
\blx@blxinit | |
\blx@setsfcodes | |
\blx@postpunct@agroup | |
\toggletrue{blx@footnote}% | |
\csuse{bib#1notewrapper}{#2}% | |
\endgroup} | |
\newcommand{\bibfootnotewrapper}[1]{% | |
\bibsentence#1\addperiod} | |
\newcommand{\bibendnotewrapper}[1]{% | |
\bibsentence#1\addperiod} | |
\AtEndPreamble{% | |
\def\blx@theendnote{\blx@err@endnote\footnote}% | |
\def\blx@theendnotetext{\blx@err@endnote\footnotetext}% | |
\ifdef\endnote | |
{\def\blx@theendnote{\endnote}% | |
\ifdef\endnotetext | |
{\def\blx@theendnotetext{\endnotetext}} | |
{}} | |
{\ifdef\pagenote | |
{\def\blx@theendnote{\pagenote}% | |
\ifdef\pagenotetext | |
{\def\blx@theendnotetext{\pagenotetext}} | |
{}} | |
{}}} | |
\newrobustcmd*{\mknumalph}[1]{% | |
\begingroup | |
\blx@tempcnta=#1\relax | |
\ifnum\blx@tempcnta>702 % | |
\else | |
\ifnum\blx@tempcnta>26 % | |
\advance\blx@tempcnta\m@ne | |
\divide\blx@tempcnta26\relax | |
\blx@numalph\blx@tempcnta | |
\multiply\blx@tempcnta26\relax | |
\blx@tempcnta=\numexpr#1-\blx@tempcnta\relax | |
\fi | |
\fi | |
\blx@numalph\blx@tempcnta | |
\endgroup} | |
\def\blx@numalph#1{% | |
\ifcase#1\relax\blx@warning@entry{Value out of range}\number#1\or | |
a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or | |
n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else | |
\blx@warning@entry{Value out of range}\number#1\fi} | |
% {<macro>}[<pre>]{<vol>}[<post>] => <macro>{<pre>}{{<vol>}{<post>}} | |
\newrobustcmd*{\volcitecmd}{% | |
\AtNextCite{\DeclareFieldAlias{postnote}{volcitenote}}% | |
\begingroup\let\blx@citeargs\blx@volciteargs} | |
\protected\def\blx@volciteargs#1{% | |
\endgroup | |
\@ifnextchar[%] | |
{\blx@volciteargs@i{#1}} | |
{\blx@volciteargs@i{#1}[]}} | |
\long\def\blx@volciteargs@i#1[#2]#3{% | |
\@ifnextchar[%] | |
{\blx@volciteargs@ii{#1}{#2}{#3}} | |
{\blx@citeargs@iii{#1{#2}{{#3}{}}}}} | |
\long\def\blx@volciteargs@ii#1#2#3[#4]{% | |
\blx@citeargs@iii{#1{#2}{{#3}{#4}}}} | |
\newrobustcmd*{\multivolcitecmd}{% | |
\AtNextCite{\DeclareFieldAlias{postnote}{volcitenote}}% | |
\def\blx@hook@mcite@before{% | |
\global\undef\blx@hook@mcite@before | |
\let\blx@citeargs\blx@volmciteargs}} | |
\protected\def\blx@volmciteargs#1{% | |
\@ifnextchar[%] | |
{\blx@volciteargs@i{#1}} | |
{\blx@volciteargs@i{#1}[]}} | |
%% Control file | |
\begingroup | |
\let~\space | |
\@makeother\< | |
\@makeother\> | |
\@makeother\. | |
\@makeother\: | |
\@makeother\? | |
\@makeother\" | |
\@makeother\- | |
\@makeother\= | |
\@makeother\/ | |
\xdef\blx@xml@file{% | |
\blx@sig@bcf\blx@nl | |
\blx@ver@bcf\blx@nl} | |
\xdef\blx@xml@endfile{% | |
</bcf:controlfile>} | |
\xdef\blx@xml@comment#1{% | |
~~<!-- #1 -->\blx@nl} | |
\xdef\blx@xml@options#1#2#3{% | |
~~<bcf:options% | |
\noexpand\ifblank{#1}{}{ component="#1"}% | |
\noexpand\ifblank{#2}{}{ type="#2"}% | |
>\blx@nl | |
#3% | |
~~</bcf:options>\blx@nl} | |
\xdef\blx@xml@option#1#2{% | |
~~~~<bcf:option type="#1">\blx@nl | |
#2% | |
~~~~</bcf:option>\blx@nl} | |
\xdef\blx@xml@ordered#1#2#3{% | |
~~~~~~<bcf:value order="#1"#2% | |
>#3</bcf:value>\blx@nl} | |
\xdef\blx@xml@datafieldset#1#2{% | |
~~<bcf:datafieldset name="#1">\blx@nl | |
#2% | |
~~</bcf:datafieldset>\blx@nl} | |
\xdef\blx@xml@datafieldsets@member#1{% | |
~~~~<bcf:member#1/>\blx@nl} | |
\xdef\blx@xml@transliteration#1#2{% | |
~~<bcf:transliteration entrytype="#1">\blx@nl | |
#2% | |
~~</bcf:transliteration>\blx@nl} | |
\xdef\blx@xml@translit#1#2#3{% | |
~~~~<bcf:translit target="#1" from="#2" to="#3"/>\blx@nl} | |
\xdef\blx@xml@sourcemap#1{% | |
~~<bcf:sourcemap>\blx@nl | |
#1% | |
~~</bcf:sourcemap>\blx@nl} | |
\xdef\blx@xml@sourcemap@maps#1#2{% | |
~~~~<bcf:maps#1>\blx@nl | |
#2% | |
~~~~</bcf:maps>\blx@nl} | |
\xdef\blx@xml@sourcemap@map#1#2{% | |
~~~~~~<bcf:map#1>\blx@nl | |
#2% | |
~~~~~~</bcf:map>\blx@nl} | |
\xdef\blx@xml@sourcemap@perdatasource#1{% | |
~~~~~~~~<bcf:per\string_datasource>#1</bcf:per\string_datasource>\blx@nl} | |
\xdef\blx@xml@sourcemap@pertype#1{% | |
~~~~~~~~<bcf:per\string_type>#1</bcf:per\string_type>\blx@nl} | |
\xdef\blx@xml@sourcemap@pernottype#1{% | |
~~~~~~~~<bcf:per\string_nottype>#1</bcf:per\string_nottype>\blx@nl} | |
\xdef\blx@xml@sourcemap@step#1{% | |
~~~~~~~~<bcf:map\string_step#1/>\blx@nl} | |
\xdef\blx@xml@labelalphanametemplate#1#2{% | |
~~<bcf:labelalphanametemplate type="#1">\blx@nl | |
#2% | |
~~</bcf:labelalphanametemplate>\blx@nl} | |
\xdef\blx@xml@labelalphanametemplatenamepart#1#2#3{% | |
~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl} | |
\xdef\blx@xml@labelalphatemplate#1#2{% | |
~~<bcf:labelalphatemplate type="#1">\blx@nl | |
#2% | |
~~</bcf:labelalphatemplate>\blx@nl} | |
\xdef\blx@xml@labelalpha@element#1#2{% | |
~~~~<bcf:labelelement order="#1">\blx@nl | |
#2% | |
~~~~</bcf:labelelement>\blx@nl} | |
\xdef\blx@xml@labelalpha@part#1#2{% | |
~~~~~~<bcf:labelpart#1>#2</bcf:labelpart>\blx@nl} | |
\xdef\blx@xml@inheritance#1{% | |
~~<bcf:inheritance>\blx@nl | |
#1% | |
~~</bcf:inheritance>\blx@nl} | |
\xdef\blx@xml@inherit@defaults#1#2{% | |
~~~~<bcf:defaults#1>\blx@nl | |
#2% | |
~~~~</bcf:defaults>\blx@nl} | |
\xdef\blx@xml@inherit@data#1#2{% | |
~~~~<bcf:inherit#1>\blx@nl | |
#2% | |
~~~~</bcf:inherit>\blx@nl} | |
\xdef\blx@xml@inherit@type#1#2#3{% | |
~~~~~~<bcf:type\string_pair source="#1" target="#2"#3/>\blx@nl} | |
\xdef\blx@xml@inherit@field#1#2#3{% | |
~~~~~~<bcf:field source="#1" target="#2"#3/>\blx@nl} | |
\xdef\blx@xml@inherit@block#1{% | |
~~~~~~<bcf:field source="#1" skip="true"/>\blx@nl} | |
\xdef\blx@xml@nosorts#1{% | |
~~<bcf:nosorts>\blx@nl | |
#1% | |
~~</bcf:nosorts>\blx@nl} | |
\xdef\blx@xml@nosort#1#2{% | |
~~~~<bcf:nosort field="#1" value="#2"/>\blx@nl} | |
\xdef\blx@xml@noinits#1{% | |
~~<bcf:noinits>\blx@nl | |
#1% | |
~~</bcf:noinits>\blx@nl} | |
\xdef\blx@xml@noinit#1{% | |
~~~~<bcf:noinit value="#1"/>\blx@nl} | |
\xdef\blx@xml@nolabels#1{% | |
~~<bcf:nolabels>\blx@nl | |
#1% | |
~~</bcf:nolabels>\blx@nl} | |
\xdef\blx@xml@nolabel#1{% | |
~~~~<bcf:nolabel value="#1"/>\blx@nl} | |
\xdef\blx@xml@nolabelwidthcounts#1{% | |
~~<bcf:nolabelwidthcounts>\blx@nl | |
#1% | |
~~</bcf:nolabelwidthcounts>\blx@nl} | |
\xdef\blx@xml@nolabelwidthcount#1{% | |
~~~~<bcf:nolabelwidthcount value="#1"/>\blx@nl} | |
\xdef\blx@xml@uniquenametemplate#1{% | |
~~<bcf:uniquenametemplate>\blx@nl% | |
#1% | |
~~</bcf:uniquenametemplate>\blx@nl} | |
\xdef\blx@xml@uniquenametemplatenamepart#1#2#3{% | |
~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl} | |
\xdef\blx@xml@sortingnamekey#1#2{% | |
~~<bcf:sortingnamekey keyscheme="#1">\blx@nl% | |
#2% | |
~~</bcf:sortingnamekey>\blx@nl} | |
\xdef\blx@xml@sortingnamekeykeypart#1#2{% | |
~~~~<bcf:keypart#1>\blx@nl | |
#2% | |
~~~~</bcf:keypart>\blx@nl} | |
\xdef\blx@xml@sortingnamekeynamepart#1#2#3{% | |
~~~~~~<bcf:part type="namepart"#1#2>#3</bcf:part>\blx@nl} | |
\xdef\blx@xml@sortingnamekeyliteral#1#2{% | |
~~~~~~<bcf:part type="literal"#1>#2</bcf:part>\blx@nl} | |
\xdef\blx@xml@sorting#1#2{% | |
~~<bcf:sorting#1>\blx@nl% | |
#2% | |
~~</bcf:sorting>\blx@nl} | |
\xdef\blx@xml@presort#1#2{% | |
~~~~<bcf:presort\noexpand\ifblank{#1}{}{ type="#1"}>% | |
#2</bcf:presort>\blx@nl} | |
\xdef\blx@xml@sortexclude#1#2{% | |
~~~~<bcf:sortexclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl | |
#2% | |
~~~~</bcf:sortexclusion>\blx@nl} | |
\xdef\blx@xml@exclude#1{% | |
~~~~~~<bcf:exclusion>#1</bcf:exclusion>\blx@nl} | |
\xdef\blx@xml@sortinclude#1#2{% | |
~~~~<bcf:sortinclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl | |
#2% | |
~~~~</bcf:sortinclusion>\blx@nl} | |
\xdef\blx@xml@include#1{% | |
~~~~~~<bcf:inclusion>#1</bcf:inclusion>\blx@nl} | |
\xdef\blx@xml@sort#1#2{% | |
~~~~<bcf:sort #1>\blx@nl | |
#2% | |
~~~~</bcf:sort>\blx@nl} | |
\xdef\blx@xml@sortitem#1#2{% | |
~~~~~~<bcf:sortitem #1>#2</bcf:sortitem>\blx@nl} | |
\xdef\blx@xml@section#1{% | |
~~<bcf:section number="#1">} | |
\xdef\blx@xml@endsection{% | |
~~</bcf:section>} | |
\xdef\blx@xml@slist#1#2#3#4#5#6#7#8{% | |
~~<bcf:sortlist section="#3" name="#1" type="#2" sortscheme="#4" | |
sortnamekeyscheme="#5" labelprefix="#6">\blx@nl | |
#8% | |
#7% | |
~~</bcf:sortlist>\blx@nl} | |
\xdef\blx@xml@slistfilterorbegin{% | |
~~~~<bcf:filteror>\blx@nl} | |
\xdef\blx@xml@slistfilterorend{% | |
~~~~</bcf:filteror>\blx@nl} | |
\xdef\blx@xml@slistfilter#1#2{% | |
~~~~<bcf:filter type="#1">#2</bcf:filter>\blx@nl} | |
\xdef\blx@xml@bibdata#1#2{% | |
~~<bcf:bibdata section="#1">\blx@nl | |
#2% | |
~~</bcf:bibdata>\blx@nl} | |
\xdef\blx@xml@datasource#1#2#3{% | |
~~~~<bcf:datasource type="#1" datatype="#2">#3</bcf:datasource>\blx@nl} | |
\xdef\blx@xml@citekey#1#2{% | |
~~~~<bcf:citekey order="#2">#1</bcf:citekey>} | |
\xdef\blx@xml@citeset#1#2{% | |
~~~~<bcf:citekey type="set" members="#2">#1</bcf:citekey>} | |
\xdef\blx@xml@svalue#1#2{% | |
\blx@xml@option{singlevalued}{% | |
~~~~~~<bcf:key>#1</bcf:key>\blx@nl | |
~~~~~~<bcf:value>#2</bcf:value>\blx@nl}} | |
\xdef\blx@xml@mvalue#1#2{% | |
\blx@xml@option{multivalued}{% | |
~~~~~~<bcf:key>#1</bcf:key>\blx@nl | |
#2}} | |
\xdef\blx@xml@toggle#1{% | |
\blx@xml@svalue{#1}{\noexpand\iftoggle{blx@#1}{1}{0}}} | |
\xdef\blx@xml@options@scope#1#2{% | |
~~<bcf:optionscope type="#1">\blx@nl | |
#2% | |
~~</bcf:optionscope>\blx@nl} | |
\xdef\blx@xml@option@scope#1#2{% | |
~~~~<bcf:option datatype="#1">#2</bcf:option>\blx@nl} | |
\endgroup | |
\def\blx@bcf@options@global{% | |
\blx@xml@comment{GLOBAL}% | |
\blx@xml@options{biblatex}{global}{% | |
\blx@xml@svalue{alphaothers}{\labelalphaothers}% | |
\blx@xml@toggle{labelalpha}% | |
\blx@xml@mvalue{labelnamespec}{\blx@bcf@labelnamespec}% | |
\blx@xml@toggle{labeltitle}% | |
\blx@xml@mvalue{labeltitlespec}{\blx@bcf@labeltitlespec}% | |
\blx@xml@toggle{labeltitleyear}% | |
\blx@xml@toggle{labeldateparts}% | |
\blx@xml@mvalue{labeldatespec}{\blx@bcf@labeldatespec}% | |
\blx@xml@toggle{julian}% | |
\blx@xml@svalue{gregorianstart}{\blx@gregorianstart}% | |
\blx@xml@svalue{maxalphanames}{\blx@maxalphanames}% | |
\blx@xml@svalue{maxbibnames}{\blx@maxbibnames}% | |
\blx@xml@svalue{maxcitenames}{\blx@maxcitenames}% | |
\blx@xml@svalue{maxitems}{\blx@maxitems}% | |
\blx@xml@svalue{minalphanames}{\blx@minalphanames}% | |
\blx@xml@svalue{minbibnames}{\blx@minbibnames}% | |
\blx@xml@svalue{mincitenames}{\blx@mincitenames}% | |
\blx@xml@svalue{minitems}{\blx@minitems}% | |
\blx@xml@toggle{singletitle}% | |
\blx@xml@svalue{sortalphaothers}{\sortalphaothers}% | |
\blx@xml@svalue{sortlocale}{\blx@sortlocale}% | |
\blx@xml@svalue{sortscheme}{\blx@sorting}% | |
\blx@xml@svalue{uniquelist}{\blx@uniquelist}% | |
\blx@xml@svalue{uniquename}{\blx@uniquename}% | |
\blx@xml@toggle{uniqueprimaryauthor}% | |
\blx@xml@toggle{uniquetitle}% | |
\blx@xml@toggle{uniquebaretitle}% | |
\blx@xml@toggle{uniquework}% | |
\blx@xml@toggle{useprefix}% | |
\blx@xml@nametoggles | |
}% | |
} | |
\def\blx@bcf@options@type#1{% | |
\blx@xml@comment{#1}% | |
\blx@xml@options{biblatex}{#1}{% | |
\blx@xml@toggle{labelalpha}% | |
\blx@xml@mvalue{labelnamespec}{% | |
\ifcsdef{blx@bcf@labelnamespec@#1} | |
{\csuse{blx@bcf@labelnamespec@#1}} | |
{\blx@bcf@labelnamespec}}% | |
\blx@xml@toggle{labeltitle}% | |
\blx@xml@mvalue{labeltitlespec}{% | |
\ifcsdef{blx@bcf@labeltitlespec@#1} | |
{\csuse{blx@bcf@labeltitlespec@#1}} | |
{\blx@bcf@labeltitlespec}}% | |
\blx@xml@toggle{labeltitleyear}% | |
\blx@xml@toggle{labeldateparts}% | |
\blx@xml@mvalue{labeldatespec}{% | |
\ifcsdef{blx@bcf@labeldatespec@#1} | |
{\csuse{blx@bcf@labeldatespec@#1}} | |
{\blx@bcf@labeldatespec}}% | |
\blx@xml@svalue{maxalphanames}{\blx@maxalphanames}% | |
\blx@xml@svalue{maxbibnames}{\blx@maxbibnames@type}% | |
\blx@xml@svalue{maxcitenames}{\blx@maxcitenames@type}% | |
\blx@xml@svalue{maxitems}{\blx@maxitems@type}% | |
\blx@xml@svalue{minalphanames}{\blx@minalphanames}% | |
\blx@xml@svalue{minbibnames}{\blx@minbibnames@type}% | |
\blx@xml@svalue{mincitenames}{\blx@mincitenames@type}% | |
\blx@xml@svalue{minitems}{\blx@minitems@type}% | |
\blx@xml@toggle{singletitle}% | |
\blx@xml@toggle{skipbib}% | |
\blx@xml@toggle{skiplab}% | |
\blx@xml@toggle{skipbiblist}% | |
\blx@xml@svalue{uniquelist}{\blx@uniquelist}% | |
\blx@xml@svalue{uniquename}{\blx@uniquename}% | |
\blx@xml@toggle{uniqueprimaryauthor}% | |
\blx@xml@toggle{uniquetitle}% | |
\blx@xml@toggle{uniquebaretitle}% | |
\blx@xml@toggle{uniquework}% | |
\blx@xml@toggle{useprefix}% | |
\blx@xml@nametoggles | |
}% | |
} | |
\def\blx@ctrlwrite{% | |
\begingroup | |
\blx@safe@actives | |
\let\protect\string | |
% options | |
\edef\labelalphaothers{\labelalphaothers}% | |
\edef\sortalphaothers{\sortalphaothers}% | |
\blx@xmlsanitizeafter{\def\labelalphaothers}{\labelalphaothers}% | |
\blx@xmlsanitizeafter{\def\sortalphaothers}{\sortalphaothers}% | |
% Expand the global use* name toggles | |
\let\blx@xml@nametoggles\@empty | |
\def\do##1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use##1}}}% | |
\abx@donames | |
\edef\blx@tempa{% | |
\blx@xml@file | |
\blx@xml@comment{BIBER OPTIONS}% | |
\blx@xml@options{biber}{global}{% | |
\blx@xml@svalue{output_encoding}{\blx@texencoding}% | |
\blx@xml@svalue{input_encoding}{\blx@bibencoding}% | |
\blx@xml@toggle{debug}% | |
\blx@xml@svalue{mincrossrefs}{\blx@mincrossrefs}% | |
\blx@xml@svalue{minxrefs}{\blx@minxrefs}% | |
\blx@xml@toggle{sortcase}% | |
\blx@xml@toggle{sortupper}% | |
}% | |
\blx@xml@comment{BIBLATEX OPTIONS}% | |
\blx@bcf@options@global | |
}% | |
\ifdef\blx@opts@type | |
{\def\do##1{% | |
\begingroup | |
\blx@setoptions@type{##1}% | |
% Expand the type use* name toggles | |
\let\blx@xml@nametoggles\@empty | |
\def\do####1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use####1}}}% | |
\abx@donames | |
\begingroup | |
\let\protect\relax | |
\blx@checkoptions@type | |
\endgroup | |
\xappto\blx@tempa{\blx@bcf@options@type{##1}}% | |
\endgroup}% | |
\dolistloop\blx@opts@type} | |
{}% | |
% options scope | |
% GLOBAL | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@global{\blx@xml@option@scope{##1}{####1}}}% | |
\dolistcsloop{blx@globalopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@globalopts@datatypes | |
% ENTRYTYPE | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@type{\blx@xml@option@scope{##1}{####1}}}% | |
\dolistcsloop{blx@typeopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@typeopts@datatypes | |
% ENTRY | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@entry{\blx@xml@option@scope{##1}{####1}}}% | |
\dolistcsloop{blx@entryopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@entryopts@datatypes | |
% NAMELIST | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@namelist{\blx@xml@option@scope{##1}{####1}}}% | |
\dolistcsloop{blx@namelistopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@entryopts@datatypes | |
% NAME | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@name{\blx@xml@option@scope{##1}{####1}}}% | |
\dolistcsloop{blx@nameopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@entryopts@datatypes | |
\eappto\blx@tempa{% | |
\blx@xml@comment{BIBLATEX OPTION SCOPE}% | |
\blx@xml@options@scope{GLOBAL}{\blx@bcf@options@scope@global}% | |
\blx@xml@options@scope{ENTRYTYPE}{\blx@bcf@options@scope@type}% | |
\blx@xml@options@scope{ENTRY}{\blx@bcf@options@scope@entry}% | |
\blx@xml@options@scope{NAMELIST}{\blx@bcf@options@scope@namelist}% | |
\blx@xml@options@scope{NAME}{\blx@bcf@options@scope@name}} | |
% datafieldsets | |
\def\do##1{% | |
\xappto\blx@bcf@datafieldsets{\blx@xml@datafieldset{##1}{\csuse{blx@datafieldsetmembers@##1}}}} | |
\dolistloop\blx@datafieldsets | |
\eappto\blx@tempa{% | |
\blx@xml@comment{DATAFIELDSETS}% | |
\blx@bcf@datafieldsets}% | |
% sourcemap | |
\ifbool{sourcemap} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{SOURCEMAP}% | |
\blx@xml@sourcemap{% | |
\ifdef\blx@sourcemap@user | |
{\blx@sourcemap@user} | |
{}% | |
\ifdef\blx@sourcemap@style | |
{\blx@sourcemap@style} | |
{}% | |
\ifdef\blx@sourcemap@defaults@bibtex | |
{\blx@sourcemap@defaults@bibtex} | |
{}% | |
\ifdef\blx@sourcemap@defaults@biblatexml | |
{\blx@sourcemap@defaults@biblatexml} | |
{}}}} | |
{}% | |
% labelalpha name template | |
\eappto\blx@tempa{% | |
\blx@xml@comment{LABELALPHA NAME TEMPLATE}}% | |
\def\do##1{% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalphanametemplate{##1}{% | |
\csuse{blx@labelalphanametemplate@##1}}% | |
}% | |
}% | |
\dolistloop\blx@lantem@type | |
% labelalpha template | |
\eappto\blx@tempa{% | |
\blx@xml@comment{LABELALPHA TEMPLATE}}% | |
\def\do##1{% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalphatemplate{##1}{% | |
\csuse{blx@labelalphatemplate@##1}}% | |
}% | |
}% | |
\dolistloop\blx@latem@type | |
% data inheritance | |
\eappto\blx@tempa{% | |
\blx@xml@comment{INHERITANCE}% | |
\blx@xml@inheritance{% | |
\csuse{blx@inherit@default}% | |
\csuse{blx@inherit@data}% | |
}% | |
}% | |
% noinit | |
\ifcsdef{blx@noinit} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOINIT}% | |
\blx@xml@noinits{% | |
\csuse{blx@noinit}% | |
}% | |
}} | |
{}% | |
% nolabel | |
\ifcsdef{blx@nolabel} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOLABEL}% | |
\blx@xml@nolabels{% | |
\csuse{blx@nolabel}% | |
}% | |
}} | |
{}% | |
% nolabel | |
\ifcsdef{blx@nolabelwidthcount} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOLABELWIDTHCOUNT}% | |
\blx@xml@nolabelwidthcounts{% | |
\csuse{blx@nolabelwidthcount}% | |
}% | |
}} | |
{}% | |
% nosort | |
\ifcsdef{blx@nosort} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOSORT}% | |
\blx@xml@nosorts{% | |
\csuse{blx@nosort}% | |
}% | |
}} | |
{}% | |
% transliteration | |
\ifdefempty\blx@translits | |
{} | |
{\eappto\blx@tempa{\blx@xml@comment{TRANSLITERATION}}% | |
\def\do##1{% | |
\eappto\blx@tempa{\blx@xml@transliteration{##1}{\csuse{blx@translit@##1}}}}% | |
\dolistloop\blx@translits}% | |
% uniquenametemplate | |
\eappto\blx@tempa{\blx@xml@comment{UNIQUENAME TEMPLATE}}% | |
\eappto\blx@tempa{\blx@xml@uniquenametemplate{\blx@uniquenametemplate}}% | |
% sortingnamekey | |
\eappto\blx@tempa{\blx@xml@comment{SORTING NAME KEY}}% | |
\def\do##1{% | |
\eappto\blx@tempa{% | |
\blx@xml@sortingnamekey{##1}{% | |
\csuse{blx@sortingnamekey@##1}}}}% | |
\dolistloop\blx@sortingnamekeyspecs | |
% sorting | |
\def\do##1{% | |
\eappto\blx@bcf@presort{\csuse{blx@bcf@presort@##1}}% | |
\eappto\blx@bcf@exclude{\csuse{blx@bcf@exclude@##1}}% | |
\eappto\blx@bcf@include{\csuse{blx@bcf@include@##1}}}% | |
\abx@doentrytypes | |
\do{*}% entrytype wildcard | |
\eappto\blx@tempa{% | |
\blx@xml@comment{SORTING}% | |
\blx@xml@sorting{}{% | |
\blx@bcf@presort | |
\blx@bcf@exclude | |
\blx@bcf@include | |
\csuse{blx@sorting@\blx@sorting}% | |
}% | |
}% | |
% datamodel | |
\eappto\blx@tempa{% | |
\blx@xml@comment{DATA MODEL}% | |
\blx@xml@datamodel{% | |
\blx@xml@datamodel@constants{% | |
\blx@bcf@datamodel@constants | |
}% | |
\blx@xml@datamodel@entrytypes{% | |
\blx@bcf@datamodel@entrytypes | |
}% | |
\blx@xml@datamodel@fields{% | |
\blx@bcf@datamodel@fields | |
}% | |
\blx@bcf@datamodel@entryfields | |
\blx@bcf@datamodel@constraints | |
}% | |
}% | |
% files | |
\let\blx@tempb\@empty | |
\blx@bibdata\blx@tempb\blx@bibfiles | |
\eappto\blx@tempa{% | |
\blx@xml@comment{CITATION DATA}% | |
\blx@xml@comment{SECTION 0}% | |
\blx@xml@bibdata{0}{\blx@tempb}% | |
\blx@xml@section{0}% | |
}% | |
\immediate\openout\blx@bcfout\jobname.bcf\relax | |
\blx@auxwrite\blx@bcfout{}{\blx@tempa}% | |
\global\undef\blx@tempa | |
\endgroup | |
\AfterEndDocument{% | |
\blx@auxwrite\blx@bcfout{}{% | |
\blx@xml@endsection\blx@nl | |
\csuse{blx@slists}% | |
\blx@xml@endfile}% | |
\immediate\closeout\blx@bcfout}} | |
%% Customisation | |
% nolabel | |
\newrobustcmd*{\DeclareNolabel}[1]{% | |
\begingroup | |
\let\nolabel\blx@nolabel@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@nolabel\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNolabel | |
\newcommand*{\blx@nolabel@setup}[1]{% | |
\eappto\blx@tempa{% | |
\blx@xml@nolabel{#1}}} | |
% nolabelwidthcount | |
\newrobustcmd*{\DeclareNolabelwidthcount}[1]{% | |
\begingroup | |
\let\nolabel\blx@nolabelwidthcount@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@nolabelwidthcount\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNolabelwidthcount | |
\newcommand*{\blx@nolabelwidthcount@setup}[1]{% | |
\eappto\blx@tempa{% | |
\blx@xml@nolabelwidthcount{#1}}} | |
% nosort | |
\newrobustcmd*{\DeclareNosort}[1]{% | |
\begingroup | |
\let\nosort\blx@nosort@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@nosort\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNosort | |
\newcommand*{\blx@nosort@setup}[2]{% | |
\eappto\blx@tempa{% | |
\blx@xml@nosort{#1}{#2}}} | |
% noinit | |
\newrobustcmd*{\DeclareNoinit}[1]{% | |
\begingroup | |
\let\noinit\blx@noinit@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@noinit\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNoinit | |
\newcommand*{\blx@noinit@setup}[1]{% | |
\eappto\blx@tempa{% | |
\blx@xml@noinit{#1}}} | |
% datafieldsets | |
\newrobustcmd*{\DeclareDatafieldSet}[2]{% | |
\begingroup | |
\let\member\blx@datafieldset@member | |
\let\blx@tempa\@empty | |
\def\blx@setname{#1} | |
\cslet{blx@datafieldset@#1}\@empty | |
#2% | |
\csxdef{blx@datafieldsetmembers@#1}{\blx@tempa}% | |
\listgadd\blx@datafieldsets{#1}% | |
\global\csletcs{datafieldset#1}{blx@datafieldset@#1}% expose user-facing macro | |
\endgroup} | |
\@onlypreamble\DeclareDatafieldSet | |
\newcommand*{\blx@datafieldset@member}[1][2]{% | |
\let\blx@dm@fieldtype\@empty | |
\let\blx@dm@datatype\@empty | |
\let\blx@member@field\@empty | |
\let\blx@tempb\@empty | |
\setkeys{blx@datafieldsets@member}{#1}% | |
\eappto\blx@tempa{% | |
\blx@xml@datafieldsets@member{\blx@tempb}}% | |
\ifdefempty\blx@member@field | |
{} | |
{\listcsxadd{blx@datafieldset@\blx@setname}{\blx@member@field}}% | |
% Set some internal macros in case biblatex needs to use the set | |
\ifboolexpr{% | |
not test {\ifdefempty{\blx@dm@fieldtype}} | |
and | |
not test {\ifdefempty{\blx@dm@datatype}}} | |
{\def\do##1{% | |
\listcsxadd{blx@datafieldset@\blx@setname}{##1}} | |
\dolistcsloop{blx@datamodelfields@types@\blx@dm@fieldtype @\blx@dm@datatype}} | |
{\ifdefempty{\blx@dm@fieldtype} | |
{} | |
{\def\do##1{% | |
\listcsxadd{blx@datafieldset@\blx@setname}{##1}} | |
\dolistcsloop{blx@datamodelfields@fieldtypes@\blx@dm@fieldtype}}% | |
\ifdefempty{\blx@dm@datatype} | |
{} | |
{\def\do##1{% | |
\listcsxadd{blx@datafieldset@\blx@setname}{##1}} | |
\dolistcsloop{blx@datamodelfields@datatypes@\blx@dm@datatype}}}} | |
\define@key{blx@datafieldsets@member}{datatype}{% characters | |
\appto\blx@tempb{ datatype="#1"}% | |
\def\blx@dm@datatype{#1}} | |
\define@key{blx@datafieldsets@member}{fieldtype}{% characters | |
\appto\blx@tempb{ fieldtype="#1"}% | |
\def\blx@dm@fieldtype{#1}} | |
\define@key{blx@datafieldsets@member}{field}{% characters | |
\appto\blx@tempb{ field="#1"}% | |
\def\blx@member@field{#1}} | |
% sourcemap | |
\newrobustcmd*{\DeclareSourcemap}[1]{% | |
\booltrue{sourcemap}% | |
\begingroup | |
\let\maps\blx@usersourcemap@maps | |
\let\blx@tempa\@empty | |
#1% | |
\csxdef{blx@sourcemap@user}{\blx@tempa}% | |
\endgroup} | |
\@onlypreamble\DeclareSourcemap | |
\newrobustcmd*{\DeclareStyleSourcemap}[1]{% | |
\booltrue{sourcemap}% | |
\begingroup | |
\let\maps\blx@stylesourcemap@maps | |
\let\blx@tempa\@empty | |
#1% | |
\xappto\blx@sourcemap@style\blx@tempa% | |
\endgroup} | |
\@onlypreamble\DeclareStyleSourcemap | |
\newrobustcmd*{\DeclareDriverSourcemap}[2][]{% | |
\booltrue{sourcemap}% | |
\begingroup | |
\let\blx@tempa\@empty | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\let\blx@tempd\@empty | |
\let\map\blx@sourcemap@map | |
#2% | |
\ifblank{#1} | |
{\setkeys{blx@sourcemap@maps}{datatype=bibtex, level=driver}} | |
{\setkeys{blx@sourcemap@maps}{#1, level=driver}}% | |
\eappto\blx@tempa{% | |
\blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}% | |
\csxdef{blx@sourcemap@defaults@\blx@tempd}{\blx@tempa}% | |
\endgroup} | |
\@onlypreamble\DeclareDriverSourcemap | |
\newcommand*{\blx@usersourcemap@maps}[2][]{% | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\let\map\blx@sourcemap@map | |
\ifblank{#1} | |
{\setkeys{blx@sourcemap@maps}{datatype=bibtex, level=user}} | |
{\setkeys{blx@sourcemap@maps}{#1, level=user}}% | |
#2% | |
\eappto\blx@tempa{% | |
\blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}} | |
\newcommand*{\blx@stylesourcemap@maps}[2][]{% | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\let\map\blx@sourcemap@map | |
\ifblank{#1} | |
{\setkeys{blx@sourcemap@maps}{datatype=bibtex, level=style}} | |
{\setkeys{blx@sourcemap@maps}{#1, level=style}}% | |
#2% | |
\eappto\blx@tempa{% | |
\blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}} | |
\define@key{blx@sourcemap@maps}{datatype}{% characters | |
\eappto\blx@tempb{ datatype="#1"}% | |
\eappto\blx@tempd{#1}} | |
\define@key{blx@sourcemap@maps}{overwrite}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempb{ map\string_overwrite="1"}} | |
{}} | |
\define@key{blx@sourcemap@maps}{level}{% user|style|driver | |
\appto\blx@tempb{ level="#1"}} | |
\newcommand*{\blx@sourcemap@map}[2][]{% | |
\let\blx@tempm\@empty | |
\let\blx@tempe\@empty | |
\let\perdatasource\blx@sourcemap@perdatasource | |
\let\pertype\blx@sourcemap@pertype | |
\let\pernottype\blx@sourcemap@pernottype | |
\let\step\blx@sourcemap@step | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@sourcemap@map}{#1}}% | |
#2% | |
\eappto\blx@tempc{% | |
\blx@xml@sourcemap@map{\blx@tempm}{\blx@tempe}}} | |
\define@key{blx@sourcemap@map}{overwrite}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempm{ map\string_overwrite="1"}} | |
{}} | |
\define@key{blx@sourcemap@map}{foreach}{% characters | |
\eappto\blx@tempm{ map\string_foreach="#1"}} | |
\define@key{blx@sourcemap@map}{refsection}{% integer | |
\eappto\blx@tempm{ refsection="#1"}} | |
\newcommand*{\blx@sourcemap@perdatasource}[1]{% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@perdatasource{#1}}} | |
\newcommand*{\blx@sourcemap@pertype}[1]{% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@pertype{#1}}} | |
\newcommand*{\blx@sourcemap@pernottype}[1]{% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@pernottype{#1}}} | |
\newcommand*{\blx@sourcemap@step}[1][2]{% | |
\let\blx@tempf\@empty | |
\setkeys{blx@sourcemap@step}{#1}% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@step{\blx@tempf}}} | |
\define@key{blx@sourcemap@step}{typesource}{% characters | |
\eappto\blx@tempf{ map\string_type\string_source="#1"}} | |
\define@key{blx@sourcemap@step}{typetarget}{% characters | |
\eappto\blx@tempf{ map\string_type\string_target="#1"}} | |
\define@key{blx@sourcemap@step}{final}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_final="1"}} | |
{}} | |
\define@key{blx@sourcemap@step}{fieldsource}{% characters | |
\eappto\blx@tempf{ map\string_field\string_source="#1"}} | |
\define@key{blx@sourcemap@step}{notfield}{% characters | |
\eappto\blx@tempf{ map\string_notfield="#1"}} | |
\define@key{blx@sourcemap@step}{fieldtarget}{% characters | |
\eappto\blx@tempf{ map\string_field\string_target="#1"}} | |
\define@key{blx@sourcemap@step}{fieldset}{% characters | |
\eappto\blx@tempf{ map\string_field\string_set="#1"}} | |
% We are sanitising the XML here as it's the value of an attribute which | |
% might contain quotes or ampersands (URLs, for example) | |
\define@key{blx@sourcemap@step}{fieldvalue}{% characters | |
\blx@xmlsanitizeafter{\def\blx@temps}{#1}% | |
\eappto\blx@tempf{ map\string_field\string_value="\blx@temps"}} | |
\define@key{blx@sourcemap@step}{append}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_append="1"}} | |
{}} | |
\define@key{blx@sourcemap@step}{null}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_null="1"}} | |
{}} | |
\define@key{blx@sourcemap@step}{entrynull}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entry\string_null="1"}} | |
{}} | |
\define@key{blx@sourcemap@step}{entrynew}{% characters | |
\appto\blx@tempf{ map\string_entry\string_new="#1"}} | |
\define@key{blx@sourcemap@step}{entrynewtype}{% characters | |
\appto\blx@tempf{ map\string_entry\string_newtype="#1"}} | |
\define@key{blx@sourcemap@step}{entrytarget}{% characters | |
\appto\blx@tempf{ map\string_entrytarget="#1"}} | |
\define@key{blx@sourcemap@step}{entryclone}{% characters | |
\appto\blx@tempf{ map\string_entry\string_clone="#1"}} | |
\define@key{blx@sourcemap@step}{origfield}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_origfield="1"}} | |
{}} | |
\define@key{blx@sourcemap@step}{origfieldval}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_origfieldval="1"}} | |
{}} | |
\define@key{blx@sourcemap@step}{origentrytype}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_origentrytype="1"}} | |
{}} | |
\define@key{blx@sourcemap@step}{match}{% characters | |
\appto\blx@tempf{ map\string_match="#1"}} | |
\define@key{blx@sourcemap@step}{notmatch}{% characters | |
\appto\blx@tempf{ map\string_notmatch="#1"}} | |
\define@key{blx@sourcemap@step}{replace}{% characters | |
\eappto\blx@tempf{ map\string_replace="#1"}} | |
% [<entrytype>]{<spec>} | |
\newrobustcmd*{\DeclareLabelalphaNameTemplate}[2][]{% | |
\ifblank{#1} | |
{\blx@lantem{#2}{global}} | |
{\forcsvlist{\blx@lantem{#2}}{#1}}} | |
\@onlypreamble\DeclareLabelalphaNameTemplate | |
\blx@collectopts{xml}{blx@globalopts}{labelalphanametemplate}% for passing to the .bcf | |
\blx@collectopts{xml}{blx@typeopts}{labelalphanametemplate}% for passing to the .bcf | |
\def\blx@lantem#1#2{% | |
\begingroup | |
\let\namepart\blx@lantem@namepart | |
\let\blx@tempa\@empty | |
\blx@tempcnta\z@ | |
#1% | |
\ifdef\blx@lantem@type | |
{\ifinlist{#2}\blx@lantem@type | |
{\global\cslet{blx@labelalphanametemplate@#2}\blx@tempa} | |
{\listgadd\blx@lantem@type{#2}% | |
\global\cslet{blx@labelalphanametemplate@#2}\blx@tempa}} | |
{\listgadd\blx@lantem@type{#2}% | |
\global\cslet{blx@labelalphanametemplate@#2}\blx@tempa}% | |
\endgroup} | |
\newcommand*{\blx@lantem@namepart}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@lantem@namepart}{#1}}% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalphanametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}} | |
\define@key{blx@lantem@namepart}{use}[true]{% use* option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ use="1"}} | |
{}} | |
\define@key{blx@lantem@namepart}{pre}[true]{% pre option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ pre="1"}} | |
{}} | |
\define@key{blx@lantem@namepart}{compound}[true]{% base option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_compound="1"}} | |
{}} | |
\define@key{blx@lantem@namepart}{strwidth}{% integer | |
\eappto\blx@tempc{ substring\string_width="#1"}} | |
\define@key{blx@lantem@field}{strside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempc{ substring\string_side="right"}} | |
{\eappto\blx@tempc{ substring\string_side="left"}}} | |
% [<entrytype>]{<spec>} | |
\newrobustcmd*{\DeclareLabelalphaTemplate}[2][]{% | |
\ifblank{#1} | |
{\blx@latem{#2}{global}} | |
{\forcsvlist{\blx@latem{#2}}{#1}}} | |
\@onlypreamble\DeclareLabelalphaTemplate | |
\blx@collectopts{xml}{blx@globalopts}{labelalphatemplate}% for passing to the .bcf | |
\blx@collectopts{xml}{blx@typeopts}{labelalphatemplate}% for passing to the .bcf | |
\def\blx@latem#1#2{% | |
\begingroup | |
\let\labelelement\blx@latem@element | |
\let\field\blx@latem@field | |
\let\literal\blx@latem@literal | |
\blx@tempcnta\z@ | |
\let\blx@tempa\@empty | |
#1% | |
\ifdef\blx@latem@type | |
{\ifinlist{#2}\blx@latem@type | |
{\global\cslet{blx@labelalphatemplate@#2}\blx@tempa} | |
{\listgadd\blx@latem@type{#2}% | |
\global\cslet{blx@labelalphatemplate@#2}\blx@tempa}} | |
{\listgadd\blx@latem@type{#2}% | |
\global\cslet{blx@labelalphatemplate@#2}\blx@tempa}% | |
\endgroup} | |
\newcommand*{\blx@latem@element}[1]{% | |
\advance\blx@tempcnta\@ne | |
\let\blx@tempb\@empty | |
#1% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalpha@element{\the\blx@tempcnta}{\blx@tempb}}} | |
\newcommand*{\blx@latem@literal}[1]{% | |
\blx@xmlsanitizeafter{\def\blx@temps}{#1}% | |
\eappto\blx@tempb{% | |
\blx@xml@labelalpha@part{}{\expandafter\regexp\expandafter{\blx@temps}}}} | |
\newcommand*{\blx@latem@field}[2][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@latem@field}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@labelalpha@part{\blx@tempc}{#2}}} | |
% Legacy options moved to \namepart in \DeclareLabelalphaNameTemplate | |
\define@key{blx@latem@field}{compound}{% deprecated | |
\blx@warning@noline{% | |
Ignored 'compound' option to \string\field\space in \string\DeclareLabelalphaNameTemplate\MessageBreak | |
This is now the 'compound' option of \string\namepart\space in\MessageBreak | |
\string\DeclareLabelalphaNameTemplate}} | |
\define@key{blx@latem@field}{pcompound}{% deprecated | |
\blx@warning@noline{% | |
Ignored 'pcompound' option to \string\field\space in \string\DeclareLabelalphaNameTemplate\MessageBreak | |
This is now the 'compound' option of \string\namepart\space in\MessageBreak | |
\string\DeclareLabelalphaNameTemplate}} | |
\define@key{blx@latem@field}{pstrwidth}{% deprecated | |
\blx@warning@noline{% | |
Ignored 'pstrwidth' option to \string\field\space in \string\DeclareLabelalphaNameTemplate\MessageBreak | |
This is now the 'strwidth' option of \string\namepart\space in\MessageBreak | |
\string\DeclareLabelalphaNameTemplate}} | |
\define@key{blx@latem@field}{uppercase}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ uppercase="1"}} | |
{}} | |
\define@key{blx@latem@field}{lowercase}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ lowercase="1"}} | |
{}} | |
\define@key{blx@latem@field}{final}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ final="1"}} | |
{}} | |
\define@key{blx@latem@field}{strwidth}{% integer | |
\eappto\blx@tempc{ substring\string_width="#1"}} | |
\define@key{blx@latem@field}{varwidth}[true]{% "v" | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_width="v"}} | |
{}} | |
\define@key{blx@latem@field}{varwidthnorm}[true]{% "vf" | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_width="vf"}} | |
{}} | |
\define@key{blx@latem@field}{varwidthlist}[true]{% "l" | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_width="l"}} | |
{}} | |
\define@key{blx@latem@field}{strfixedcount}{% | |
\eappto\blx@tempc{ substring\string_fixed\string_threshold="#1"}} | |
\define@key{blx@latem@field}{strwidthmax}{% | |
\eappto\blx@tempc{ substring\string_width\string_max="#1"}} | |
\define@key{blx@latem@field}{strside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempc{ substring\string_side="right"}} | |
{\eappto\blx@tempc{ substring\string_side="left"}}} | |
\define@key{blx@latem@field}{namessep}{% | |
\eappto\blx@tempc{ namessep="#1"}} | |
\define@key{blx@latem@field}{ifnames}{% | |
\eappto\blx@tempc{ ifnames="#1"}} | |
\define@key{blx@latem@field}{names}{% | |
\eappto\blx@tempc{ names="#1"}} | |
\define@key{blx@latem@field}{noalphaothers}[true]{% | |
\eappto\blx@tempc{ noalphaothers="1"}} | |
\define@key{blx@latem@field}{padchar}{% | |
\blx@xmlsanitizeafter{\def\blx@temps}{#1}% | |
\eappto\blx@tempc{ pad\string_char="\expandafter\regexp\expandafter{\blx@temps}"}} | |
\define@key{blx@latem@field}{padside}{% left|right | |
\ifstrequal{#1}{left} | |
{\eappto\blx@tempc{ pad\string_side="left"}} | |
{\eappto\blx@tempc{ pad\string_side="right"}}} | |
% [<exceptions>]{<options>} | |
\newrobustcmd*{\DefaultInheritance}[2][]{% | |
\begingroup | |
\let\blx@tempf\@empty | |
\ifblank{#2} | |
{} | |
{\setkeys{blx@inherit@default}{#2}}% | |
\edef\blx@tempa{\space | |
inherit\string_all="\iftoggle{blx@inherit@all}{true}{false}"\space | |
override\string_target="\iftoggle{blx@inherit@override}{true}{false}"% | |
\blx@tempf}% | |
\let\blx@tempb\@empty | |
\let\except\blx@inherit@except | |
#1% | |
\xdef\blx@inherit@default{% | |
\blx@xml@inherit@defaults{\blx@tempa}{\blx@tempb}}% | |
\endgroup} | |
\@onlypreamble\DefaultInheritance | |
\newtoggle{blx@inherit@all} | |
\newtoggle{blx@inherit@override} | |
\define@key{blx@inherit@default}{all}[true]{% true|false | |
\settoggle{blx@inherit@all}{#1}} | |
\define@key{blx@inherit@default}{override}[true]{% true|false | |
\settoggle{blx@inherit@override}{#1}} | |
\define@key{blx@inherit@default}{ignore}{% csv list | |
\edef\blx@tempf{ ignore="#1"}} | |
% {<source>}{<target>}{<options>} | |
\newcommand*{\blx@inherit@except}[3]{% | |
\let\blx@tempc\@empty | |
\ifblank{#3} | |
{} | |
{\setkeys{blx@inherit@except}{#3}}% | |
\eappto\blx@tempb{% | |
\blx@xml@inherit@type{#1}{#2}{\blx@tempc}}} | |
\define@key{blx@inherit@except}{all}[true]{% true|false | |
\eappto\blx@tempc{ inherit\string_all="#1"}} | |
\define@key{blx@inherit@except}{override}[true]{% true|false | |
\eappto\blx@tempc{ override\string_target="#1"}} | |
\define@key{blx@inherit@except}{ignore}{% csv list | |
\eappto\blx@tempc{ ignore="#1"}} | |
% {<type,type,...>}{<type,type,...>}{<spec>} | |
\newrobustcmd*{\DeclareDataInheritance}[4][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\let\blx@tempf\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@inherit}{#1}}% | |
\forcsvlist{\blx@inherit@i{#3}}{#2}% | |
\let\blx@tempb\@empty | |
\let\inherit\blx@inherit@field | |
\let\noinherit\blx@inherit@block | |
#4% | |
\xappto\blx@inherit@data{% | |
\blx@xml@inherit@data{\blx@tempf}{% | |
\blx@tempa | |
\blx@tempb}}% | |
\endgroup} | |
\@onlypreamble\DeclareDataInheritance | |
\def\blx@inherit@i#1#2{% | |
\forcsvlist{\blx@inherit@ii{#2}}{#1}} | |
\def\blx@inherit@ii#1#2{% | |
\eappto\blx@tempa{\blx@xml@inherit@type{#1}{#2}{}}} | |
\blx@collectopts{xml}{blx@globalopts}{inheritance}% for passing to the .bcf | |
% [<options>]{<source>}{<target>} | |
\newcommand*{\blx@inherit@field}[3][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@inherit@field}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@inherit@field{#2}{#3}{\blx@tempc}}} | |
\newcommand*{\blx@inherit@block}[1]{% | |
\eappto\blx@tempb{\blx@xml@inherit@block{#1}}} | |
\define@key{blx@inherit}{ignore}{% csv list | |
\edef\blx@tempf{ ignore="#1"}} | |
\define@key{blx@inherit@field}{override}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\edef\blx@tempc{ override\string_target="true"}} | |
{\edef\blx@tempc{ override\string_target="false"}}} | |
\newrobustcmd*{\ResetDataInheritance}{% | |
\global\csundef{blx@inherit@data}} | |
\@onlypreamble\ResetDataInheritance | |
% {<name>}{<spec>} | |
\newrobustcmd*{\DeclareBiblistFilter}[2]{% | |
\begingroup | |
\let\filteror\blx@biblistfilteror | |
\let\filter\blx@biblistfilter | |
\let\blx@tempa\@empty | |
#2% | |
\global\cslet{blx@biblistfilters@#1}\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareBiblistFilter | |
\newcommand*{\blx@biblistfilteror}[1]{% | |
\eappto\blx@tempa{\blx@xml@slistfilterorbegin}% | |
#1% | |
\eappto\blx@tempa{\blx@xml@slistfilterorend}} | |
\newcommand*{\blx@biblistfilter}[1][2]{% | |
\let\blx@tempc\@empty | |
\let\blx@tempd\@empty | |
\setkeys{blx@biblistfilter@filter}{#1}% | |
\eappto\blx@tempa{% | |
\blx@xml@slistfilter{\blx@tempc}{\blx@tempd}}} | |
\define@key{blx@biblistfilter@filter}{type}{% | |
\def\blx@tempc{#1}} | |
\define@key{blx@biblistfilter@filter}{filter}{% | |
\def\blx@tempd{#1}} | |
% Predefine filters for label fields | |
\def\do#1{\DeclareBiblistFilter{#1}{\filter[type=field,filter=#1]}} | |
\abx@dolabelfields | |
% [<entrytype>] | |
\newrobustcmd*{\DeclareSortTranslit}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@tempa{*}} | |
{\def\blx@tempa{#1}}% | |
\let\translit\blx@translit@setup | |
\let\blx@tempb\@empty | |
#2% | |
\global\cslet{blx@translit@\blx@tempa}\blx@tempb | |
\xifinlist\blx@tempa\blx@translits | |
{} | |
{\listxadd\blx@translits\blx@tempa}% | |
\endgroup} | |
\@onlypreamble\DeclareSortTranslit | |
\blx@collectopts{xml}{blx@globalopts}{translit}% for passing to the .bcf | |
\blx@collectopts{xml}{blx@typeopts}{translit}% for passing to the .bcf | |
\newcommand*{\blx@translit@setup}[3][*]{% | |
\eappto\blx@tempb{% | |
\blx@xml@translit{#1}{#2}{#3}}} | |
% {<spec>} | |
\newrobustcmd*{\DeclareUniquenameTemplate}[1]{% | |
\begingroup | |
\let\namepart\blx@untemp@namepart | |
\let\blx@tempa\@empty | |
\blx@tempcnta\z@ | |
#1% | |
\global\let\blx@uniquenametemplate\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareUniquenameTemplate | |
\blx@collectopts{xml}{blx@globalopts}{uniquenametemplate}% for passing to the .bcf | |
\newcommand*{\blx@untemp@namepart}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@untemp@namepart}{#1}}% | |
\eappto\blx@tempa{% | |
\blx@xml@uniquenametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}} | |
\define@key{blx@untemp@namepart}{use}[true]{% use* option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ use="1"}} | |
{}} | |
\define@key{blx@untemp@namepart}{base}[true]{% base option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ base="1"}} | |
{}} | |
% [<specname>]{<spec>} | |
\newrobustcmd*{\DeclareSortingNamekeyScheme}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@snkname{global}}% default | |
{\def\blx@snkname{#1}}% | |
\let\namepart\blx@sortnk@namepart | |
\let\keypart\blx@sortnk@keypart | |
\let\literal\blx@sortnk@literal | |
\let\blx@tempa\@empty | |
\blx@tempcnta\z@ | |
#2% | |
\global\cslet{blx@sortingnamekey@\blx@snkname}\blx@tempa | |
\xifinlist\blx@snkname\blx@sortingnamekeyspecs | |
{} | |
{\listxadd\blx@sortingnamekeyspecs\blx@snkname}% | |
\endgroup} | |
\@onlypreamble\DeclareSortingNamekeyScheme | |
\blx@collectopts{xml}{blx@globalopts}{sortingnamekey}% for passing to the .bcf | |
\DeclareEntryOption[string]{sortnamekeyscheme}{% | |
\def\blx@refcontext@sortingnamekey{#1}} | |
% User-mode macro for checking sorting name key scheme | |
\def\ifsortnamekeyscheme#1{% | |
\expandafter\ifstrequal\expandafter{\blx@refcontext@sortingnamekey}{#1}} | |
\newcommand*{\blx@sortnk@keypart}[1]{% | |
\advance\blx@tempcnta\@ne | |
\blx@tempcntb\z@ | |
\edef\blx@tempd{ order="\the\blx@tempcnta"}% | |
\let\blx@tempb\@empty | |
#1% | |
\eappto\blx@tempa{% | |
\blx@xml@sortingnamekeykeypart{\blx@tempd}{\blx@tempb}}} | |
\newcommand*{\blx@sortnk@literal}[1]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{ order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\eappto\blx@tempb{% | |
\blx@xml@sortingnamekeyliteral{\blx@tempe}{#1}}} | |
\newcommand*{\blx@sortnk@namepart}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{ order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@sortnk@namepart}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@sortingnamekeynamepart{\blx@tempe}{\blx@tempc}{#2}}} | |
\define@key{blx@sortnk@namepart}{use}[true]{% use* option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ use="1"}} | |
{\appto\blx@tempc{ use="0"}}} | |
\define@key{blx@sortnk@namepart}{inits}[true]{% initials only option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ inits="1"}} | |
{\appto\blx@tempc{ inits="0"}}} | |
% {<name>}{<spec>} | |
\newrobustcmd*{\DeclareSortingScheme}[3][]{% | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@sortdef@sorting}{#1}% | |
\csxdef{blx@sortdef@locale@#2}{\blx@templ}}% | |
\begingroup | |
\def\name{%LEGACY(<2.0) | |
\blx@warning@noline{% | |
'\string\name' is deprecated in sorting specifications, please use '\string\field'}% | |
\blx@sortdef@field}% | |
\def\list{%LEGACY(<2.0) | |
\blx@warning@noline{% | |
'\string\list' is deprecated in sorting specifications, please use '\string\field'}% | |
\blx@sortdef@field}% | |
\let\sort\blx@sortdef@sort | |
\let\field\blx@sortdef@field | |
\let\literal\blx@sortdef@literal | |
\def\citeorder{\blx@sortdef@field{citeorder}}% | |
\blx@tempcnta\z@ | |
\let\blx@tempa\@empty | |
#3% | |
\global\cslet{blx@sorting@#2}\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareSortingScheme | |
\blx@collectopts{xml}{blx@globalopts}{sortscheme}% for passing to the .bcf | |
\define@key{blx@sortdef@sorting}{locale}{% locale name | |
\def\blx@templ{#1}} | |
\newcommand*{\blx@sortdef@sort}[2][]{% | |
\advance\blx@tempcnta\@ne | |
\blx@tempcntb\z@ | |
\let\blx@tempb\@empty | |
\edef\blx@tempc{order="\the\blx@tempcnta"}% | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@sortdef@sort}{#1}}% | |
\let\do\@firstofone | |
#2% | |
\eappto\blx@tempa{% | |
\blx@xml@sort{\blx@tempc}{\blx@tempb}}} | |
\define@key{blx@sortdef@sort}{locale}{% locale name | |
\eappto\blx@tempc{ locale="#1"}} | |
\define@key{blx@sortdef@sort}{direction}{% ascending|descending | |
\ifstrequal{#1}{ascending} | |
{\eappto\blx@tempc{ sort\string_direction="ascending"}} | |
{\eappto\blx@tempc{ sort\string_direction="descending"}}} | |
\define@key{blx@sortdef@sort}{final}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ final="1"}} | |
{}} | |
\define@key{blx@sortdef@sort}{sortcase}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ sortcase="1"}} | |
{\appto\blx@tempc{ sortcase="0"}}} | |
\define@key{blx@sortdef@sort}{sortupper}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ sortupper="1"}} | |
{\appto\blx@tempc{ sortupper="0"}}} | |
\newcommand*{\blx@sortdef@field}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempd{order="\the\blx@tempcntb"}% | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@sortdef@field}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@sortitem{\blx@tempd}{#2}}} | |
\define@key{blx@sortdef@field}{padside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempd{ pad\string_side="right"}} | |
{\eappto\blx@tempd{ pad\string_side="left"}}} | |
\define@key{blx@sortdef@field}{padwidth}{% integer | |
\eappto\blx@tempd{ pad\string_width="#1"}} | |
\define@key{blx@sortdef@field}{padchar}{% character | |
\blx@xmlsanitizeafter{\def\blx@tempe}{#1}% | |
\eappto\blx@tempd{ pad\string_char="\blx@tempe"}} | |
\define@key{blx@sortdef@field}{strside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempd{ substring\string_side="right"}} | |
{\eappto\blx@tempd{ substring\string_side="left"}}} | |
\define@key{blx@sortdef@field}{strwidth}{% integer | |
\eappto\blx@tempd{ substring\string_width="#1"}} | |
\def\blx@sortdef@literal#1{% | |
\advance\blx@tempcntb\@ne | |
\blx@xmlsanitizeafter{\def\blx@tempe}{#1}% | |
\eappto\blx@tempb{% | |
\blx@xml@sortitem{order="\the\blx@tempcntb"}{\blx@tempe}}} | |
% [<type,type,...>]{<string>} | |
\newrobustcmd*{\DeclarePresort}[2][]{% | |
\begingroup | |
\blx@xmlsanitizeafter{\def\blx@tempa}{#2}% | |
\ifblank{#1} | |
{\xdef\blx@bcf@presort{\blx@xml@presort{}{\blx@tempa}}} | |
{\notblank{#2} | |
{\forcsvlist{\blx@defpresort\blx@tempa}{#1}} | |
{\forcsvlist\blx@undefpresort{#1}}}% | |
\endgroup} | |
\@onlypreamble\DeclarePresort | |
\blx@collectopts{string}{blx@globalopts}{presort}% for passing to the .bcf | |
\blx@collectopts{string}{blx@typeopts}{presort}% for passing to the .bcf | |
\blx@collectopts{string}{blx@entryopts}{presort}% for passing to the .bcf | |
\def\blx@defpresort#1#2{% | |
\csxdef{blx@bcf@presort@#2}{\blx@xml@presort{#2}{#1}}} | |
\def\blx@undefpresort#1{% | |
\global\csundef{blx@bcf@presort@#1}} | |
% {<entrytype,...>}{<field,...>} | |
\newrobustcmd*{\DeclareSortExclusion}[2]{% | |
\forcsvlist{\blx@sortexclude{#2}}{#1}} | |
\blx@collectopts{xml}{blx@typeopts}{sortexclusion}% for passing to the .bcf | |
% {<field>}{<entrytype>} | |
\def\blx@sortexclude#1#2{% | |
\begingroup | |
\ifblank{#1} | |
{\global\csundef{blx@bcf@exclude@#2}} | |
{\let\blx@tempa\@empty | |
\forcsvlist\blx@sortexclude@i{#1}% | |
\csxdef{blx@bcf@exclude@#2}{% | |
\blx@xml@sortexclude{#2}{\blx@tempa}}} | |
\endgroup} | |
\def\blx@sortexclude@i#1{% | |
\appto\blx@tempa{\blx@xml@exclude{#1}}} | |
% {<entrytype,...>}{<field,...>} | |
\newrobustcmd*{\DeclareSortInclusion}[2]{% | |
\forcsvlist{\blx@sortinclude{#2}}{#1}} | |
\blx@collectopts{xml}{blx@typeopts}{sortinclusion}% for passing to the .bcf | |
% {<field>}{<entrytype>} | |
\def\blx@sortinclude#1#2{% | |
\begingroup | |
\ifblank{#1} | |
{\global\csundef{blx@bcf@include@#2}} | |
{\let\blx@tempa\@empty | |
\forcsvlist\blx@sortinclude@i{#1}% | |
\csxdef{blx@bcf@include@#2}{% | |
\blx@xml@sortinclude{#2}{\blx@tempa}}} | |
\endgroup} | |
\def\blx@sortinclude@i#1{% | |
\appto\blx@tempa{\blx@xml@include{#1}}} | |
% [<type,type,...>]{<field,field,...>} | |
\newrobustcmd*{\DeclareLabelname}[2][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\def\blx@tempb{labelnamespec}% | |
\let\field\blx@ordered@field | |
\ifblank{#1} | |
{\global\cslet{blx@bcf@labelnamespec}\@empty} | |
{\def\blx@tempa{#1}% | |
\def\do##1{\global\cslet{blx@bcf@labelnamespec@##1}\@empty}% | |
\expandafter\docsvlist\expandafter{#1}}% | |
#2% | |
\endgroup} | |
\@onlypreamble\DeclareLabelname | |
\blx@collectopts{xml}{blx@globalopts}{labelnamespec}% for passing to the .bcf | |
\blx@collectopts{xml}{blx@typeopts}{labelnamespec}% for passing to the .bcf | |
\newrobustcmd*{\DeclareLabeltitle}[2][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\def\blx@tempb{labeltitlespec}% | |
\let\field\blx@ordered@field | |
\ifblank{#1} | |
{\global\cslet{blx@bcf@labeltitlespec}\@empty} | |
{\def\blx@tempa{#1}% | |
\def\do##1{\global\cslet{blx@bcf@labeltitlespec@##1}\@empty}% | |
\expandafter\docsvlist\expandafter{#1}}% | |
#2% | |
\endgroup} | |
\@onlypreamble\DeclareLabeltitle | |
\blx@collectopts{xml}{blx@globalopts}{labeltitlespec}% for passing to the .bcf | |
\blx@collectopts{xml}{blx@typeopts}{labeltitlespec}% for passing to the .bcf | |
\newrobustcmd*{\DeclareLabelyear}[2][]{% | |
\blx@warning@noline{% | |
'DeclareLabelyear' is deprecated, please use 'DeclareLabeldate'}} | |
\newrobustcmd*{\DeclareLabeldate}[2][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\def\blx@tempb{labeldatespec}% | |
\let\field\blx@orderedld@field | |
\let\literal\blx@orderedld@literal | |
\ifblank{#1} | |
{\global\cslet{blx@bcf@labeldatespec}\@empty} | |
{\def\blx@tempa{#1}% | |
\def\do##1{\global\cslet{blx@bcf@labeldatespec@##1}\@empty}% | |
\expandafter\docsvlist\expandafter{#1}}% | |
#2% | |
\endgroup} | |
\@onlypreamble\DeclareLabeldate | |
\blx@collectopts{xml}{blx@globalopts}{labeldatespec}% for passing to the .bcf | |
\blx@collectopts{xml}{blx@typeopts}{labeldatespec}% for passing to the .bcf | |
\newcommand*{\blx@ordered@field}[2][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@ordered@field}{#1}}% | |
\advance\blx@tempcnta\@ne | |
\ifdefempty{\blx@tempa} | |
{\csxappto{blx@bcf@\blx@tempb}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}} | |
{\def\do##1{% | |
\blx@addtypeopt{##1}% | |
\csxappto{blx@bcf@\blx@tempb @##1}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}}% | |
\expandafter\docsvlist\expandafter{\blx@tempa}}} | |
\newcommand*{\blx@orderedld@field}[2][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\setkeys{blx@ordered@field}{#1}}% | |
\advance\blx@tempcnta\@ne | |
\ifdefempty{\blx@tempa} | |
{\csxappto{blx@bcf@\blx@tempb}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}} | |
{\def\do##1{% | |
\blx@addtypeopt{##1}% | |
\csxappto{blx@bcf@\blx@tempb @##1}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}}% | |
\expandafter\docsvlist\expandafter{\blx@tempa}}} | |
\newcommand*{\blx@orderedld@literal}[1]{% | |
\advance\blx@tempcnta\@ne | |
\ifdefempty{\blx@tempa} | |
{\csxappto{blx@bcf@\blx@tempb}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}} | |
{\def\do##1{% | |
\blx@addtypeopt{##1}% | |
\csxappto{blx@bcf@\blx@tempb @##1}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}}% | |
\expandafter\docsvlist\expandafter{\blx@tempa}}} | |
%% Package options | |
% [<entrytype,entrytype,...>]{<options>} | |
\newrobustcmd*{\ExecuteBibliographyOptions}[2][]{% | |
\ifblank{#1} | |
{\setkeys{blx@opt@pre}{#2}} | |
{\forcsvlist{\blx@typeoptions{#2}}{#1}}} | |
\@onlypreamble\ExecuteBibliographyOptions | |
\def\blx@typeoptions#1#2{% | |
\blx@addtypeopt{#2}% | |
\csappto{blx@opts@type@#2}{#1,}} | |
\def\blx@addtypeopt#1{% | |
\notblank{#1} | |
{\ifdef\blx@opts@type | |
{\ifinlist{#1}\blx@opts@type | |
{} | |
{\listgadd\blx@opts@type{#1}}} | |
{\listgadd\blx@opts@type{#1}}} | |
{}} | |
% load-time only | |
% Have to have a dummy for this as it's set much earlier but is passed | |
% through to here where we just ignore it | |
\define@key{blx@opt@ldt}{datamodel}{} | |
\define@key{blx@opt@ldt}{backend}{% | |
\ifstrequal{#1}{biber} | |
{} | |
{\ifboolexpr{ | |
test {\ifstrequal{#1}{bibtex}} | |
or | |
test {\ifstrequal{#1}{bibtex8}}} | |
{\settoggle{blx@bibtex}{true}% | |
\newtoggle{blx@bibtex8}% | |
\ifstrequal{#1}{bibtex8} | |
{\settoggle{blx@bibtex8}{true}} | |
{}}% | |
{\blx@err@invopt{backend=#1}{}}}} | |
\define@key{blx@opt@ldt}{style}{% | |
\def\blx@cbxfile{#1}% | |
\def\blx@bbxfile{#1}} | |
\define@key{blx@opt@ldt}{bibstyle}{% | |
\def\blx@bbxfile{#1}} | |
\define@key{blx@opt@ldt}{citestyle}{% | |
\def\blx@cbxfile{#1}} | |
\define@key{blx@opt@ldt}{natbib}[true]{% | |
\settoggle{blx@natbib}{#1}} | |
\define@key{blx@opt@ldt}{mcite}[true]{% | |
\settoggle{blx@mcite}{#1}} | |
% load-time and preamble | |
\DeclareBibliographyOption[boolean]{debug}[true]{% | |
\settoggle{blx@debug}{#1}} | |
\DeclareBibliographyOption[boolean]{loadfiles}[true]{% | |
\settoggle{blx@loadfiles}{#1}} | |
\DeclareBibliographyOption[integer]{mincrossrefs}{% | |
\ifnum#1<\z@ | |
\def\blx@mincrossrefs{1}% | |
\else | |
\def\blx@mincrossrefs{#1}% | |
\fi} | |
\DeclareBibliographyOption[integer]{minxrefs}{% | |
\ifnum#1<\z@ | |
\def\blx@minxrefs{1}% | |
\else | |
\def\blx@minxrefs{#1}% | |
\fi} | |
\def\blx@minxrefs{2} | |
\DeclareBibliographyOption[string]{texencoding}{% | |
\ifstrequal{#1}{auto} | |
{\undef\blx@texencoding} | |
{\def\blx@texencoding{#1}}} | |
\DeclareBibliographyOption[string]{bibencoding}{% | |
\ifcsdef{blx@bibenc@#1} | |
{\letcs\blx@bibencoding{blx@bibenc@#1}} | |
{\def\blx@bibencoding{#1}}} | |
\def\abx@mapbibenc#1#2{\csdef{blx@bibenc@#1}{#2}} | |
\abx@mapbibenc{inputenc}{auto} | |
\abx@mapbibenc{x-ascii}{ascii} | |
\def\abx@mapinpenc#1#2{\csdef{blx@inpenc@#1}{#2}} | |
\abx@mapinpenc{utf8x}{utf8} | |
\abx@mapinpenc{lutf8}{utf8} | |
\abx@mapinpenc{x-ascii}{ascii} | |
\DeclareBibliographyOption[boolean]{safeinputenc}[true]{% | |
\settoggle{blx@safeinputenc}{#1}} | |
\newtoggle{blx@safeinputenc} | |
\DeclareBibliographyOption[string]{sorting}{% | |
\def\blx@sorting{#1}% | |
\def\blx@refcontext@sorting{#1}} | |
\AtEndPreamble{% | |
\ifcsdef{blx@sorting@\blx@sorting} | |
{} | |
{\blx@err@invopt{sorting=\blx@sorting}{}% | |
\def\blx@sorting{nty}% | |
\def\blx@refcontext@sorting{nty}}% | |
\listxadd\blx@sortschemes\blx@sorting | |
\def\blx@refcontext@sortingnamekey{global}% | |
\let\blx@refcontext@labelprefix\@empty | |
\xdef\blx@refcontext@context{\blx@refcontext@sorting/\blx@refcontext@sortingnamekey/\blx@refcontext@labelprefix}% | |
\listxadd\blx@refcontexts\blx@refcontext@context} | |
\DeclareBibliographyOption[boolean]{sortcase}[true]{% | |
\settoggle{blx@sortcase}{#1}} | |
\DeclareBibliographyOption[boolean]{sortupper}[true]{% | |
\settoggle{blx@sortupper}{#1}} | |
\DeclareBibliographyOption[string]{sortlos}{% | |
\blx@warning@noline{% | |
sortlos option is deprecated, use 'sorting' option to \string\printbiblist}} | |
\DeclareBibliographyOption[integer]{maxnames}{% | |
\numdef\blx@maxcitenames{#1}% | |
\numdef\blx@maxbibnames{#1}} | |
\DeclareBibliographyOption[integer]{minnames}{% | |
\numdef\blx@mincitenames{#1}% | |
\numdef\blx@minbibnames{#1}} | |
\DeclareTypeOption[integer]{maxnames}{% | |
\numdef\blx@maxcitenames@type{#1}% | |
\numdef\blx@maxbibnames@type{#1}% | |
\c@maxnames#1\relax} | |
\DeclareTypeOption[integer]{minnames}{% | |
\numdef\blx@mincitenames@type{#1}% | |
\numdef\blx@minbibnames@type{#1}% | |
\c@minnames#1\relax} | |
\DeclareEntryOption[integer]{maxnames}{% | |
\c@maxnames#1\relax} | |
\DeclareEntryOption[integer]{minnames}{% | |
\c@minnames#1\relax} | |
\DeclareBibliographyOption[integer]{maxbibnames}{% | |
\numdef\blx@maxbibnames{#1}} | |
\DeclareBibliographyOption[integer]{minbibnames}{% | |
\numdef\blx@minbibnames{#1}} | |
\DeclareTypeOption[integer]{maxbibnames}{% | |
\numdef\blx@maxbibnames@type{#1}% | |
\iftoggle{blx@bibliography} | |
{\c@maxnames#1\relax} | |
{}} | |
\DeclareTypeOption[integer]{minbibnames}{% | |
\numdef\blx@minbibnames@type{#1}% | |
\iftoggle{blx@bibliography} | |
{\c@minnames#1\relax} | |
{}} | |
\DeclareEntryOption[integer]{maxbibnames}{% | |
\iftoggle{blx@bibliography} | |
{\c@maxnames#1\relax} | |
{}} | |
\DeclareEntryOption[integer]{minbibnames}{% | |
\iftoggle{blx@bibliography} | |
{\c@minnames#1\relax} | |
{}} | |
\DeclareBibliographyOption[integer]{maxcitenames}{% | |
\numdef\blx@maxcitenames{#1}} | |
\DeclareBibliographyOption[integer]{mincitenames}{% | |
\numdef\blx@mincitenames{#1}} | |
\DeclareTypeOption[integer]{maxcitenames}{% | |
\numdef\blx@maxcitenames@type{#1}% | |
\iftoggle{blx@bibliography} | |
{} | |
{\c@maxnames#1\relax}} | |
\DeclareTypeOption[integer]{mincitenames}{% | |
\numdef\blx@mincitenames@type{#1}% | |
\iftoggle{blx@bibliography} | |
{} | |
{\c@minnames#1\relax}} | |
\DeclareEntryOption[integer]{maxcitenames}{% | |
\iftoggle{blx@bibliography} | |
{} | |
{\c@maxnames#1\relax}} | |
\DeclareEntryOption[integer]{mincitenames}{% | |
\iftoggle{blx@bibliography} | |
{} | |
{\c@minnames#1\relax}} | |
\appto\blx@checkoptions@global{% | |
\blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames | |
\blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames} | |
\appto\blx@checkoptions@type{% | |
\blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames@type\blx@minbibnames@type | |
\blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames@type\blx@mincitenames@type} | |
\appto\blx@checkoptions@entry{% | |
\blx@maxmin@cnt{maxnames}{minnames}\c@maxnames\c@minnames} | |
\DeclareBibliographyOption[integer]{maxitems}{% | |
\numdef\blx@maxitems{#1}} | |
\DeclareBibliographyOption[integer]{minitems}{% | |
\numdef\blx@minitems{#1}} | |
\DeclareTypeOption[integer]{maxitems}{% | |
\numdef\blx@maxitems@type{#1}% | |
\c@maxitems#1\relax} | |
\DeclareTypeOption[integer]{minitems}{% | |
\numdef\blx@minitems@type{#1}% | |
\c@minitems#1\relax} | |
\DeclareEntryOption[integer]{maxitems}{% | |
\c@maxitems#1\relax} | |
\DeclareEntryOption[integer]{minitems}{% | |
\c@minitems#1\relax} | |
\appto\blx@checkoptions@global{% | |
\blx@maxmin@num{maxitems}{minitems}\blx@maxitems\blx@minitems} | |
\appto\blx@checkoptions@type{% | |
\blx@maxmin@num{maxitems}{minitems}\blx@maxitems@type\blx@minitems@type} | |
\appto\blx@checkoptions@entry{% | |
\blx@maxmin@cnt{maxitems}{minitems}\c@maxitems\blx@minitems} | |
\DeclareBibliographyOption[integer]{maxalphanames}{% | |
\numdef\blx@maxalphanames{#1}} | |
\DeclareBibliographyOption[integer]{minalphanames}{% | |
\numdef\blx@minalphanames{#1}} | |
\DeclareTypeOption[integer]{maxalphanames}{% | |
\numdef\blx@maxalphanames{#1}} | |
\DeclareTypeOption[integer]{minalphanames}{% | |
\numdef\blx@minalphanames{#1}} | |
\DeclareEntryOption[integer]{maxalphanames}{% | |
\numdef\blx@maxalphanames{#1}} | |
\DeclareEntryOption[integer]{minalphanames}{% | |
\numdef\blx@minalphanames{#1}} | |
\appto\blx@checkoptions@global{% | |
\blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames} | |
\appto\blx@checkoptions@type{% | |
\blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames} | |
\def\blx@maxmin@num#1#2#3#4{% | |
\ifnumless#3\@ne | |
{\blx@err@invopt{#1=#3}{'#1' must be greater than zero}% | |
\let#3\@ne} | |
{}% | |
\ifnumless#4\@ne | |
{\blx@err@invopt{#2=#4}{'#2' must be greater than zero}% | |
\let#4\@ne} | |
{}% | |
\ifnumless#3#4 | |
{\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}% | |
\let#3#4} | |
{}} | |
\def\blx@maxmin@cnt#1#2#3#4{% | |
\ifnumless#3\@ne | |
{\blx@err@invopt{#1=\number#3}{'#1' must be greater than zero}% | |
#3\@ne} | |
{}% | |
\ifnumless#4\@ne | |
{\blx@err@invopt{#2=\number#4}{'#2' must be greater than zero}% | |
#4\@ne} | |
{}% | |
\ifnumless#3#4 | |
{\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}% | |
#3=#4} | |
{}} | |
% Legacy for giveninits | |
\DeclareBibliographyOption[boolean]{firstinits}[true]{% | |
\blx@warning@noline{% | |
'firstinits' option is deprecated, use 'giveninits' instead}% | |
\settoggle{abx@bool@giveninits}{#1}} | |
% Legacy for sortfirstinits/sortgiveninits | |
\DeclareBibliographyOption[boolean]{sortfirstinits}[true]{% | |
\blx@warning@noline{% | |
'sortfirstinits' option is deprecated, use 'inits' option\MessageBreak | |
to \string\namepart\space in \string\DeclareSortingNamekeyScheme}} | |
\DeclareBibliographyOption[boolean]{sortgiveninits}{% | |
\blx@warning@noline{% | |
'sortgiveninits' option is deprecated, use 'inits' option\MessageBreak | |
to \string\namepart\space in \string\DeclareSortingNamekeyScheme}} | |
\DeclareBibliographyOption[boolean]{terseinits}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@terseinits} | |
\renewrobustcmd*{\bibinitperiod}{} | |
\renewrobustcmd*{\bibinitdelim}{} | |
\renewrobustcmd*{\bibinithyphendelim}{}} | |
{\togglefalse{blx@terseinits} | |
\renewrobustcmd*{\bibinitperiod}{\adddot} | |
\renewrobustcmd*{\bibinitdelim}{\addnbspace} | |
\renewrobustcmd*{\bibinithyphendelim}{\adddot\mbox{-}}}} | |
\DeclareBibliographyOption[boolean]{abbreviate}[true]{% | |
\ifstrequal{#1}{true} | |
{\def\abx@str{abx@sstr}} | |
{\def\abx@str{abx@lstr}}} | |
\DeclareBibliographyOption[boolean]{dateabbrev}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\abx@bibmonth\blx@imc@bibsstring | |
\let\abx@bibseason\blx@imc@bibsstring} | |
{\let\abx@bibmonth\blx@imc@biblstring | |
\let\abx@bibseason\blx@imc@biblstring}} | |
\DeclareBibliographyOption[string]{sortlocale}{% | |
\edef\blx@sortlocale{\detokenize{#1}}} | |
\DeclareBibliographyOption[string]{language}{% | |
\togglefalse{blx@autolangbib}% | |
\togglefalse{blx@autolangcite}% | |
\ifboolexpr{ | |
test {\ifstrequal{#1}{auto}} | |
or | |
test {\ifstrequal{#1}{autobib}} | |
or | |
test {\ifstrequal{#1}{autocite}} | |
} | |
{\def\blx@languagename{english}% | |
\ifstrequal{#1}{auto} | |
{\toggletrue{blx@autolangbib}% | |
\toggletrue{blx@autolangcite}} | |
{}% | |
\ifstrequal{#1}{autobib} | |
{\toggletrue{blx@autolangbib}} | |
{}% | |
\ifstrequal{#1}{autocite} | |
{\toggletrue{blx@autolangcite}} | |
{}} | |
% If language is explicit, we do want to auto-switch but only to the | |
% selected language | |
{\IfFileExists{#1.lbx} | |
{\toggletrue{blx@autolangbib}% | |
\toggletrue{blx@autolangcite}% | |
\edef\blx@languagename{#1}% | |
\edef\blx@forcelanguagename{#1}} | |
{\blx@error | |
{Language '#1' not supported} | |
{Failed to find a matching '#1.lbx' file}}}} | |
\DeclareBibliographyOption[boolean]{clearlang}[true]{% | |
\settoggle{blx@clearlang}{#1}} | |
\DeclareBibliographyOption[string]{babel}{% | |
\blx@warning@noline{% | |
'babel' option is deprecated, use 'autolang' instead}% | |
\blx@autolang@i{#1}} | |
\DeclareBibliographyOption[string]{autolang}{% | |
\blx@autolang@i{#1}} | |
\def\blx@autolang@i#1{% | |
\ifcsdef{blx@opt@autolang@#1} | |
{\csuse{blx@opt@autolang@#1}} | |
{\blx@err@invopt{autolang=#1}{}}} | |
\def\blx@opt@autolang@none{% | |
\undef\blx@thelangenv | |
\let\blx@hook@initlang\@empty | |
\let\blx@hook@endlang\@empty} | |
\def\blx@opt@autolang@hyphen{% | |
\def\blx@thelangenv{hyphenrules}% | |
\let\blx@hook@initlang\@empty | |
\let\blx@hook@endlang\@empty} | |
\csdef{blx@opt@autolang@other*}{% | |
\def\blx@thelangenv{otherlanguage*}% | |
\def\blx@hook@initlang{\@quotereset\@ne}% | |
\def\blx@hook@endlang{\blx@postpunct}} | |
\def\blx@opt@autolang@other{% | |
\def\blx@thelangenv{otherlanguage}% | |
\def\blx@hook@initlang{\@quotereset\@ne}% | |
\def\blx@hook@endlang{\blx@postpunct}} | |
\def\blx@opt@autolang@langname{% | |
\@ifpackageloaded{polyglossia} | |
{\def\blx@thelangenv{langname}} | |
{\def\blx@thelangenv{otherlanguage}}% | |
\def\blx@hook@initlang{\@quotereset\@ne}% | |
\def\blx@hook@endlang{\blx@postpunct}} | |
\DeclareBibliographyOption[boolean]{indexing}[true]{% | |
\blx@opt@index{#1}} | |
\DeclareTypeOption[boolean]{indexing}[true]{% | |
\blx@opt@index{#1}} | |
\DeclareEntryOption[boolean]{indexing}[true]{% | |
\blx@opt@index{#1}} | |
\def\blx@opt@index#1{% | |
\ifcsdef{blx@opt@index@#1} | |
{\csuse{blx@opt@index@#1}} | |
{\blx@err@invopt{indexing=#1}{}}} | |
\def\blx@opt@index@true{% | |
\toggletrue{blx@citeindex}% | |
\toggletrue{blx@bibindex}} | |
\def\blx@opt@index@false{% | |
\togglefalse{blx@citeindex}% | |
\togglefalse{blx@bibindex}} | |
\def\blx@opt@index@cite{% | |
\toggletrue{blx@citeindex}% | |
\togglefalse{blx@bibindex}} | |
\def\blx@opt@index@bib{% | |
\togglefalse{blx@citeindex}% | |
\toggletrue{blx@bibindex}} | |
\DeclareBibliographyOption[boolean]{sortcites}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\blx@thecitesort\blx@citesort | |
\let\blx@thenotecheck\blx@notecheck | |
\booltrue{sortcites}} | |
{\let\blx@thecitesort\blx@citenosort | |
\let\blx@thenotecheck\relax}} | |
\DeclareBibliographyOption[boolean]{hyperref}[true]{% | |
\ifcsdef{blx@opt@hyperref@#1} | |
{\letcs\blx@hyperref{blx@opt@hyperref@#1}} | |
{\blx@err@invopt{hyperref=#1}{}}} | |
\def\blx@opt@hyperref@false{0} | |
\def\blx@opt@hyperref@true{1} | |
\def\blx@opt@hyperref@auto{2} | |
\DeclareBibliographyOption[boolean]{backref}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\blx@backref\blx@addbackref | |
\let\abx@aux@backref\blx@aux@backref | |
\booltrue{backtracker}} | |
{\let\blx@backref\@gobble | |
\let\abx@aux@backref\@gobblefive | |
\boolfalse{backtracker}}} | |
\DeclareBibliographyOption[string]{backrefsetstyle}{% | |
\ifcsdef{blx@opt@backrefsetstyle@#1} | |
{\letcs\blx@backrefsetstyle{blx@opt@backrefsetstyle@#1}} | |
{\blx@err@invopt{backrefsetstyle=#1}{}}} | |
\def\blx@opt@backrefsetstyle@setonly{0} | |
\def\blx@opt@backrefsetstyle@memonly{1} | |
\def\blx@opt@backrefsetstyle@setormem{2} | |
\def\blx@opt@backrefsetstyle@setandmem{3} | |
\def\blx@opt@backrefsetstyle@memandset{4} | |
\def\blx@opt@backrefsetstyle@setplusmem{5} | |
\appto\blx@mkhyperref{% | |
\ifHy@plainpages | |
\blx@warning@noline{% | |
hyperref package option 'plainpages' enabled.\MessageBreak | |
This may cause problems with hyperlinked back\MessageBreak | |
references. 'plainpages=false' is recommended}% | |
\fi | |
\ifHy@pageanchor\else | |
\blx@warning@noline{% | |
hyperref package option 'pageanchor' disabled.\MessageBreak | |
This will cause problems with hyperlinked back\MessageBreak | |
references. 'pageanchor=true' is required}% | |
\fi} | |
\DeclareBibliographyOption[string]{block}{% | |
\ifcsdef{blx@opt@block@#1} | |
{\csuse{blx@opt@block@#1}} | |
{\blx@err@invopt{block=#1}{}}} | |
\def\blx@opt@block@none{% | |
\let\blx@bibsetup\@empty | |
\let\newblockpunct\@empty} | |
\def\blx@opt@block@par{% | |
\let\blx@bibsetup\@empty | |
\def\newblockpunct{\par}} | |
\def\blx@opt@block@nbpar{% | |
\def\blx@bibsetup{\interlinepenalty\@M}% | |
\def\newblockpunct{\par\nobreak}} | |
\def\blx@opt@block@space{% | |
\let\blx@bibsetup\@empty | |
\def\newblockpunct{% | |
\unspace\space | |
\hskip 0.11em | |
\@plus 0.33em | |
\@minus 0.07em}} | |
\def\blx@opt@block@ragged{% | |
\let\blx@bibsetup\raggedright | |
\def\newblockpunct{% | |
\unspace\penalty-9\relax\space}} | |
\DeclareBibliographyOption[boolean]{pagetracker}[true]{% | |
\ifcsdef{blx@opt@pagetracker@#1} | |
{\csuse{blx@opt@pagetracker@#1}} | |
{\blx@err@invopt{pagetracker=#1}{}}} | |
\def\blx@opt@pagetracker@true{% | |
\if@twoside | |
\blx@opt@pagetracker@spread | |
\else | |
\blx@opt@pagetracker@page | |
\fi} | |
\def\blx@opt@pagetracker@false{% | |
\let\blx@pagetracker\relax | |
\let\abx@aux@page\@gobbletwo | |
\let\abx@aux@fnpage\@gobbletwo | |
\boolfalse{pagetracker}} | |
\def\blx@opt@pagetracker@page{% | |
\let\blx@pagetracker\blx@pagetracker@context | |
\let\abx@aux@page\blx@aux@page | |
\let\abx@aux@fnpage\blx@aux@fnpage | |
\booltrue{pagetracker}} | |
\def\blx@opt@pagetracker@spread{% | |
\if@twoside | |
\let\blx@pagetracker\blx@pagetracker@context | |
\let\abx@aux@page\blx@aux@spread | |
\let\abx@aux@fnpage\blx@aux@fnspread | |
\booltrue{pagetracker}% | |
\else | |
\blx@warning@noline{% | |
LaTeX not in twoside mode\MessageBreak | |
Falling back to 'pagetracker=page'}% | |
\blx@opt@pagetracker@page | |
\fi} | |
\DeclareBibliographyOption[boolean]{citecounter}[true]{% | |
\ifcsdef{blx@opt@citecounter@#1} | |
{\csuse{blx@opt@citecounter@#1}} | |
{\blx@err@invopt{citecounter=#1}{}}} | |
\def\blx@opt@citecounter@true{% | |
\let\blx@setcitecounter\blx@setcitecounter@global | |
\let\blx@citecounter\blx@citecounter@global | |
\let\abx@aux@count\blx@aux@count | |
\let\abx@aux@fncount\blx@aux@fncount | |
\booltrue{citetracker}} | |
\def\blx@opt@citecounter@context{% | |
\let\blx@setcitecounter\blx@setcitecounter@context | |
\let\blx@citecounter\blx@citecounter@context | |
\let\abx@aux@count\blx@aux@count | |
\let\abx@aux@fncount\blx@aux@fncount | |
\booltrue{citetracker}} | |
\def\blx@opt@citecounter@false{% | |
\let\blx@setcitecounter\relax | |
\let\blx@citecounter\relax | |
\let\abx@aux@count\@gobbletwo | |
\let\abx@aux@fncount\@gobbletwo} | |
\DeclareBibliographyOption[boolean]{citetracker}[true]{% | |
\ifcsdef{blx@opt@citetracker@#1} | |
{\csuse{blx@opt@citetracker@#1}} | |
{\blx@err@invopt{citetracker=#1}{}}} | |
\def\blx@opt@citetracker@true{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@global | |
\let\blx@imc@ifentryseen\blx@ifentryseen@global | |
\let\blx@citetracker\blx@citetracker@global | |
\booltrue{citetracker}} | |
\def\blx@opt@citetracker@false{% | |
\let\blx@imc@ifciteseen\@secondoftwo | |
\protected\long\def\blx@imc@ifentryseen##1##2##3{##3}% | |
\let\blx@citetracker\relax} | |
\def\blx@opt@citetracker@context{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@context | |
\let\blx@imc@ifentryseen\blx@ifentryseen@context | |
\let\blx@citetracker\blx@citetracker@context | |
\booltrue{citetracker}} | |
\def\blx@opt@citetracker@strict{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@global | |
\let\blx@imc@ifentryseen\blx@ifentryseen@global | |
\def\blx@citetracker{% | |
\blx@ifcitesingle{\blx@citetracker@global}{}}% | |
\booltrue{citetracker}} | |
\def\blx@opt@citetracker@constrict{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@context | |
\let\blx@imc@ifentryseen\blx@ifentryseen@context | |
\def\blx@citetracker{% | |
\blx@ifcitesingle{\blx@citetracker@context}{}}% | |
\booltrue{citetracker}} | |
\DeclareBibliographyOption[boolean]{ibidtracker}[true]{% | |
\ifcsdef{blx@opt@ibidtracker@#1} | |
{\csuse{blx@opt@ibidtracker@#1}} | |
{\blx@err@invopt{ibidtracker=#1}{}}} | |
\def\blx@opt@ibidtracker@true{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@global | |
\let\blx@ibidtracker\blx@ibidtracker@global | |
\let\blx@ibidreset\blx@ibidreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@ibidtracker@false{% | |
\let\blx@imc@ifciteibid\@secondoftwo | |
\let\blx@ibidtracker\relax | |
\let\blx@ibidreset\relax} | |
\def\blx@opt@ibidtracker@context{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@context | |
\let\blx@ibidtracker\blx@ibidtracker@context | |
\let\blx@ibidreset\blx@ibidreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@ibidtracker@strict{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@strict | |
\let\blx@ibidtracker\blx@ibidtracker@strict | |
\let\blx@ibidreset\blx@ibidreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@ibidtracker@constrict{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@constrict | |
\let\blx@ibidtracker\blx@ibidtracker@constrict | |
\let\blx@ibidreset\blx@ibidreset@context | |
\booltrue{citetracker}} | |
\DeclareBibliographyOption[boolean]{idemtracker}[true]{% | |
\ifcsdef{blx@opt@idemtracker@#1} | |
{\csuse{blx@opt@idemtracker@#1}} | |
{\blx@err@invopt{idemtracker=#1}{}}} | |
\def\blx@opt@idemtracker@true{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@global | |
\let\blx@idemtracker\blx@idemtracker@global | |
\let\blx@idemreset\blx@idemreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@idemtracker@false{% | |
\let\blx@imc@ifciteidem\@secondoftwo | |
\let\blx@idemtracker\relax | |
\let\blx@idemreset\relax} | |
\def\blx@opt@idemtracker@context{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@context | |
\let\blx@idemtracker\blx@idemtracker@context | |
\let\blx@idemreset\blx@idemreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@idemtracker@strict{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@strict | |
\let\blx@idemtracker\blx@idemtracker@strict | |
\let\blx@idemreset\blx@idemreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@idemtracker@constrict{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@constrict | |
\let\blx@idemtracker\blx@idemtracker@constrict | |
\let\blx@idemreset\blx@idemreset@context | |
\booltrue{citetracker}} | |
\DeclareBibliographyOption[boolean]{opcittracker}[true]{% | |
\ifcsdef{blx@opt@opcittracker@#1} | |
{\csuse{blx@opt@opcittracker@#1}} | |
{\blx@err@invopt{opcittracker=#1}{}}} | |
\def\blx@opt@opcittracker@true{% | |
\let\blx@imc@ifopcit\blx@ifopcit@global | |
\let\blx@opcittracker\blx@opcittracker@global | |
\let\blx@opcitreset\blx@opcitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@opcittracker@false{% | |
\let\blx@imc@ifopcit\@secondoftwo | |
\let\blx@opcittracker\relax | |
\let\blx@opcitreset\relax} | |
\def\blx@opt@opcittracker@context{% | |
\let\blx@imc@ifopcit\blx@ifopcit@context | |
\let\blx@opcittracker\blx@opcittracker@context | |
\let\blx@opcitreset\blx@opcitreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@opcittracker@strict{% | |
\let\blx@imc@ifopcit\blx@ifopcit@strict | |
\let\blx@opcittracker\blx@opcittracker@strict | |
\let\blx@opcitreset\blx@opcitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@opcittracker@constrict{% | |
\let\blx@imc@ifopcit\blx@ifopcit@constrict | |
\let\blx@opcittracker\blx@opcittracker@constrict | |
\let\blx@opcitreset\blx@opcitreset@context | |
\booltrue{citetracker}} | |
\DeclareBibliographyOption[boolean]{loccittracker}[true]{% | |
\ifcsdef{blx@opt@loccittracker@#1} | |
{\csuse{blx@opt@loccittracker@#1}} | |
{\blx@err@invopt{loccittracker=#1}{}}} | |
\def\blx@opt@loccittracker@true{% | |
\let\blx@imc@ifloccit\blx@ifloccit@global | |
\let\blx@loccittracker\blx@loccittracker@global | |
\let\blx@loccitreset\blx@loccitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@loccittracker@false{% | |
\let\blx@imc@ifloccit\@secondoftwo | |
\let\blx@loccittracker\relax | |
\let\blx@loccitreset\relax} | |
\def\blx@opt@loccittracker@context{% | |
\let\blx@imc@ifloccit\blx@ifloccit@context | |
\let\blx@loccittracker\blx@loccittracker@context | |
\let\blx@loccitreset\blx@loccitreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@loccittracker@strict{% | |
\let\blx@imc@ifloccit\blx@ifloccit@strict | |
\let\blx@loccittracker\blx@loccittracker@strict | |
\let\blx@loccitreset\blx@loccitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@loccittracker@constrict{% | |
\let\blx@imc@ifloccit\blx@ifloccit@constrict | |
\let\blx@loccittracker\blx@loccittracker@constrict | |
\let\blx@loccitreset\blx@loccitreset@context | |
\booltrue{citetracker}} | |
\DeclareBibliographyOption[boolean]{parentracker}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\bibopenparen\blx@bibopenparen | |
\let\bibcloseparen\blx@bibcloseparen | |
\let\bibopenbracket\blx@bibopenbracket | |
\let\bibclosebracket\blx@bibclosebracket} | |
{\protected\def\bibopenparen{\bibleftparen}% | |
\protected\def\bibcloseparen{\bibrightparen}% | |
\protected\def\bibopenbracket{\bibleftbracket}% | |
\protected\def\bibclosebracket{\bibrightbracket}}} | |
\DeclareBibliographyOption[integer]{maxparens}{% | |
\ifnumless{#1}{1} | |
{\blx@err@invopt{maxparens=#1}{}} | |
{\setcounter{maxparens}{#1}}} | |
\newtoggle{blx@labeldateusetime} | |
\DeclareBibliographyOption[boolean]{labeldateusetime}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@labeldateusetime}} | |
{\togglefalse{blx@labeldateusetime}}} | |
\DeclareBibliographyOption[string]{labeldate}{% | |
% 'true' or 'false' means that the user thinks that this is the old 'labeldate' | |
% option which is now 'labeldateparts' (which is a boolean). | |
\ifboolexpr{% | |
test {\ifstrequal{#1}{true}} | |
or | |
test {\ifstrequal{#1}{false}}} | |
{\blx@warning@noline{% | |
'labeldate' option used to determine whether to provide label date fields and\MessageBreak | |
extrayear field is renamed to 'labeldateparts', setting this instead. This option is | |
now used to set the format of the labeldate}% | |
\settoggle{blx@labeldateparts}{#1}} | |
{\ifstrequal{#1}{iso8601} | |
{\blx@warning@noline{% | |
'iso8601' date format specifier is deprecated, use 'edtf' instead}% | |
\def\blx@dateformat@labeldate{edtf}% | |
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{\def\blx@dateformat@labeldate{#1}}% | |
\ifstrequal{#1}{ymd} | |
{\renewrobustcmd*{\bibdaterangesep}{\slash}% | |
\renewrobustcmd*{\bibtimerangesep}{\slash}% | |
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{}% | |
\ifstrequal{#1}{edtf}% bibdaterangesep hard-coded to slash, no extra space before prefices | |
{\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{}% | |
\ifcsdef{mkdaterange#1} | |
{\protected\def\blx@imc@printlabeldate{\csuse{mkdaterange#1}{label}} | |
\protected\def\blx@imc@printlabeldateextra{\csuse{mkdaterange#1extra}{label}}} | |
{\ifcsdef{mkbibrange#1}%LEGACY(<3.5) | |
{\protected\def\blx@imc@printlabeldate{\csuse{mkbibrange#1}{label}} | |
\protected\def\blx@imc@printlabeldateextra{\csuse{mkbibrange#1extra}{label}}} | |
{\blx@err@invopt{labeldate=#1}{}}}}} | |
\DeclareBibliographyOption[string]{datelabel}{% | |
\blx@warning@noline{% | |
'datelabel' option is deprecated, use 'labeldate' instead}% | |
\setkeys{blx@opt@pre}{labeldate=#1}} | |
\DeclareBibliographyOption[string]{labeltime}{% | |
\ifcsdef{mktimerange#1} | |
{\def\blx@timeformat@labeltime{#1}% | |
\protected\def\blx@imc@printlabeltime{\csuse{mktimerange#1}{label}}} | |
{\blx@err@invopt{labeltime=#1}{}}} | |
% Date meta-information | |
\DeclareBibliographyOption[string]{dateera}{% | |
\ifboolexpr{% | |
test {\ifstrequal{#1}{astronomical}} | |
or | |
test {\ifstrequal{#1}{secular}} | |
or | |
test {\ifstrequal{#1}{christian}}} | |
{\def\blx@dateera{#1}% | |
\ifstrequal{#1}{secular} | |
{\def\blx@dateera@bce{beforecommonera}% | |
\def\blx@dateera@ce{commonera}} | |
{}% | |
\ifstrequal{#1}{christian} | |
{\def\blx@dateera@bce{beforechrist}% | |
\def\blx@dateera@ce{annodomini}} | |
{}} | |
{\blx@err@invopt{dateera=#1}{}}} | |
% Effectively turns off dateeraauto since it's only used on ce dates which | |
% are never less than zero (as that would be a bce date) | |
\numdef\blx@dateeraauto{0} | |
\DeclareBibliographyOption[integer]{dateeraauto}{% | |
\numdef\blx@dateeraauto{#1}} | |
\newtoggle{blx@datecirca} | |
\DeclareBibliographyOption[boolean]{datecirca}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@datecirca}% | |
\protected\def\datecircaprint{% | |
\ifdatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}% | |
\protected\def\enddatecircaprint{% | |
\ifenddatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}% | |
\protected\def\datecircaprintedtf{% | |
\ifdatecirca{\textasciitilde}{}}% | |
\protected\def\enddatecircaprintedtf{% | |
\ifenddatecirca{\textasciitilde}{}}} | |
{\togglefalse{blx@datecirca}}} | |
\newtoggle{blx@dateuncertain} | |
\DeclareBibliographyOption[boolean]{dateuncertain}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@dateuncertain}% | |
\protected\def\dateuncertainprint{% | |
\ifdateuncertain{\bibdateuncertain}{}}% | |
\protected\def\enddateuncertainprint{% | |
\ifenddateuncertain{\bibdateuncertain}{}}} | |
{\togglefalse{blx@dateuncertain}}} | |
% *time format options - auto-created for all datamodel date fields | |
% *date format options - auto-created for all datamodel date fields | |
% *dateusetime options - auto-created for all datamodel date fields | |
% Date metadata toggles are defined in one of the \abx@dobooleans calls | |
\def\do#1{% | |
\DeclareBibliographyOption[string]{#1date}{% | |
\ifstrequal{##1}{iso8601} | |
{\blx@warning@noline{'iso8601' date format specifier is deprecated, use 'edtf' instead}% | |
\csdef{blx@dateformat@#1date}{edtf}} | |
{\csdef{blx@dateformat@#1date}{##1}}% | |
\ifstrequal{##1}{ymd} | |
{\renewrobustcmd*{\bibdaterangesep}{\slash}% | |
\renewrobustcmd*{\bibtimerangesep}{\slash}% | |
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{}% | |
\ifcsdef{mkdaterange##1} | |
{\protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkdaterange##1}{#1}}% | |
\protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkdaterange##1extra}{#1}}} | |
{\ifcsdef{mkbibrange##1}%LEGACY(<3.5) | |
{\blx@warning@noline{% | |
'\string\mkbibrange##1(extra)' date range macro in style is deprecated,\MessageBreak | |
please define '\string\mkdaterange##1(extra)' instead}% | |
\protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkbibrange##1}{#1}}% | |
\protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkbibrange##1extra}{#1}}} | |
{\blx@err@invopt{#1date=##1}{}}}}% | |
% Default for new date fields is "comp" but this is overridden below by | |
% biblatex defaults | |
\setkeys{blx@opt@pre}{#1date=comp}% | |
% Time format options | |
\DeclareBibliographyOption[string]{#1time}{% | |
\csdef{blx@timeformat@#1time}{##1}% | |
\ifcsdef{mktimerange##1} | |
{\protected\csedef{blx@imc@print#1time}{\csuse{mktimerange##1}{#1}}} | |
{\blx@err@invopt{#1time=##1}{}}}% | |
% Default for new time fields is "24h" | |
\setkeys{blx@opt@pre}{#1time=24h}% | |
% Boolean for unknown dates | |
\newtoggle{abx@bool@#1dateunknown}% | |
\newtoggle{abx@bool@end#1dateunknown}% | |
% Boolean to determine if times are printed with dates | |
\newtoggle{blx@#1dateusetime}% | |
\DeclareBibliographyOption[boolean]{#1dateusetime}{% | |
\ifstrequal{##1}{true} | |
{\toggletrue{blx@#1dateusetime}} | |
{\togglefalse{blx@#1dateusetime}}}} | |
\abx@dodatetypes | |
\DeclareBibliographyOption[string]{alldatesusetime}{% | |
\def\do##1{\ExecuteBibliographyOptions{##1usetime=#1}}% | |
\abx@dodates | |
\do{labeldate}} | |
\DeclareBibliographyOption[string]{alldates}{% | |
\def\do##1{\ExecuteBibliographyOptions{##1=#1}}% | |
\abx@dodates | |
\do{labeldate}} | |
\DeclareBibliographyOption[string]{alltimes}{% | |
\def\do##1{% | |
\ExecuteBibliographyOptions{##1time=#1}}% | |
\abx@dodatetypes | |
\do{label}} | |
\newtoggle{blx@julian} | |
\def\blx@gregorianstart{1582-10-15} | |
\DeclareBibliographyOption[boolean]{julian}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@julian}} | |
{\togglefalse{blx@julian}}} | |
\DeclareBibliographyOption[string]{gregorianstart}{% | |
\def\blx@gregorianstart{#1}} | |
\newtoggle{blx@datezeros}\toggletrue{blx@datezeros} | |
\DeclareBibliographyOption[boolean]{datezeros}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@datezeros}% | |
\let\blx@imc@mkyearzeros\blx@imc@forcezerosy | |
\let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt | |
\let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt} | |
{\togglefalse{blx@datezeros}% | |
\let\blx@imc@mkyearzeros\blx@imc@stripzeros | |
\let\blx@imc@mkmonthzeros\blx@imc@stripzeros | |
\let\blx@imc@mkdayzeros\blx@imc@stripzeros}} | |
\newtoggle{blx@timezeros}\toggletrue{blx@timezeros} | |
\DeclareBibliographyOption[boolean]{timezeros}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@timezeros}% | |
\let\blx@imc@mktimezeros\blx@imc@forcezerosmdt} | |
{\togglefalse{blx@timezeros}% | |
\let\blx@imc@mktimezeros\blx@imc@stripzeros}} | |
\newtoggle{blx@timezones} | |
\DeclareBibliographyOption[boolean]{timezones}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@timezones}} | |
{\togglefalse{blx@timezones}}} | |
\newtoggle{blx@seconds} | |
\DeclareBibliographyOption[boolean]{seconds}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@seconds}} | |
{\togglefalse{blx@seconds}}} | |
\DeclareBibliographyOption[string]{autocite}{% | |
\ifcsundef{blx@acite@#1} | |
{\blx@error | |
{Autocite command '#1' undefined} | |
{The autocite command '#1' has not been defined by | |
the\MessageBreak selected citation style}} | |
{\letcs\autocite{blx@acite@#1}% | |
\letcs\autocites{blx@macite@#1}}} | |
\DeclareBibliographyOption[string]{notetype}{% | |
\ifcsdef{blx@opt@notetype@#1} | |
{\blx@notetype\csuse{blx@opt@notetype@#1}} | |
{\blx@err@invopt{notetype=#1}{}}} | |
\cslet{blx@opt@notetype@foot+end}\z@ | |
\let\blx@opt@notetype@footonly\@ne | |
\let\blx@opt@notetype@endonly\tw@ | |
\DeclareBibliographyOption[boolean]{autopunct}[true]{% | |
\ifstrequal{#1}{true} | |
{\DeclareAutoPunctuation{.,;:!?}} | |
{\DeclareAutoPunctuation{}}} | |
\DeclareBibliographyOption[boolean]{punctfont}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\blx@ifpuncthook\@firstoftwo} | |
{\let\blx@ifpuncthook\@secondoftwo}} | |
\DeclareBibliographyOption[boolean]{labelnumber}[true]{% | |
\settoggle{blx@labelnumber}{#1}% | |
\iftoggle{blx@labelnumber} | |
{} | |
{\setkeys{blx@opt@pre}{defernumbers=false}}} | |
\DeclareTypeOption[boolean]{labelnumber}[true]{% | |
\settoggle{blx@labelnumber}{#1}} | |
\DeclareBibliographyOption[boolean]{labelalpha}[true]{% | |
\settoggle{blx@labelalpha}{#1}} | |
\DeclareTypeOption[boolean]{labelalpha}[true]{% | |
\settoggle{blx@labelalpha}{#1}} | |
\DeclareBibliographyOption[boolean]{labeltitle}[true]{% | |
\settoggle{blx@labeltitle}{#1}} | |
\DeclareTypeOption[boolean]{labeltitle}[true]{% | |
\settoggle{blx@labeltitle}{#1}} | |
\DeclareBibliographyOption[boolean]{labeltitleyear}[true]{% | |
\settoggle{blx@labeltitleyear}{#1}} | |
\DeclareTypeOption[boolean]{labeltitleyear}[true]{% | |
\settoggle{blx@labeltitleyear}{#1}} | |
\DeclareBibliographyOption[boolean]{labeldateparts}[true]{% | |
\settoggle{blx@labeldateparts}{#1}} | |
\DeclareTypeOption[boolean]{labeldateparts}[true]{% | |
\settoggle{blx@labeldateparts}{#1}} | |
\DeclareBibliographyOption[boolean]{labelyear}[true]{% | |
\blx@warning@noline{% | |
'labelyear' option is deprecated, use 'labeldateparts' instead}% | |
\settoggle{blx@labeldateparts}{#1}} | |
\DeclareTypeOption[boolean]{labelyear}[true]{% | |
\blx@warning@noline{% | |
'labelyear' option is deprecated, use 'labeldateparts' instead}% | |
\settoggle{blx@labeldateparts}{#1}} | |
\DeclareBibliographyOption[boolean]{uniquelist}[true]{% | |
\ifcsdef{blx@opt@uniquelist@#1} | |
{\letcs\blx@uniquelist{blx@opt@uniquelist@#1}} | |
{\blx@err@invopt{uniquelist=#1}{}}} | |
\DeclareTypeOption[boolean]{uniquelist}[true]{% | |
\ifcsdef{blx@opt@uniquelist@#1} | |
{\letcs\blx@uniquelist{blx@opt@uniquelist@#1}} | |
{\blx@err@invopt{uniquelist=#1}{}}} | |
\DeclareEntryOption[boolean]{uniquelist}[true]{% | |
\ifcsdef{blx@opt@uniquelist@#1} | |
{\letcs\blx@uniquelist{blx@opt@uniquelist@#1}} | |
{\blx@err@invopt{uniquelist=#1}{}}} | |
\def\blx@opt@uniquelist@false{0} | |
\def\blx@opt@uniquelist@true{1} | |
\def\blx@opt@uniquelist@minyear{2} | |
\DeclareBibliographyOption[boolean]{uniquename}[true]{% | |
\ifcsdef{blx@opt@uniquename@#1} | |
{\letcs\blx@uniquename{blx@opt@uniquename@#1}} | |
{\blx@err@invopt{uniquename=#1}{}}} | |
\DeclareTypeOption[boolean]{uniquename}[true]{% | |
\ifcsdef{blx@opt@uniquename@#1} | |
{\letcs\blx@uniquename{blx@opt@uniquename@#1}} | |
{\blx@err@invopt{uniquename=#1}{}}} | |
\DeclareEntryOption[boolean]{uniquename}[true]{% | |
\ifcsdef{blx@opt@uniquename@#1} | |
{\letcs\blx@uniquename{blx@opt@uniquename@#1}} | |
{\blx@err@invopt{uniquename=#1}{}}} | |
\def\blx@opt@uniquename@false{0} | |
\def\blx@opt@uniquename@init{1} | |
\def\blx@opt@uniquename@true{2} | |
\def\blx@opt@uniquename@full{2} | |
\def\blx@opt@uniquename@allinit{3} | |
\def\blx@opt@uniquename@allfull{4} | |
\def\blx@opt@uniquename@mininit{5} | |
\def\blx@opt@uniquename@minfull{6} | |
\DeclareBibliographyOption[boolean]{singletitle}[true]{% | |
\settoggle{blx@singletitle}{#1}} | |
\DeclareTypeOption[boolean]{singletitle}[true]{% | |
\settoggle{blx@singletitle}{#1}} | |
\DeclareBibliographyOption[boolean]{uniquetitle}[true]{% | |
\settoggle{blx@uniquetitle}{#1}} | |
\DeclareTypeOption[boolean]{uniquetitle}[true]{% | |
\settoggle{blx@uniquetitle}{#1}} | |
\DeclareBibliographyOption[boolean]{uniquebaretitle}[true]{% | |
\settoggle{blx@uniquebaretitle}{#1}} | |
\DeclareTypeOption[boolean]{uniquebaretitle}[true]{% | |
\settoggle{blx@uniquebaretitle}{#1}} | |
\DeclareBibliographyOption[boolean]{uniquework}[true]{% | |
\settoggle{blx@uniquework}{#1}} | |
\DeclareTypeOption[boolean]{uniquework}[true]{% | |
\settoggle{blx@uniquework}{#1}} | |
\DeclareBibliographyOption[boolean]{uniqueprimaryauthor}[true]{% | |
\settoggle{blx@uniqueprimaryauthor}{#1}} | |
\DeclareBibliographyOption[boolean]{defernumbers}[true]{% | |
\settoggle{blx@defernumbers}{#1}% | |
\iftoggle{blx@defernumbers} | |
{\setkeys{blx@opt@pre}{labelnumber}% | |
\let\blx@thelabelnumber\blx@addlabelnumber | |
\let\abx@aux@number\blx@aux@number} | |
{\let\blx@thelabelnumber\relax | |
\let\abx@aux@number\@gobblefive}} | |
\DeclareBibliographyOption[string]{refsection}{% | |
\ifcsdef{blx@opt@refsection@#1} | |
{\letcs\blx@refsecreset@level{blx@opt@refsection@#1}} | |
{\blx@err@invopt{refsection=#1}{}}} | |
\def\blx@opt@refsection@none{0} | |
\def\blx@opt@refsection@part{1} | |
\def\blx@opt@refsection@chapter{2} | |
\def\blx@opt@refsection@section{3} | |
\def\blx@opt@refsection@subsection{4} | |
\AtEndPreamble{% | |
\ifcase\blx@refsecreset@level | |
\or % 1 | |
\blx@refpatch@part\newrefsection | |
\or % 2 | |
\blx@refpatch@chapter\newrefsection | |
\or % 3 | |
\blx@refpatch@sect{section}{\newrefsection}{1}% | |
\or % 4 | |
\blx@refpatch@sect{subsection}{\newrefsection}{2}% | |
\fi} | |
\DeclareBibliographyOption[string]{refsegment}{% | |
\ifcsdef{blx@opt@refsegment@#1} | |
{\letcs\blx@refsegreset@level{blx@opt@refsegment@#1}} | |
{\blx@err@invopt{refsegment=#1}{}}} | |
\def\blx@opt@refsegment@none{0} | |
\def\blx@opt@refsegment@part{1} | |
\def\blx@opt@refsegment@chapter{2} | |
\def\blx@opt@refsegment@section{3} | |
\def\blx@opt@refsegment@subsection{4} | |
\AtEndPreamble{% | |
\ifnumgreater\blx@refsegreset@level\z@ | |
{\ifnumgreater\blx@refsegreset@level\blx@refsecreset@level | |
{} | |
{\blx@err@confopt | |
{refsegment/refsection} | |
{The 'refsegment' option must point to a | |
lower-level\MessageBreak document division | |
than 'refsection'}% | |
\def\blx@refsegreset@level{0}}} | |
{}% | |
\ifcase\blx@refsegreset@level | |
\or % 1 | |
\blx@refpatch@part\newrefsegment | |
\or % 2 | |
\blx@refpatch@chapter\newrefsegment | |
\or % 3 | |
\blx@refpatch@sect{section}{\newrefsegment}{1}% | |
\or % 4 | |
\blx@refpatch@sect{subsection}{\newrefsegment}{2}% | |
\fi} | |
\DeclareBibliographyOption[string]{citereset}{% | |
\ifcsdef{blx@opt@citereset@#1} | |
{\letcs\blx@citereset@level{blx@opt@citereset@#1}} | |
{\blx@err@invopt{citereset=#1}{}}} | |
\def\blx@opt@citereset@none{0} | |
\def\blx@opt@citereset@part{1} | |
\def\blx@opt@citereset@chapter{2} | |
\def\blx@opt@citereset@section{3} | |
\def\blx@opt@citereset@subsection{4} | |
\AtEndPreamble{% | |
\ifcase\blx@citereset@level | |
\or % 1 | |
\blx@refpatch@part{\citereset\blx@inf@creset}% | |
\or % 2 | |
\blx@refpatch@chapter{\citereset\blx@inf@creset}% | |
\or % 3 | |
\blx@refpatch@sect{section}{\citereset\blx@inf@creset}{1}% | |
\or % 4 | |
\blx@refpatch@sect{subsection}{\citereset\blx@inf@creset}{2}% | |
\fi} | |
\DeclareBibliographyOption[boolean]{bibwarn}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\blx@bbl@thewarn\blx@bbl@warn} | |
{\let\blx@bbl@thewarn\@gobble}} | |
% Name field options | |
\def\do#1{% | |
\DeclareBibliographyOption[boolean]{use#1}[true]{% | |
\settoggle{blx@use#1}{##1}} | |
\DeclareTypeOption[boolean]{use#1}[true]{% | |
\settoggle{blx@use#1}{##1}} | |
\DeclareEntryOption[boolean]{use#1}[true]{% | |
\settoggle{blx@use#1}{##1}}} | |
\abx@donames | |
% Entry options | |
\DeclareBibliographyOption[boolean]{useprefix}[true]{% | |
\settoggle{blx@useprefix}{#1}} | |
\DeclareTypeOption[boolean]{useprefix}[true]{% | |
\settoggle{blx@useprefix}{#1}} | |
\DeclareEntryOption[boolean]{useprefix}[true]{% | |
\settoggle{blx@useprefix}{#1}} | |
\DeclareTypeOption[boolean]{skipbib}[true]{% | |
\settoggle{blx@skipbib}{#1}} | |
\DeclareEntryOption[boolean]{skipbib}[true]{% | |
\settoggle{blx@skipbib}{#1}} | |
\DeclareTypeOption[boolean]{skiplos}{% | |
\blx@warning@noline{% | |
skiplos option is deprecated, use 'skipbiblist' instead}% | |
\settoggle{blx@skipbiblist}{#1}} | |
\DeclareEntryOption[boolean]{skiplos}{% | |
\blx@warning@noline{% | |
skiplos option is deprecated, use 'skipbiblist' instead}% | |
\settoggle{blx@skipbiblist}{#1}} | |
\DeclareTypeOption[boolean]{skipbiblist}[true]{% | |
\settoggle{blx@skipbiblist}{#1}} | |
\DeclareEntryOption[boolean]{skipbiblist}[true]{% | |
\settoggle{blx@skipbiblist}{#1}} | |
\DeclareTypeOption[boolean]{skiplab}[true]{% | |
\settoggle{blx@skiplab}{#1}} | |
\DeclareEntryOption[boolean]{skiplab}[true]{% | |
\settoggle{blx@skiplab}{#1}} | |
\DeclareTypeOption[boolean]{dataonly}[true]{% | |
\settoggle{blx@skipbib}{#1}% | |
\settoggle{blx@skipbiblist}{#1}% | |
\settoggle{blx@skiplab}{#1}} | |
\DeclareEntryOption[boolean]{dataonly}[true]{% | |
\settoggle{blx@skipbib}{#1}% | |
\settoggle{blx@skipbiblist}{#1}% | |
\settoggle{blx@skiplab}{#1}} | |
% Option processor/scheduler | |
\DeclareOption*{% | |
\begingroup | |
\def\blx@tempa#1=#2&{#1}% | |
\edef\blx@tempa{% | |
\expandafter\blx@tempa\CurrentOption=&}% | |
\ifcsundef{KV@blx@opt@ldt@\blx@tempa} | |
{\endgroup | |
\eappto\blx@theoptions{\CurrentOption,}} | |
{\edef\blx@tempa{\endgroup | |
\noexpand\setkeys{blx@opt@ldt}{\CurrentOption}}% | |
\blx@tempa}} | |
\def\blx@processoptions{% | |
\ifundef\blx@theoptions | |
{} | |
{\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\setkeys{blx@opt@pre}{\blx@theoptions}}% | |
\blx@tempa}} | |
%% Initial setup | |
% Set defaults | |
\setkeys{blx@opt@ldt}{style=numeric} | |
\setkeys{blx@opt@pre}{% | |
sorting=nty,sortlocale=auto,sortcase,sortupper,sortcites=false, | |
maxnames=3,minnames=1,maxalphanames=3,minalphanames=1, | |
maxitems=3,minitems=1,mincrossrefs=2,minxrefs=2,useauthor=true,useeditor=true, | |
usetranslator=false,indexing=false,abbreviate=true,dateabbrev=true,dateera=astronomical, | |
backref=false,backrefsetstyle=setonly,pagetracker=false,ibidtracker=false, | |
idemtracker=false,opcittracker=false,loccittracker=false,citetracker=false, | |
citecounter=false,block=none,language=autobib,clearlang=true,autolang=none, | |
date=comp,labeldate=year,origdate=comp,eventdate=comp,urldate=short, | |
autopunct=true,punctfont=false,defernumbers=false,timezeros=true, | |
refsection=none,refsegment=none,citereset=none,hyperref=auto, | |
parentracker,maxparens=3,bibencoding=auto,bibwarn,timezones=false, | |
seconds=false,julian=false,labeltime=24h} | |
% Load compatibility code | |
\blx@inputonce{blx-compat.def}{compatibility code}{}{}{}{} | |
% Restore catcodes | |
\blx@catcodes | |
\undef\blx@catcodes | |
% Process load-time options | |
\ProcessOptions* | |
% Switch to BibTeX support if requests | |
\iftoggle{blx@bibtex} | |
{\blx@inputonce{blx-bibtex.def}{BibTeX backend compatibility}{}{}{}{}} | |
{} | |
% Load citation and bibliography styles, configuration file | |
\blx@inputonce{biblatex.def}{generic definitions}{}{}{}{} | |
\iftoggle{blx@natbib} | |
{\blx@inputonce{blx-natbib.def}{natbib compatibility}{}{}{}{}} | |
{} | |
\iftoggle{blx@mcite} | |
{\blx@inputonce{blx-mcite.def}{mcite-like commands}{}{}{}{}} | |
{} | |
\RequireBibliographyStyle{\blx@bbxfile} | |
\RequireCitationStyle{\blx@cbxfile} | |
\blx@secinit | |
\citereset | |
\blx@inputonce{biblatex.cfg}{configuration file}{}{}{}{} | |
% Process preamble options | |
\blx@processoptions | |
% Deferred setup at end of preamble | |
\AtEndPreamble{% | |
\blx@checkoptions@global | |
\c@maxnames\blx@maxcitenames\relax | |
\c@minnames\blx@mincitenames\relax | |
\c@maxitems\blx@maxitems\relax | |
\c@minitems\blx@minitems\relax | |
\togglefalse{abx@bool@xinits} | |
\def\do#1{\iftoggle{abx@bool@#1inits}{\toggletrue{abx@bool@xinits}}{}} | |
\abx@donameparts | |
\iftoggle{abx@bool@xinits} | |
{\ifnumequal\blx@uniquename\blx@opt@uniquename@full | |
{\blx@warn@conflopt{% | |
'<namepart>inits' conflicts with 'uniquename=full'.\MessageBreak | |
Setting 'uniquename=init'}% | |
\setkeys{blx@opt@pre}{uniquename=init}} | |
{}% | |
\ifnumequal\blx@uniquename\blx@opt@uniquename@allfull | |
{\blx@warn@conflopt{% | |
'<namepart>inits' conflicts with 'uniquename=allfull'.\MessageBreak | |
Setting 'uniquename=allinit}% | |
\setkeys{blx@opt@pre}{uniquename=allinit}} | |
{}% | |
\ifnumequal\blx@uniquename\blx@opt@uniquename@minfull | |
{\blx@warn@conflopt{% | |
'<namepart>inits' conflicts with 'uniquename=minfull'.\MessageBreak | |
Setting 'uniquename=mininit}% | |
\setkeys{blx@opt@pre}{uniquename=mininit}} | |
{}} | |
{}% | |
\nottoggle{blx@labeldateparts} | |
{\ifnumequal\blx@uniquelist\blx@opt@uniquelist@minyear | |
{\blx@warn@conflopt{% | |
'uniquelist=minyear' requires 'labeldateparts'.\MessageBreak | |
Setting 'uniquelist=true'}% | |
\setkeys{blx@opt@pre}{uniquelist}} | |
{}} | |
{}% | |
\def\do#1{% | |
\ifcsstring{blx@dateformat@#1}{edtf} | |
{\StrCut{#1}{date}\blx@datetype\blx@tempnull | |
\ifdefstring\blx@dateera{astronomical}{} | |
{\blx@warn@conflopt{% | |
'#1=edtf' requires 'dateera=astronomical'.\MessageBreak | |
Setting 'dateera=astrononmical'}% | |
\setkeys{blx@opt@pre}{dateera=astronomical}}% | |
\ifcsstring{blx@timeformat@\blx@datetype time}{24h}% | |
{} | |
{\blx@warn@conflopt{% | |
'#1=edtf' requires '\blx@datetype time=24h'.\MessageBreak | |
Setting '\blx@datetype time=24h'}% | |
\setkeys{blx@opt@pre}{\blx@datetype time=24h}}% | |
\iftoggle{blx@julian} | |
{\blx@warn@conflopt{% | |
'#1=edtf' requires 'julian=false'.\MessageBreak | |
Setting 'julian=false'}% | |
\setkeys{blx@opt@pre}{julian=false}} | |
{}% | |
\nottoggle{blx@datezeros} | |
{\blx@warn@conflopt{% | |
'#1=edtf' requires 'datezeros=true'.\MessageBreak | |
Setting 'datezeros=true'}% | |
\setkeys{blx@opt@pre}{datezeros=true}} | |
{}% | |
\nottoggle{blx@timezeros} | |
{\blx@warn@conflopt{% | |
'#1=edtf' requires 'timezeros=true'.\MessageBreak | |
Setting 'timezeros=true'}% | |
\setkeys{blx@opt@pre}{timezeros=true}} | |
{}% | |
\nottoggle{blx@seconds} | |
{\blx@warn@conflopt{% | |
'#1=edtf' requires 'seconds=true'.\MessageBreak | |
Setting 'seconds=true'}% | |
\setkeys{blx@opt@pre}{seconds=true}} | |
{}} | |
{}}% | |
\abx@dodates | |
\do{labeldate}} | |
\def\blx@checkencoding{% | |
\ifdef\blx@texencoding | |
{\blx@info@noline{% | |
Input encoding '\blx@texencoding' specified}} | |
{\ifundef\inputencodingname | |
{\ifundef\XeTeXrevision | |
{\ifundef\luatexversion | |
{\def\blx@texencoding{ascii}% | |
\blx@info@noline{% | |
No input encoding detected.\MessageBreak | |
Assuming '\blx@texencoding'}} | |
{\def\blx@texencoding{utf8}% | |
\blx@info@noline{% | |
LuaTeX detected.\MessageBreak | |
Assuming input encoding '\blx@texencoding'}}} | |
{\def\blx@texencoding{utf8}% | |
\blx@info@noline{% | |
XeTeX detected.\MessageBreak | |
Assuming input encoding '\blx@texencoding'}}} | |
{\ifcsdef{blx@inpenc@\inputencodingname} | |
{\letcs\blx@texencoding{blx@inpenc@\inputencodingname}} | |
{\let\blx@texencoding\inputencodingname}% | |
\blx@info@noline{% | |
Input encoding '\blx@texencoding' detected}}}% | |
\ifdef\blx@bibencoding | |
{\ifdefstring\blx@bibencoding{ascii} | |
{\blx@info@noline{% | |
Data encoding '\blx@bibencoding' specified.\MessageBreak | |
No need to reencode data}} | |
{\ifdefstring\blx@bibencoding{auto} | |
{\let\blx@bibencoding\blx@texencoding | |
\blx@info@noline{% | |
Automatic encoding selection.\MessageBreak | |
Assuming data encoding '\blx@bibencoding'}} | |
{\ifdefstrequal\blx@bibencoding\blx@texencoding | |
{\blx@info@noline{% | |
Data encoding '\blx@bibencoding' specified.\MessageBreak | |
No need to reencode data}} | |
{\blx@info@noline{% | |
Data encoding '\blx@bibencoding' specified.\MessageBreak | |
Backend will reencode on the fly}}}}} | |
{\def\blx@bibencoding{ascii}% | |
\blx@info@noline{% | |
Data encoding not specified.\MessageBreak | |
Assuming '\blx@bibencoding'}}% | |
\ifboolexpr{% | |
togl {blx@safeinputenc} | |
and ( test {\@ifpackageloaded{inputenc}} | |
or | |
test {\@ifpackageloaded{inputenx}} ) | |
} | |
{\def\blx@texencoding{ascii}% | |
\blx@info@noline{% | |
Input encoding '\blx@texencoding' forced by\MessageBreak | |
'safeinputenc' option}} | |
{}% | |
} | |
% Deferred last minute setup | |
\AtBeginDocument{% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@sortscheme{\blx@sorting}}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}} | |
\blx@checkencoding | |
\if@filesw | |
\blx@ctrlwrite | |
\blx@bblinput | |
\blx@maxsection\z@ | |
\fi | |
\csuse{abx@preamble}% | |
\blx@inf@refsec | |
\blx@inf@refseg} | |
\AtEndOfPackage{% | |
% Data model macros are forbidden after package load is finished | |
\def\blx@warn@dm#1{\blx@warning@noline{Data model macro '#1' cannot be used in preamble}} | |
\def\ResetDatamodelEntrytypes{\blx@warn@dm{ResetDatamodelEntrytypes}} | |
\def\ResetDatamodelFields{\blx@warn@dm{ResetDatamodelFields}} | |
\def\ResetDatamodelEntryfields{\blx@warn@dm{ResetDatamodelEntryfields}} | |
\def\ResetDatamodelConstraints{\blx@warn@dm{ResetDatamodelConstraints}} | |
\renewcommand*{\DeclareDatamodelEntrytypes}[2][]{\blx@warn@dm{DeclareDatamodelEntrytypes}} | |
\renewcommand*{\DeclareDatamodelFields}[2][]{\blx@warn@dm{DeclareDatamodelFields}} | |
\renewcommand*{\DeclareDatamodelEntryfields}[2][]{\blx@warn@dm{DeclareDatamodelEntryfields}} | |
\renewcommand*{\DeclareDatamodelConstraints}[2][]{\blx@warn@dm{DeclareDatamodelConstraints}} | |
\renewcommand*{\DeclareDatamodelConstant}[3][]{\blx@warn@dm{DeclareDatamodelConstant}} | |
\AtBeginDocument{% | |
\let\do\undef | |
\blx@dopreamblecmds | |
\let\do\noexpand}} | |
\endinput |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment