Skip to content

Instantly share code, notes, and snippets.

@moewew
Last active October 31, 2017 18:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save moewew/86d34f18e0a8342a236b15bd9545c407 to your computer and use it in GitHub Desktop.
Save moewew/86d34f18e0a8342a236b15bd9545c407 to your computer and use it in GitHub Desktop.
% 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)]
%% 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=\thr@@
\else
\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
\undef\blx@mkhyperref
\undef\blx@mknohyperref
\fi
\providecommand*{\nolinkurl}{\url}%
\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&lt\string;}%
\edef>{\string&gt\string;}%
\edef&{\string&amp\string;}%
\edef"{\string&quot\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&#1\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&#1%
\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&#1%
\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&#1%
\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&#2{%
\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
% 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
\fi
\letcs\blx@tempb{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}%
% \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
\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&#3{%
\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##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}%
\ifblank{#2}
{\def\blx@postcode{#6}}
{\def\blx@postcode{\usebibmacro{postnote}#6}}%
\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}%
\ifblank{#2}
{\def\blx@postcode{#6}}
{\def\blx@postcode{\usebibmacro{postnote}#6}}%
\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}%
\ifblank{#2}
{\def\blx@postcode{#6}}
{\def\blx@postcode{\usebibmacro{postnote}#6}}%
\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&#2{%
\begingroup
\escapechar=-1 %
\edef\blx@tempa{\expandafter\@gobble\string#2}%
\expandafter\endgroup
\ifx\blx@tempa\@empty
\else
\blx@usqcheck@i\blx@tempb
\fi
#1&#2%
}
\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}
\def\blx@opt@hyperref@manual{3}
\def\blx@warn@usedmanualhyperrefs#1{%
\blx@warning@noline{The command '\string#1' can\MessageBreak
only be used with 'hyperref=manual'}}
\def\blx@warn@multiplemanualhyperrefs{%
\blx@warning@noline{You must call either '\string\BiblatexManualHyperrefOn'\MessageBreak
or '\string\BiblatexManualHyperrefOff' exactly once.\MessageBreak
Subsequent calls to either command will be ignored}}
\def\BiblatexManualHyperrefOn{%
\ifnum\blx@hyperref=\thr@@
\blx@mkhyperref
\global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs
\global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs
\else
\blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOn}%
\fi}
\def\BiblatexManualHyperrefOff{%
\ifnum\blx@hyperref=\thr@@
\blx@mknohyperref
\global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs
\global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs
\else
\blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOff}%
\fi}
\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