Skip to content

Instantly share code, notes, and snippets.

@moewew
Last active July 21, 2018 10:42
Show Gist options
  • Save moewew/d12e0fe557fadd165c3132b501252fb4 to your computer and use it in GitHub Desktop.
Save moewew/d12e0fe557fadd165c3132b501252fb4 to your computer and use it in GitHub Desktop.
Drop-in replacement for biblatex.sty v3.11 for https://github.com/plk/biblatex/issues/773
% Copyright (c) 2006-2011 Philipp Lehman.
% 2012-2017 Philip Kime, Audrey Boruvka, Joseph Wright
% 2018- Philip Kime, Moritz Wemheuer
%
% 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{2018/03/04}
\def\abx@version{3.12}
\PackageWarningNoLine{biblatex}{This is only a test for #773. Not for production use.}
\PackageWarningNoLine{biblatex}{See https://github.com/plk/biblatex/issues/773}
\def\abx@bbxid{\abx@date\space v\abx@version\space biblatex bibliography style (PK/MW)}
\def\abx@cbxid{\abx@date\space v\abx@version\space biblatex citation style (PK/MW)}
\def\abx@lbxid{\abx@date\space v\abx@version\space biblatex localization (PK/MW)}
\def\abx@cptid{\abx@date\space v\abx@version\space biblatex compatibility (PK/MW)}
% 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.4}
% 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.9}
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{biblatex}
[\abx@date\space v\abx@version\space programmable bibliographies (PK/MW)]
%% Dependencies
\RequirePackage{pdftexcmds}
\RequirePackage{etoolbox}
\RequirePackage{keyval}
\RequirePackage{kvoptions}
\RequirePackage{logreq}
\RequirePackage{ifthen}
\RequirePackage{url}
\RequirePackage{xstring}
%\RequirePackage{trace}
\@ifpackagelater{etoolbox}{2010/11/29}
{}
{\PackageError{biblatex}
{Outdated 'etoolbox' package}
{Upgrade to etoolbox v2.1 (2010/11/29) or later.\MessageBreak
I found: '\csuse{ver@etoolbox.sty}'.\MessageBreak
This is a fatal error. I'm aborting now}%
\endinput}
\@ifpackagelater{xstring}{2013/10/13}
{}
{\PackageError{biblatex}
{Outdated 'xstring' package}
{Upgrade to xstring v1.7c (2013/10/13) or later.\MessageBreak
I found: '\csuse{xstringversion}'.\MessageBreak
This is a fatal error. I'm aborting now}%
\endinput}
% polyglossia pretends to be babel, so we need to make sure
% we are definitely talking to babel here.
\AtEndPreamble{%
\@ifpackageloaded{polyglossia}
{}
{\@ifpackageloaded{babel}
{\@ifpackagelater{babel}{2016/04/23}
{}
{\PackageError{biblatex}
{Outdated 'babel' package}
{Upgrade to babel 3.9r (2016/04/23) or later.\MessageBreak
I found: '\csuse{ver@babel.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
\begingroup
\catcode`\#=12
\gdef\blx@patchbidifootnotes{%
\patchcmd\@footnotetext
{#1}
{\toggletrue{blx@footnote}#1}
{\togglefalse{blx@tempa}}
{}%
\patchcmd\@LTRfootnotetext
{#1}
{\toggletrue{blx@footnote}#1}
{\togglefalse{blx@tempa}}
{}%
\patchcmd\@RTLfootnotetext
{#1}
{\toggletrue{blx@footnote}#1}
{\togglefalse{blx@tempa}}
{}}
\endgroup
\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}%
\iftoggle{blx@noerroretextools}
{\@ifpackageloaded{etextools}
{\blx@warning@noline{%
Incompatible package 'etextools' loaded,\MessageBreak
no error is thrown because you set\MessageBreak
'noerroretextools=true'.\MessageBreak
'etextools' redefines '\string\forlistloop', you will\MessageBreak
need to restore the definition from 'etoolbox'}}
{\blx@warning@noline{%
You set 'noerroretextools=true',\MessageBreak
but 'etextools' is not loaded.\MessageBreak
Please do not set 'noerroretextools' to 'true'\MessageBreak
unless you really need it}}}
{\@ifpackageloaded{etextools}
{\blx@error
{Incompatible package 'etextools'}
{The 'etextools' package and biblatex are incompatible.\MessageBreak
If you must load 'etextools' at all costs, set 'noerroretextools=true'}}
{}}%
\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}}
{}}
{}%
\@ifpackageloaded{bidi}% bidi
{\blx@patchbidifootnotes}
{}%
\@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}}
{}%
\@ifclassloaded{beamer}
{\expandafter\patchcmd\csname beamerx@\string\beamer@framefootnotetext\endcsname
{\color@begingroup}
{\color@begingroup\toggletrue{blx@footnote}}
{\togglefalse{blx@tempa}}
{}%
\expandafter\patchcmd\csname beamerx@\string\@mpfootnotetext\endcsname
{\color@begingroup}
{\color@begingroup\toggletrue{blx@footnote}}
{}
{}}
{}%
\iftoggle{blx@tempa}
{\blx@warning@noline{%
Patching footnotes failed.\MessageBreak
Footnote detection will not work}}
{}%
\def\do#1{%
\patchcmd#1%
{\color@begingroup}
{\color@begingroup\toggletrue{blx@footnote}}
{\listbreak}
{}}%
\docsvlist{%
\@mpfootnotetext,% minipages
\H@@mpfootnotetext}% hyperref minipages
\@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{maxextradate}
\def\themaxextradate{\the\c@maxextradate}
\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@sortsets}
\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@sortingnamekeytemplates\@empty
% Used to track uniquename templates
\global\let\blx@untemplatespecs\@empty
% Used to track labelalphaname templates
\global\let\blx@lantemplatespecs\@empty
% Used to track transliterations
\global\let\blx@translits\@empty
% Use to track every entry found in .bbl
% Used to issue defernumbers warning about missing keys because this causes
% defernumbers labelling to fail.
\global\let\blx@entries\@empty
% Initialise some lists which track changing citations/sortingtemplates
% etc. between runs
\global\let\blx@cites\@empty
\global\let\blx@refcontexts\@empty
\global\let\blx@lastrefcontexts\@empty
\global\let\blx@sortingtemplatenames\@empty
\global\let\blx@dlistnames\@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' is deprecated. #2}}{}%
\global\cslet{abx@field@legacy@warning@#1}\@empty}}%
\newrobustcmd*{\DeprecateList}[2]{%
\csdef{abx@list@#1}{%
\ifcsundef{abx@list@legacy@warning@#1}{\blx@warning@noline{List '#1' is deprecated. #2}}{}%
\global\cslet{abx@list@legacy@warning@#1}\@empty}}%
\newrobustcmd*{\DeprecateName}[2]{%
\csdef{abx@name@#1}{%
\ifcsundef{abx@name@legacy@warning@#1}{\blx@warning@noline{Name '#1' is deprecated. #2}}{}%
\global\cslet{abx@name@legacy@warning@#1}\@empty}}%
\let\blx@aliasfields\@empty
\newrobustcmd*{\DeprecateFieldWithReplacement}[2]{%
\appto\blx@aliasfields{%
\ifcsundef{abx@field@#2}
{}
{\csdef{abx@field@#1}{%
\csuse{abx@field@#2}%
\ifcsundef{abx@field@legacy@warning@#1}
{\blx@warning@noline{Field '#1' is deprecated.\MessageBreak
Please use '#2' instead.\MessageBreak
Using '#2' now}}
{}%
\global\cslet{abx@field@legacy@warning@#1}\@empty}}}}
\newrobustcmd*{\DeprecateListWithReplacement}[2]{%
\appto\blx@aliasfields{%
\ifcsundef{abx@list@#2}
{}
{\csdef{abx@list@#1}{%
\csuse{abx@list@#2}%
\ifcsundef{abx@list@legacy@warning@#1}
{\blx@warning@noline{List '#1' is deprecated.\MessageBreak
Please use '#2' instead.\MessageBreak
Using '#2' now}}
{}%
\global\cslet{abx@list@legacy@warning@#1}\@empty}}}}
\newrobustcmd*{\DeprecateNameWithReplacement}[2]{%
\appto\blx@aliasfields{%
\ifcsundef{abx@name@#2}
{}
{\csdef{abx@name@#1}{%
\csuse{abx@name@#2}%
\ifcsundef{abx@name@legacy@warning@#1}
{\blx@warning@noline{Name '#1' is deprecated.\MessageBreak
Please use '#2' instead.\MessageBreak
Using '#2' now}}
{}%
\global\cslet{abx@name@legacy@warning@#1}\@empty}}}}
%% 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}%
#3\@@input\@filef@und#4#5%
\listxadd\blx@list@req@stat{#1}%
\@addtofilelist{#1}}
{\blx@info@noline{... file '#1' not found}#6}%
\global\cslet{blx@file@#1}\@empty}
{#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 template '#1' not found}
{The sorting template '#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'
\ifcsundef{KV@blx@lbx@#1}{undefined}{untranslated}}%
\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@inf@delimdeclare#1#2{%
\blx@info{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}
{\global\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
\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}
% {<alias>}{<name>}
\newrobustcmd*{\letbibmacro}{%
\@ifstar
{\blx@letbibmacro@i}
{\blx@letbibmacro}}
\def\blx@letbibmacro#1#2{%
\blx@letbibmacro@i{\detokenize{#1}}{\detokenize{#2}}}
\def\blx@letbibmacro@i#1#2{%
\ifcsundef{abx@macro@#2}
{\blx@error
{Bibliography macro '#2' undefined}
{Use '\string\newbibmacro' to define this macro}}
{\csletcs{abx@macro@#1}{abx@macro@#2}}}
% {<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}%
\blx@resetdata
\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}%
\blx@resetdata
\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}%
\blx@resetdata
\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{pagetotal}}%
\iffieldundef{#1}
{}
{\iffieldequalstr{#1}{none}
{\def\blx@tempa{\blx@mkpagetotal@i}}
{\iffieldplusstringbibstring{#1}{total}
{\edef\blx@tempa{\blx@mkpagetotal{\thefield{#1}total}}}
{\blx@warning@entry{%
Unknown pagination type '\strfield{#1}total'}}}}%
\@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}}
{}}
% <*>[<postpro>]{<string>}
\newrobustcmd*{\mknormrange}{%
\begingroup
\@ifstar
{\blx@range@aux\blx@normrange@ii}
{\blx@range@aux\blx@normrange@i}}
\def\blx@range@aux#1{%
\@ifnextchar[{#1}{#1[\@firstofone]}}
\def\blx@normrange@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@normrange@split
\let\blx@range@process\blx@normrange@process
\blx@range@chunk{#2}%
\edef\blx@tempa{\endgroup
\unexpanded{#1}{\expandonce\blx@tempa}}%
\blx@tempa}
\def\blx@normrange@ii[#1]#2{%
\protected\def\blx@range@out@value{#1}%
\let\blx@range@out@delim\@firstofone
\let\blx@range@split\blx@normrange@split
\let\blx@range@process\blx@normrange@process
\blx@range@chunk{#2}%
\endgroup}
\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&}
{}}
% Unicode en-dashes are supported in blx-unicode.def
\def\blx@normrange@split#1{%
\def\blx@normrange@abort{\blx@range@out@value{#1}}%
\blx@imc@ifpages{#1}
{\blx@normrange@range#1\bibrangedash\bibrangedash&}
{\blx@normrange@abort}}
\def\blx@normrange@range#1\bibrangedash#2\bibrangedash#3&{%
\ifblank{#3}
{\blx@normrange@hyphen#1--&}
{\ifblank{#2}
{\blx@range@out@value{#1\bibrangedash}}
{\ifblank{#1}
{\blx@range@out@value{\bibrangedash#2}}
{\blx@range@process{#1}{#2}}}}}
\def\blx@normrange@hyphen#1-#2-#3&{%
\ifblank{#3}
{\blx@normrange@abort}
{\ifblank{#2}
{\ifblank{#1}
{\let\blx@tempb\@empty}
{\def\blx@tempb{#1}}%
\blx@normrange@hyphen@i#3&}
{\ifblank{#1}
{\blx@range@out@value{\bibrangedash#2}}
{\blx@range@process{#1}{#2}}}}}
\def\blx@normrange@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@range@process
\expandafter{\blx@tempb}{#1}}}
{\blx@normrange@hyphen@i#2&}}}
\def\blx@normrange@process#1#2{%
\blx@range@out@value{#1\bibrangedash#2}}
% <*>[<postpro>]{<string>}
\newrobustcmd*{\mkcomprange}{%
\begingroup
\@ifstar
{\blx@range@aux\blx@comprange@ii}
{\blx@range@aux\blx@comprange@i}}
\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@normrange@split
\let\blx@range@process\blx@comprange@check
\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@normrange@split
\let\blx@range@process\blx@comprange@check
\blx@range@chunk{#2}%
\endgroup}
\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}
% <*>[<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}
% Unicode en-dashes are supported in blx-unicode.def
\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][]{%
\ifcsvoid{blx@declaredelimcontexts@#2}
{}
{\def\do##1{\csundef{blx@printdelim@##1@#2}}%
\dolistcsloop{blx@declaredelimcontexts@#2}}%
\cslet{blx@declaredelimcontexts@#2}\@empty
\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{%
\listcsadd{blx@declaredelimcontexts@#2}{##1}%
\blx@declaredelim@i{blx@printdelim@##1@}{##1}{#2}{#3}}%
\docsvlist{#1}}}%
\def\blx@declaredelim@i#1#2#3#4{%
\def\do@i##1{%
\ifcsdef{#1##1}
{\blx@inf@delimdeclare{##1}{#2}}
{}%
\csdef{#1##1}{#4}}%
\forcsvlist{\do@i}{#3}}
% *[<contextname, ...>]{<alias>}{<delim>}
\newrobustcmd*{\DeclareDelimAlias}{%
\@ifstar
{\blx@declaredelimalias}
{\blx@declaredelimaliasauto}}
\newrobustcmd*{\blx@declaredelimalias}[3][]{%
\ifblank{#1}
{\blx@declaredelimalias@i{}{#2}{#3}}
{\def\do##1{%
\blx@declaredelimalias@i{blx@printdelim@##1@}{#2}{#3}}%
\docsvlist{#1}}}
\newrobustcmd*{\blx@declaredelimaliasauto}[2]{%
\blx@declaredelimalias@i{}{#1}{#2}%
\ifcsvoid{blx@declaredelimcontexts@#2}
{}
{\def\do##1{%
\blx@declaredelimalias@i{blx@printdelim@##1@}{#1}{#2}}%
\dolistcsloop{blx@declaredelimcontexts@#2}}}
\def\blx@declaredelimalias@i#1#2#3{%
\ifcsdef{#1#2}
{\blx@inf@delimdeclare{#2}{#1}}
{}%
\csdef{#1#2}{\csuse{#1#3}}}
\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}}
\newrobustcmd*{\AtUsedriver}{%
\@ifstar
{\global\undef\blx@hook@usedriver
\gappto\blx@hook@usedriver}
{\gappto\blx@hook@usedriver}}
\@onlypreamble\AtUsedriver
\def\blx@imc@UseUsedriverHook{\csuse{blx@hook@usedriver}}
\blx@regimcs{\UseUsedriverHook}
\AtUsedriver{%
\let\finentry\blx@finentry@usedrv
\let\newblock\relax
\let\abx@macro@bibindex\@empty
\let\abx@macro@pageref\@empty}
% {<init>}{<entrytype>}
\protected\def\blx@imc@usedriver#1#2{%
\begingroup
\csuse{blx@hook@usedriver}%
\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}}
\def\ifentryseen{\blx@imc@ifentryseen}
\def\ifentryinbib{\blx@imc@ifentryinbib}
\def\ifentrycategory{\blx@imc@ifentrycategory}
\def\ifentrykeyword{\blx@imc@ifentrykeyword}
\def\blx@imc@iflabeldateisdate{%
\ifboolexpr{%
togl {blx@labeldateparts}
and not test {\iffieldundef{labeldatesource}}
and
(test {\iffieldequalstr{labeldatesource}{}}
or test {\iffieldequalstr{labeldatesource}{year}})}}
\def\blx@imc@ifdatehasyearonlyprecision#1{%
\ifboolexpr{not test {\iffieldundef{#1year}}
and (test {\ifcsstring{blx@dateformat@#1date}{year}}
or (test {\iffieldundef{#1month}}
and test {\iffieldundef{#1season}}))}}
\def\blx@imc@ifdatehastime#1{%
\ifboolexpr{togl {blx@#1dateusetime}
and not test {\iffieldundef{#1hour}}}}
\def\blx@imc@ifdateshavedifferentprecision#1#2{%
\ifboolexpr{ (test {\ifdatehasyearonlyprecision{#1}}
and not test {\ifdatehasyearonlyprecision{#2}})
or (not test {\ifdatehasyearonlyprecision{#1}}
and test {\ifdatehasyearonlyprecision{#2}})
or (test {\ifdatehastime{#1}}
and not test {\ifdatehastime{#2}})
or (not test {\ifdatehastime{#1}}
and test {\ifdatehastime{#2}})}}
\blx@regimcs{%
\ifdriver \thefield \strfield \csfield \usefield \thelist \strlist \thename \strname
\clearfield \clearlist \clearname \restorefield \restorelist \restorename
\ifcategory \ifkeyword
\ifciteseen \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
\iflabeldateisdate \ifdatehasyearonlyprecision \ifdatehastime
\ifdateshavedifferentprecision
\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
\ifx\@let@token\blx@mkcp@sgl
\blx@mksc@nocase{{#2}}%
\else
\ifx\@let@token\blx@mkcp@dbl
\blx@mksc@nocase{{#2}}%
\else
\blx@mksc@locase{{#2}}%
\fi
\fi
\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
% They 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}}
% These are options in the .bbl that biber makes explicit as they are needed in biblatex
% for various reasons. Not all namelist/name scope options are necessary in the .bbl as
% some are used by biber only and are not needed by biblatex after biber has finished
% generating the .bbl
% 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}{sortingnamekeytemplatename}{\def\blx@refcontext@sortingnamekeytemplatename{#1}}
\define@key{blx@opt@namelist}{uniquenametemplatename}{\def\blx@refcontext@uniquenametemplatename{#1}}
\define@key{blx@opt@namelist}{labelalphanametemplatename}{\def\blx@refcontext@labelalphanametemplatename{#1}}
% Per-name options
\define@key{blx@opt@name}{uniquename}{\c@uniquename#1\relax}
\define@key{blx@opt@name}{uniquepart}{\def\abx@field@uniquepart{#1}}
\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}{sortingnamekeytemplatename}{\def\blx@refcontext@sortingnamekeytemplatename{#1}}
\define@key{blx@opt@name}{uniquenametemplatename}{\def\blx@refcontext@uniquenametemplatename{#1}}
\define@key{blx@opt@name}{labelalphanametemplatename}{\def\blx@refcontext@labelalphanametemplatename{#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
\blx@setoptions@entry
\def\abx@field@entrysetcount{1}%
\blx@execute
\blx@beglangbib
\blx@begunit
\blx@anchor
\blx@entryset@precode
\blx@driver{\blx@imc@thefield{entrytype}}%
\blx@entryset@postcode
\blx@endunit
\blx@endlangbib
\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@anchor
\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}}
\def\blx@bibstringsimple{%
\let\bibstring\blx@imc@bibxstring
\let\biblstring\blx@imc@bibxlstring
\let\bibsstring\blx@imc@bibxsstring}
\def\blx@bibstringnormal{%
\let\bibstring\blx@imc@bibstring
\let\biblstring\blx@imc@biblstring
\let\bibsstring\blx@imc@bibsstring}
\protected\def\blx@bibstring#1#2#3{%
\blx@begunit
\blx@hyphenreset
\blx@bibstringsimple
\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
\blx@bibstringsimple
\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
\blx@bibstringsimple
\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
\blx@bibstringsimple
\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}}}
% {<field>}{<string>}{<true>}{<false>}
\def\blx@imc@iffieldplusstringbibstring#1#2{%
\blx@imc@iffieldundef{#1}
{\@secondoftwo}
{\ifcsundef{\abx@str @\detokenize\expandafter
\expandafter\expandafter{%
\csname abx@field@#1\endcsname}#2}
{\@secondoftwo}
{\@firstoftwo}}}
\blx@regimcs{%
\bibstring \biblstring \bibsstring
\bibxstring \bibxlstring \bibxsstring
\bibcpstring \bibcplstring \bibcpsstring
\biblcstring \biblclstring \biblcsstring
\bibucstring \bibuclstring \bibucsstring
\ifbibstring \ifbibxstring \iffieldbibstring
\iffieldplusstringbibstring}
\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{organizer}%
\do{organizers}%
\do{byorganizer}%
\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{nodate}%
\do{page}%
\do{pages}%
\do{column}%
\do{columns}%
\do{line}%
\do{lines}%
\do{verse}%
\do{verses}%
\do{section}%
\do{sections}%
\do{paragraph}%
\do{paragraphs}%
\do{pagetotal}%
\do{pagetotals}%
\do{columntotal}%
\do{columntotals}%
\do{linetotal}%
\do{linetotals}%
\do{versetotal}%
\do{versetotals}%
\do{sectiontotal}%
\do{sectiontotals}%
\do{paragraphtotal}%
\do{paragraphtotals}%
\do{in}%
\do{inseries}%
\do{ofseries}%
\do{book}%
\do{issue}%
\do{number}%
\do{chapter}%
\do{bathesis}%
\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{langbulgarian}%
\do{langcatalan}%
\do{langcroatian}%
\do{langczech}%
\do{langdanish}%
\do{langdutch}%
\do{langenglish}%
\do{langestonian}%
\do{langfinnish}%
\do{langfrench}%
\do{langgalician}%
\do{langgerman}%
\do{langgreek}%
\do{langitalian}%
\do{langjapanese}%
\do{langlatin}%
\do{langlatvian}%
\do{langnorwegian}%
\do{langpolish}%
\do{langportuguese}%
\do{langrussian}%
\do{langslovak}%
\do{langslovene}%
\do{langspanish}%
\do{langswedish}%
\do{langukrainian}%
\do{fromamerican}%
\do{frombrazilian}%
\do{frombulgarian}%
\do{fromcatalan}%
\do{fromcroatian}%
\do{fromczech}%
\do{fromdanish}%
\do{fromdutch}%
\do{fromenglish}%
\do{fromestonian}%
\do{fromfinnish}%
\do{fromfrench}%
\do{fromgalician}%
\do{fromgerman}%
\do{fromgreek}%
\do{fromitalian}%
\do{fromjapanese}%
\do{fromlatin}%
\do{fromlatvian}%
\do{fromnorwegian}%
\do{frompolish}%
\do{fromportuguese}%
\do{fromrussian}%
\do{fromslovak}%
\do{fromslovene}%
\do{fromspanish}%
\do{fromswedish}%
\do{fromukrainian}%
\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@strings{#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@extras{#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@strings{#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}}
% {<mapping suffix>}
\newrobustcmd*{\DeclareLanguageMappingSuffix}[1]{%
\gdef\blx@lng@suff{#1}}
\@onlypreamble\DeclareLanguageMappingSuffix
\let\blx@lng@suff\@empty
% {<language>}{<mapping>}
\newrobustcmd*{\DeclareLanguageMapping}[2]{%
\csgdef{blx@lng@#1}{#2}%
\csgdef{blx@lng@explicit@#1}{#2}}
\@onlypreamble\DeclareLanguageMapping
% to avoid copying, these commands simply redefine the input handlers and
% process and postprocess code
% {<language>}{<success>}{<failure>}
\def\blx@lbxinput#1{%
\csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@once}%
\csletcs{blx@lbx@input@process}{blx@lbx@input@process@all}%
\csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@all}%
\blx@lbxinput@i{#1}}
\def\blx@lbxinput@strings#1{%
\csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@simple}%
\csletcs{blx@lbx@input@process}{blx@lbx@input@process@strings}%
\csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@strings}%
\blx@lbxinput@i{#1}}
\def\blx@lbxinput@extras#1{%
\csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@simple}%
\csletcs{blx@lbx@input@process}{blx@lbx@input@process@extras}%
\csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@extras}%
\blx@lbxinput@i{#1}}
\def\blx@lbxinput@i#1{%
\ifcsundef{blx@nolbxrecurse@#1}
{\ifcsdef{blx@lng@explicit@#1}
{\global\csletcs{blx@lng@#1}{blx@lng@explicit@#1}}
{\ifdefempty\blx@lng@suff
{}
{\csgdef{blx@lng@#1}{#1\blx@lng@suff}}}}
{}%
\blx@lbxinput@ii{#1}}
\def\blx@lbxinput@ii#1{%
\ifcsdef{blx@lng@#1}
{\expandafter\expandafter\expandafter\blx@lbxinput@iii
\expandafter\expandafter\expandafter{%
\csname blx@lng@#1\endcsname}{#1}}
{\blx@lbxinput@iv{#1}{#1}{language '#1'}}}
% {<mapping>}{<language>}
\def\blx@lbxinput@iii#1#2{%
\global\csundef{blx@lng@#2}%
\IfFileExists{#1.lbx}
{\blx@lbxinput@iv{#2}{#1}{language '#2' -> '#1'}}
{\ifcsdef{blx@suffmaptried@#2}
{}
{\blx@warning@noline{%
File '#1.lbx' not found!\MessageBreak
Ignoring mapping '#2' -> '#1'}%
\global\cslet{blx@suffmaptried@#2}\@empty}%
\blx@lbxinput@iv{#2}{#2}{language '#2'}}}
% .lbx files must be read with one of the two following commands,
% do not use \blx@inputonce. Only the commands here make sure that the file
% is read as many times as necessary.
% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>}
\protected\long\def\blx@lbx@input@handler@simple#1#2#3#4#5#6{%
\blx@info@noline{Trying to load #2..}%
\IfFileExists{#1}
{\blx@info@noline{... file '#1' found}%
#3\@@input\@filef@und#4#5%
\ifcsundef{blx@file@lbx@#1}
{\listxadd\blx@list@req@stat{#1}%
\@addtofilelist{#1}%
\global\cslet{blx@file@lbx@#1}\@empty}
{}}
{\blx@info@noline{... file '#1' not found}#6}}
% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>}
\protected\long\def\blx@lbx@input@handler@once#1#2#3#4#5#6{%
\ifcsundef{blx@file@lbx@#1}
{\blx@info@noline{Trying to load #2..}%
\global\cslet{blx@file@lbx@#1}\@empty
\IfFileExists{#1}
{\blx@info@noline{... file '#1' found}%
#3\@@input\@filef@und#4#5%
\listxadd\blx@list@req@stat{#1}%
\@addtofilelist{#1}}
{\blx@info@noline{... file '#1' not found}#6}}
{#5}}
\def\blx@lbx@input@process@strings#1{
\global\cslet{abx@strings@#1}\@empty
\def\InheritBibliographyStrings{%
\blx@letbibstrings{#1}}%
\def\DeclareBibliographyStrings##1{%
\begingroup
\let\blx@defstring\blx@lbx@defstring
\blx@defbibstrings{#1}{##1}%
\endgroup}}
\def\blx@lbx@input@process@extras#1{%
\global\cslet{abx@extras@#1}\@empty
\global\cslet{abx@noextras@#1}\@empty
\def\InheritBibliographyExtras{\blx@letbibextras{#1}}%
\def\DeclareBibliographyExtras{\blx@defbibextras{#1}}%
\def\UndeclareBibliographyExtras{\blx@undefbibextras{#1}}}
\def\blx@lbx@input@process@all#1{%
\blx@lbx@input@process@strings{#1}%
\blx@lbx@input@process@extras{#1}%
\def\DeclareHyphenationExceptions{\blx@hyphexcept{#1}}}
\def\blx@lbx@input@postprocess@strings#1{
\csuse{blx@hook@strings@#1}}
\def\blx@lbx@input@postprocess@extras#1{%
\csuse{blx@hook@extras@#1}%
\csuse{blx@hook@noextras@#1}}
\def\blx@lbx@input@postprocess@all#1{%
\blx@lbx@input@postprocess@strings{#1}%
\blx@lbx@input@postprocess@extras{#1}%
\csuse{blx@hook@hyph@#1}}
% {<language>}{<lbxfile>}{<message>}
\def\blx@lbxinput@iv#1#2#3{%
\begingroup
\blx@lbx@input@handler{#2.lbx}{#3}
{\blx@maplang{#1}{#1}%
\let\InheritBibliographyStrings\@gobble
\let\DeclareBibliographyStrings\@gobble
\let\InheritBibliographyExtras\@gobble
\let\DeclareBibliographyExtras\@gobble
\let\UndeclareBibliographyExtras\@gobble
\blx@lbx@input@process{#1}%
\begingroup
\cslet{blx@nolbxrecurse@#1}\@empty
\blx@saneccodes
\makeatletter}
{\endgroup
\blx@lbx@input@postprocess{#1}}
{\aftergroup\@firstoftwo}
{\aftergroup\@secondoftwo}%
\endgroup}
% {<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}}
% calls to \blx@metadateinfo should be grouped to avoid name clashes
\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}%
\letcs\ifdateunknown{if#1dateunknown}%
\letcs\ifenddateunknown{if#1enddateunknown}}
\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]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{}
{\printtext[#2date]{%
\datecircaprint
% Such a season component can only come from an ISO8601 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}}}}}%
\endgroup}
\newrobustcmd*{\mkdaterangetrunc}[2]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{}
{\printtext[#2date]{%
\datecircaprint
% Such a season component can only come from an ISO8601 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}}}}}%
\endgroup}
\newrobustcmd*{\mkdaterangefullextra}[2]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{}
{\printtext[#2date]{%
\datecircaprint
% Such a season component can only come from an ISO8601 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{extradate}}
{\iffieldequalstr{#2endyear}{}
{\printfield{extradate}%
\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{extradate}%
\enddateuncertainprint
\dateeraprint{#2endyear}}}}}%
\endgroup}
\newrobustcmd*{\mkdaterangetruncextra}[2]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{}
{\printtext[#2date]{%
\datecircaprint
% Such a season component can only come from an ISO8601 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{extradate}}
{\iffieldequalstr{#2endyear}{}
{\printfield{extradate}%
\printtext{\mbox{\bibdaterangesep}}}
{\printtext{%
\bibdaterangesep
\enddatecircaprint
\iffieldundef{#2season}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}%
\printfield{extradate}%
\enddateuncertainprint
\dateeraprint{#2endyear}}}}}%
\endgroup}
\newrobustcmd*{\mkdaterangeyear}[1]{%
\blx@imc@clearfield{#1season}%
\blx@imc@clearfield{#1month}%
\blx@imc@clearfield{#1day}%
\blx@imc@clearfield{#1hour}%
\blx@imc@clearfield{#1minute}%
\blx@imc@clearfield{#1second}%
\blx@imc@clearfield{#1timezone}%
\blx@imc@clearfield{#1endseason}%
\blx@imc@clearfield{#1endmonth}%
\blx@imc@clearfield{#1endday}%
\blx@imc@clearfield{#1endhour}%
\blx@imc@clearfield{#1endminute}%
\blx@imc@clearfield{#1endsecond}%
\blx@imc@clearfield{#1endtimezone}%
\iffieldsequal{#1year}{#1endyear}
{\blx@imc@clearfield{#1endyear}}
{}%
\mkdaterangefull{short}{#1}}
% {<datetype>}
\newrobustcmd*{\mkdaterangeymd}[1]{%
\begingroup
\blx@metadateinfo{#1}%
\iffieldundef{#1year}
{}
{\printtext[#1date]{%
\datecircaprint
% Such a season component can only come from an ISO8601 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}}}}}%
\endgroup}
% {<datetype>}
\newrobustcmd*{\mkdaterangeymdextra}[1]{%
\begingroup
\blx@metadateinfo{#1}%
\iffieldundef{#1year}
{}
{\printtext[#1date]{%
\datecircaprint
% Such a season component can only come from an ISO8601 season which replaces
% a normal month so if it exists, we know that a normal date print is ruled out
\iffieldundef{#1season}
{\blx@ymddate[extradate]{#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}}}}}%
\endgroup}
% [extradate]{<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{#1season}%
\blx@imc@clearfield{#1month}%
\blx@imc@clearfield{#1day}%
\blx@imc@clearfield{#1hour}%
\blx@imc@clearfield{#1minute}%
\blx@imc@clearfield{#1second}%
\blx@imc@clearfield{#1timezone}%
\blx@imc@clearfield{#1endseason}%
\blx@imc@clearfield{#1endmonth}%
\blx@imc@clearfield{#1endday}%
\blx@imc@clearfield{#1endhour}%
\blx@imc@clearfield{#1endminute}%
\blx@imc@clearfield{#1endsecond}%
\blx@imc@clearfield{#1endtimezone}%
\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*{\mkdaterangeiso}[1]{%
\begingroup
\blx@metadateinfo{#1}%
\def\bibdatetimesep{T}%
\iffieldundef{#1year}
{}
{\printtext[#1date]{%
\blx@isodate{#1}{}%
\ifboolexpr{%
togl {blx@#1dateusetime}
and
not test {\iffieldundef{#1hour}}}
{\printtext{\bibdatetimesep}%
\blx@isotime{#1}{}}
{}%
\dateuncertainprint
\datecircaprintiso
\iffieldundef{#1endyear}
{}
{\addslash
\blx@isodate{#1}{end}%
\ifboolexpr{%
togl {blx@#1dateusetime}
and
not test {\iffieldundef{#1endhour}}}
{\printtext{\bibdatetimesep}%
\blx@isotime{#1}{end}}
{}%
\enddateuncertainprint
\enddatecircaprintiso}}}%
\endgroup}
\newrobustcmd*{\mkdaterangeisoextra}[1]{%
\begingroup
\blx@metadateinfo{#1}%
\def\bibdatetimesep{T}%
\iffieldundef{#1year}
{}
{\printtext[#1date]{%
\blx@isodate[extradate]{#1}{}%
\ifboolexpr{%
togl {blx@#1dateusetime}
and
not test {\iffieldundef{#1hour}}}
{\printtext{\bibdatetimesep}%
\blx@isotime{#1}{}}
{}%
\dateuncertainprint
\datecircaprintiso
\iffieldundef{#1endyear}
{}
{\addslash
\blx@isodate{#1}{end}}%
\ifboolexpr{%
togl {blx@#1dateusetime}
and
not test {\iffieldundef{#1endhour}}}
{\printtext{\bibdatetimesep}%
\blx@isotime{#1}{end}}
{}%
\enddateuncertainprint
\enddatecircaprintiso}}%
\endgroup}
% [extradate]{<datetype>}{''|end}
\newrobustcmd*{\blx@isodate}[3][]{%
\dateeraprintpre{#2#3year}%
\blx@imc@forcezerosy{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}%
% Such a season component can only come from an ISO8601 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@isotime}[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}
% 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}
% 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'}}
{}%
\edef\blx@saved@underscore@catcode{\the\catcode`\_}%
\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
\ifcsstring{blx@thelangenv}{hyphenrules}
{}
{\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`\_=\blx@saved@underscore@catcode\relax}
\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
% nametemplates meta-option entry/namelist/name scope
\blx@collectopts{string}{blx@entryopts}{nametemplates}
\blx@collectopts{string}{blx@namelistopts}{nametemplates}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{nametemplates}% for passing to the .bcf
% sortingnamekeytemplate namelist/name scope
\blx@collectopts{string}{blx@namelistopts}{sortingnamekeytemplatename}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{sortingnamekeytemplatename}% for passing to the .bcf
% uniquenametemplate namelist/name scope
\blx@collectopts{string}{blx@namelistopts}{uniquenametemplatename}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{uniquenametemplatename}% for passing to the .bcf
% labelalphanametemplate namelist/name scope
\blx@collectopts{string}{blx@namelistopts}{labelalphanametemplatename}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{labelalphanametemplatename}% 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{#1datecircaprintiso}\@empty
\cslet{#1enddatecircaprintiso}\@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
\cslet{if#1dateunknown}\@secondoftwo
\cslet{if#1enddateunknown}\@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}%
\listxadd\blx@datemetabooleans{#1dateunknown}%
\listxadd\blx@datemetabooleans{#1enddateunknown}}
\abx@dodatetypes
\def\do#1{%
\listxadd\blx@namepartmetafields{#1namehash}%
\listxadd\blx@namepartmetafields{#1fullhash}%
\listxadd\blx@namepartmetafields{#1bibnamehash}}
\abx@donameparts
\def\do#1{%
\listxadd\blx@labeldatepartfields{label#1}}
\abx@dodateparts
\def\abx@dointernalfields{%
\do{clonesourcekey}%
\do{labeldate}%
\do{labeldatesource}%
\do{labeldateera}%
\do{labelenddateera}%
\do{labelyear}%
\do{labelendyear}%
\do{labelmonth}%
\do{labelendmonth}%
\do{labelday}%
\do{labelendday}%
\do{labelhour}%
\do{labelendhour}%
\do{labelminute}%
\do{labelendminute}%
\do{labelsecond}%
\do{labelendsecond}%
\do{labeltimezone}%
\do{labelendtimezone}%
\do{labelseason}%
\do{labelendseason}%
\do{entrykey}%
\do{entryset}%
\do{entrysetcount}%
\do{entrytype}%
\do{extraalpha}%
\do{extratitle}%
\do{extratitleyear}%
\do{extradate}%
\do{fullhash}%
\do{labelalpha}%
\do{labelnumber}%
\do{labelprefix}%
\do{labeltitleyear}%
\do{localnumber}%
\do{namehash}%
\do{bibnamehash}%
\do{options}%
\do{sortinit}%
\do{sortinithash}%
\dolistloop\blx@datemetafields
\dolistloop\blx@namepartmetafields
\dolistloop\blx@labeldatepartfields}
\def\abx@dobooleans{%
\do{crossrefsource}%
\do{xrefsource}%
\do{singletitle}%
\do{uniquetitle}%
\do{uniquebaretitle}%
\do{uniquework}%
\do{uniqueprimaryauthor}%
\dolistloop\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@makeifdatemeta@bools@i#1#2{%
\appto\blx@blxinit{%
\blx@makeifdatemeta@bools{#1}{#2}}}
\def\blx@makeifdatemeta@bools#1#2{%
\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@makeifdatemeta@fields@i#1{%
\appto\blx@blxinit{%
\blx@makeifdatemeta@fields{#1}}}
\def\blx@makeifdatemeta@fields#1{%
\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@makeifdatemeta@bools@i{#1}{circa}%
\blx@makeifdatemeta@bools@i{#1}{julian}%
\blx@makeifdatemeta@bools@i{#1}{uncertain}%
\blx@makeifdatemeta@bools@i{#1}{unknown}}
\abx@dodatetypes
% Create date meta information field tests
\def\do#1{%
\blx@makeifdatemeta@fields@i{#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
\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
\newlength{\locallabelnumberwidth}
\newlength{\locallabelalphawidth}
\def\do#1{\expandafter\newlength\expandafter{\csname local#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
\ifundef\abx@annotation@defined
{}
{\def\do##1{\csundef{abx@annotation@##1}}%
\dolistloop\abx@annotation@defined}%
\let\abx@annotation@defined\@empty
\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
\abx@dointernalfields
\let\do\blx@saverelfield
\dolistloop\abx@dorelfields
\ifundef\abx@savedannotation@defined
{}
{\def\do##1{\csundef{abx@annotation@\blx@saveannotations@makesaved##1}}%
\dolistloop\abx@savedannotation@defined}%
\let\abx@savedannotation@defined\@empty
\ifundef\abx@annotation@defined
{}
{\let\do\blx@saveannotations
\dolistloop\abx@annotation@defined}%
\let\abx@savedannotation@defined\abx@annotation@defined
\let\do\blx@savebool
\abx@dobooleans
\let\do\blx@savedatetype
\abx@dodatetypes
\do{label}%
\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{etb@tgl@abx@bool@saved#1}{etb@tgl@abx@bool@#1}}
\protected\def\blx@savedatetype#1{%
\csletcs{blx@dateformat@saved#1date}{blx@dateformat@#1date}%
\protected\csedef{blx@imc@printsaved#1date}{%
\noexpand\csuse{mkdaterange\csuse{blx@dateformat@saved#1date}}
{saved#1}}%
\protected\csedef{blx@imc@printsaved#1dateextra}{%
\begingroup
% extradate is hard-coded in date macros, so reset it temporarily
\csletcs{abx@field@extradate}{abx@field@savedextradate}%
\noexpand\csuse{mkdaterange\csuse{blx@dateformat@saved#1date}extra}
{saved#1}%
\endgroup}%
\csletcs{blx@timeformat@saved#1time}{blx@timeformat@#1time}%
\protected\csedef{blx@imc@printsaved#1time}{%
\noexpand\csuse{mktimerange\csuse{blx@timeformat@saved#1time}}
{saved#1}}%
\csletcs{etb@tgl@blx@saved#1dateusetime}{etb@tgl@blx@#1dateusetime}%
% the datemetabooleans are here again for labeldate
\blx@savebool{#1datecirca}%
\blx@savebool{#1enddatecirca}%
\blx@savebool{#1datejulian}%
\blx@savebool{#1enddatejulian}%
\blx@savebool{#1dateuncertain}%
\blx@savebool{#1enddateuncertain}%
\blx@savebool{#1dateunknown}%
\blx@savebool{#1enddateunknown}%
\blx@makeifdatemeta@bools{saved#1}{circa}%
\blx@makeifdatemeta@bools{saved#1}{julian}%
\blx@makeifdatemeta@bools{saved#1}{uncertain}%
\blx@makeifdatemeta@bools{saved#1}{unknown}%
\blx@makeifdatemeta@fields{saved#1}%
\csletcs{printsaved#1date}{blx@imc@printsaved#1date}%
\csletcs{printsaved#1time}{blx@imc@printsaved#1time}%
\csletcs{printsaved#1dateextra}{blx@imc@printsaved#1dateextra}}
\def\blx@saveannotations@makesaved#1@#2{#1@saved#2}
\protected\def\blx@saveannotations#1{%
\csletcs{abx@annotation@\blx@saveannotations@makesaved#1}{abx@annotation@#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{%
\ifstrequal{#1}{field}
{\csxappto\blx@bbl@data{%
\listadd\noexpand\abx@annotation@defined{#1@#2}%
\def\do####1{\listcsadd{abx@annotation@#1@#2}{####1}}%
\docsvlist{#5}}}
{}%
\ifstrequal{#1}{item}
{\csxappto\blx@bbl@data{%
\listadd\noexpand\abx@annotation@defined{#1@#2@#3}%
\def\do####1{\listcsadd{abx@annotation@#1@#2@#3}{####1}}%
\docsvlist{#5}}}
{}%
\ifstrequal{#1}{part}
{\csxappto\blx@bbl@data{%
\listadd\noexpand\abx@annotation@defined{#1@#2@#3@#4}%
\def\do####1{\listcsadd{abx@annotation@#1@#2@#3@#4}{####1}}%
\docsvlist{#5}}}
{}}
% [<field>]{<annotation>}
\newcommand*{\blx@imc@iffieldannotation}[2][]{%
\ifblank{#1}
{\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}}
{\def\blx@tempa{#1}}%
\blx@resolve@annotation@label{\blx@tempa}%
\ifinlistcs{#2}{abx@annotation@field@\blx@tempa}}
% [<field>][<item>]{<annotation>}
\def\blx@imc@ifitemannotation{%
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@ifitemannotation@i}
{\blx@imc@ifitemannotation@i[\blx@tempa]}
}
\def\blx@imc@ifitemannotation@i[#1]{%
\@ifnextchar[%]
{\blx@imc@ifitemannotation@ii{#1}}
{\blx@imc@ifitemannotation@ii{#1}[\the\value{listcount}]}}
\def\blx@imc@ifitemannotation@ii#1[#2]#3{%
\def\blx@tempb{#1}%
\blx@resolve@annotation@label{\blx@tempb}%
\ifinlistcs{#3}{abx@annotation@item@\blx@tempb @#2}}
% [<field>][<item>]{<part>}{<annotation>}
\def\blx@imc@ifpartannotation{%
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@ifpartannotation@i}
{\blx@imc@ifpartannotation@i[\blx@tempa]}}
\def\blx@imc@ifpartannotation@i[#1]{%
\@ifnextchar[%]
{\blx@imc@ifpartannotation@ii{#1}}
{\blx@imc@ifpartannotation@ii{#1}[\the\value{listcount}]}}
\def\blx@imc@ifpartannotation@ii#1[#2]#3#4{%
\def\blx@tempb{#1}%
\blx@resolve@annotation@label{\blx@tempb}%
\ifinlistcs{#4}{abx@annotation@part@\blx@tempb @#2@#3}}
% {<datetype>}{<annotation>}
% labeldatesource has a slightly different format than other <field>sources
% that's one reason for a dedicated command, the other being that this command
% is probably only used in contexts where \currentfield is not defined, so
% the <datetype> argument is always required
\newcommand*{\blx@imc@ifdateannotation}[2]{%
\def\blx@tempa{#1}%
\ifcsundef{abx@field@\blx@tempa source}
{}%
{\letcs\blx@tempa{abx@field@\blx@tempa source}%
\edef\blx@tempa{\blx@tempa date}}%
\ifinlistcs{#2}{abx@annotation@field@\blx@tempa}}
\blx@regimcs{\iffieldannotation \ifitemannotation \ifpartannotation
\ifdateannotation}
% {<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@aliasfields
\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}}}
{}%
% labeldateunspecified
\ifcsdef{abx@field@\abx@field@labeldatesource dateunspecified}
{\csletcs{abx@field@labeldateunspecified}{abx@field@\abx@field@labeldatesource dateunspecified}}
{}%
% labeldatecirca/labelenddatecirca
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource datecirca}
{\csletcs{etb@tgl@abx@bool@labeldatecirca}{etb@tgl@abx@bool@\abx@field@labeldatesource datecirca}}
{}%
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource enddatecirca}
{\csletcs{etb@tgl@abx@bool@labelenddatecirca}{etb@tgl@abx@bool@\abx@field@labeldatesource enddatecirca}}
{}%
% labeldatejulian/labelenddatejulian
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource datejulian}
{\csletcs{etb@tgl@abx@bool@labeldatejulian}{etb@tgl@abx@bool@\abx@field@labeldatesource datejulian}}
{}%
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource enddatejulian}
{\csletcs{etb@tgl@abx@bool@labelenddatejulian}{etb@tgl@abx@bool@\abx@field@labeldatesource enddatejulian}}
{}%
% labeldateuncertain/labelenddateuncertain
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource dateuncertain}
{\csletcs{etb@tgl@abx@bool@labeldateuncertain}{etb@tgl@abx@bool@\abx@field@labeldatesource dateuncertain}}
{}%
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource enddateuncertain}
{\csletcs{etb@tgl@abx@bool@labelenddateuncertain}{etb@tgl@abx@bool@\abx@field@labeldatesource enddateuncertain}}
{}%
% labeldateunknown/labelenddateunknown
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource dateunknown}
{\csletcs{etb@tgl@abx@bool@labeldateunknown}{etb@tgl@abx@bool@\abx@field@labeldatesource dateunknown}}
{}%
\ifcsdef{etb@tgl@abx@bool@\abx@field@labeldatesource enddateunknown}
{\csletcs{etb@tgl@abx@bool@labelenddateunknown}{etb@tgl@abx@bool@\abx@field@labeldatesource enddateunknown}}
{}}}}
% This gets the entry data for a citation
\def\blx@getdata@cite#1{%
\blx@getdata{#1}%
% Inject the relevant set parent fields like labelnumber/labelprefix into child
\ifcsdef{blx@setc@\the\c@refsection @#1}
{\blx@ifdata{#1}
{\def\abx@field@childentrykey{#1}%LEGACY(<3.8)
\edef\abx@field@childentrytype{\abx@field@entrytype}%LEGACY(<3.8)
\begingroup
\expandafter\expandafter\expandafter\blx@getdata\expandafter\expandafter\expandafter{%
\csname blx@setc@\the\c@refsection @#1\endcsname}%
\let\blx@tempa\@empty
% Inject labelnumber if it exists
\ifdef\abx@field@labelnumber
{\appto\blx@tempa{\def\noexpand\abx@field@labelnumber{\abx@field@labelnumber}}}
{}%
% Inject labelprefix if it exists
\ifdef\abx@field@labelprefix
{\appto\blx@tempa{\def\noexpand\abx@field@labelprefix{\abx@field@labelprefix}}}
{}%
% Inject labelalpha if it exists
\ifdef\abx@field@labelalpha
{\appto\blx@tempa{\def\noexpand\abx@field@labelalpha{\abx@field@labelalpha}}}
{}%
% Inject extraalpha if it exists
\ifdef\abx@field@extraalpha
{\appto\blx@tempa{\def\noexpand\abx@field@extraalpha{\abx@field@extraalpha}}}
{}%
% Perform the injection
\edef\blx@tempb{\endgroup\blx@tempa}%
\blx@tempb}
{}}
{}%
\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@dlist@list@<section>@<refcontext> - a list of list items in a refcontext in a
% section (for tracking bibliography lists,
% obeys skipbiblist)
% blx@dlist@entry@<section>@<list> - a list of normal entries in a list in a
% section (for tracking bibliographies,
% obeys skipbib)
% blx@dlist@centry@<section>@<list> - a list of normal entries in a list 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@dlist@name @\abx@field@entrykey}%
\blx@bbl@addfield{entrykey}{\abx@field@entrykey}%
\listxadd\blx@entries{\abx@field@entrykey}%
\blx@bbl@addfield{entrytype}{#2}%
\csuse\blx@bbl@data
\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@dlist@type}{entry}
{\listcsxadd{blx@dlist@entry@\the\c@refsection @\blx@dlist@name}{\abx@field@entrykey}%
\listcsxadd{blx@dlist@centry@\the\c@refsection @\blx@dlist@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@dlist@type}{list}
{\blx@bbl@labelfields
\listcsxadd{blx@dlist@\blx@dlist@type @\the\c@refsection @\blx@dlist@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
\ifcsdef{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}
{\letcs\blx@tempa{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}%
\global\cslet{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}\@empty
\forlistloop\blx@addset@i\blx@tempa}
{\PackageWarningNoLine{biblatex}{Sorting template has changed}}%
\endgroup}
\def\blx@addset@i#1{%
\listcsgadd{blx@dlist@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@dlist@centry@\the\c@refsection @\blx@refcontext@context}{#1}}
% {<csname>}{<field>/<format>}{<field>}
\def\abx@flfw@getfieldformat#1#2#3{%
\blx@getformat\abx@tmp@theformat{ffd}{#2}{#3}%
\csletcs{#1}{abx@tmp@theformat}}
\def\blx@labelwidth@resetlocal{%
\locallabelnumberwidth0pt\relax
\locallabelalphawidth0pt\relax
\def\do##1{%
\csname local##1width\endcsname0pt\relax}%
\abx@dolabelfields}
\def\blx@labelwidth@settolocal{%
\labelnumberwidth\locallabelnumberwidth
\labelalphawidth\locallabelalphawidth
\def\do##1{%
\csname ##1width\endcsname\csname local##1width\endcsname}%
\abx@dolabelfields}
\def\blx@locallabelwidth#1{%
\blx@labelwidth@resetlocal
\let\blx@do\blx@lengthitem
\let\blx@done\relax
\blx@listloop{#1}%
\blx@labelwidth@settolocal}
% {<prefix for labelwidth fields>}
\def\blx@bbl@labelnumberwidth@numeric#1{%
\abx@flfw@getfieldformat{abx@flfw@labelnumberwidth}{labelnumberwidth}{}%
\abx@flfw@getfieldformat{abx@flfw@labelprefix}{labelprefix}{}%
\abx@flfw@getfieldformat{abx@flfw@labelnumber}{labelnumber}{}%
\iftoggle{blx@defernumbers}
{\ifundef\abx@field@localnumber
{\numdef\abx@field@localnumber{0}}%
{}}
{\ifundef\abx@field@localnumber
{\edef\abx@field@localnumber{%
\csuse{blx@labelnumber@\the\c@refsection}}}
{}}%
\blx@setlabwidth{\csname #1labelnumberwidth\endcsname}{%
\csuse{abx@flfw@labelnumberwidth}{%
\ifdef\abx@field@labelprefix
{\csuse{abx@flfw@labelprefix}{\abx@field@labelprefix}}
{}%
\csuse{abx@flfw@labelnumber}{\abx@field@localnumber}}}}
\def\blx@bbl@labelnumberwidth@shorthand#1{%
\abx@flfw@getfieldformat{abx@flfw@labelnumberwidth}{labelnumberwidth}{}%
\abx@flfw@getfieldformat{abx@flfw@labelnumber}{labelnumber}{}%
\blx@setlabwidth{\csname #1labelnumberwidth\endcsname}{%
\csuse{abx@flfw@labelnumberwidth}{%
\csuse{abx@flfw@labelnumber}{\abx@field@shorthand}}}}
\def\blx@bbl@locallabelnumberwidth{%
\ifdefempty\abx@field@localnumber
{}
{\ifundef\abx@field@shorthand
{\blx@bbl@labelnumberwidth@numeric{local}}
{\blx@bbl@labelnumberwidth@shorthand{local}}}}
% {<prefix for labelwidth fields>}
\def\blx@bbl@labelalphawidth#1{%
\abx@flfw@getfieldformat{abx@flfw@labelalphawidth}{labelalphawidth}{}%
\abx@flfw@getfieldformat{abx@flfw@labelprefix}{labelprefix}{}%
\abx@flfw@getfieldformat{abx@flfw@labelalpha}{labelalpha}{}%
\abx@flfw@getfieldformat{abx@flfw@extraalpha}{extraalpha}{}%
\blx@setlabwidth{\csname #1labelalphawidth\endcsname}{%
\csuse{abx@flfw@labelalphawidth}{%
\ifdef\abx@field@labelprefix
{\csuse{abx@flfw@labelprefix}{\abx@field@labelprefix}}
{}%
\csuse{abx@flfw@labelalpha}{\abx@field@labelalpha}%
\ifundef\abx@field@extraalpha
{}
{\csuse{abx@flfw@extraalpha}{\abx@field@extraalpha}}}}}
\def\blx@bbl@locallabelalphawidth{%
\ifundef\abx@field@labelalpha
{}
{\blx@bbl@labelalphawidth{local}}}
\def\blx@bbl@locallabelfields{\blx@bbl@labelfields@i{local}}
\def\blx@bbl@labelfields{\blx@bbl@labelfields@i{}}
% {<prefix for labelwidth fields>}
\def\blx@bbl@labelfields@i#1{%
\def\do##1{%
\ifcsundef{abx@field@##1}
{}
{\abx@flfw@getfieldformat{abx@flfw@##1width}{##1width}{##1}%
\blx@setlabwidth{\csname #1##1width\endcsname}{%
\csuse{abx@flfw@##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
{\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@bbl@labelnumberwidth@numeric{}}}
{\csgappto\blx@bbl@data{\let\abx@field@labelnumber\abx@field@shorthand}%
\iftoggle{blx@skipbib}
{}
{\blx@bbl@labelnumberwidth@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@bbl@labelalphawidth{}}}}
\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@extradate
{}
{\ifnum\abx@field@extradate>\c@maxextradate
\global\c@maxextradate\abx@field@extradate\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\datalist\blx@bbl@dlist
\let\enddatalist\blx@bbl@enddlist
\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{%
% Special warning for defernumbers when a citation cannot be found
\iftoggle{blx@defernumbers}
{\def\do##1{\ifinlist{##1}\blx@entries
{}
{\blx@warning@noline{%
citation '##1' was not found at all in the .bbl, bibliography labels cannot be generated, please correct the citation}}}%
\dolistloop\blx@lastcites}
{}}
% {<entrykey>}
% Get the saved information on which citations were mentioned last run
\protected\def\abx@aux@cite#1{%
\listxadd\blx@lastcites{\detokenize{#1}}}
% {<refcontext>}
% Get the saved information on which refcontexts were mentioned last run
\protected\def\abx@aux@refcontext#1{%
\listgadd\blx@lastrefcontexts{#1}}
% {<sortingtemplatename>}
% Get the saved information on which shorthand sorting templates 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 templates, 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 sortingtemplate "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 sortingtemplates as nobody wants to sort biblists with
% "none", since it makes no sense
\ifinlist{none}\blx@sortingtemplatenames
{\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}
{\ifundef\abx@field@localnumber
{}
{\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
\global\cslet{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}\@empty}}
{}}
{}}%
{}}
{}%
\endgroup}
% {<datalistname>}
\def\blx@bbl@dlist[#1]#2{%
\begingroup
\def\blx@dlist@type{#1}%
\def\blx@dlist@name{#2}}
\def\blx@bbl@enddlist{%
\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}[]{}
% 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}{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@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@bib1}{locallabelwidth}[]{}
\define@key{blx@biblist1}{locallabelwidth}[]{}
\define@key{blx@bib2}{locallabelwidth}[true]{\blx@key@locallabelwidth{#1}}
\define@key{blx@biblist2}{locallabelwidth}[true]{\blx@key@locallabelwidth{#1}}
\def\blx@key@locallabelwidth#1{%
\ifstrequal{#1}{true}
{\def\abx@locallabelwidth{\blx@locallabelwidth}}
{\let\abx@locallabelwidth\@gobble}}
\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'}}}
{}}
% [<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@tempe{\the\c@refsection}% default refsection is current
\blx@safe@actives
\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@dlist@entry@\blx@tempe @\blx@refcontext@context}
{}
{\letcs\blx@tempa{blx@dlist@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
% Add datalist to list of seen datalists to prevent duplicates
\xifinlist{\blx@refcontext@context @\blx@tempe @entry}\blx@dlistnames
{}
{\listxadd\blx@dlistnames{\blx@refcontext@context @\blx@tempe @entry}%
\csxappto{blx@dlists}{%
\blx@xml@dlist{\blx@refcontext@context}{entry}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@refcontext@sortingtemplatename}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{}}}%
\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@dlist@entry@\the\c@refsection @\blx@refcontext@context}
{}
{\toggletrue{blx@tempa}%
\begingroup
\expandafter\blx@bibliography\csname blx@dlist@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@dlist@entry@\the\c@refsection @\blx@refcontext@context}
{}
{\letcs\blx@tempa{blx@dlist@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@dlist@entry@\the\c@refsection @\blx@refcontext@context}
{}
{\letcs\blx@tempa{blx@dlist@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#1{%
\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
\abx@locallabelwidth{#1}%
\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{#1}}
\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>}
\def\blx@lengthitem#1{%
\blx@ifdata{#1}
{\begingroup
\blx@getdata{#1}%
\blx@bibcheck
\iftoggle{blx@skipentry}{}{%
\iftoggle{blx@labelnumber}
{\blx@bbl@locallabelnumberwidth}
{}%
\iftoggle{blx@labelalpha}
{\blx@bbl@locallabelalphawidth}
{}%
\nottoggle{blx@skipbiblist}
{\blx@bbl@locallabelfields}
{}}%
\endgroup}
{}}
% {<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}
\define@key{blx@biblist2}{driver}{\blx@key@driver{#1}}
\define@key{blx@biblist1}{driver}{}
\def\blx@key@driver#1{%
\def\blx@thebiblistdriver{#1}}
% 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}%
\def\blx@thebiblistdriver{#2}%
\def\blx@thebiblistfilter{#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 template and template name for list is same name as list
% name, then current context if not found
\edef\blx@tempc{%
\ifcsdef{blx@sortingtemplate@#2}
{#2}
{\blx@refcontext@sortingtemplatename}}%
% locally define this since we want to fetch data from the datalist named
% after the list we are printing rather than the data in refcontext list
\edef\blx@refcontext@context{\blx@tempc/\blx@refcontext@sortingnamekeytemplatename/\blx@refcontext@labelprefix/\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}%
\xifinlist\blx@tempc\blx@sortingtemplatenames
{}
{\listxadd\blx@sortingtemplatenames\blx@tempc}%
\let\blx@printbibchecks\relax
\edef\blx@tempe{\the\c@refsection}% default refsection is current
\blx@safe@actives
\blx@printbibchecks
% Add the sortingtemplate to the list of sortingtemplates 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}}}%
\setkeys{blx@biblist1}{#1}% Set section only, if present ...
\blx@rest@actives
\ifcsvoid{blx@dlist@list@\blx@tempe @\blx@refcontext@context}
{}
{\letcs\blx@tempa{blx@dlist@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
% Add datalist to list of seen datalists to prevent duplicates
\xifinlist{\blx@refcontext@context @\blx@tempe @list}\blx@dlistnames
{}
{\listxadd\blx@dlistnames{\blx@refcontext@context @\blx@tempe @list}%
\csxappto{blx@dlists}{%
\blx@xml@dlist{\blx@refcontext@context}{list}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@tempc}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{\csuse{blx@biblistfilters@\blx@thebiblistfilter}}}}%
\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#1{%
\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}}%
\abx@locallabelwidth{#1}%
\csuse{blx@env@\blx@theenv}%
\csuse{blx@hook@biblistinit@\blx@thebiblist}%
\let\blx@do\blx@biblistitem
\let\blx@done\blx@endbiblist
\blx@listloop{#1}}
\def\blx@endbiblist{%
\csuse{blx@endenv@\blx@theenv}%
\blx@noitem
\endgroup
\blx@bibnote\blx@thepostnote
\endgroup
\if@restonecol\twocolumn\fi}
% {<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@thebiblistdriver}%
\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 sortingtemplate to the list of sortingtemplates so we can track
% special cases like sorting=none which need cite order change detection
\xifinlist\blx@refcontext@sortingtemplatename\blx@sortingtemplatenames
{}
{\listxadd\blx@sortingtemplatenames\blx@refcontext@sortingtemplatename}%
\xdef\blx@refcontext@context{\blx@refcontext@sortingtemplatename/\blx@refcontext@sortingnamekeytemplatename/\blx@refcontext@labelprefix/\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}%
% 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@sortingtemplate@\blx@refcontext@sortingtemplatename}
{\blx@err@invopt{sorting=\blx@refcontext@sortingtemplatename}{}}
{}%
\ifcsundef{blx@sortingnamekeytemplate@\blx@refcontext@sortingnamekeytemplatename}
{\blx@err@invopt{sortingnamekeytemplate=\blx@refcontext@sortingnamekeytemplatename}{}}
{}%
\ifcsundef{blx@uniquenametemplate@\blx@refcontext@uniquenametemplatename}
{\blx@err@invopt{uniquenametemplate=\blx@refcontext@uniquenametemplatename}{}}
{}%
\ifcsundef{blx@labelalphanametemplate@\blx@refcontext@labelalphanametemplatename}
{\blx@err@invopt{labelalphanametemplate=\blx@refcontext@labelalphanametemplatename}{}}
{}}}
% 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@sortingtemplatename{\blx@sorting}%
\gdef\blx@refcontext@sortingnamekeytemplatename{global}%
\gdef\blx@refcontext@uniquenametemplatename{global}%
\gdef\blx@refcontext@labelalphanametemplatename{global}%
\xdef\blx@refcontext@context{\blx@refcontext@sortingtemplatename/\blx@refcontext@sortingnamekeytemplatename//\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}}
% Meta option to set all name template options
\define@key{blx@refcontext}{nametemplates}{%
\gdef\blx@refcontext@sortingnamekeytemplatename{#1}%
\gdef\blx@refcontext@uniquenametemplatename{#1}%
\gdef\blx@refcontext@labelalphanametemplatename{#1}}
\define@key{blx@refcontext}{sorting}{\gdef\blx@refcontext@sortingtemplatename{#1}}
\define@key{blx@refcontext}{sortingnamekeytemplatename}{\gdef\blx@refcontext@sortingnamekeytemplatename{#1}}
\define@key{blx@refcontext}{uniquenametemplatename}{\gdef\blx@refcontext@uniquenametemplatename{#1}}
\define@key{blx@refcontext}{labelalphanametemplatename}{\gdef\blx@refcontext@labelalphanametemplatename{#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'}}
{}}}
% [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%
\def\blx@tempd{global}%
\def\blx@tempe{global}%
\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/\blx@tempd/\blx@tempe}}
\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%
\def\blx@tempd{global}%
\def\blx@tempe{global}%
\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/\blx@tempd/\blx@tempe}}
\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%
\def\blx@tempd{global}%
\def\blx@tempe{global}%
\setkeys{blx@assignrefcontext}{#2}%
\def\do##1{%
\csxdef{blx@assignedrefcontextkeys#1@\the\c@refsection @##1}{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}%
\docsvlist{#3}}
% Meta option to set all name template options
\define@key{blx@assignrefcontext}{nametemplates}{%
\def\blx@tempb{#1}%
\def\blx@tempd{#1}%
\def\blx@tempe{#1}}
\define@key{blx@assignrefcontext}{sorting}{\def\blx@tempa{#1}}
\define@key{blx@assignrefcontext}{sortingnamekeytemplatename}{\def\blx@tempb{#1}}
\define@key{blx@assignrefcontext}{labelprefix}{\def\blx@tempc{#1}}
\define@key{blx@assignrefcontext}{uniquenametemplatename}{\def\blx@tempd{#1}}
\define@key{blx@assignrefcontext}{labelalphanametemplatename}{\def\blx@tempe{#1}}
% Reference sections
\newrobustcmd*{\newrefsection}{%
\endrefcontext
\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
\scr@startsection,% bad hack for koma >= 3.15
\@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@all{%
\ifbool{citerequest}
{\blx@bibreq{*}%
\global\csletcs
{blx@segm@\the\c@refsection @\the\c@refsegment}
{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}%
\ifcsvoid{blx@dlist@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{%
\expandafter\blx@citeloop@i\expandafter{\detokenize{#1}}}
\protected\def\blx@citeloop@i#1{%
\begingroup
% This must be here and not after \blx@citeadd as this changes the refcontext
\letcs\blx@tempb{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}%
% Make sure this counter exists. Sometimes it might not when using, e.g:
% refsection=chapter and \includeonly to put in the chapters or when
% inserting citations into table of contents
\ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else
\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname
\fi
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
\blx@tempcnta\z@
\blx@tempcntb\z@
\let\blx@tempa\@empty
\forcsvlist\blx@citeadd{#1}% adds to \blx@tempa
\blx@thenotecheck
\ifnum\blx@tempcnta>\z@
\ifnum\blx@tempcntb>\z@
\multicitedelim
\fi
\else
\blx@postpunct@saved
\fi
% \blx@tempb is a sorted list of all cites, \blx@tempa is the list of cites to
% sort using this list
\blx@thecitesort
\edef\blx@tempa{\endgroup
\c@citecount\z@
\c@citetotal\the\blx@tempcnta\relax
\unexpanded{\forlistloop\blx@citeprint}{\blx@tempb}}%
\blx@tempa}
\def\blx@notecheck{%
\ifnum\blx@tempcnta>\@ne
\blx@warning{%
Package option 'sortcites' enabled.\MessageBreak
Verify postnote placement}%
\fi}
\def\blx@citesort{%
\ifnum\blx@tempcnta>\@ne
\blx@filtercitesort\blx@tempb{blx@tempa}%
\else
\blx@citenosort
\fi}
\def\blx@citenosort{%
\let\blx@tempb\blx@tempa}
% {<entrykey>}
\def\blx@citeadd#1{%
\ifcsdef{blx@keyalias@\the\c@refsection @#1}
{\edef\blx@realkey{\csuse{blx@keyalias@\the\c@refsection @#1}}}
{\def\blx@realkey{#1}}%
\expandafter\blx@getrefcontext\expandafter{\blx@realkey}% needed for \ifdata
\expandafter\blx@citation\expandafter{\blx@realkey}\blx@msg@cundefon
\expandafter\blx@ifdata\expandafter{\blx@realkey}
{\advance\blx@tempcnta\@ne
\listeadd\blx@tempa{\blx@realkey}}
{\ifnum\blx@tempcntb>\z@\multicitedelim\fi
\expandafter\abx@missing\expandafter{\blx@realkey}%
\advance\blx@tempcntb\@ne}}
% set default refcontext for one citation key
% and then override with data from auto-assign \assignrefcontext* macros, if any
% <entrykey>
\def\blx@getrefcontext#1{%
% Save refcontext for restoration at end of \citeprint
\let\blx@refcontext@context@saved\blx@refcontext@context
% Get the default refcontext
% If there was one due to appearance in a bib/biblist, use it
% otherwise fall back on global refcontext. This can happen for cites
% made (a bit strangely but some styles do this) inside a biblist
% which never appear in any printed bib/biblist and therefore have no default
% refcontext defined
\ifcsdef{blx@assignedrefcontextbib@\the\c@refsection @#1}
{\letcs\blx@refcontext@context{blx@assignedrefcontextbib@\the\c@refsection @#1}}
{\edef\blx@refcontext@context{\blx@sorting/global//global/global}}%
% assignment via keyword list
\ifdef\blx@assignedrefcontextkeywlist
{\def\do##1{%
\blx@imc@ifentrykeyword{#1}{##1}
{% weak version
\ifboolexpr{test {\ifcsdef{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}}
and
not togl {blx@refcontext}}% inside explicit non-global refcontext
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}}
{}%
% strong version
\ifcsdef{blx@assignedrefcontextkeyws@\the\c@refsection @##1}
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws@\the\c@refsection @##1}}
{}}
{}}%
\dolistloop\blx@assignedrefcontextkeywlist}
{}%
% assignment via category
\ifdef\blx@assignedrefcontextcatlist
{\def\do##1{%
\blx@imc@ifentrycategory{#1}{##1}
{% weak version
\ifboolexpr{test {\ifcsdef{blx@assignedrefcontextcats*@\the\c@refsection @##1}}
and
not togl {blx@refcontext}}% inside explicit non-global refcontext
{\letcs\blx@refcontext@context{blx@assignedrefcontextcats*@\the\c@refsection @##1}}
{}%
% strong version
\ifcsdef{blx@assignedrefcontextcats@\the\c@refsection @##1}
{\letcs\blx@refcontext@context{blx@assignedrefcontextcats@\the\c@refsection @##1}}
{}}
{}}%
\dolistloop\blx@assignedrefcontextcatlist}
{}%
% assignment via entrykeys
% weak version
\nottoggle{blx@refcontext}
{\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @*}
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @*}}
{\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @#1}
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @#1}}
{}}}
{}%
% strong version
\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @*}
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @*}}
{\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @#1}
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @#1}}
{}}}
% {<entrykey>}
\protected\def\blx@citeprint#1{%
\blx@getrefcontext{#1}%
\advance\c@citecount\@ne
\addtocounter{instcount}\@ne
\ifnum\c@citecount=\@ne
\blx@getdata@cite{#1}%
\blx@precode
\ifnum\c@citetotal>\@ne
\blx@resetdata
\fi
\else
\blx@dlimcode
\fi
\begingroup
\ifnum\c@citetotal>\@ne
\blx@getdata@cite{#1}%
\fi
\blx@entrysetcount
\blx@setoptions@type\abx@field@entrytype
\blx@setoptions@entry
\blx@backref{#1}%
\blx@pagetracker
\csuse{blx@hook@citekey}%
\csuse{blx@hook@citekey@next}%
\blx@beglangcite
\blx@execute
\blx@loopcode
\blx@citecounter
\blx@citetracker
\blx@ibidtracker
\blx@idemtracker
\blx@opcittracker
\blx@loccittracker
\ifnum\c@citecount=\c@citetotal
\def\blx@thecheckpunct{\blx@err@nestcite\@gobble}%
\blx@postcode
\blx@postpunct@saved
\fi
\blx@endlangcite
\endgroup
\let\blx@refcontext@context\blx@refcontext@context@saved}
% cite counter
\def\blx@citecounter@global{%
\ifbool{@filesw}
{\ifbool{citetracker}
{\immediate\write\@mainaux{%
\string\abx@aux@count
{\the\c@refsection}{\abx@field@entrykey}}}
{}}
{}}
\def\blx@citecounter@context{%
\ifbool{@filesw}
{\ifbool{citetracker}
{\immediate\write\@mainaux{%
\iftoggle{blx@footnote}
{\string\abx@aux@fncount}
{\string\abx@aux@count}%
{\the\c@refsection}{\abx@field@entrykey}}}
{}}
{}}
% {<refsection>}{<entrykey>}
\protected\def\blx@aux@count#1#2{%
\csnumgdef{blx@count@#1@\detokenize{#2}}{\csuse{blx@count@#1@\detokenize{#2}}+1}}
\protected\def\blx@aux@fncount#1#2{%
\csnumgdef{blx@fncount@#1@\detokenize{#2}}{\csuse{blx@fncount@#1@\detokenize{#2}}+1}}
\let\abx@aux@count\@gobbletwo
\let\abx@aux@fncount\@gobbletwo
\AtEndDocument{%
\let\abx@aux@count\@gobbletwo
\let\abx@aux@fncount\@gobbletwo}
\protected\def\blx@setcitecounter@global{%
\c@citecounter0%
\csuse{blx@count@\the\c@refsection @\abx@field@entrykey}%
\relax}
\protected\def\blx@setcitecounter@context{%
\c@citecounter0%
\iftoggle{blx@footnote}
{\csuse{blx@fncount@\the\c@refsection @\abx@field@entrykey}}
{\csuse{blx@count@\the\c@refsection @\abx@field@entrykey}}%
\relax}
% cite tracker
\def\blx@citetracker@global{%
\ifbool{citetracker}
{\xifinlistcs\abx@field@entrykey{blx@bsee@\the\c@refsection}
{}
{\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}}
{}}
\def\blx@citetracker@context{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\xifinlistcs\abx@field@entrykey{blx@fsee@\the\c@refsection}
{}
{\listcsxadd{blx@fsee@\the\c@refsection}\abx@field@entrykey}}
{\xifinlistcs\abx@field@entrykey{blx@bsee@\the\c@refsection}
{}
{\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}}}
{}}
\protected\appto\abx@savetrackers{%
\global\csletcs{blx@saved@bsee@\the\c@refsection}{blx@bsee@\the\c@refsection}%
\global\csletcs{blx@saved@fsee@\the\c@refsection}{blx@fsee@\the\c@refsection}}
\protected\appto\abx@resttrackers{%
\global\csletcs{blx@bsee@\the\c@refsection}{blx@saved@bsee@\the\c@refsection}%
\global\csletcs{blx@fsee@\the\c@refsection}{blx@saved@fsee@\the\c@refsection}}
\protected\appto\abx@cleartrackers{%
\global\cslet{blx@saved@bsee@\the\c@refsection}\@empty
\global\cslet{blx@saved@fsee@\the\c@refsection}\@empty}
% ibidem tracker
\def\blx@ibidtracker@global{%
\ifbool{citetracker}
{\global\let\blx@lastkey@text\abx@field@entrykey}
{}}
\def\blx@ibidtracker@context{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\global\let\blx@lastkey@foot\abx@field@entrykey}
{\global\let\blx@lastkey@text\abx@field@entrykey}}
{}}
\def\blx@ibidtracker@strict{%
\blx@ifcitesingle
{\blx@ibidtracker@global}
{\blx@ibidreset@global}}%
\def\blx@ibidtracker@constrict{%
\blx@ifcitesingle
{\blx@mpfnsave
\blx@ibidtracker@context}
{\blx@ibidreset@context}}%
\def\blx@ibidreset@force{%
\global\undef\blx@lastkey@text
\global\undef\blx@lastkey@foot
\blx@mpfnreset}
\def\blx@ibidreset@global{%
\global\undef\blx@lastkey@text}
\def\blx@ibidreset@context{%
\iftoggle{blx@footnote}
{\blx@mpfnreset
\global\undef\blx@lastkey@foot}
{\global\undef\blx@lastkey@text}}
\protected\appto\abx@savetrackers{%
\global\let\blx@saved@lastkey@text\blx@lastkey@text
\global\let\blx@saved@lastkey@foot\blx@lastkey@foot}
\protected\appto\abx@resttrackers{%
\global\let\blx@lastkey@text\blx@saved@lastkey@text
\global\let\blx@lastkey@foot\blx@saved@lastkey@foot}
\protected\appto\abx@cleartrackers{%
\global\undef\blx@saved@lastkey@text
\global\undef\blx@saved@lastkey@foot}
% idem tracker
\def\blx@idemtracker@global{%
\ifbool{citetracker}
{\global\let\blx@lasthash@text\abx@field@fullhash}
{}}
\def\blx@idemtracker@context{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\global\let\blx@lasthash@foot\abx@field@fullhash}
{\global\let\blx@lasthash@text\abx@field@fullhash}}
{}}
\let\blx@idemtracker@strict\blx@idemtracker@global
\def\blx@idemtracker@constrict{%
\blx@mpfnsave
\blx@idemtracker@context}
\def\blx@idemreset@force{%
\global\undef\blx@lasthash@text
\global\undef\blx@lasthash@foot
\blx@mpfnreset}
\def\blx@idemreset@global{%
\global\undef\blx@lasthash@text}
\def\blx@idemreset@context{%
\iftoggle{blx@footnote}
{\blx@mpfnreset
\global\undef\blx@lasthash@foot}
{\global\undef\blx@lasthash@text}}
\protected\appto\abx@savetrackers{%
\global\let\blx@saved@lasthash@text\blx@lasthash@text
\global\let\blx@saved@lasthash@text\blx@lasthash@text}
\protected\appto\abx@resttrackers{%
\global\let\blx@lasthash@text\blx@saved@lasthash@text
\global\let\blx@lasthash@text\blx@saved@lasthash@text}
\protected\appto\abx@cleartrackers{%
\global\undef\blx@saved@lasthash@text
\global\undef\blx@saved@lasthash@foot}
% opcit tracker
\def\blx@opcittracker@global{%
\ifbool{citetracker}
{\blx@opcit@tracker{text}}
{}}
\def\blx@opcittracker@context{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\blx@opcit@tracker{foot}}
{\blx@opcit@tracker{text}}}
{}}
\def\blx@opcittracker@strict{%
\blx@ifcitesingle
{\blx@opcittracker@global}
{\blx@opcitreset@global}}%
\def\blx@opcittracker@constrict{%
\blx@ifcitesingle
{\blx@mpfnsave
\blx@opcittracker@context}
{\blx@opcitreset@context}}%
\def\blx@opcit@tracker#1{%
\blx@imc@iffieldundef{namehash}
{}
{\global\cslet{blx@lastkey@#1@\abx@field@namehash}\abx@field@entrykey
\xifinlistcs\abx@field@namehash{blx@trackhash@#1}
{}
{\listcsxadd{blx@trackhash@#1}\abx@field@namehash}}}
\def\blx@opcit@reset#1{%
\begingroup
\def\do##1{\global\csundef{blx@lastkey@#1@##1}}%
\dolistcsloop{blx@trackhash@#1}%
\global\cslet{blx@trackhash@#1}\@empty
\endgroup}
\def\blx@opcitreset@force{%
\blx@opcit@reset{text}%
\blx@opcit@reset{foot}%
\blx@mpfnreset}
\def\blx@opcitreset@global{%
\blx@opcit@reset{text}}
\def\blx@opcitreset@context{%
\iftoggle{blx@footnote}
{\blx@opcit@reset{foot}%
\blx@mpfnreset}
{\blx@opcit@reset{text}}}
\let\blx@trackhash@text\@empty
\let\blx@trackhash@foot\@empty
\protected\appto\abx@savetrackers{%
\begingroup
\def\do#1{\global\csletcs{blx@saved@lastkey@text@#1}{blx@lastkey@text@#1}}%
\dolistloop\blx@trackhash@text
\global\let\blx@saved@trackhash@text\blx@trackhash@text
\def\do#1{\global\csletcs{blx@saved@lastkey@foot@#1}{blx@lastkey@foot@#1}}%
\dolistloop\blx@trackhash@foot
\global\let\blx@saved@trackhash@foot\blx@trackhash@foot
\endgroup}
\protected\appto\abx@resttrackers{%
\begingroup
\blx@opcit@reset{text}%
\global\let\blx@trackhash@text\blx@saved@trackhash@text
\def\do#1{\global\csletcs{blx@lastkey@text@#1}{blx@saved@lastkey@text@#1}}%
\dolistloop\blx@trackhash@text
\blx@opcit@reset{foot}%
\global\let\blx@trackhash@foot\blx@saved@trackhash@foot
\def\do#1{\global\csletcs{blx@lastkey@foot@#1}{blx@saved@lastkey@foot@#1}}%
\dolistloop\blx@trackhash@foot
\endgroup}
\protected\appto\abx@cleartrackers{%
\begingroup
\def\do#1{\global\csundef{blx@saved@lastkey@text@#1}}%
\dolistloop\blx@saved@trackhash@text
\global\undef\blx@saved@trackhash@text
\def\do#1{\global\csundef{blx@saved@lastkey@foot@#1}}%
\dolistloop\blx@saved@trackhash@foot
\global\undef\blx@saved@trackhash@foot
\endgroup}
% loccit tracker
\def\blx@loccittracker@global{%
\ifbool{citetracker}
{\blx@loccit@tracker{text}}
{}}
\def\blx@loccittracker@context{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\blx@loccit@tracker{foot}}
{\blx@loccit@tracker{text}}}
{}}
\def\blx@loccittracker@strict{%
\ifbool{citetracker}
{\blx@loccit@stricttracker{text}}
{}}
\def\blx@loccittracker@constrict{%
\ifbool{citetracker}
{\iftoggle{blx@footnote}
{\blx@mpfnsave
\blx@loccit@stricttracker{foot}}
{\blx@loccit@stricttracker{text}}}
{}}
\def\blx@loccit@tracker#1{%
\global\csundef{blx@lastnote@#1@\abx@field@entrykey}%
\blx@imc@iffieldundef{postnote}
{}
{\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote
\xifinlistcs\abx@field@entrykey{blx@trackkeys@#1}
{}
{\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}}
\def\blx@loccit@stricttracker#1{%
\global\csundef{blx@lastnote@#1@\abx@field@entrykey}%
\blx@imc@iffieldundef{postnote}
{}
{\blx@ifcitesingle
{\expandafter\blx@imc@ifpages
\expandafter{\abx@field@postnote}
{\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote
\xifinlistcs\abx@field@entrykey{blx@trackkeys@#1}
{}
{\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}
{}}
{}}}
\def\blx@loccit@reset#1{%
\begingroup
\def\do##1{\global\csundef{blx@lastnote@#1@##1}}%
\dolistcsloop{blx@trackkeys@#1}%
\global\cslet{blx@trackkeys@#1}\@empty
\endgroup}
\def\blx@loccitreset@force{%
\blx@loccit@reset{text}%
\blx@loccit@reset{foot}%
\blx@mpfnreset}
\def\blx@loccitreset@global{%
\blx@loccit@reset{text}}
\def\blx@loccitreset@context{%
\iftoggle{blx@footnote}
{\blx@loccit@reset{foot}%
\blx@mpfnreset}
{\blx@loccit@reset{text}}}
\let\blx@trackkeys@text\@empty
\let\blx@trackkeys@foot\@empty
\protected\appto\abx@savetrackers{%
\begingroup
\def\do#1{\global\csletcs{blx@saved@lastnote@text@#1}{blx@lastnote@text@#1}}%
\dolistloop\blx@trackkeys@text
\global\let\blx@saved@trackkeys@text\blx@trackkeys@text
\def\do#1{\global\csletcs{blx@saved@lastnote@foot@#1}{blx@lastnote@foot@#1}}%
\dolistloop\blx@trackkeys@foot
\global\let\blx@saved@trackkeys@foot\blx@trackkeys@foot
\endgroup}
\protected\appto\abx@resttrackers{%
\begingroup
\blx@loccit@reset{text}%
\global\let\blx@trackkeys@text\blx@saved@trackkeys@text
\def\do#1{\global\csletcs{blx@lastnote@text@#1}{blx@saved@lastnote@text@#1}}%
\dolistloop\blx@trackkeys@text
\blx@loccit@reset{foot}%
\global\let\blx@trackkeys@foot\blx@saved@trackkeys@foot
\def\do#1{\global\csletcs{blx@lastnote@foot@#1}{blx@saved@lastnote@foot@#1}}%
\dolistloop\blx@trackkeys@foot
\endgroup}
\protected\appto\abx@cleartrackers{%
\begingroup
\def\do#1{\global\csundef{blx@saved@lastnote@text@#1}}%
\dolistloop\blx@saved@trackkeys@text
\global\undef\blx@saved@trackkeys@text
\def\do#1{\global\csundef{blx@saved@lastnote@foot@#1}}%
\dolistloop\blx@saved@trackkeys@foot
\global\undef\blx@saved@trackkeys@foot
\endgroup}
\def\blx@addbackref#1{%
\ifcsdef{blx@setp@\the\c@refsection @#1}
{\ifcase\blx@backrefsetstyle
\blx@addbackref@i{#1}%
\or
\blx@addbackref@ii{setp}{#1}%
\or
\blx@addbackref@i{#1}%
\or
\blx@addbackref@i{#1}%
\or
\blx@addbackref@i{#1}%
\blx@addbackref@ii{setp}{#1}%
\or
\blx@addbackref@i{#1}%
\blx@addbackref@ii{setp}{#1}%
\fi}
{\ifcsdef{blx@setc@\the\c@refsection @#1}
{\ifcase\blx@backrefsetstyle
\blx@addbackref@ii{setc}{#1}%
\or
\blx@addbackref@i{#1}%
\or
\blx@addbackref@i{#1}%
\or
\blx@addbackref@i{#1}%
\blx@addbackref@ii{setc}{#1}%
\or
\blx@addbackref@i{#1}%
\or
\blx@addbackref@i{#1}%
\blx@addbackref@ii{setc}{#1}%
\fi}
{\blx@addbackref@i{#1}}}}
\def\blx@addbackref@i#1{%
\ifbacktracker
\blx@leavevmode
\if@filesw
\protected@write\@mainaux{}{\string\abx@aux@backref
{\the\c@instcount}{#1}{\the\c@refsection}%
{\thepage}{\noexpand\the\c@page}}%
\fi
\fi}
\def\blx@addbackref@ii#1#2{%
\expandafter\expandafter\expandafter\forcsvlist
\expandafter\expandafter\expandafter\blx@addbackref@i
\expandafter\expandafter\expandafter{%
\csname blx@#1@\the\c@refsection @#2\endcsname}}
% {<instcount>}{<entrykey>}{<refsection>}{<page>}{<page int>}
\protected\def\blx@aux@backref#1#2#3#4#5{%
\ifcsundef{blx@pref@#3@\detokenize{#2}}
{\global\cslet{blx@pref@#3@\detokenize{#2}}\@empty
\expandafter\blx@onlypreamble\csname blx@pref@#3@\detokenize{#2}\endcsname}
{}%
\ifinlistcs{#4}{blx@pref@#3@\detokenize{#2}}
{}
{\listcsgadd{blx@pref@#3@\detokenize{#2}}{#4}}%
\blx@addpagesum{#1}{#5}}
\AtEndDocument{%
\def\abx@aux@backref#1#2#3#4#5{\blx@addpagesum{#1}{#5}}}
% {<true>}{<false>}
\def\blx@ifcitesingle{%
\ifnum\c@citetotal=\@ne
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% hyperref interface
\appto\blx@mkhyperref{%
\protected\def\blx@imc@bibhyperref{%
\@ifnextchar[%]
{\blx@bibhyperref}
{\blx@bibhyperref[\abx@field@entrykey]}}%
\ifundef\hyper@natanchorstart
{\long\def\blx@bibhyperref[#1]#2{%
\blx@sfsave\hyperlink{cite.\the\c@refsection @#1}{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}%
\protected\long\def\blx@imc@bibhyperlink#1#2{%
\blx@sfsave\hyperlink{cite.\the\c@refsection:#1}{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}%
\protected\long\def\blx@imc@bibhypertarget#1#2{%
\blx@sfsave\hypertarget{cite.\the\c@refsection:#1}{\blx@sfrest
#2%
\blx@sfsave}\blx@sfrest}}%
{\long\def\blx@bibhyperref[#1]#2{%
\blx@sfsave\hyper@natlinkstart{\the\c@refsection @#1}\blx@sfrest
#2%
\blx@sfsave\hyper@natlinkend\blx@sfrest}%
\protected\long\def\blx@imc@bibhyperlink#1#2{%
\blx@sfsave\hyper@natlinkstart{\the\c@refsection:#1}\blx@sfrest
#2%
\blx@sfsave\hyper@natlinkend\blx@sfrest}%
\protected\long\def\blx@imc@bibhypertarget#1#2{%
\blx@sfsave\hyper@natanchorstart{\the\c@refsection:#1}\blx@sfrest
#2%
\blx@sfsave\hyper@natanchorend\blx@sfrest}}
\let\blx@imc@ifhyperref\@firstoftwo
\def\blx@sf{\spacefactor}%
\def\blx@sfsave{%
\blx@leavevmode
\numgdef\blx@sf{\spacefactor}}%
\def\blx@sfrest{%
\ifhmode\spacefactor\blx@sf\relax\fi
\gdef\blx@sf{\spacefactor}}}
\appto\blx@mknohyperref{%
\protected\def\blx@imc@bibhyperref{\@ifnextchar[\blx@nohyperref\@firstofone}%
\def\blx@nohyperref[#1]#2{#2}%
\let\blx@imc@bibhyperlink\@secondoftwo
\let\blx@imc@bibhypertarget\@secondoftwo
\let\blx@imc@ifhyperref\@secondoftwo}
\blx@regimcs{%
\bibhyperref \bibhyperlink \bibhypertarget \ifhyperref}
% {<entrykey>,...}
\protected\def\nocite#{\blx@nocite}
\def\blx@nocite#1{%
\@bsphack
\AfterPreamble{%
\iftoggle{blx@bibliography}
{}
{\ifstrequal{*}{#1}
{\blx@citation@all}
{\blx@xsanitizeafter{\forcsvlist\blx@nocite@do}{#1}}}}%
\@esphack}
\def\blx@nocite@do#1{%
% Make sure this counter exists. Sometimes it might not when using, e.g:
% refsection=chapter and \includeonly to put in the chapters or when
% inserting citations into table of contents
\ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else
\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname
\fi
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
\blx@citation{#1}\blx@msg@cundef}
% {<macro>}[<arg1>][<arg2>]{<arg3>}
% => <macro>{<arg1>}{<arg2>}{<arg3>}
\protected\def\blx@citeargs#1{%
\@ifnextchar[%]
{\blx@citeargs@i{#1}}
{\blx@citeargs@iii{#1{}{}}}}
\long\def\blx@citeargs@i#1[#2]{%
\@ifnextchar[%]
{\blx@citeargs@ii{#1{#2}}}
{\blx@citeargs@iii{#1{}{#2}}}}
\long\def\blx@citeargs@ii#1[#2]{%
\blx@citeargs@iii{#1{#2}}}
\long\def\blx@citeargs@iii#1#2{%
\blx@xsanitizeafter{#1}{#2}}
% {<macro>}(<arg1>)(<arg2>)
% => <macro>{<arg1>}{<arg2>}
\protected\def\blx@multiargs#1{%
\@ifnextchar(%)
{\blx@multiargs@i{#1}}
{#1{}{}}}
\long\def\blx@multiargs@i#1(#2){%
\@ifnextchar(%)
{\blx@multiargs@ii{#1{#2}}}
{#1{}{#2}}}
\long\def\blx@multiargs@ii#1(#2){#1{#2}}
% {<macro>}[<arg1>][<arg2>]{<arg3>}<punct>
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<punctcmd>}
\protected\def\blx@citepunct#1{%
\blx@citeargs{\blx@citepunct@i{#1}}}
\long\def\blx@citepunct@i#1#2#3#4{%
\blx@thecheckpunct{#1{#2}{#3}{#4}}}
% {<csname>}[<arg1>][<arg2>]{arg3}[arg4]{arg5}<punct>
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<arg4>}{arg5}{<punctcmd>}
\protected\def\blx@citexpunct#1{%
\blx@citeargs{\blx@citexpunct@i{#1}}}
\long\def\blx@citexpunct@i#1#2#3#4{%
\@ifnextchar[%]
{\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}}
{\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}[#1]}}
\long\def\blx@citexpunct@ii#1#2[#3]#4{%
\blx@thecheckpunct{\blxcitecmd{#1}#2{#3}{#4}}}
% {<code>}<punct> => <code>{<punctcmd>}
\long\def\blx@checkpunct#1{%
\begingroup
\def\blx@tempa{\endgroup#1}%
\futurelet\blx@tempb\blx@checkpunct@i}
\def\blx@checkpunct@i{%
\expandafter\blx@checkpunct@ii\blx@autopunct&}
\def\blx@checkpunct@ii#1{%
\ifx#1&%
\expandafter\blx@checkpunct@iii
\fi
\ifx#1\blx@tempb
\expandafter\blx@checkpunct@iv
\fi
\blx@checkpunct@ii}
\def\blx@checkpunct@iii#1\blx@checkpunct@ii{%
\global\undef\abx@field@postpunct
\blx@tempa{\blx@postpunct}}
\def\blx@checkpunct@iv#1\blx@checkpunct@ii#2&#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}%
\def\blx@postpunct@saved{##4}%
\blx@citeloop{##3}%
\endgroup}}
% {<type>}{<name>}{*}
\def\blx@checkcitecmd#1#2{%
\ifblank{#2}
{\ifcsdef{blx@cite@#1}
{\blx@info{Redefining '\@backslashchar#1'}}
{\ifcsundef{#1}
{}
{\blx@warning@noline{Redefining '\@backslashchar#1'}}}%
\ifcsdef{blx@cite@#1*}
{}
{\csedef{blx@cite@#1*}{%
\expandafter\noexpand\csname blx@cite@#1\endcsname}%
\csedef{blx@citei@#1*}{%
\expandafter\noexpand\csname blx@citei@#1\endcsname}}}
{\ifcsdef{blx@cite@#1}
{}
{\csdef{blx@cite@#1}{\blx@err@citecmd{#1}}%
\csdef{blx@citei@#1}{\blx@err@citecmd{#1}}}}}
% {<name>}{prenote}{postnote}{citekey}{punct}
\newrobustcmd*{\blxcitecmd}[1]{%
\ifcsundef{blx@cite@#1}
{\blx@err@citecmd{#1}}
{\csuse{blx@cite@#1}}}
\newrobustcmd*{\blxciteicmd}[1]{%
\begingroup
\blx@citeinit
\ifcsundef{blx@citei@#1}
{\blx@err@citecmd{#1}}
{\csuse{blx@citei@#1}}}
% {<multicitecount>}{<name>}{prenote}{postnote}{citekey}{punct}
\protected\def\blxmciteicmd#1{%
\c@multicitecount#1\relax
\blxciteicmd}
% {<multicitetotal>}{<multiprenote>}{<multipostnote>}
\protected\def\blxmcites#1#2#3{%
\begingroup
\blx@citeinit
\c@multicitecount\z@
\c@multicitetotal#1\relax
\ifnum\c@multicitetotal>\@ne
\let\blx@ifcitesingle\@secondoftwo
\fi
\csuse{blx@hook@mcite}%
\csuse{blx@hook@mcite@next}%
\ifblank{#2}%
{}
{\def\abx@field@multiprenote{#2}}%
\ifblank{#3}%
{}
{\def\abx@field@multipostnote{#3}}%
\usebibmacro{multiprenote}}
\protected\def\blxendmcites{%
\usebibmacro{multipostnote}%
\endgroup}
% {<command>}[<wrapper>]{<cite>}{<delimiter>}
\newrobustcmd{\DeclareMultiCiteCommand}[1]{%
\ifundef#1%
{}
{\blx@info{Redefining '\string#1'}}%
\@ifnextchar[%]
{\blx@defmcitecmd{#1}}
{\blx@defmcitecmd{#1}[\@firstofone]}}
\def\blx@defmcitecmd#1[#2]#3#4{%
\begingroup
\escapechar\m@ne
\edef\blx@tempa{\endgroup
\protected\def\noexpand#1{%
\blx@citecmdinit
\noexpand\@ifstar
{\expandafter\noexpand
\csname blx@mcite@\string#1\endcsname*%
\expandafter\noexpand
\csname blx@mcitei@\string#1\endcsname}
{\expandafter\noexpand
\csname blx@mcite@\string#1\endcsname{}%
\expandafter\noexpand
\csname blx@mcitei@\string#1\endcsname}}%
\protected\csdef{blx@mcite@\string#1}####1####2{%
\begingroup
\blx@citeinit
\noexpand\blx@multicite
####2%
{\unexpanded{#2}}%
{\string#3####1}%
{\unexpanded{#4}}}%
\protected\long\csdef{blx@mcitei@\string#1}}%
\blx@tempa##1##2##3{##1{##2}##3\endgroup}}
% {<command>}{<wrapper>}{<citecmd>}{<delimiter>} =>
% <init><command>{<wrapper>}{<cites>}{<punct>}
\def\blx@multicite#1#2#3#4{%
\begingroup
\csuse{blx@hook@mcite@before}%
\def\blx@tempa{#1}%
\def\blx@tempb{#2}%
\def\blx@tempc{#3}%
\def\blx@tempd{#4}%
\c@multicitetotal\z@
\blx@multiargs\blx@multicite@i}
\def\blx@multicite@i#1#2{%
\ifblank{#1}%
{\let\abx@field@multiprenote\@empty}%
{\def\abx@field@multiprenote{#1}}%
\ifblank{#2}%
{\let\abx@field@multipostnote\@empty}%
{\def\abx@field@multipostnote{#2}}%
\let\blx@tempe\@empty
\let\blx@tempf\@empty
\togglefalse{blx@tempa}%
\blx@multiparse}
\def\blx@multicite@add#1#2#3{%
\togglefalse{blx@tempa}%
\advance\c@multicitetotal\@ne
\eappto\blx@tempe{%
\expandonce\blx@tempf
\blxmciteicmd{\the\c@multicitetotal}%
{\expandonce\blx@tempc}\unexpanded{{#1}{#2}{#3}}{}}%
\let\blx@tempf\blx@tempd
\blx@multiparse}
\def\blx@multicite@end#1{%
\edef\blx@tempa{\endgroup
\expandonce\blx@tempa
{\expandonce\blx@tempb}%
{\blxmcites
{\the\c@multicitetotal}%
{\expandonce\abx@field@multiprenote}%
{\expandonce\abx@field@multipostnote}%
\expandonce\blx@tempe
\blxendmcites}%
{#1}%
\iftoggle{blx@tempa}{\relax\space}{}}%
\blx@tempa}
\def\blx@multiparse{%
\futurelet\@let@token\blx@multiparse@i}
\def\blx@multiparse@i{%
\ifx\@let@token\relax
\blx@multiparse@ii{\blx@multicite@end{}}%
\fi
\ifx\@let@token[%]
\blx@multiparse@ii{\blx@citeargs\blx@multicite@add}%
\fi
\ifx\@let@token\bgroup
\blx@multiparse@ii{\blx@citeargs\blx@multicite@add}%
\fi
\ifx\@let@token\@sptoken
\blx@multiparse@ii\blx@multiparse@iii
\fi
\iftrue
\iftoggle{blx@tempa}
{\blx@multiparse@ii{\blx@multicite@end{}}}
{\blx@multiparse@ii{\blx@thecheckpunct\blx@multicite@end}}%
\fi
&}
\def\blx@multiparse@ii#1#2&{\fi#1}
\csdef{blx@multiparse@iii} {\toggletrue{blx@tempa}\blx@multiparse}
% {<name>}[l|i|r]{<cite>}{<multicite>}
\newrobustcmd*{\DeclareAutoCiteCommand}[1]{%
\ifcsundef{blx@acite@#1}
{}
{\blx@info{Redefining autocite command '#1'}}%
\@ifnextchar[%]
{\blx@defautocmd@i{#1}}
{\blx@defautocmd@i{#1}[r]}}
\def\blx@defautocmd@i#1[#2]#3#4{%
\begingroup
\escapechar\m@ne
\edef\blx@tempa{\endgroup
\noexpand\blx@defautocmd@ii{#1}{#2}%
{\string#3}{\string#4}}%
\blx@tempa}
\def\blx@defautocmd@ii#1#2#3#4{%
\protected\csedef{blx@acite@#1}{%
\blx@citecmdinit
\noexpand\@ifstar
{\blx@citepunct{\expandafter\noexpand
\csname blx@acitei@#1\endcsname*}}
{\blx@citepunct{\expandafter\noexpand
\csname blx@acitei@#1\endcsname{}}}}%
\protected\csedef{blx@acitei@#1}##1##2##3##4##5{%
\begingroup
\blx@citeinit
\if l#2\noexpand\unspace##5\fi
\if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##5}\fi
\blxcitecmd{#3##1}{##2}{##3}{##4}{}%
\if r#2##5\fi
\if f#2\noexpand\iftoggle{blx@footnote}{##5}{}\fi
\endgroup}%
\protected\csedef{blx@macite@#1}{%
\blx@citecmdinit
\noexpand\@ifstar
{\expandafter\noexpand
\csname blx@mcite@#4\endcsname*%
\expandafter\noexpand
\csname blx@macitei@#1\endcsname}
{\expandafter\noexpand
\csname blx@mcite@#4\endcsname{}%
\expandafter\noexpand
\csname blx@macitei@#1\endcsname}}%
\protected\csedef{blx@macitei@#1}##1##2##3{%
\if l#2\noexpand\unspace##3\fi
\if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##3}\fi
##1{##2}%
\if r#2##3\fi
\if f#2\noexpand\iftoggle{blx@footnote}{##3}{}\fi
\endgroup}}
% {<characters>}
\newrobustcmd*{\DeclareAutoPunctuation}[1]{%
\ifblank{#1}
{\let\blx@thecheckpunct\blx@nocheckpunct}
{\let\blx@thecheckpunct\blx@checkpunct
\def\blx@autopunct{#1}}}
\AfterEndPreamble{% babel
\begingroup
\makeatletter
\endlinechar\m@ne
\scantokens\expandafter{%
\expandafter\gdef
\expandafter\blx@autopunct
\expandafter{\blx@autopunct}}%
\endgroup}
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<namelist>}<punct>
\newrobustcmd*{\citename}{\blx@citexpunct{citename}}
\long\csdef{blx@cite@citename}#1#2#3#4#5#6{%
\begingroup
\blx@citecmdinit
\blx@citeinit
\ifblank{#1}
{}
{\def\abx@field@prenote{#1}}%
\ifblank{#2}
{\let\blx@thenotecheck\relax}
{\def\abx@field@postnote{#2}}%
\def\blx@precode{\usebibmacro{prenote}}%
\def\blx@loopcode{%
\ifnameundef{#5}
{\blx@warning@entry{'#5' undefined or not a name list}%
\abx@missing{#5}}
{\printnames[#4]{#5}}}%
\def\blx@dlimcode{\multicitedelim}%
\def\blx@postpunct@saved{#6}%
\ifblank{#2}
{\let\blx@postcode\@empty}
{\def\blx@postcode{\usebibmacro{postnote}}}%
\boolfalse{citetracker}%
\boolfalse{pagetracker}%
\blx@citeloop{#3}%
\endgroup}
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<list>}<punct>
\newrobustcmd*{\citelist}{\blx@citexpunct{citelist}}
\long\csdef{blx@cite@citelist}#1#2#3#4#5#6{%
\begingroup
\blx@citecmdinit
\blx@citeinit
\ifblank{#1}
{}
{\def\abx@field@prenote{#1}}%
\ifblank{#2}
{\let\blx@thenotecheck\relax}
{\def\abx@field@postnote{#2}}%
\def\blx@precode{\usebibmacro{prenote}}%
\def\blx@loopcode{%
\iflistundef{#5}
{\blx@warning@entry{'#5' undefined or not a literal list}%
\abx@missing{#5}}
{\printlist[#4]{#5}}}%
\def\blx@dlimcode{\multicitedelim}%
\def\blx@postpunct@saved{#6}%
\ifblank{#2}
{\let\blx@postcode\@empty}
{\def\blx@postcode{\usebibmacro{postnote}}}%
\boolfalse{citetracker}%
\boolfalse{pagetracker}%
\blx@citeloop{#3}%
\endgroup}
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<field>}<punct>
\newrobustcmd*{\citefield}{\blx@citexpunct{citefield}}
\long\csdef{blx@cite@citefield}#1#2#3#4#5#6{%
\begingroup
\blx@citecmdinit
\blx@citeinit
\ifblank{#1}
{}
{\def\abx@field@prenote{#1}}%
\ifblank{#2}
{\let\blx@thenotecheck\relax}
{\def\abx@field@postnote{#2}}%
\def\blx@precode{\usebibmacro{prenote}}%
\def\blx@loopcode{%
\iffieldundef{#5}
{\blx@warning@entry{'#5' undefined or not a field}%
\abx@missing{#5}}
{\printfield[#4]{#5}}}%
\def\blx@dlimcode{\multicitedelim}%
\def\blx@postpunct@saved{#6}%
\ifblank{#2}
{\let\blx@postcode\@empty}
{\def\blx@postcode{\usebibmacro{postnote}}}%
\boolfalse{citetracker}%
\boolfalse{pagetracker}%
\blx@citeloop{#3}%
\endgroup}
\renewrobustcmd*{\cite}{\blx@err@citecmd\cite}
\let\blx@cite@cite\relax
\newrobustcmd*{\parencite}{\blx@warn@citecmd\parencite\cite}
\let\blx@cite@parencite\relax
\newrobustcmd*{\footcite}{\blx@warn@citecmd\footcite\cite}
\let\blx@cite@footcite\relax
\newrobustcmd*{\footcitetext}{\blx@warn@citecmd\footcitetext\cite}
\let\blx@cite@footcitetext\relax
\newrobustcmd*{\smartcite}{\blx@warn@citecmd\smartcite\cite}
\let\blx@cite@smartcite\relax
\newrobustcmd*{\textcite}{\blx@warn@citecmd\textcite\cite}
\let\blx@cite@textcite\relax
\newrobustcmd*{\supercite}{\blx@warn@citecmd\supercite\cite}
\let\blx@cite@supercite\relax
%% ifthen interface
\def\blx@TE#1#2{%
\TE@throw
\unexpanded{%
\iftrue\@nameuse{fi}%
#1{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2}
\def\blx@xTE#1#2{%
\TE@throw
\unexpanded{\iftrue\@nameuse{fi}}%
#1\unexpanded{{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2}
\let\blx@TE@hook\@empty
\appto\blx@blxinit{%
\appto\blx@TE@hook{%
\def\ifhyperref{\blx@TE\blx@imc@ifhyperref}%
\def\ifmorenames{\blx@TE\blx@imc@ifmorenames}%
\def\ifmoreitems{\blx@TE\blx@imc@ifmoreitems}%
\def\iffirstcitekey{\blx@TE\blx@imc@iffirstcitekey}%
\def\iflastcitekey{\blx@TE\blx@imc@iflastcitekey}%
\def\ifciteseen{\blx@TE\blx@imc@ifciteseen}%
\def\ifentryseen{\blx@TE\blx@imc@ifentryseen}%
\def\ifentryinbib{\blx@TE\blx@imc@ifentryinbib}%
\def\ifciteibid{\blx@TE\blx@imc@ifciteibid}%
\def\ifciteidem{\blx@TE\blx@imc@ifciteidem}%
\def\ifopcit{\blx@TE\blx@imc@ifopcit}%
\def\ifloccit{\blx@TE\blx@imc@ifloccit}%
\def\ifsamepage{\blx@TE\blx@imc@ifsamepage}%
\def\iffirstonpage{\blx@TE\blx@imc@iffirstonpage}%
\def\ifcurrentfield#1{\blx@TE{\blx@imc@ifcurrentfield{#1}}}%
\def\ifcurrentlist#1{\blx@TE{\blx@imc@ifcurrentlist{#1}}}%
\def\ifcurrentname#1{\blx@TE{\blx@imc@ifcurrentname{#1}}}%
\def\ifentrytype#1{\blx@TE{\blx@imc@ifentrytype{#1}}}%
\def\iffieldequalcs#1#2{\blx@TE{\blx@imc@iffieldequalcs{#1}{#2}}}%
\def\iffieldequals#1#2{\blx@TE{\blx@imc@iffieldequals{#1}{#2}}}%
\def\iffieldequalstr#1#2{\blx@TE{\blx@imc@iffieldequalstr{#1}{#2}}}%
\def\iffieldsequal#1#2{\blx@TE{\blx@imc@iffieldsequal{#1}{#2}}}%
\def\ifbibmacroundef#1{\blx@TE{\blx@imc@ifbibmacroundef{#1}}}%
\def\iffieldundef#1{\blx@TE{\blx@imc@iffieldundef{#1}}}%
\def\ifnameequalcs#1#2{\blx@TE{\blx@imc@ifnameequalcs{#1}{#2}}}%
\def\ifnameequals#1#2{\blx@TE{\blx@imc@ifnameequals{#1}{#2}}}%
\def\ifnamesequal#1#2{\blx@TE{\blx@imc@ifnamesequal{#1}{#2}}}%
\def\ifnameundef#1{\blx@TE{\blx@imc@ifnameundef{#1}}}%
\def\ifcategory#1{\blx@TE{\blx@imc@ifcategory{#1}}}%
\def\ifkeyword#1{\blx@TE{\blx@imc@ifkeyword{#1}}}%
\def\ifentrycategory#1#2{\blx@TE{\blx@imc@ifentrycategory{#1}{#2}}}%
\def\ifentrykeyword#1#2{\blx@TE{\blx@imc@ifentrykeyword{#1}{#2}}}%
\def\ifcapital{\blx@TE\blx@imc@ifcapital}%
\def\ifinteger#1{\blx@TE{\blx@imc@ifinteger{#1}}}%
\def\iffieldint#1{\blx@TE{\blx@imc@iffieldint{#1}}}%
\def\ifnumeral#1{\blx@TE{\blx@imc@ifnumeral{#1}}}%
\def\ifnumerals#1{\blx@TE{\blx@imc@ifnumerals{#1}}}%
\def\ifpages#1{\blx@TE{\blx@imc@ifpages{#1}}}%
\def\iffieldnum#1{\blx@TE{\blx@imc@iffieldnum{#1}}}%
\def\iffieldnums#1{\blx@TE{\blx@imc@iffieldnums{#1}}}%
\def\iffieldpages#1{\blx@TE{\blx@imc@iffieldpages{#1}}}%
\def\ifbibstring#1{\blx@TE{\blx@imc@ifbibstring{#1}}}%
\def\iffieldbibstring#1{\blx@TE{\blx@imc@iffieldbibstring{#1}}}%
\def\ifnatbibmode{\blx@TE{\iftoggle{blx@natbib}}}%
\def\ifcitation{\blx@TE{\iftoggle{blx@citation}}}%
\def\ifbibliography{\blx@TE{\iftoggle{blx@bibliography}}}%
\def\ifciteindex{\blx@TE{\iftoggle{blx@citeindex}}}%
\def\ifbibindex{\blx@TE{\iftoggle{blx@bibindex}}}%
\def\iffootnote{\blx@TE{\iftoggle{blx@footnote}}}%
\def\ifuseprefix{\blx@TE{\iftoggle{blx@useprefix}}}%
\def\ifterseinits{\blx@TE{\iftoggle{blx@terseinits}}}%
\def\ifsingletitle{\blx@TE{\iftoggle{abx@bool@singletitle}}}%
\def\ifuniquetitle{\blx@TE{\iftoggle{abx@bool@uniquetitle}}}%
\def\ifuniquebaretitle{\blx@TE{\iftoggle{abx@bool@uniquebaretitle}}}%
\def\ifuniquework{\blx@TE{\iftoggle{abx@bool@uniquework}}}%
\def\ifuniqueprimaryauthor{\blx@TE{\iftoggle{abx@bool@uniqueprimaryauthor}}}%
\def\ifandothers#1{\blx@TE{\iftoggle{abx@bool@more#1}}}%
\def\iflabeldateisdate{\blx@TE\blx@imc@iflabeldateisdate}%
\def\ifdatehasyearonlyprecision#1{%
\blx@TE{\blx@imc@ifdatehasyearonlyprecision{#1}}}%
\def\ifdatehastime#1{\blx@TE{\blx@imc@ifdatehastime{#1}}}%
\def\ifdateshavedifferentprecision#1#2{%
\blx@TE{\blx@imc@ifdateshavedifferentprecision{#1}{#2}}}}}
% {<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 name="#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@extradate#1{%
~~<bcf:extradatespec>\blx@nl
#1%
~~</bcf:extradatespec>\blx@nl}
\xdef\blx@xml@extradatescope#1{%
~~~~<bcf:scope>\blx@nl
#1%
~~~~</bcf:scope>\blx@nl}
\xdef\blx@xml@edordered#1#2{%
~~~~~~<bcf:field order="#1">#2</bcf:field>\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#2{%
~~<bcf:uniquenametemplate name="#1">\blx@nl%
#2%
~~</bcf:uniquenametemplate>\blx@nl}
\xdef\blx@xml@uniquenametemplatenamepart#1#2#3{%
~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl}
\xdef\blx@xml@sortingnamekeytemplate#1#2{%
~~<bcf:sortingnamekeytemplate name="#1">\blx@nl%
#2%
~~</bcf:sortingnamekeytemplate>\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@sortingtemplate#1#2#3{%
~~<bcf:sortingtemplate name="#1"#2>\blx@nl%
#3%
~~</bcf:sortingtemplate>\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@dlist@refcontext#1#2#3#4#5{%
~~~~~~~~~~~~~~~~sortingtemplatename="#1"\blx@nl
~~~~~~~~~~~~~~~~sortingnamekeytemplatename="#2"\blx@nl
~~~~~~~~~~~~~~~~labelprefix="#3"\blx@nl
~~~~~~~~~~~~~~~~uniquenametemplatename="#4"\blx@nl
~~~~~~~~~~~~~~~~labelalphanametemplatename="#5"}
\xdef\blx@xml@dlist#1#2#3#4#5{%
~~<bcf:datalist section="#3"\blx@nl
~~~~~~~~~~~~~~~~name="#1"\blx@nl
~~~~~~~~~~~~~~~~type="#2"\blx@nl
#4>\blx@nl
#5%
~~</bcf:datalist>\blx@nl}
\xdef\blx@xml@dlistfilterorbegin{%
~~~~<bcf:filteror>\blx@nl}
\xdef\blx@xml@dlistfilterorend{%
~~~~</bcf:filteror>\blx@nl}
\xdef\blx@xml@dlistfilter#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{sortingtemplatename}{\blx@sorting}%
\blx@xml@toggle{sortsets}%
\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@lantemplatespecs
% 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
% extradate specification
\eappto\blx@tempa{%
\blx@xml@comment{EXTRADATE}%
\blx@xml@extradate{\csuse{blx@bcf@extradatespec}}}%
% 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 TEMPLATES}}%
\def\do##1{%
\eappto\blx@tempa{%
\blx@xml@uniquenametemplate{##1}{\csuse{blx@uniquenametemplate@##1}}}}%
\dolistloop\blx@untemplatespecs
% sortingnamekeytemplate
\eappto\blx@tempa{\blx@xml@comment{SORTING NAME KEY TEMPLATES}}%
\def\do##1{%
\eappto\blx@tempa{%
\blx@xml@sortingnamekeytemplate{##1}{\csuse{blx@sortingnamekeytemplate@##1}}}}%
\dolistloop\blx@sortingnamekeytemplates
% presort/sorting excludes/sorting includes
\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@bcf@presort
\blx@bcf@exclude
\blx@bcf@include}%
% 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{%
\def\do##1{%
\csxappto{blx@sortingtemplates}{%
\blx@xml@sortingtemplate{##1}
{\ifcsdef{blx@sortdef@locale@##1}{ locale="\csuse{blx@sortdef@locale@##1}"}{}}
{\csuse{blx@sortingtemplate@##1}}}}%
\dolistloop\blx@sortingtemplatenames
\blx@auxwrite\blx@bcfout{}{%
\blx@xml@endsection\blx@nl
\blx@xml@comment{SORTING TEMPLATES}%
\csuse{blx@sortingtemplates}%
\blx@xml@comment{DATALISTS}%
\csuse{blx@dlists}%
\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%
\xappto\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}{entrynocite}[true]{% true|false
\ifstrequal{#1}{true}
{\appto\blx@tempf{ map\string_entry\string_nocite="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"}}
% [<specname>]{<spec>}
\newrobustcmd*{\DeclareLabelalphaNameTemplate}[2][]{%
\begingroup
\ifblank{#1}
{\def\blx@lantname{global}}% default
{\def\blx@lantname{#1}}%
\let\namepart\blx@lantem@namepart
\let\blx@tempa\@empty
\blx@tempcnta\z@
#2%
\global\cslet{blx@labelalphanametemplate@\blx@lantname}\blx@tempa
\xifinlist\blx@lantname\blx@lantemplatespecs
{}
{\listxadd\blx@lantemplatespecs\blx@lantname}%
\endgroup}
\@onlypreamble\DeclareLabelalphaNameTemplate
\blx@collectopts{xml}{blx@globalopts}{labelalphanametemplate}% for passing to the .bcf
\DeclareEntryOption[string]{labelalphanametemplatename}{%
\def\blx@refcontext@labelalphanametemplatename{#1}}
\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}}}
\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@dlistfilterorbegin}%
#1%
\eappto\blx@tempa{\blx@xml@dlistfilterorend}}
\newcommand*{\blx@biblistfilter}[1][2]{%
\let\blx@tempc\@empty
\let\blx@tempd\@empty
\setkeys{blx@biblistfilter@filter}{#1}%
\eappto\blx@tempa{%
\blx@xml@dlistfilter{\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
\define@key{blx@biblist2}{biblistfilter}{\blx@key@biblistfilter{#1}}
\define@key{blx@biblist1}{biblistfilter}{}
\def\blx@key@biblistfilter#1{%
\ifcsundef{blx@biblistfilters@#1}
{\blx@error
{BiblistFilter '#1' not found}
{The BiblistFilter '#1' could not be found.\MessageBreak
Use '\string\DeclareBiblistFilter' to define it}}
{\def\blx@thebiblistfilter{#1}}}
% [<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}}}
% [<specname>]{<spec>}
\newrobustcmd*{\DeclareUniquenameTemplate}[2][]{%
\begingroup
\ifblank{#1}
{\def\blx@untname{global}}% default
{\def\blx@untname{#1}}%
\let\namepart\blx@untemp@namepart
\let\blx@tempa\@empty
\blx@tempcnta\z@
#2%
\global\cslet{blx@uniquenametemplate@\blx@untname}\blx@tempa
\xifinlist\blx@untname\blx@untemplatespecs
{}
{\listxadd\blx@untemplatespecs\blx@untname}%
\endgroup}
\@onlypreamble\DeclareUniquenameTemplate
\blx@collectopts{xml}{blx@globalopts}{uniquenametemplate}% for passing to the .bcf
\DeclareEntryOption[string]{uniquenametemplatename}{%
\def\blx@refcontext@uniquenametemplatename{#1}}
\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"}}
{}}
\define@key{blx@untemp@namepart}{disambiguation}{% disambiguation option for namepart none|inits|full|fullonly
\appto\blx@tempc{ disambiguation="#1"}}
% [<templatename>]{<template>}
\newrobustcmd*{\DeclareSortingNamekeyTemplate}[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@sortingnamekeytemplate@\blx@snkname}\blx@tempa
\xifinlist\blx@snkname\blx@sortingnamekeytemplates
{}
{\listxadd\blx@sortingnamekeytemplates\blx@snkname}%
\endgroup}
\@onlypreamble\DeclareSortingNamekeyTemplate
\blx@collectopts{xml}{blx@globalopts}{sortingnamekeytemplate}% for passing to the .bcf
\DeclareEntryOption[string]{sortingnamekeytemplatename}{%
\def\blx@refcontext@sortingnamekeytemplatename{#1}}
% User-mode macro for checking sorting name template options
\def\ifuniquenametemplatename#1{%
\expandafter\ifstrequal\expandafter{\blx@refcontext@uniquenametemplatename}{#1}}
\def\iflabelalphanametemplatename#1{%
\expandafter\ifstrequal\expandafter{\blx@refcontext@labelalphanametemplatename}{#1}}
\def\ifsortingnamekeytemplatename#1{%
\expandafter\ifstrequal\expandafter{\blx@refcontext@sortingnamekeytemplatename}{#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"}}}
% [options]{<templatename>}{<template>}
\newrobustcmd*{\DeclareSortingTemplate}[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@sortingtemplate@#2}\blx@tempa
\endgroup}
\@onlypreamble\DeclareSortingTemplate
\blx@collectopts{xml}{blx@globalopts}{sortingtemplate}% 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}}}
% {<field,field,...>}
\newrobustcmd*{\DeclareExtradate}[1]{%
\begingroup
\let\blx@tempa\@empty
\let\scope\blx@extradate@scope
#1%
\global\let\blx@bcf@extradatespec\blx@tempa
\endgroup}
\@onlypreamble\DeclareExtradate
\blx@collectopts{xml}{blx@globalopts}{extradatespec}% for passing to the .bcf
\newrobustcmd*{\blx@extradate@scope}[1]{%
\let\blx@tempb\@empty
\let\field\blx@ordereded@field
#1%
\csxappto{blx@tempa}{%
\noexpand\blx@xml@extradatescope{\blx@tempb}}}
\newcommand*{\blx@ordereded@field}[1]{%
\advance\blx@tempcnta\@ne
\csxappto{blx@tempb}{%
\noexpand\blx@xml@edordered{\the\blx@tempcnta}{#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*{\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}}
\newtoggle{blx@noerroretextools}
\define@key{blx@opt@ldt}{noerroretextools}[true]{%
\settoggle{blx@noerroretextools}{#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}
% global "sorting" option becomes "sortingtemplatename" in the .bcf and so
% don't use \DeclareBibliographyOption. This is a legacy naming issue
% unlikely to be corrected as "sorting" is an obvious name for biblatex users
% "sorting" is used in the .bcf for the actual sorting template definitions and is
% an XML format option
\define@key{blx@opt@pre}{sorting}{%
\def\blx@sorting{#1}%
\def\blx@refcontext@sortingtemplatename{#1}}
\blx@collectopts{string}{blx@globalopts}{sortingtemplatename}% for passing to the .bcf
\AtEndPreamble{%
\ifcsdef{blx@sortingtemplate@\blx@sorting}
{}
{\blx@err@invopt{sorting=\blx@sorting}{}%
\def\blx@sorting{nty}%
\def\blx@refcontext@sortingtemplatename{nty}}%
\listxadd\blx@sortingtemplatenames\blx@sorting
\def\blx@refcontext@sortingnamekeytemplatename{global}%
\let\blx@refcontext@labelprefix\@empty
\def\blx@refcontext@uniquenametemplatename{global}%
\def\blx@refcontext@labelalphanametemplatename{global}%
\xdef\blx@refcontext@context{\blx@refcontext@sortingtemplatename/\blx@refcontext@sortingnamekeytemplatename/\blx@refcontext@labelprefix/\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}%
\listxadd\blx@refcontexts\blx@refcontext@context}
\DeclareBibliographyOption[boolean]{sortcase}[true]{%
\settoggle{blx@sortcase}{#1}}
\DeclareBibliographyOption[boolean]{sortupper}[true]{%
\settoggle{blx@sortupper}{#1}}
\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}
{}}
\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]{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]{sortsets}[true]{%
\settoggle{blx@sortsets}{#1}}
\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\undef\blx@mkhyperref
\global\undef\blx@mknohyperref
\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\undef\blx@mkhyperref
\global\undef\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
extradate 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.\MessageBreak
Use 'iso' instead}%
\def\blx@dateformat@labeldate{iso}%
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
{\ifstrequal{#1}{edtf}
{\blx@warning@noline{%
'edtf' date format specifier is deprecated.\MessageBreak
Use 'iso' instead}%
\def\blx@dateformat@labeldate{iso}%
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
{\def\blx@dateformat@labeldate{#1}}}%
\ifstrequal{#1}{ymd}
{\renewrobustcmd*{\bibdaterangesep}{\slash}%
\renewrobustcmd*{\bibtimerangesep}{\slash}%
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
{}%
\ifstrequal{#1}{iso}% 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]{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{%LEGACY(<3.9)
\blx@warning@noline{%
'\string\datecircaprintedtf' is deprecated.
Please use '\string\datecircaprintiso'}%
\datecircaprintiso}%
\protected\def\enddatecircaprintedtf{%LEGACY(<3.9)
\blx@warning@noline{%
'\string\enddatecircaprintedtf' is deprecated.
Please use '\string\enddatecircaprintiso'}%
\enddatecircaprintiso}%
\protected\def\datecircaprintiso{%
\ifdatecirca{\textasciitilde}{}}%
\protected\def\enddatecircaprintiso{%
\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.\MessageBreak
Use 'iso' instead}%
\csdef{blx@dateformat@#1date}{iso}}
{\ifstrequal{##1}{edtf}
{\blx@warning@noline{'edtf' date format specifier is deprecated.\MessageBreak
Use 'iso' instead}%
\csdef{blx@dateformat@#1date}{iso}}
{\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 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]{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[boolean]{locallabelwidth}[true]{%
\blx@key@locallabelwidth{#1}}
%{<switch>}{<patch>}{<pre>}{<post>}
\def\blx@patchsection@switch#1#2#3#4{%
\AtEndPreamble{%
#3%
\ifcase#1
\or % 1: part
\blx@refpatch@part{#2}%
\or % 2: chapter
\blx@refpatch@chapter{#2}%
\or % 3: section
\blx@refpatch@sect{section}{#2}{1}%
\or % 4: subsection
\blx@refpatch@sect{subsection}{#2}{2}%
\or % 5: chapter+ = part, chapter
\blx@refpatch@part{#2}%
\blx@refpatch@chapter{#2}%
\or % 6: section+ = part, chapter, section
\blx@refpatch@part{#2}%
\ifundef\chapter
{}
{\blx@refpatch@chapter{#2}}%
\blx@refpatch@sect{section}{#2}{1}%
\or % 7: subsection+ = part, chapter, section, subsection
\blx@refpatch@part{#2}%
\ifundef\chapter
{}
{\blx@refpatch@chapter{#2}}%
\blx@refpatch@sect{section}{#2}{1}%
\blx@refpatch@sect{subsection}{#2}{2}%
\fi
#4%
}%
}
\DeclareBibliographyOption[string]{refsection}{%
\ifcsdef{blx@opt@refsection@#1}
{\letcs\blx@refsecreset@level{blx@opt@refsection@#1}}
{\blx@err@invopt{refsection=#1}{}}}
\csdef{blx@opt@refsection@none}{0}
\csdef{blx@opt@refsection@part}{1}
\csdef{blx@opt@refsection@chapter}{2}
\csdef{blx@opt@refsection@section}{3}
\csdef{blx@opt@refsection@subsection}{4}
\csdef{blx@opt@refsection@chapter+}{5}
\csdef{blx@opt@refsection@section+}{6}
\csdef{blx@opt@refsection@subsection+}{7}
\blx@patchsection@switch{\blx@refsecreset@level}{\newrefsection}{}{}
\DeclareBibliographyOption[string]{refsegment}{%
\ifcsdef{blx@opt@refsegment@#1}
{\letcs\blx@refsegreset@level{blx@opt@refsegment@#1}}
{\blx@err@invopt{refsegment=#1}{}}}
\csdef{blx@opt@refsegment@none}{0}
\csdef{blx@opt@refsegment@part}{1}
\csdef{blx@opt@refsegment@chapter}{2}
\csdef{blx@opt@refsegment@section}{3}
\csdef{blx@opt@refsegment@subsection}{4}
\csdef{blx@opt@refsegment@chapter+}{5}
\csdef{blx@opt@refsegment@section+}{6}
\csdef{blx@opt@refsegment@subsection+}{7}
\blx@patchsection@switch{\blx@refsegreset@level}
{\newrefsegment}
{\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}}}
{}}
{}
\DeclareBibliographyOption[string]{citereset}{%
\ifcsdef{blx@opt@citereset@#1}
{\letcs\blx@citereset@level{blx@opt@citereset@#1}}
{\blx@err@invopt{citereset=#1}{}}}
\csdef{blx@opt@citereset@none}{0}
\csdef{blx@opt@citereset@part}{1}
\csdef{blx@opt@citereset@chapter}{2}
\csdef{blx@opt@citereset@section}{3}
\csdef{blx@opt@citereset@subsection}{4}
\csdef{blx@opt@citereset@chapter+}{5}
\csdef{blx@opt@citereset@section+}{6}
\csdef{blx@opt@citereset@subsection+}{7}
\blx@patchsection@switch{\blx@citereset@level}{\citereset\blx@inf@creset}{}{}
\DeclareBibliographyOption[boolean]{bibwarn}[true]{%
\ifstrequal{#1}{true}
{\def\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]{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,locallabelwidth=false}
% Load Unicode enhancements (only for LuaTeX and XeTeX)
\ifboolexpr{
not test {\ifundef\XeTeXrevision}
or
not test {\ifundef\luatexversion}}
{\blx@inputonce{blx-unicode.def}{enhanced support for Unicode engines}{}{}{}{}}
{}
% 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 requested
\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}{iso}
{\StrCut{#1}{date}\blx@datetype\blx@tempnull
\ifdefstring\blx@dateera{astronomical}{}
{\blx@warn@conflopt{%
'#1=iso' requires 'dateera=astronomical'.\MessageBreak
Setting 'dateera=astrononmical'}%
\setkeys{blx@opt@pre}{dateera=astronomical}}%
\ifcsstring{blx@timeformat@\blx@datetype time}{24h}%
{}
{\blx@warn@conflopt{%
'#1=iso' 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=iso' requires 'julian=false'.\MessageBreak
Setting 'julian=false'}%
\setkeys{blx@opt@pre}{julian=false}}
{}%
\nottoggle{blx@datezeros}
{\blx@warn@conflopt{%
'#1=iso' requires 'datezeros=true'.\MessageBreak
Setting 'datezeros=true'}%
\setkeys{blx@opt@pre}{datezeros=true}}
{}%
\nottoggle{blx@timezeros}
{\blx@warn@conflopt{%
'#1=iso' requires 'timezeros=true'.\MessageBreak
Setting 'timezeros=true'}%
\setkeys{blx@opt@pre}{timezeros=true}}
{}%
\nottoggle{blx@seconds}
{\blx@warn@conflopt{%
'#1=iso' 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@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