Skip to content

Instantly share code, notes, and snippets.

@moewew
Created July 26, 2020 10:13
Show Gist options
  • Save moewew/457a1d42fb3d779e08dd8b1e29d07302 to your computer and use it in GitHub Desktop.
Save moewew/457a1d42fb3d779e08dd8b1e29d07302 to your computer and use it in GitHub Desktop.
% 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{2020/07/26}
\def\abx@version{3.15DEV-idemtest}
\typeout{******************************************************}
\PackageWarningNoLine{biblatex}{%
This is a drop-in replacement for biblatex.sty\MessageBreak
v3.14\MessageBreak
for https://github.com/plk/biblatex/issues/518\MessageBreak
This file is NOT recommended for production use.\MessageBreak
This files is NOT an accurate representation of\MessageBreak
the current state of the 3.15 dev branch}
\typeout{******************************************************}
\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.7}
% 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{3.1}
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{biblatex}
[\abx@date\space v\abx@version\space programmable bibliographies (PK/MW)]
%% Dependencies
\RequirePackage{pdftexcmds}[2018/01/30]
\RequirePackage{etoolbox}
\RequirePackage{keyval}
\RequirePackage{kvoptions}
\RequirePackage{logreq}
\RequirePackage{ifthen}
\RequirePackage{url}
%\RequirePackage{trace}
\@ifpackagelater{etoolbox}{2010/11/29}
{}
{\PackageError{biblatex}
{Outdated 'etoolbox' package}
{Upgrade to etoolbox v2.1 (2010/11/29) or later.\MessageBreak
I found: '\csuse{ver@etoolbox.sty}'.\MessageBreak
This is a fatal error. I'm aborting now}%
\endinput}
%% Category codes
\def\blx@docatcodes{%
\do\=\do\<\do\>\do\-\do\"\do\'\do\`\do\.%
\do\,\do\;\do\:\do\!\do\?\do\/}
\def\do#1{\catcode\number`#1=\the\catcode`#1\relax}
\edef\blx@catcodes{\blx@docatcodes\do\^\do\~\do\&\do\|}
\let\do\noexpand
\def\blx@saneccodes{%
\catcode`\~=\active
\let\do\@makeother
\blx@docatcodes
\let\do\noexpand}
\blx@saneccodes
\catcode`\&=3
\catcode`\|=3
\catcode`\^=7
\def\blx@nl{^^J}
\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}
%% Early errors and warnings
\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}}
%% Compatibility
% this hook is executed once at the beginning of loading the package
% just a few lines down
% and again later in an \AtEndPreamble hook
\def\blx@packageincompatibility{%
\def\do##1{%
\@ifpackageloaded{##1}
{\ifcsundef{blx@pkgloaded@##1}
{\global\cslet{blx@pkgloaded@##1}\@empty
\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}%
% etextools is special, it gets an option to demote the error to a warning
% remind people to restore \forlistloop
\ifcsdef{blx@noerroretextools}
{\@ifpackageloaded{etextools}
{\ifcsundef{blx@pkgloaded@etextools}
{\global\cslet{blx@pkgloaded@etextools}\@empty
\blx@warning@noline{%
Incompatible package 'etextools' loaded,\MessageBreak
no error is thrown because you defined\MessageBreak
'\string\blx@noerroretextools'.\MessageBreak
'etextools' redefines '\string\forlistloop', you must\MessageBreak
restore the definition from 'etoolbox'\MessageBreak
before you load biblatex}}
{}}
{}}
{\@ifpackageloaded{etextools}
{\ifcsundef{blx@pkgloaded@etextools}
{\global\cslet{blx@pkgloaded@etextools}\@empty
\blx@error
{Incompatible package 'etextools'}
{The 'etextools' package and biblatex are
incompatible.\MessageBreak
If you must load 'etextools' at all costs, define the command%
\MessageBreak '\string\blx@noerroretextools'}}
{}}
{}}}
% Call this right here, almost immediately after loading to give sensible
% errors for incompatibilities that arise at loading-time.
% The macro is called again a second time in \AtEndPreamble when all packages
% should be loaded.
% This still can't catch all cases, \usepackage{biblatex}\usepackage{natbib}
% still gives a weird error.
\blx@packageincompatibility
% this part is only executed now
\@ifpackageloaded{polyglossia}
{\global\cslet{blx@pkgloaded@polyglossia}\@empty}
{}
% this part is deferred to \AtEndPreamble
\def\blx@packageincompatibility@endpreambleonly{%
% people should not be abusing noerroretextools,
% so warn if it is not needed
\ifcsdef{blx@noerroretextools}
{\@ifpackageloaded{etextools}
{}
{\blx@warning@noline{%
You defined '\string\blx@noerroretextools',\MessageBreak
but 'etextools' is not loaded.\MessageBreak
Please do not define '\string\blx@noerroretextools'\MessageBreak
unless you really need it}}}
{}%
% polyglossia pretends to be babel, so the nested structure helps
% to make sure that babel really is babel
\@ifpackageloaded{polyglossia}
{\ifcsundef{blx@pkgloaded@polyglossia}
{\blx@error
{'polyglossia' loaded after biblatex}
{'polyglossia' must be loaded before biblatex}}
{}%
\@ifpackagelater{polyglossia}{2019/10/27}
{}
{\blx@warning@noline
{biblatex works best with 'polyglossia' 1.45\MessageBreak
or above.\MessageBreak
Please update 'polyglossia' to v1.45 (2019/10/27)\MessageBreak
or later.\MessageBreak
Variant detection will not work properly with\MessageBreak
older versions}}}
{\@ifpackageloaded{babel}
{\@ifpackagelater{babel}{2016/04/23}
{}
{\blx@error
{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}}
{}}}
\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{%
\blx@packageincompatibility
\blx@packageincompatibility@endpreambleonly
\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 ...
{\def\do#1{%
\patchcmd#1
{\@makefntext}
{\toggletrue{blx@footnote}\@makefntext}
{\togglefalse{blx@tempa}}
{}}%
\docsvlist{\@footnotetext,% ams classes standard
\H@@footnotetext}}% hyperref
{}%
\@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}%
\newcommand*{\blx@initoquote}{\initoquote}%
\newcommand*{\blx@textooquote}{\textooquote}%
\newcommand*{\blx@textcoquote}{\textcoquote}%
\newcommand*{\blx@initiquote}{\initiquote}%
\newcommand*{\blx@textoiquote}{\textoiquote}%
\newcommand*{\blx@textciquote}{\textciquote}%
\newcommand*{\blx@enquote}{\enquote}}
{\@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*{\blx@initoquote}{\@quotelevel\@ne}%
\newrobustcmd*{\blx@initiquote}{\@quotelevel\tw@}%
\newrobustcmd*{\blx@textooquote}{``}%
\newrobustcmd*{\blx@textcoquote}{''}%
\newrobustcmd*{\blx@textoiquote}{`\relax}% block ligs
\newrobustcmd*{\blx@textciquote}{'\relax}% block ligs
\newrobustcmd*{\blx@enquote}
{\@ifstar\blx@enquote@iii\blx@enquote@i}%
\def\blx@enquote@i{%
\ifnum\@quotelevel>\z@
\expandafter\blx@enquote@iii
\else
\expandafter\blx@enquote@ii
\fi}%
\long\def\blx@enquote@ii#1{%
\begingroup\blx@initoquote
\blx@textooquote#1\blx@textcoquote
\endgroup}%
\long\def\blx@enquote@iii#1{%
\begingroup\blx@initiquote
\blx@textoiquote#1\blx@textciquote
\endgroup}%
\appto\blx@setsfcodes{%
\sfcode`\`=\z@
\sfcode`\'=\z@}}%
\let\do\noexpand}
% no longer needed, keep for backwards compatibility
\let\blx@langstrings\relax
\def\blx@ifhyphenationundef#1{\ifcsundef{l@#1}}
% polyglossia makes heavy use of \AtBeginDocument, so we need to use
% it too to get in later than polyglossia's setup.
% This means that load-order is relevant, boo ...
\AtBeginDocument{%
\@ifpackageloaded{polyglossia}
{\ifundef\xpg@ifdefined
{}
{\def\blx@ifhyphenationundef#1#2#3{\xpg@ifdefined{#1}{#3}{#2}}}%
% This is required for languages which are never explicitly selected
% \xpg@bloaded is not defined in polyglossia < v1.45
\ifundef\xpg@bloaded
{\ifundef\xpg@loaded
{\let\xpg@bloaded\@empty}
{\let\xpg@bloaded\xpg@loaded}}
{}%
\global\let\blx@maplang\blx@maplang@polyglossia
\def\do#1{\blx@langsetup{#1}}%
\expandafter\docsvlist\expandafter{\xpg@bloaded}%
\ifboolexpr{
not togl {blx@autolangbib}
and
not togl {blx@autolangcite}}
{\blx@mknoautolang}
{\blx@mkautolangpoly}%
}
{\global\let\blx@maplang\blx@maplang@babel
\@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 togl {blx@autolangbib}
and
not togl {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
% pick up the main document language as sortlocale if
% auto-detection is desired
\ifdefstring\blx@sortlocale{auto}
{\ifdef\blx@main@language% babel or polyglossia is loaded
{\edef\blx@sortlocale{\blx@main@language}}
{\def\blx@sortlocale{english}}}
{}%
}
\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
\providecommand{\@gobblefive}[5]{}
\providecommand{\@gobblethree}[3]{}
% etoolbox helpers
% \ifinlist{<item>}{<list>} is not a good idea
% for printable stuff according to the etoolbox docs
% for \ifinlist (p. 31)
\newrobustcmd{\blx@ifprintableinlist}[2]{%
\begingroup
\def\blx@tempa{\endgroup
\@secondoftwo}%
\renewcommand*{\do}[1]{%
\ifstrequal{##1}{#1}
{\def\blx@tempa{\endgroup
\@firstoftwo}%
\listbreak}
{}}%
\dolistloop{#2}%
\expandafter\blx@tempa}
\newrobustcmd{\blx@ifprintableinlistcs}[2]{%
\expandafter\blx@ifprintableinlistcs@i\csname #2\endcsname{#1}}
\long\def\blx@ifprintableinlistcs@i#1#2{\blx@ifprintableinlist{#2}{#1}}
\ifundef\pdf@mdfivesum
{\let\blx@mdfivesum\@firstofone
\blx@warning@noline{Command '\string\pdf@mdfivesum' undefined.\MessageBreak
'labelprefix' may not be able to accept all input}}
{\let\blx@mdfivesum\pdf@mdfivesum}
% xstring replacements
% reverse a given string
% idea by egreg (https://tex.stackexchange.com/users/4427/egreg)
% from https://tex.stackexchange.com/q/36034/
% relicensed under LPPL according to
% https://tex.meta.stackexchange.com/a/3333/
\def\blx@revstr#1{%
\ifblank{#1}
{}
{\blx@revstr@l #1\blx@revstr@b@i\blx@revstr@b@ii}}
\def\blx@revstr@l#1#2\blx@revstr@b@i#3\blx@revstr@b@ii{%
\ifblank{#2}
{#1#3}
{\blx@revstr@l#2\blx@revstr@b@i#1#3\blx@revstr@b@ii}}
% these tests are inspired by Stephan v. Bechtolsheim's TUGboat article
% https://www.tug.org/TUGboat/tb09-1/tb20bechtolsheim.pdf
% but we need to test for start and end and not for generic substring
% start is easy, delimited arguments help there
\protected\def\blx@ifstrstartswith#1#2{%
\def\blx@ifstrstartswith@i ##1#2##2&{%
\ifblank{##1}}%
\blx@ifstrstartswith@i #1#2&}
% end is harder, so we reverse everything and apply the start test
\protected\def\blx@ifstrendswith#1#2{%
\begingroup
\edef\blx@tempa{\endgroup
\noexpand\blx@ifstrstartswith{\blx@revstr{#1}}{\blx@revstr{#2}}}%
\blx@tempa}
% not expandable, so write the result to the macro given in #3
% {<string>}{<strip>}{<result>}
% <result> will contain the bit of <string>
% after the first occurrence of <strip>
\protected\def\blx@stripfromstartinto#1#2#3{%
\def\blx@stripfromstart@i ##1#2##2&{%
\def#3{##2}}%
\blx@stripfromstart@i #1&}
% {<string>}{<strip>}{<result>}
% <result> will contain the bit of <string>
% before the last occurence of <strip>
\protected\def\blx@stripfromendinto#1#2#3{%
\begingroup
\edef\blx@tempa{\endgroup
\noexpand\blx@stripfromstartinto{\blx@revstr{#1}}{\blx@revstr{#2}}}%
\blx@tempa{#3}%
\edef#3{\noexpand\blx@revstr{#3}}%
\edef#3{#3}}
%% Allocation
% 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{maxcitecounter}
\def\themaxcitecounter{\the\c@maxcitecounter}
\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{maxextraname}
\def\themaxextraname{\the\c@maxextraname}
\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
\newcount\blx@entrysetcounter
\def\blx@uniquename{false}
\def\blx@uniquelist{false}
\def\blx@maxbibnames{0}
\def\blx@minbibnames{0}
\def\blx@maxcitenames{0}
\def\blx@mincitenames{0}
\def\blx@maxsortnames{0}
\def\blx@minsortnames{0}
\def\blx@maxalphanames{0}
\def\blx@minalphanames{0}
\def\blx@maxitems{0}
\def\blx@minitems{0}
\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@sortsets}
\newtoggle{blx@crossrefsource}
\newtoggle{blx@xrefsource}
\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@volcite}
\newtoggle{blx@bibliography}
\newtoggle{blx@citeindex}
\newtoggle{blx@bibindex}
\newtoggle{blx@localnumber}
\newtoggle{blx@refcontext}
\newtoggle{blx@noroman}
\newtoggle{blx@nohashothers}
\newtoggle{blx@nosortothers}
\newtoggle{blx@singletitle}
\newtoggle{blx@uniquebaretitle}
\newtoggle{blx@uniqueprimaryauthor}
\newtoggle{blx@uniquetitle}
\newtoggle{blx@uniquework}
\newcommand*{\blx@xifstrequal}[2]{%
\begingroup
\edef\blx@tempa{%
\endgroup
\noexpand\ifstrequal{#1}{#2}}%
\blx@tempa}
% 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@nocites\@empty
\global\let\blx@directcites\@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@legacywarning@field@#1}
{\blx@warning@noline{Field '#1' is deprecated. #2}}
{}%
\global\cslet{abx@legacywarning@field@#1}\@empty}}%
\newrobustcmd*{\DeprecateList}[2]{%
\csdef{abx@list@#1}{%
\ifcsundef{abx@legacywarning@list@#1}
{\blx@warning@noline{List '#1' is deprecated. #2}}
{}%
\global\cslet{abx@legacywarning@list@#1}\@empty}}
\newrobustcmd*{\DeprecateName}[2]{%
\csdef{abx@name@#1}{%
\ifcsundef{abx@legacywarning@name@#1}
{\blx@warning@noline{Name '#1' is deprecated. #2}}
{}%
\global\cslet{abx@legacywarning@name@#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@legacywarning@field@#1}
{\blx@warning@noline{Field '#1' is deprecated.\MessageBreak
Please use '#2' instead.\MessageBreak
Using '#2' now}}
{}%
\global\cslet{abx@legacywarning@field@#1}\@empty}}}}
\newrobustcmd*{\DeprecateListWithReplacement}[2]{%
\appto\blx@aliasfields{%
\ifcsundef{abx@list@#2}
{}
{\csdef{abx@list@#1}{%
\csuse{abx@list@#2}%
\ifcsundef{abx@legacywarning@list@#1}
{\blx@warning@noline{List '#1' is deprecated.\MessageBreak
Please use '#2' instead.\MessageBreak
Using '#2' now}}
{}%
\global\cslet{abx@legacywarning@list@#1}\@empty}}}}
\newrobustcmd*{\DeprecateNameWithReplacement}[2]{%
\appto\blx@aliasfields{%
\ifcsundef{abx@name@#2}
{}
{\csdef{abx@name@#1}{%
\csuse{abx@name@#2}%
\ifcsundef{abx@legacywarning@name@#1}
{\blx@warning@noline{Name '#1' is deprecated.\MessageBreak
Please use '#2' instead.\MessageBreak
Using '#2' now}}
{}%
\global\cslet{abx@legacywarning@name@#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@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}
)
)
}}
%% More user feedback
\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#2{%
\blx@error
{Option '#1' already defined}
{The option '#1' is already defined in scope '#2'}}
\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}
% Idea from Peter Wilson's hyphenat package
% https://ctan.org/pkg/hyphenat
% also https://texfaq.org/FAQ-hyphoff
\newlanguage\blx@langwohyphens
\providerobustcmd*{\nohyphenation}{%
\language\blx@langwohyphens}
\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 for '\abx@field@entrytype' 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}}
\def\ifbibmacroundef{\blx@imc@ifbibmacroundef}
% {<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}}
{}}
\def\blx@imc@thefirstlistitem#1{%
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\blx@imc@thefirstlistitem@grab
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
{\csuse{abx@list@#1}}}
\def\blx@imc@thefirstlistitem@grab#1{%
\blx@imc@thefirstlistitem@grab@i
#1{}{}%
\blx@imc@thefirstlistitem@grab@i@end}
\def\blx@imc@thefirstlistitem@grab@i#1#2\blx@imc@thefirstlistitem@grab@i@end{#1}
% {<command>}{<field>}
% needs 7 levels of expansion, i.e. 2^7-1=127 '\expandafter's
\def\blx@imc@usefirstlistitem#1#2{%
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter
#1%
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter
{\blx@imc@thefirstlistitem{#2}}}
\def\blx@imc@strfirstlistitem#1{%
\ifcsdef{abx@list@#1}
{\blx@imc@usefirstlistitem{\detokenize}{#1}}
{}}
% {<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{ibid}
{\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{idem}
{\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{opcit}
{\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{loccit}
{\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}}}
% {<tracker>}{<true>}{<false>}
\def\blx@ifmpfncheck#1{%
\expandafter\ifnum\expandafter\numexpr\expandafter
\value\expandafter\@mpfn\expandafter-\csname blx@lastmpfn@#1\endcsname<\tw@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\def\blx@mpfnsave#1{%
\expandafter\xdef\csname blx@lastmpfn@#1\endcsname
{\the\value\@mpfn}}
\def\blx@mpfnreset#1{%
\expandafter\global\expandafter\let\csname blx@lastmpfn@#1\endcsname
\z@}
\blx@mpfnreset{ibid}
\blx@mpfnreset{idem}
\blx@mpfnreset{loccit}
\blx@mpfnreset{opcit}
% {<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\blx@imc@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[{\blx@range@aux@i#1}{#1[\@firstofone][\@firstofone]}}
\def\blx@range@aux@i#1[#2]{%
\@ifnextchar[{#1[#2]}{#1[#2][\@firstofone]}}
\def\blx@normrange@i[#1][#2]#3{%
\let\blx@tempa\@empty
\protected\def\blx@range@out@value{\appto\blx@tempa}%
\def\blx@range@out@item@process{#2}%
\let\blx@range@out@delim\blx@range@out@value
\let\blx@range@split\blx@genrange@split
\let\blx@range@process\blx@normrange@process
\blx@range@chunk{#3}%
\begingroup
\edef\blx@tempa{\endgroup
\unexpanded{#1}{\expandonce\blx@tempa}}%
\blx@tempa
\endgroup}
\def\blx@normrange@ii[#1][#2]#3{%
\protected\def\blx@range@out@value{#1}%
\def\blx@range@out@item@process{#2}%
\let\blx@range@out@delim\@firstofone
\let\blx@range@split\blx@genrange@split
\let\blx@range@process\blx@normrange@process
\blx@range@chunk{#3}%
\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@genrange@split#1{%
\edef\blx@normrange@abort{%
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\unexpanded{#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}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\unexpanded{#1}}%
\noexpand\bibrangedash}}%
\blx@tempc}
{\ifblank{#1}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{%
\unexpanded{#2}}}}%
\blx@tempc}
{\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}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{%
\unexpanded{#2}}}}%
\blx@tempc}
{\blx@range@process{#1}{#2}}}}}
\def\blx@normrange@hyphen@i#1-#2&{%
\ifblank{#1#2}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\expandonce\blx@tempb}%
\noexpand\bibrangedash}}%
\blx@tempc}
{\notblank{#1}
{\ifdefempty\blx@tempb
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{%
\unexpanded{#1}}}}%
\blx@tempc}
{\expandafter\blx@range@process
\expandafter{\blx@tempb}{#1}}}
{\blx@normrange@hyphen@i#2&}}}
\def\blx@normrange@process#1#2{%
\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\unexpanded{#1}}%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{\unexpanded{#2}}}}%
\blx@tempc}
% <*>[<postpro>]{<string>}
\newrobustcmd*{\mkcomprange}{%
\begingroup
\@ifstar
{\blx@range@aux\blx@comprange@ii}
{\blx@range@aux\blx@comprange@i}}
\def\blx@comprange@i[#1][#2]#3{%
\let\blx@tempa\@empty
\protected\def\blx@range@out@value{\appto\blx@tempa}%
\def\blx@range@out@item@process{#2}%
\let\blx@range@out@delim\blx@range@out@value
\let\blx@range@split\blx@genrange@split
\let\blx@range@process\blx@comprange@check
\blx@range@chunk{#3}%
\begingroup
\edef\blx@tempa{\endgroup
\unexpanded{#1}{\expandonce\blx@tempa}}%
\blx@tempa
\endgroup}
\def\blx@comprange@ii[#1][#2]#3{%
\protected\def\blx@range@out@value{#1}%
\def\blx@range@out@item@process{#2}%
\let\blx@range@out@delim\@firstofone
\let\blx@range@split\blx@genrange@split
\let\blx@range@process\blx@comprange@check
\blx@range@chunk{#3}%
\endgroup}
\def\blx@comprange@check#1#2{%
\blx@imc@ifinteger{#1}
{\blx@imc@ifinteger{#2}
{\@firstoftwo}
{\@secondoftwo}}
{\@secondoftwo}
{\blx@comprange@comp{#1}{#2}}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\unexpanded{#1}}%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{\unexpanded{#2}}}}%
\blx@tempc}}
\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
\begingroup
\edef\blx@tempb{\endgroup
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\blx@tempb}%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{\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@range@aux\blx@firstpage@ii}
{\blx@range@aux\blx@firstpage@i}}
\def\blx@firstpage@i[#1][#2]#3{%
\let\blx@tempa\@empty
\protected\def\blx@range@out@value{\appto\blx@tempa}%
\def\blx@range@out@item@process{#2}%
\let\blx@range@out@delim\blx@range@out@value
\let\blx@range@split\blx@firstpage@split
\blx@range@chunk{#3}%
\begingroup
\edef\blx@tempa{\endgroup
\unexpanded{#1}{\expandonce\blx@tempa}}%
\blx@tempa
\endgroup}
\def\blx@firstpage@ii[#1][#2]#3{%
\protected\def\blx@range@out@value{#1}%
\def\blx@range@out@item@process{#2}%
\let\blx@range@out@delim\@firstofone
\let\blx@range@split\blx@firstpage@split
\blx@range@chunk{#3}%
\endgroup}
% Unicode en-dashes are supported in blx-unicode.def
\def\blx@firstpage@split#1{%
\edef\blx@firstpage@abort{%
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\unexpanded{#1}}}}%
\blx@firstpage@range#1\bibrangedash\bibrangedash&}
\def\blx@firstpage@range#1\bibrangedash#2\bibrangedash#3&{%
\ifblank{#3}
{\blx@firstpage@hyphen#1--&}
{\ifblank{#1}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{\unexpanded{#2}}}}%
\blx@tempc}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\unexpanded{#1}}}}%
\blx@tempc}}}
\def\blx@firstpage@hyphen#1-#2-#3&{%
\ifblank{#3}
{\blx@firstpage@abort}
{\ifblank{#1}
{\ifblank{#2}
{\blx@firstpage@hyphen@i#3&}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{%
\unexpanded{#2}}}}%
\blx@tempc}}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\expandonce\blx@range@out@item@process{\unexpanded{#1}}}}%
\blx@tempc}}}
\def\blx@firstpage@hyphen@i#1-#2&{%
\ifblank{#1}
{\ifblank{#2}
{\blx@firstpage@abort}
{\blx@firstpage@hyphen@i#2&}}
{\begingroup
\edef\blx@tempc{\endgroup
\blx@range@out@value{%
\noexpand\bibrangedash
\expandonce\blx@range@out@item@process{%
\unexpanded{#1}}}}%
\blx@tempc}}
\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}}
\def\blx@cleardelim#1{%
\ifcsvoid{blx@declaredelimcontexts@#1}
{}
{\def\do##1{\csundef{blx@printdelim@##1@#1}}%
\dolistcsloop{blx@declaredelimcontexts@#1}}%
\cslet{blx@declaredelimcontexts@#1}\@empty}
\newrobustcmd*{\blx@declaredelimclear}[3][]{%
\blx@cleardelim{#2}%
\ifblank{#1}
{\blx@declaredelim{#2}{#3}}
{\blx@declaredelim[#1]{#2}{#3}}}
\newrobustcmd*{\blx@declaredelim}[3][]{%
\ifblank{#1}
{\blx@declaredelim@i{}{}{#2}{#3}}
{\def\do##1{%
\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}}
% *[<alias context, ...>]{<alias>}[<delim context>]{<delim>}
\newrobustcmd*{\DeclareDelimAlias}{%
\@ifstar
{\blx@declaredelimalias@expl}
{\blx@declaredelimalias@auto}}
\newrobustcmd*{\blx@declaredelimalias@auto}[2]{%
\blx@cleardelim{#1}%
\blx@declaredelimalias@def{}{#1}{}{#2}%
\ifcsvoid{blx@declaredelimcontexts@#2}
{}
{\def\do##1{%
\blx@declaredelimalias@def
{blx@printdelim@##1@}{#1}{blx@printdelim@##1@}{#2}}%
\dolistcsloop{blx@declaredelimcontexts@#2}}}
\def\blx@declaredelimalias@expl{%
\@ifnextchar[%]
{\blx@declaredelimalias@expl@i}
{\blx@declaredelimalias@expl@i[]}}
\def\blx@declaredelimalias@expl@i[#1]#2{%
\@ifnextchar[%]
{\blx@declaredelimalias@expl@iii{#1}{#2}}
{\blx@declaredelimalias@expl@ii{#1}{#2}}}
\def\blx@declaredelimalias@expl@ii#1#2#3{%
\ifblank{#1}
{\blx@declaredelimalias@def{}{#2}{}{#3}}
{\def\do##1{%
\blx@declaredelimalias@def
{blx@printdelim@##1@}{#2}{blx@printdelim@##1@}{#3}}%
\docsvlist{#1}}}
\def\blx@declaredelimalias@expl@iii#1#2[#3]#4{%
\ifblank{#1}
{\ifblank{#3}
{\blx@declaredelimalias@def{}{#2}{}{#4}}
{\blx@declaredelimalias@def{}{#2}{blx@printdelim@#3@}{#4}}}
{\ifblank{#3}
{\def\do##1{%
\blx@declaredelimalias@def
{blx@printdelim@##1@}{#2}{}{#4}}}
{\def\do##1{%
\blx@declaredelimalias@def
{blx@printdelim@##1@}{#2}{blx@printdelim@#3@}{#4}}}%
\docsvlist{#1}}}
\def\blx@declaredelimalias@def#1#2#3#4{%
\ifcsdef{#1#2}
{\blx@inf@delimdeclare{#2}{#1}}
{}%
\ifblank{#1}
{}
{\ifinlistcs{#1}{blx@declaredelimcontexts@#2}
{}
{\listcsadd{blx@declaredelimcontexts@#2}{#1}}}%
\csdef{#1#2}{\ifcsundef{#3#4}{\csuse{#4}}{\csuse{#3#4}}}}
\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]{%
\csdef{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
\delimcontext{bib}%
\csuse{blx@hook@usedriver}%
\csuse{blx@hook@bbxinit}#1%
\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}})}}
\def\blx@imc@ifdateyearsequal#1#2{%
\ifboolexpr{ test {\iffieldsequal{#1year}{#2year}}
and test {\iffieldsequal{#1dateera}{#2dateera}}}}
\blx@regimcs{%
\ifdriver \thefield \strfield \csfield \usefield \thelist \strlist
\thefirstlistitem \usefirstlistitem \strfirstlistitem
\thename \strname
\clearfield \clearlist \clearname \restorefield \restorelist \restorename
\ifcategory \ifkeyword
\ifciteseen \ifciteibid \ifciteidem \ifopcit \ifloccit
\ifcurrentfield \ifcurrentlist \ifcurrentname \ifentrytype
\iffieldequalcs \iffieldequals \iffieldequalstr \iffieldsequal
\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
\ifdateyearsequal
\mkpageprefix \mkpagetotal
\newblock \newunit \setunit \printunit \finentry}
\appto\blx@blxinit{%
\def\ifnatbibmode{\iftoggle{blx@natbib}}%
\def\ifcitation{\iftoggle{blx@citation}}%
\def\ifvolcite{\iftoggle{blx@volcite}}%
\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\ifnocite{\iftoggle{abx@bool@nocite}}%
\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\pnfmt{\printtext[postnote]}%
\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{\pnfmt,\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\blx@main@language
{\xifinlist\blx@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}{}}}
\newrobustcmd*{\DeclareNameWrapperFormat}{%
\@ifstar
{\blx@defformat\blx@defnameformat{nwd}*}
{\blx@defformat\blx@defnameformat{nwd}{}}}
\newrobustcmd*{\DeclareIndexNameWrapperFormat}{%
\@ifstar
{\blx@defformat\blx@defnameformat{nxd}*}
{\blx@defformat\blx@defnameformat{nxd}{}}}
\newrobustcmd*{\DeclareListWrapperFormat}{%
\@ifstar
{\blx@defformat\blx@defplainformat{lwd}*}
{\blx@defformat\blx@defplainformat{lwd}{}}}
\newrobustcmd*{\DeclareIndexListWrapperFormat}{%
\@ifstar
{\blx@defformat\blx@defplainformat{lxd}*}
{\blx@defformat\blx@defplainformat{lxd}{}}}
% {<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*{\savelistwrapperformat}[2][*]{\blx@save{abx@lwd@#1@#2}}
\newrobustcmd*{\savenamewrapperformat}[2][*]{\blx@save{abx@nwd@#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}}
\newrobustcmd*{\restorelistwrapperformat}[2][*]{\blx@restore{abx@lwd@#1@#2}}
\newrobustcmd*{\restorenamewrapperformat}[2][*]{\blx@restore{abx@nwd@#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}}
\newrobustcmd*{\iflistwrapperformatundef}[2][*]{\ifcsundef{abx@lwd@#1@#2}}
\newrobustcmd*{\ifnamewrapperformatundef}[2][*]{\ifcsundef{abx@nwd@#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}}
\newrobustcmd*{\DeclareNameWrapperAlias}{\blx@defalias{nwd}}
\newrobustcmd*{\DeclareIndexNameWrapperAlias}{\blx@defalias{nxd}}
\newrobustcmd*{\DeclareListWrapperAlias}{\blx@defalias{lwd}}
\newrobustcmd*{\DeclareIndexListWrapperAlias}{\blx@defalias{lxd}}
% #1: internal type signature, #2: type text for warning
% #3 #4 #5 #6
% [aliastype]{aliasname}[formattype]{formatname}
\def\blx@deprecateformat#1#2{%
\@ifnextchar[%]
{\blx@deprecateformat@i{#1}{#2}}
{\blx@deprecateformat@i{#1}{#2}[*]}}
\def\blx@deprecateformat@i#1#2[#3]#4{%
\@ifnextchar[%]
{\blx@deprecateformat@ii{#1}{#2}{#3}{#4}}
{\blx@deprecateformat@ii{#1}{#2}{#3}{#4}[*]}}
\def\blx@deprecateformat@ii#1#2#3#4[#5]#6{%
\blx@safe@actives
\afterassignment\blx@rest@actives
\csdef{abx@#1@#3@#4}{%
\ifcsundef{abx@legacywarning@#1@#3@#4}
{\global\cslet{abx@legacywarning@#1@#3@#4}\@empty
\blx@warning@noline{%
#2 '#4' deprecated.\MessageBreak
Please use '#6' instead.\MessageBreak
Using '#6' now}}
{}%
\csname abx@#1@#5@#6\endcsname}}
% [<entrytype>]{<alias>}[<entrytype>]{<name>}
\newrobustcmd*{\DeprecateNameFormatWithReplacement}{%
\blx@deprecateformat{nfd}{Name format}}
\newrobustcmd*{\DeprecateIndexNameFormatWithReplacement}{%
\blx@deprecateformat{nid}{Index name format}}
\newrobustcmd*{\DeprecateListFormatWithReplacement}{%
\blx@deprecateformat{lfd}{List format}}
\newrobustcmd*{\DeprecateIndexListFormatWithReplacement}{%
\blx@deprecateformat{lid}{Index list format}}
\newrobustcmd*{\DeprecateFieldFormatWithReplacement}{%
\blx@deprecateformat{ffd}{Field format}}
\newrobustcmd*{\DeprecateIndexFieldFormatWithReplacement}{%
\blx@deprecateformat{fid}{Index field format}}
\newrobustcmd*{\DeprecateNameWrapperFormatWithReplacement}{%
\blx@deprecateformat{nwd}{Name wrapper format}}
\newrobustcmd*{\DeprecateIndexNameWrapperFormatWithReplacement}{%
\blx@deprecateformat{nxd}{Index name wrapper format}}
\newrobustcmd*{\DeprecateListWrapperFormatWithReplacement}{%
\blx@deprecateformat{lwd}{List wrapper format}}
\newrobustcmd*{\DeprecateIndexListWrapperFormatWithReplacement}{%
\blx@deprecateformat{lxd}{Index list wrapper format}}
% [<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@thewrapperformat{nwd}{#1}{#4}%
\ifdefvoid\blx@thewrapperformat
{\blx@nounit}
{\blx@getformat\blx@theformat{nfd}{#1}{#4}%
\ifdefvoid\blx@theformat
{\blx@nounit}
{\blx@begunit
\blx@namesetup{#2}{#3}{#4}%
\blx@thewrapperformat{\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}}
% Biber-calculated info passed back to biblatex as an option in the .bbl
% unlike stuff defined with \DeclareBiblatexOption and
% \blx@DeclareBackendOption these are not 'real' options
\define@key{blx@opt@namelist}{ul}{\c@uniquelist#1\relax}
\define@key{blx@opt@name}{un}{\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}}}
\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@thewrapperformat{nxd}{#1}{#4}%
\ifdefvoid\blx@thewrapperformat
{}
{\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{%
\begingroup
\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}%
\endgroup}
\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@thewrapperformat{lwd}{#1}{#4}%
\ifdefvoid\blx@thewrapperformat
{\blx@nounit}
{\blx@getformat\blx@theformat{lfd}{#1}{#4}%
\ifdefvoid\blx@theformat
{\blx@nounit}
{\blx@begunit
\blx@listsetup{#2}{#3}{#4}%
\blx@thewrapperformat{\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@thewrapperformat{lxd}{#1}{#4}%
\ifdefvoid\blx@thewrapperformat
{}
{\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
\global\blx@entrysetcounter\@ne
\edef\abx@field@entrysetcount{\the\blx@entrysetcounter}%
\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@setoptions@type\abx@field@entrytype
\blx@setoptions@entry
\global\advance\blx@entrysetcounter\@ne
\edef\abx@field@entrysetcount{\the\blx@entrysetcounter}%
\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{langhungarian}%
\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{fromhungarian}%
\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]{%
\blx@ifhyphenationundef{#1}
{\blx@warn@nohyph{#1}}
{}%
\csgappto{blx@hook@hyph@#1}{\blx@hyphexcept{#1}{#2}}}
\@onlypreamble\DefineHyphenationExceptions
\def\blx@hyphexcept#1#2{%
\blx@ifhyphenationundef{#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.
% blx@file@lbx@simple@#1 only blocks the file being added to the file list
% blx@file@lbx@once@#1 blocks a file from being loaded again by the input-once
% routine
% {<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@simple@#1}
{\listxadd\blx@list@req@stat{#1}%
\@addtofilelist{#1}%
\global\cslet{blx@file@lbx@simple@#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@once@#1}
{\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@simple@#1}
{\listxadd\blx@list@req@stat{#1}%
\@addtofilelist{#1}}
{}}
{\blx@info@noline{... file '#1' not found}#6}%
\global\cslet{blx@file@lbx@once@#1}\@empty
\global\cslet{blx@file@lbx@simple@#1}\@empty}
{#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}%
\blx@maplang{#1}{#1}}
% {<language>}{<lbxfile>}{<message>}
\def\blx@lbxinput@iv#1#2#3{%
\begingroup
\blx@lbx@input@handler{#2.lbx}{#3}
{\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@nounit}
{\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}}}
\newcommand*{\blx@if@printtime}[2]{%
\ifboolexpr{%
togl {blx@#1dateusetime}
and
not test {\iffieldundef{#1#2hour}}}}
\newcommand*{\blx@if@printanytimes}[1]{%
\ifboolexpr{
togl {blx@#1dateusetime}
and
( not test {\iffieldundef{#1hour}}
or not test {\iffieldundef{#1endhour}})}}
% {<datetype>}{'' | end}
\newrobustcmd*{\blx@printtime}[2]{%
\blx@if@printtime{#1}{#2}
{\blx@timepre{#1}{#2}%
\printtext{\bibdatetimesep}%
\printtext[#1time]{%
\csuse{mkbibtime\csuse{blx@timeformat@#1time}}
{#1#2hour}{#1#2minute}{#1#2second}{#1#2timezone}}}
{}}
% {<short|long>}{<datetype>}
\newrobustcmd*{\mkdaterangefull}[2]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\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{#2endseason}
{\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*{\mkdaterangefullextra}[2]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\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{#2endseason}
{\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*{\mkdaterangetrunc}[2]{%
\blx@if@printanytimes{#2}
{\mkdaterangefull{#1}{#2}}
{\mkdaterangetrunc@i{#1}{#2}}}
\newrobustcmd*{\mkdaterangetrunc@i}[2]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\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}
{\ifdateyearsequal{#2}{#2end}
{\iffieldsequal{#2month}{#2endmonth}
{\csuse{mkbibdate#1}{}{}{#2day}}
{\csuse{mkbibdate#1}{}{#2month}{#2day}}}
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
\iffieldsequal{#2dateera}{#2enddateera}{}
{\dateeraprint{#2year}}}}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibseasondate#1}{}{#2season}}
{\csuse{mkbibseasondate#1}{#2year}{#2season}%
\iffieldsequal{#2dateera}{#2enddateera}{}
{\dateeraprint{#2year}}}}%
\dateuncertainprint
\iffieldundef{#2endyear}
{}
{\iffieldequalstr{#2endyear}{}
{\mbox{\bibdaterangesep}}
{\bibdaterangesep
\enddatecircaprint
\iffieldundef{#2endseason}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}%
\enddateuncertainprint
\dateeraprint{#2endyear}}}}}%
\endgroup}
\newrobustcmd*{\mkdaterangetruncextra}[2]{%
\blx@if@printanytimes{#2}
{\mkdaterangefullextra{#1}{#2}}
{\mkdaterangetruncextra@i{#1}{#2}}}
\newrobustcmd*{\mkdaterangetruncextra@i}[2]{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\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}
{\ifdateyearsequal{#2}{#2end}
{\iffieldsequal{#2month}{#2endmonth}
{\csuse{mkbibdate#1}{}{}{#2day}}
{\csuse{mkbibdate#1}{}{#2month}{#2day}}}
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
\iffieldsequal{#2dateera}{#2enddateera}{}
{\dateeraprint{#2year}}}}
{\ifdateyearsequal{#2}{#2end}
{\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{#2endseason}
{\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}%
\ifdateyearsequal{#1}{#1end}
{\blx@imc@clearfield{#1endyear}}
{}%
\mkdaterangefull{short}{#1}}
% {<datetype>}
\newrobustcmd*{\mkdaterangeymd}[1]{%
\begingroup
\blx@metadateinfo{#1}%
\iffieldundef{#1year}
{\blx@nounit}
{\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}
{\blx@nounit}
{\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}%
\ifdateyearsequal{#1}{#1end}
{\blx@imc@clearfield{#1endyear}}
{}%
\mkdaterangefullextra{short}{#1}}
\newrobustcmd*{\mkdaterangeiso}[1]{%
\begingroup
\blx@metadateinfo{#1}%
\def\bibdatetimesep{T}%
\iffieldundef{#1year}
{\blx@nounit}
{\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}
{\blx@nounit}
{\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@xifstrequal{#1}{spring}{21}
{\blx@xifstrequal{#1}{summer}{22}
{\blx@xifstrequal{#1}{autumn}{23}
{\blx@xifstrequal{#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}}}
{}}
% some sane defaults for bibliography extras
% many of these should be redefined in the .lbx files
% all .lbx files should have date and time handling, so the fallback values
% issue a warning to make people aware of the deficiency in their file
% \mkbibordinal should also only be used if it is defined, so it warns as well
% 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@xifstrequal{#1}{Z}{\bibutctimezone}{#1}}
% you should never end up needing the next few definitions
% but it is safer to do something than just swallow the input
\newrobustcmd*{\mkbibdatelong}[3]{%
\blx@warning@noline{%
Using fallback definition for \string\mkbibdatelong.\MessageBreak
The command should be defined in the .lbx file.\MessageBreak
If you see this message, the .lbx file could not be\MessageBreak
loaded, is faulty or does not contain a definition\MessageBreak
for \string\mkbibdatelong
}%
\iffieldundef{#3}
{}
{\mkbibordinal{\thefield{#3}}%
\iffieldundef{#2}{}{\nobreakspace}}%
\iffieldundef{#2}
{}
{\mkbibmonth{\thefield{#2}}%
\iffieldundef{#1}{}{\space}}%
\iffieldbibstring{#1}
{\bibstring{\thefield{#1}}}
{\dateeraprintpre{#1}\stripzeros{\thefield{#1}}}}
\newrobustcmd*{\mkbibdateshort}[3]{%
\blx@warning@noline{%
Using fallback definition for \string\mkbibdateshort.\MessageBreak
The command should be defined in the .lbx file.\MessageBreak
If you see this message, the .lbx file could not be\MessageBreak
loaded, is faulty or does not contain a definition\MessageBreak
for \string\mkbibdateshort
}%
\iffieldundef{#3}
{}
{\mkdayzeros{\thefield{#3}}%
\iffieldundef{#2}{}{/}}%
\iffieldundef{#2}
{}
{\mkmonthzeros{\thefield{#2}}%
\iffieldundef{#1}{}{/}}%
\iffieldbibstring{#1}
{\bibstring{\thefield{#1}}}
{\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}}
\expandafter\newrobustcmd\expandafter*\csname mkbibtime24h\endcsname[4]{%
\blx@warning@noline{%
Using fallback definition for
\expandafter\string\csname mkbibtime24h\endcsname.\MessageBreak
The command should be defined in the .lbx file.\MessageBreak
If you see this message, the .lbx file could not be\MessageBreak
loaded, is faulty or does not contain a definition\MessageBreak
for \expandafter\string\csname mkbibtime24h\endcsname
}%
\iffieldundef{#1}{}
{\printtext{\mktimezeros{\thefield{#1}}}\setunit{\bibtimesep}}%
\iffieldundef{#2}{}
{\printtext{\mktimezeros{\thefield{#2}}}\setunit{\bibtimesep}}%
\iffieldundef{#3}{}
{\printtext{\mktimezeros{\thefield{#3}}}}%
\setunit{}%
\iffieldundef{#4}{}
{\bibtimezonesep
\mkbibtimezone{\thefield{#4}}}}
\expandafter\newrobustcmd\expandafter*\csname mkbibtime12h\endcsname[4]{%
\blx@warning@noline{%
Using fallback definition for
\expandafter\string\csname mkbibtime12h\endcsname.\MessageBreak
The command should be defined in the .lbx file.\MessageBreak
If you see this message, the .lbx file could not be\MessageBreak
loaded, is faulty or does not contain a definition\MessageBreak
for \expandafter\string\csname mkbibtime12h\endcsname
}%
\stripzeros{\mktimehh{\thefield{#1}}}%
\bibtimesep
\forcezerosmdt{\thefield{#2}}%
\iffieldundef{#3}{}
{\bibtimesep
\forcezeros{\thefield{#3}}}%
\space
\ifnumless{\thefield{#1}}{12}
{\bibstring{am}}
{\bibstring{pm}}%
\iffieldundef{#4}{}
{\space\bibtimezonesep
\parentext{\mkbibtimezone{\thefield{#4}}}}}
\newrobustcmd*{\mkbibseasondateshort}[2]{%
\blx@warning@noline{%
Using fallback definition for \string\mkbibseasondateshort.\MessageBreak
The command should be defined in the .lbx file.\MessageBreak
If you see this message, the .lbx file could not be\MessageBreak
loaded, is faulty or does not contain a definition\MessageBreak
for \string\mkbibseasondateshort
}%
\mkbibseason{\thefield{#2}}%
\iffieldundef{#1}{}{\space}%
\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}
\newrobustcmd*{\mkbibseasondatelong}[2]{%
\blx@warning@noline{%
Using fallback definition for \string\mkbibseasondatelong.\MessageBreak
The command should be defined in the .lbx file.\MessageBreak
If you see this message, the .lbx file could not be\MessageBreak
loaded, is faulty or does not contain a definition\MessageBreak
for \string\mkbibseasondatelong
}%
\mkbibseason{\thefield{#2}}%
\iffieldundef{#1}{}{\space}%
\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}
\newrobustcmd*{\bibdatedash}{\bibrangedash}
\newrobustcmd*{\finalandcomma}{}
\newrobustcmd*{\finalandsemicolon}{}
\newrobustcmd*{\mkbibordinal}[1]{%
\blx@warning@noline{%
Using fallback definition for \string\mkbibordinal.\MessageBreak
The command should be defined in the .lbx file.\MessageBreak
If you see this message, the .lbx file could not be\MessageBreak
loaded, is faulty or does not contain a definition\MessageBreak
for \string\mkbibordinal
}%
#1%
}
\newrobustcmd*{\mkbibmascord}{\mkbibordinal}
\newrobustcmd*{\mkbibfemord}{\mkbibordinal}
\newrobustcmd*{\mkbibneutord}{\mkbibordinal}
% the following is usually not redefined in an .lbx
\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{%
\protected@edef\blx@tempa{#1}%
\expandafter\blx@imc@forcezerosmdt@i\expandafter{\blx@tempa}}
\protected\def\blx@imc@forcezerosmdt@i#1{%
\notblank{#1}
{\blx@imc@ifinteger{#1}
{\ifnumless{#1}{10}
{0\the\numexpr(#1)\relax}
{#1}}
{#1}}
{#1}}
% strip leading zeros and prepend zero(s) for year
% Allow for non numeric labelyear values
\protected\def\blx@imc@forcezerosy#1{%
\protected@edef\blx@tempa{#1}%
\expandafter\blx@imc@forcezerosy@i\expandafter{\blx@tempa}}
\protected\def\blx@imc@forcezerosy@i#1{%
\notblank{#1}
{\blx@imc@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}}
{#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@babel#1#2{%
\csgappto{extras#1}{%
\blx@resetpunct
\csuse{abx@extras@#2}%
\csuse{abx@strings@#2}}%
\csgappto{noextras#1}{%
\blx@resetpunct
\csuse{abx@noextras@#2}}}
\def\blx@maplang@polyglossia#1#2{%
\csgappto{blockextras@bbl@#1}{%
\blx@resetpunct
\csuse{abx@extras@#2}%
\csuse{abx@strings@#2}}%
\csgappto{inlinextras@bbl@#1}{%
\blx@resetpunct
\csuse{abx@extras@#2}%
\csuse{abx@strings@#2}}%
\csgappto{noextras@bbl@#1}{%
\blx@resetpunct
\csuse{abx@noextras@#2}}}
%% 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{%
\blx@ifhyphenationundef{\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'}}
{\let\blx@main@language\bbl@main@language}%
\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
\blx@ifhyphenationundef{\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@imc@mainlang{\select@language{\blx@main@language}}%
\blx@langsetup\blx@main@language}
{\blx@err@patch{'babel' package}%
\blx@mknoautolang}}
\gdef\blx@mkautolangpoly{%
\ifundef\mainbabelname
{\ifundef\bbl@main@language
{\blx@error
{No default 'polyglossia' language defined}
{You must define a default language for 'polyglossia'}}
{\let\blx@main@language\bbl@main@language}}
{\let\blx@main@language\mainbabelname}%
\edef\blx@saved@underscore@catcode{\the\catcode`\_}%
\catcode`\_=11% polyglossia uses "_" as a letter
\pretocmd\select@language{\blx@langsetup{\babelname}}
{\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
\blx@ifhyphenationundef{\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}}}}
{}}}
{}%
\def\blx@imc@mainlang{\select@language{\blx@main@language}}%
\blx@langsetup\blx@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}}}
% entry, namelist, name scopes are input/handled on the backend side
% if we want to see the info back on the biblatex side, we need the backend
% to pass the info through via the .bbl file
\def\blx@declareblxopt@extrahandler@entry#1{%
\csgdef{blx@bcf@backendout@entry@#1}{1}}
\def\blx@declareblxopt@extrahandler@namelist#1{%
\csgdef{blx@bcf@backendout@namelist@#1}{1}}
\def\blx@declareblxopt@extrahandler@name#1{%
\csgdef{blx@bcf@backendout@name@#1}{1}}
% {<option scope>}[<datatype>]{<key>}[<value>]{<code>}
\protected\def\blx@declareblxopt#1{%
\@ifnextchar[%]
{\blx@declareblxopt@i#1}
{\blx@declareblxopt@i#1[]}}
\def\blx@declareblxopt@i#1[#2]#3{%
\begingroup
\ifblank{#2}
{\def\blx@tempa{boolean}}
{\ifcsundef{blx@#1opts@#2}
{\blx@warn@badoptdt{#2}%
\def\blx@tempa{boolean}}
{\def\blx@tempa{#2}}}%
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@#1opts}{#3}%
\ifcsundef{blx@declareblxopt@extrahandler@#1}
{}
{\csuse{blx@declareblxopt@extrahandler@#1}{#3}}%
\endgroup
\@ifnextchar[%]
{\csuse{blx@defblxopt@#1opt}{#3}}
{\csuse{blx@defblxopt@#1opt}{#3}[]}}
\long\def\blx@defblxopt@globalopt#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}{pre/global}}}
{\blx@err@optdef{#1}{ldt/global}}}
\long\def\blx@defblxopt@typeentryopt#1#2[#3]#4{%
\ifcsundef{KV@blx@opt@#1@#2}
{\ifblank{#3}
{\define@key{blx@opt@#1}{#2}{#4}}
{\define@key{blx@opt@#1}{#2}[#3]{#4}}}
{\blx@err@optdef{#2}{#1}}}
\def\blx@defblxopt@typeopt{\blx@defblxopt@typeentryopt{typ}}
\def\blx@defblxopt@entryopt{\blx@defblxopt@typeentryopt{ent}}
\def\blx@defblxopt@nameopt{\blx@defblxopt@typeentryopt{name}}
\def\blx@defblxopt@namelistopt{\blx@defblxopt@typeentryopt{namelist}}
% 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>}[<default value>]{<code>}
\newcommand*{\DeclareBibliographyOption}{\blx@declareblxopt{global}}
\newcommand*{\DeclareTypeOption}{\blx@declareblxopt{type}}
\newcommand*{\DeclareEntryOption}{\blx@declareblxopt{entry}}
% we'll assume that \blx@optscopes is non-empty from now on
\newcommand*{\blx@optscopes}{}
\forcsvlist{\listadd\blx@optscopes}{global,type,entry}
\long\def\blx@defblxopt@loopscopes@i#1[#2]#3#4{%
\csuse{blx@defblxopt@#4opt}{#1}[#2]{#3}}
\long\def\blx@defblxopt@loopscopes#1[#2]#3{%
\forlistloop{\blx@defblxopt@loopscopes@i{#1}[#2]{#3}}{\blx@optscopes}}
% {<option scopes>}[<datatype>]{<key>}[<default value>]{<code>}
\newrobustcmd*{\DeclareBiblatexOption}[1]{%
\let\blx@optscopes\@empty
\forcsvlist{\listadd\blx@optscopes}{#1}%
\blx@DeclareBiblatexOption@i}
\newrobustcmd*{\blx@DeclareBiblatexOption@i}[2][]{%
\begingroup
\ifblank{#1}
{\def\blx@tempa{boolean}}
{\let\blx@tempb\@secondoftwo
\def\do##1{%
\ifcsundef{blx@##1opts@#1}
{\let\blx@tempb\@firstoftwo\listbreak}
{}}%
\dolistloop{\blx@optscopes}%
\blx@tempb
{\blx@warn@badoptdt{#1}%
\def\blx@tempa{boolean}}
{\def\blx@tempa{#1}}}%
\def\do##1{%
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@##1opts}{#2}%
\ifcsundef{blx@declareblxopt@extrahandler@##1}
{}
{\csuse{blx@declareblxopt@extrahandler@##1}{#2}}}%
\dolistloop{\blx@optscopes}%
\endgroup
\@ifnextchar[%]
{\blx@defblxopt@loopscopes{#2}}
{\blx@defblxopt@loopscopes{#2}[]}}
% this macro is internal for now because options declared with it need
% support on the backend side and are not useful for document or style authors
% {<option scopes>}[<datatype>]{<key>}
\newrobustcmd*{\blx@DeclareBackendOption}[1]{%
\let\blx@optscopes\@empty
\forcsvlist{\listadd\blx@optscopes}{#1}%
\blx@DeclareBackendOption@i}
\newrobustcmd*{\blx@DeclareBackendOption@i}[2][]{%
\begingroup
\ifblank{#1}
{\def\blx@tempa{boolean}}
{\let\blx@tempb\@secondoftwo
\def\do##1{%
\ifcsundef{blx@##1opts@#1}
{\let\blx@tempb\@firstoftwo\listbreak}
{}}%
\dolistloop{\blx@optscopes}%
\blx@tempb
{\blx@warn@badoptdt{#1}%
\def\blx@tempa{boolean}}
{\def\blx@tempa{#1}}}%
\def\do##1{%
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@##1opts}{#2}}%
\dolistloop{\blx@optscopes}%
\endgroup}
% per-entry inheritance blocking option for biber
\blx@DeclareBackendOption{entry}[string]{noinherit}
% nametemplates meta-option entry/namelist/name scope
% this meta option is resolved by Biber
\blx@DeclareBackendOption{entry,namelist,name}[string]{nametemplates}
\gdef\blx@bcf@backendin@entry@nametemplates{sortingnamekeytemplatename,%
uniquenametemplatename,labelalphanametemplatename}%
\gdef\blx@bcf@backendin@namelist@nametemplates{sortingnamekeytemplatename,%
uniquenametemplatename,labelalphanametemplatename}%
\gdef\blx@bcf@backendin@name@nametemplates{sortingnamekeytemplatename,%
uniquenametemplatename,labelalphanametemplatename}%
% Misc globalopts
\blx@DeclareBackendOption{global}[xml]{datamodel}
\blx@collectopts{string}{blx@globalopts}{controlversion}
\newcommand*{\labelalphaothers}{+}
\newcommand*{\sortalphaothers}{\labelalphaothers}
\blx@DeclareBackendOption{global,type}[string]{alphaothers}
\blx@DeclareBackendOption{global,type}[string]{sortalphaothers}
% 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{%
\blx@stripfromendinto{#1}{date}\blx@datetype
\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}
% Sanity check on date field names - they *must* end in 'date' to make things easier/possible later
\def\do#1{%
\blx@ifstrendswith{#1}{date}
{}
{\blx@error
{Invalid date field name '#1'}
{Date fields in the datamodel 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{extraname}%
\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}%
\do{nocite}%
\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
\blx@ifstrendswith{#1}{endyear}
{\blx@stripfromendinto{#1}{endyear}\blx@datetype
\def\blx@tempa{end}}
{\blx@stripfromendinto{#1}{year}\blx@datetype}%
\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
\blx@ifstrendswith{#1}{endyear}
{\blx@stripfromendinto{#1}{endyear}\blx@datetype
\def\blx@tempa{end}}
{\blx@stripfromendinto{#1}{year}\blx@datetype}%
\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}}}}}%
\DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{#1inits}[true]{%
\settoggle{abx@bool@#1inits}{##1}}}
\abx@donameparts
\def\do#1{%
% Define use<name> options scope for biber
\blx@DeclareBackendOption{global,type,entry}[boolean]{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>}{<name>}{<itemcount>}{<part>}{<isliteral>}{<value>}
\protected\def\blx@bbl@annotationdef#1#2#3#4#5#6#7{%
\ifstrequal{#1}{field}
{\csxappto\blx@bbl@data{%
\listadd\noexpand\abx@annotation@defined{field@#2@#3}}%
\ifstrequal{#6}{1}
{\csgappto\blx@bbl@data{%
\csdef{abx@annotation@literal@field@#2@#3}{#7}}}
{\csxappto\blx@bbl@data{%
\def\do####1{\listcsadd{abx@annotation@field@#2@#3}{####1}}%
\docsvlist{#7}}}}
{}%
\ifstrequal{#1}{item}
{\csxappto\blx@bbl@data{%
\listadd\noexpand\abx@annotation@defined{item@#2@#3@#4}}%
\ifstrequal{#6}{1}
{\csgappto\blx@bbl@data{%
\csdef{abx@annotation@literal@item@#2@#3@#4}{#7}}}
{\csxappto\blx@bbl@data{%
\def\do####1{\listcsadd{abx@annotation@item@#2@#3@#4}{####1}}%
\docsvlist{#7}}}}
{}%
\ifstrequal{#1}{part}
{\csxappto\blx@bbl@data{%
\listadd\noexpand\abx@annotation@defined{part@#2@#3@#4@#5}}%
\ifstrequal{#6}{1}
{\csgappto\blx@bbl@data{%
\csdef{abx@annotation@literal@part@#2@#3@#4@#5}{#7}}}
{\csxappto\blx@bbl@data{%
\def\do####1{\listcsadd{abx@annotation@part@#2@#3@#4@#5}{####1}}%
\docsvlist{#7}}}}
{}}
% [<field>][<annotationname>]
\def\blx@imc@getfieldannotation{%
\let\blx@tempa\@empty
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@getfieldannotation@i}
{\blx@imc@getfieldannotation@i[\blx@tempa]}}
\def\blx@imc@getfieldannotation@i[#1]{%
\ifstrempty{#1}
{\blx@imc@getfieldannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@getfieldannotation@ii{#1}}
{\blx@imc@getfieldannotation@ii{#1}[default]}}}
\def\blx@imc@getfieldannotation@ii#1[#2]{%
\def\blx@tempb{#1}%
\blx@resolve@annotation@label{\blx@tempb}%
\ifcsdef{abx@annotation@literal@field@\blx@tempb @#2}
{\csuse{abx@annotation@literal@field@\blx@tempb @#2}}
{}}
% [<field>][<annotationname>][<item>]
\def\blx@imc@getitemannotation{%
\let\blx@tempa\@empty
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@getitemannotation@i}
{\blx@imc@getitemannotation@i[\blx@tempa]}}
\def\blx@imc@getitemannotation@i[#1]{%
\ifstrempty{#1}
{\blx@imc@getitemannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@getitemannotation@ii{#1}}
{\blx@imc@getitemannotation@ii{#1}[default]}}}
\def\blx@imc@getitemannotation@ii#1[#2]{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\@ifnextchar[%]
{\blx@imc@getitemannotation@iii{#1}{\blx@tempb}}
{\blx@imc@getitemannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}}
\def\blx@imc@getitemannotation@iii#1#2[#3]{%
\def\blx@tempc{#1}%
\blx@resolve@annotation@label{\blx@tempc}%
\ifcsdef{abx@annotation@literal@item@\blx@tempc @#2@#3}
{\csuse{abx@annotation@literal@item@\blx@tempc @#2@#3}}
{}}
% [<field>][<annotationname>][<item>]{<part>}
\def\blx@imc@getpartannotation{%
\let\blx@tempa\@empty
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@getpartannotation@i}
{\blx@imc@getpartannotation@i[\blx@tempa]}}
\def\blx@imc@getpartannotation@i[#1]{%
\ifstrempty{#1}
{\blx@imc@getpartannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@getpartannotation@ii{#1}}
{\blx@imc@getpartannotation@ii{#1}[default]}}}
\def\blx@imc@getpartannotation@ii#1[#2]{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\@ifnextchar[%]
{\blx@imc@getpartannotation@iii{#1}{\blx@tempb}}
{\blx@imc@getpartannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}}
\def\blx@imc@getpartannotation@iii#1#2[#3]#4{%
\ifstrempty{#3}
{\def\blx@tempc{\the\value{listcount}}}
{\def\blx@tempc{#3}}%
\def\blx@tempd{#1}%
\blx@resolve@annotation@label{\blx@tempd}%
\ifcsdef{abx@annotation@literal@part@\blx@tempd @#2@\blx@tempc @#4}
{\csuse{abx@annotation@literal@part@\blx@tempd @#2@\blx@tempc @#4}}
{}}
% [<field>][<annotationname>]{<annotation>}
\def\blx@imc@iffieldannotation{%
\let\blx@tempa\@empty
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@iffieldannotation@i}
{\blx@imc@iffieldannotation@i[\blx@tempa]}}
\def\blx@imc@iffieldannotation@i[#1]{%
\ifstrempty{#1}
{\blx@imc@iffieldannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@iffieldannotation@ii{#1}}
{\blx@imc@iffieldannotation@ii{#1}[default]}}}
\def\blx@imc@iffieldannotation@ii#1[#2]#3{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\def\blx@tempc{#1}%
\blx@resolve@annotation@label{\blx@tempc}%
\ifinlistcs{#3}{abx@annotation@field@\blx@tempc @\blx@tempb}}
% [<field>][<annotationname>][<item>]{<annotation>}
\def\blx@imc@ifitemannotation{%
\let\blx@tempa\@empty
\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]{%
\ifstrempty{#1}
{\blx@imc@ifitemannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@ifitemannotation@ii{#1}}
{\blx@imc@ifitemannotation@ii{#1}[default]}}}
\def\blx@imc@ifitemannotation@ii#1[#2]{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\@ifnextchar[%]
{\blx@imc@ifitemannotation@iii{#1}{\blx@tempb}}
{\blx@imc@ifitemannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}}
\def\blx@imc@ifitemannotation@iii#1#2[#3]#4{%
\def\blx@tempc{#1}%
\blx@resolve@annotation@label{\blx@tempc}%
\ifinlistcs{#4}{abx@annotation@item@\blx@tempc @#2@#3}}
% [<field>][<annotationname>][<item>]{<part>}{<annotation>}
\def\blx@imc@ifpartannotation{%
\let\blx@tempa\@empty
\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]{%
\ifstrempty{#1}
{\blx@imc@ifpartannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@ifpartannotation@ii{#1}}
{\blx@imc@ifpartannotation@ii{#1}[default]}}}
\def\blx@imc@ifpartannotation@ii#1[#2]{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\@ifnextchar[%]
{\blx@imc@ifpartannotation@iii{#1}{\blx@tempb}}
{\blx@imc@ifpartannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}}
\def\blx@imc@ifpartannotation@iii#1#2[#3]#4#5{%
\ifstrempty{#3}
{\def\blx@tempc{\the\value{listcount}}}
{\def\blx@tempc{#3}}%
\def\blx@tempd{#1}%
\blx@resolve@annotation@label{\blx@tempd}%
\ifinlistcs{#5}{abx@annotation@part@\blx@tempd @#2@\blx@tempc @#4}}
% [<field>][<annotationname>]
\def\blx@imc@hasfieldannotation{%
\let\blx@tempa\@empty
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@hasfieldannotation@i}
{\blx@imc@hasfieldannotation@i[\blx@tempa]}}
\def\blx@imc@hasfieldannotation@i[#1]{%
\ifstrempty{#1}
{\blx@imc@hasfieldannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@hasfieldannotation@ii{#1}}
{\blx@imc@hasfieldannotation@ii{#1}[default]}}}
\def\blx@imc@hasfieldannotation@ii#1[#2]{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\def\blx@tempc{#1}%
\blx@resolve@annotation@label{\blx@tempc}%
\ifcsdef{abx@annotation@literal@field@\blx@tempc @\blx@tempb}}
% [<field>][<annotationname>][<item>]
\def\blx@imc@hasitemannotation{%
\let\blx@tempa\@empty
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@hasitemannotation@i}
{\blx@imc@hasitemannotation@i[\blx@tempa]}}
\def\blx@imc@hasitemannotation@i[#1]{%
\ifstrempty{#1}
{\blx@imc@hasitemannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@hasitemannotation@ii{#1}}
{\blx@imc@hasitemannotation@ii{#1}[default]}}}
\def\blx@imc@hasitemannotation@ii#1[#2]{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\@ifnextchar[%]
{\blx@imc@hasitemannotation@iii{#1}{\blx@tempb}}
{\blx@imc@hasitemannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}}
\def\blx@imc@hasitemannotation@iii#1#2[#3]{%
\def\blx@tempc{#1}%
\blx@resolve@annotation@label{\blx@tempc}%
\ifcsdef{abx@annotation@literal@item@\blx@tempc @#2@#3}}
% [<field>][<annotationname>][<item>]{<part>}
\def\blx@imc@haspartannotation{%
\let\blx@tempa\@empty
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
\@ifnextchar[%]
{\blx@imc@haspartannotation@i}
{\blx@imc@haspartannotation@i[\blx@tempa]}}
\def\blx@imc@haspartannotation@i[#1]{%
\ifstrempty{#1}
{\blx@imc@haspartannotation@i[\blx@tempa]}
{\@ifnextchar[%]
{\blx@imc@haspartannotation@ii{#1}}
{\blx@imc@haspartannotation@ii{#1}[default]}}}
\def\blx@imc@haspartannotation@ii#1[#2]{%
\ifstrempty{#2}
{\def\blx@tempb{default}}
{\def\blx@tempb{#2}}%
\@ifnextchar[%]
{\blx@imc@haspartannotation@iii{#1}{\blx@tempb}}
{\blx@imc@haspartannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}}
\def\blx@imc@haspartannotation@iii#1#2[#3]#4{%
\ifstrempty{#3}
{\def\blx@tempc{\the\value{listcount}}}
{\def\blx@tempc{#3}}%
\def\blx@tempd{#1}%
\blx@resolve@annotation@label{\blx@tempd}%
\ifcsdef{abx@annotation@literal@part@\blx@tempd @#2@\blx@tempc @#4}}
% 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
% [<annotationname>]{<datetype>}{<annotation>}
\newcommand*{\blx@imc@ifdateannotation}[3][]{%
\ifblank{#1}
{\def\blx@tempa{default}}
{\def\blx@tempa{#1}}%
\def\blx@tempb{#2}%
\ifcsundef{abx@field@\blx@tempb source}
{}%
{\letcs\blx@tempa{abx@field@\blx@tempb source}%
\edef\blx@tempb{\blx@tempb date}}%
\ifinlistcs{#3}{abx@annotation@field@\blx@tempb @\blx@tempa}}
% [<annotationname>]{<datetype>}
\newcommand*{\blx@imc@hasdateannotation}[2][]{%
\ifblank{#1}
{\def\blx@tempa{default}}
{\def\blx@tempa{#1}}%
\def\blx@tempb{#2}%
\ifcsundef{abx@field@\blx@tempb source}
{}%
{\letcs\blx@tempa{abx@field@\blx@tempb source}%
\edef\blx@tempb{\blx@tempb date}}%
\ifboolexpr { test {\ifcsdef{abx@annotation@field@\blx@tempb @\blx@tempa}}
or
test {\ifcsdef{abx@annotation@literal@field@\blx@tempb @\blx@tempa}} }}
% [<annotationname>]{<datetype>}
\newcommand*{\blx@imc@getdateannotation}[2][]{%
\ifblank{#1}
{\def\blx@tempa{default}}
{\def\blx@tempa{#1}}%
\def\blx@tempb{#1}%
\ifcsundef{abx@field@\blx@tempb source}
{}%
{\letcs\blx@tempb{abx@field@\blx@tempb source}%
\edef\blx@tempb{\blx@tempb date}}%
\ifcsdef{abx@annotation@literal@field@\blx@tempb @\blx@tempa}
{\csuse{abx@annotation@literal@field@\blx@tempb @\blx@tempa}}
{}}
\blx@regimcs{\iffieldannotation \ifitemannotation \ifpartannotation
\ifdateannotation \getfieldannotation \getitemannotation \getpartannotation
\getdateannotation \hasfieldannotation \hasitemannotation \haspartannotation
\hasdateannotation}
% {<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{%
\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}}%
\csletcs{etb@tgl@abx@bool@more##1}{%
etb@tgl@abx@bool@more\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@labelname}
{}%
\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}
{\blx@warning@noline{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{%
\locallabelnumberwidth\z@
\locallabelalphawidth\z@
\def\do##1{%
\csname local##1width\endcsname\z@}%
\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@labelname{%
\ifundef\abx@field@extraname
{}
{\ifnum\abx@field@extraname>\c@maxextraname
\global\c@maxextraname\abx@field@extraname\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{%
\xifinlist{\detokenize{#1}}\blx@lastcites
{}
{\listxadd\blx@lastcites{\detokenize{#1}}}}
% {<refcontext>}
% Get the saved information on which refcontexts were mentioned last run
\protected\def\abx@aux@refcontext#1{%
\xifinlist{\detokenize{#1}}\blx@lastrefcontexts
{}
{\listxadd\blx@lastrefcontexts{\detokenize{#1}}}}
% {<sortingtemplatename>}
% Get the saved information on which shorthand sorting templates were mentioned last run
\protected\def\abx@aux@biblist#1{%
\ifinlist{#1}\blx@lastbiblists
{}
{\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}{\expandonce{\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}}
% empty bibcheck does nothing
\cslet{blx@bibcheck@}\relax
\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}}}
\def\blx@default@theheading{bibliography}
\define@key{blx@bibdefaults}{heading}{%
\blx@key@heading{\blx@default@theheading}{#1}}
\define@key{blx@bhd}{heading}{%
\blx@key@heading{\blx@theheading}{#1}}
\define@key{blx@bib2}{heading}{%
\blx@key@heading{\blx@theheading}{#1}}
\define@key{blx@biblist2}{heading}{%
\blx@key@heading{\blx@theheading}{#1}}
\define@key{blx@bbs}{heading}{%
\blx@key@heading{\blx@theheading}{#1}}
\define@key{blx@bbg}{heading}{%
\blx@key@heading{\blx@theheading}{#1}}
\def\blx@key@heading#1#2{%
\ifcsundef{blx@head@#2}
{\blx@error
{Heading '#2' not found}
{The heading '#2' could not be found.\MessageBreak
Use \string\defbibheading\space to define it}}
{\def#1{#2}}}
\def\blx@default@theenv{bibliography}
\define@key{blx@bibdefaults}{env}{%
\blx@key@env{\blx@default@theenv}{#1}}
\define@key{blx@bib2}{env}{\blx@key@env{\blx@theenv}{#1}}
\define@key{blx@biblist2}{env}{\blx@key@env{\blx@theenv}{#1}}
\define@key{blx@bbs}{env}{\blx@key@env{\blx@theenv}{#1}}
\define@key{blx@bbg}{env}{\blx@key@env{\blx@theenv}{#1}}
\define@key{blx@bbc}{env}{\blx@key@env{\blx@theenv}{#1}}
\def\blx@key@env#1#2{%
\ifcsundef{blx@env@#2}
{\blx@error
{Environment '#2' not found}
{The environment '#2' could not be found.\MessageBreak
Use \string\defbibenvironment\space to define it}}
{\def#1{#2}}}
\let\blx@default@thetitle\@empty
\define@key{blx@bibdefaults}{title}{%
\def\blx@default@thetitle{#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}}
\cslet{blx@note@}\@empty
\def\blx@key@bibnote#1#2{%
\ifcsundef{blx@note@#2}
{\blx@error
{Note '#2' not found}
{The note '#2' could not be found.\MessageBreak
Use \string\defbibnote\space to define it}}
{\def#1{#2}}}
\let\blx@default@theprenote\@empty
\define@key{blx@bibdefaults}{prenote}{%
\blx@key@bibnote{\blx@default@theprenote}{#1}}
\define@key{blx@bib2}{prenote}{%
\blx@key@bibnote{\blx@theprenote}{#1}}
\define@key{blx@biblist2}{prenote}{%
\blx@key@bibnote{\blx@theprenote}{#1}}
\define@key{blx@bbs}{prenote}{%
\blx@key@bibnote{\blx@theprenote}{#1}}
\define@key{blx@bbg}{prenote}{%
\blx@key@bibnote{\blx@theprenote}{#1}}
\define@key{blx@bbc}{prenote}{%
\blx@key@bibnote{\blx@theprenote}{#1}}
\let\blx@default@thepostnote\@empty
\define@key{blx@bibdefaults}{postnote}{%
\blx@key@bibnote{\blx@default@thepostnote}{#1}}
\define@key{blx@bib2}{postnote}{%
\blx@key@bibnote{\blx@thepostnote}{#1}}
\define@key{blx@biblist2}{postnote}{%
\blx@key@bibnote{\blx@thepostnote}{#1}}
\define@key{blx@bbs}{postnote}{%
\blx@key@bibnote{\blx@thepostnote}{#1}}
\define@key{blx@bbg}{postnote}{%
\blx@key@bibnote{\blx@thepostnote}{#1}}
\define@key{blx@bbc}{postnote}{%
\blx@key@bibnote{\blx@thepostnote}{#1}}
\let\abx@default@locallabelwidth\@gobble
\define@key{blx@bibdefaults}{locallabelwidth}{%
\blx@key@locallabelwidth{\abx@default@locallabelwidth}{#1}}
\define@key{blx@bib1}{locallabelwidth}[]{}
\define@key{blx@biblist1}{locallabelwidth}[]{}
\define@key{blx@bib2}{locallabelwidth}[true]{%
\blx@key@locallabelwidth{\abx@locallabelwidth}{#1}}
\define@key{blx@biblist2}{locallabelwidth}[true]{%
\blx@key@locallabelwidth{\abx@locallabelwidth}{#1}}
\def\blx@key@locallabelwidth#1#2{%
\ifstrequal{#2}{true}
{\def#1{\blx@locallabelwidth}}
{\let#1\@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'}}}
{}}
\newrobustcmd*{\DeclarePrintbibliographyDefaults}{%
\setkeys{blx@bibdefaults}}
% [<options>]
\newrobustcmd*{\printbibheading}{%
\begingroup
\edef\on@line{\on@line}%
\@ifnextchar[%]
{\blx@printbibheading}
{\blx@printbibheading[]}}
\def\blx@printbibheading[#1]{%
\let\blx@theheading\blx@default@theheading
\let\blx@thetitle\blx@default@thetitle
\blx@safe@actives
\setkeys{blx@bhd}{#1}%
\blx@rest@actives
\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}%
\let\blx@theheading\blx@default@theheading
\let\blx@theenv\blx@default@theenv
\let\blx@theprenote\blx@default@theprenote
\let\blx@thepostnote\blx@default@thepostnote
\let\blx@thetitle\blx@default@thetitle
% 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
{\ifdefempty\blx@refcontext@labelprefix@real}
{\@secondoftwo}
{}
{\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@real}{\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]{%
\let\blx@theheading\blx@default@theheading
\let\blx@theenv\blx@default@theenv
\let\blx@theprenote\blx@default@theprenote
\let\blx@thepostnote\blx@default@thepostnote
\let\blx@thetitle\blx@default@thetitle
\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]{%
\let\blx@theheading\blx@default@theheading
\let\blx@theenv\blx@default@theenv
\let\blx@theprenote\blx@default@theprenote
\let\blx@thepostnote\blx@default@thepostnote
\let\blx@thetitle\blx@default@thetitle
\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]{%
\let\blx@theheading\blx@default@theheading
\let\blx@theenv\blx@default@theenv
\let\blx@theprenote\blx@default@theprenote
\let\blx@thepostnote\blx@default@thepostnote
\let\blx@thetitle\blx@default@thetitle
\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{\blx@theheading}{#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@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
\def\blx@edef@refcontext#1{%
\edef\blx@refcontext@context{#1}%
\expandafter\edef\expandafter\blx@refcontext@context\expandafter{%
\expandafter\detokenize\expandafter{\blx@refcontext@context}}}
\def\blx@xdef@refcontext#1{%
\edef\blx@refcontext@context{#1}%
\expandafter\xdef\expandafter\blx@refcontext@context\expandafter{%
\expandafter\detokenize\expandafter{\blx@refcontext@context}}}
% 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}{\detokenize{#3}}}
\def\abx@aux@refcontextdefaultsdone{%
\global\boolfalse{refcontextdefaults}}
% \abx@aux@defaultlabelprefix is a dummy only used by BibTeX to implement a
% simple labelprefix not based on full refcontexts, which BibTeX does not
% support.
\let\abx@aux@defaultlabelprefix\@gobblethree
\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
% Note that the name must be unique so we prepend "#2:" because the combination of
% options might not generate a unique name since sortschemename has a fallback to the
% refcontext scheme if there is no sortscheme named after the list
\blx@edef@refcontext{#2:\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}%
\xappto\blx@dlists{%
\blx@xml@dlist{\blx@refcontext@context}{list}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@tempc}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix@real}{\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@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}%
\blx@xdef@refcontext{%
\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
\global\let\blx@refcontext@labelprefix@real\@empty
\xdef\blx@refcontext@sortingtemplatename{\blx@sorting}%
\gdef\blx@refcontext@sortingnamekeytemplatename{global}%
\gdef\blx@refcontext@uniquenametemplatename{global}%
\gdef\blx@refcontext@labelalphanametemplatename{global}%
\blx@xdef@refcontext{%
\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}}
% labelprefix cannot be used as is because it is used to construct the internal
% refcontext name which is referenced/expanded a lot all over the place. So,
% we hash the given input and use the safe hash as internal name.
% But that is not enough since the MD5 hash function expands the argument all
% the way and so unexpandable content like \dag breaks.
% Unexpandable content should be protected with \detokenize.
\define@key{blx@refcontext}{labelprefix}{%
\xdef\blx@refcontext@labelprefix{\blx@mdfivesum{#1}}%
\gdef\blx@refcontext@labelprefix@real{#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}{%
\edef\blx@tempc{\blx@mdfivesum{#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{%
\endrefcontext
\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
\ifcscounter{blx@sectionciteorder@\the\c@refsection}
{}
{\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname}%
\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
% option switch
%{<option level counter>}{<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%
}%
}
%% Patching all the different document classes and their sectioning
%% commands is ... messy at best
%% For now we do the big three: (1) Standard classes, (2) KOMA-Script
%% and (3) memoir.
%%
%% Timing of the patch can be tricky.
%% Ideally we want the code to be executed when all counters have
%% been increased so the labels attach to the right thing, but
%% at the same time we want the code to be executed before the heading
%% is typeset so it already applies to the text in the heading.
%% Bonus points for actually executing the code on the correct page.
%% memoir has hooks for section headings that we can use here
%% see 18.25 'Heading Hooks' of the manual (v3.7h, 2018/12/12)
%% they are in a good position, when the counters have been
%% increased but heading text not yet typeset.
%% The manual suggests this hooks have been around since 2005 or so,
%% so we take them for granted.
%% Newer versions of KOMA-Script (>=3.27) (will) have a hook system
%% that we can use for that purpose as well.
%% This is fairly new, so we need to have a fallback for older versions.
%% The standard classes are tricky. They have no good hooks and just
%% for sections at least \pretocmd-ing executes the code before
%% counters are increased, so the labels attach to the wrong thing.
%% Test for correct KOMA patch method
% KOMA 3.27 has \AddtoDoHook
\newcommand*{\blx@ifkoma@AddtoDoHook}{%
\ifboolexpr{not test {\ifcsundef{KOMAClassName}}
and not test {\ifcsundef{AddtoDoHook}}}}
% KOMA 3.26 has \startsection@secnumdepth for some testing
\newcommand*{\blx@ifkoma@startsection}{%
\ifboolexpr{not test {\ifcsundef{KOMAClassName}}
and not test {\ifcsundef{startsection@secnumdepth}}}}
\newcommand*{\blx@ifmemoir}{\@ifclassloaded{memoir}}
% Note that \ExecuteDoHook always feeds an argument to the code, here that is
% going to be an empty group, which we explicitly gobble to avoid trouble.
\def\blx@refpatch@koma@AddtoDoHook#1#2{%
\AddtoDoHook{heading/begingroup/#1}{#2\@gobble}}
% \part
\def\blx@refpatch@part@memoir#1{%
\apptocmd\mempartinfo{#1}
{}{\blx@err@patch{\string\mempartinfo}}%
\apptocmd\mempartstarinfo{#1}
{}{\blx@err@patch{\string\mempartstarinfo}}}
\def\blx@refpatch@part@std#1{%
\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@part#1{%
\ifundef\part
{\blx@err@nodocdiv{part}}
{\blx@ifkoma@AddtoDoHook
{\blx@refpatch@koma@AddtoDoHook{part}{#1}}
{\blx@ifmemoir
{\blx@refpatch@part@memoir{#1}}
{\blx@refpatch@part@std{#1}}}}}
% \chapter
\def\blx@refpatch@chapter@memoir#1{%
\apptocmd\memchapinfo{#1}
{}{\blx@err@patch{\string\memchapinfo}}%
\apptocmd\memchapstarinfo{#1}
{}{\blx@err@patch{\string\memchapstarinfo}}}
\def\blx@refpatch@chapter@std#1{%
\pretocmd\@makechapterhead{#1}
{}
{\blx@err@patch{\string\@makechapterhead}}
\pretocmd\@makeschapterhead{#1}
{}
{\blx@err@patch{\string\@makeschapterhead}}}
\def\blx@refpatch@chapter#1{%
\ifundef\chapter
{\blx@err@nodocdiv{chapter}}
{\blx@ifkoma@AddtoDoHook
{\blx@refpatch@koma@AddtoDoHook{chapter}{#1}}
{\blx@ifmemoir
{\blx@refpatch@chapter@memoir{#1}}
{\blx@refpatch@chapter@std{#1}}}}}
% \section, \subsection
% {<section csname>}{<precode>}{<section level number>}
\def\blx@refpatch@sect#1#2#3{%
\ifcsundef{#1}
{\blx@err@nodocdiv{#1}\@gobbletwo}
{\blx@ifkoma@AddtoDoHook
{\blx@refpatch@koma@AddtoDoHook{#1}{#2}}
{\blx@ifkoma@startsection
{\blx@refpatch@sect@koma@startsection{#2}{#3}}
{\blx@ifmemoir
{\blx@refpatch@sect@memoir{#1}{#2}}
{\blx@refpatch@sect@std{#2}{#3}}}}}}
% KOMA >= 3.26 defines \startsection@secnumdepth to check the sectioning level,
% so we can now use \At@startsection.
% Starting from 3.27 we use AddtoDoHook, so this is a short-lived
% intermezzo.
\def\blx@refpatch@sect@koma@startsection#1#2{%
\At@startsection{\ifnumequal{\startsection@secnumdepth}{#2}{#1}{}}}
\edef\blx@refpatch@sect@memoir#1#2{%
\apptocmd\noexpand\memsecinfo
{\noexpand\blx@refpatch@sect@memoir@i{\string#1}{#1}{#2}}
{}{\noexpand\blx@err@patch{\string\memsecinfo}}%
\apptocmd\noexpand\memsecstarinfo
{\noexpand\blx@refpatch@sect@memoir@i{\string#1}{#1}{#2}}
{}{\noexpand\blx@err@patch{\string\memsecstarinfo}}}
\def\blx@refpatch@sect@memoir@i#1#2#3{%
\ifstrequal{#1}{#2}{#3}{}}
\edef\blx@refpatch@sect@std#1#2{%
\def\noexpand\do##1{%
\pretocmd##1%
{\noexpand\blx@refpatch@sect@std@i{#1}{#2}{\string#2}}
{\togglefalse{blx@tempa}\noexpand\listbreak}
{}}%
\noexpand\blx@refpatch@sect@std@ii}
\def\blx@refpatch@sect@std@i#1#2#3{%
\ifnumequal{#2}{#3}{#1}{}}
\def\blx@refpatch@sect@std@ii{%
\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 <= v <= 3.25
\@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}%
\undef\blx@tempd
\let\blx@tempe\@empty
\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
\let\blx@tempe\@empty
\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}}}
\define@key{blx@addbib}{bibencoding}{\def\blx@tempe{#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}%
\csxdef{blx@res@bibencoding@#1}{\blx@tempe}%
\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}}
{\ifcsvoid{blx@res@bibencoding@#2}
{}
{ encoding="\csuse{blx@res@bibencoding@#2}"}}
{#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>}
% Wrapper to track cite keys which are \nocited
\def\blx@nocitation#1#2{%
\ifinlist{#1}\blx@nocites
{}
{\listgadd\blx@nocites{#1}}%
\blx@citation@i{#1}{#2}}
% {<entrykey>}{<message>}
% Just a wrapper to suppress citation tracking in toc/lof etc.
\def\blx@citation#1#2{%
\ifinlist{#1}\blx@directcites
{}
{\listgadd\blx@directcites{#1}}%
\blx@citation@i{#1}{#2}}
\def\blx@citation@i#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{%
\xifinlistcs{\detokenize{#3}}{blx@segm@#1@#2}
{}
{\listcsxadd{blx@segm@#1@#2}{\detokenize{#3}}}}
\def\blx@nocitation@all{%
\ifinlist{*}\blx@nocites
{}
{\listgadd\blx@nocites{*}}%
\blx@citation@all}
\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}%
\let\blx@tempb\@empty
% Only output as \nocited if a key wasn't also directly \cite'd
% Since citekey output is sequential as cites are read, the .bcf might contain
% duplicate keys with differring nocite attributes if \nocite{X} and \cite{X} both occur
% but biber deals with this and priorities \cites
\ifboolexpr{test {\ifinlist{#1}\blx@nocites}
and
not test {\ifinlist{#1}\blx@directcites}}
{\def\blx@tempb{ nocite="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}{\blx@tempb}{0}}}
{\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}{\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' has 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}%
\ifundef\blx@tempb
{\let\blx@tempb\@empty}
{}%
% 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
\ifcscounter{blx@sectionciteorder@\the\c@refsection}
{}
{\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname}%
\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}
\def\abx@missing@entry#1{%
\abx@missing{#1}}
% {<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@entry\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}}
{\blx@edef@refcontext{\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>}
% set maxcitecounter as well, note that we also define a maxcitecounter across
% all refsections, but that does not have a high-level interface
\protected\def\blx@aux@count#1#2{%
\csnumgdef{blx@count@#1@\detokenize{#2}}{%
\csuse{blx@count@#1@\detokenize{#2}}+1}%
\ifnumgreater{\csuse{blx@count@#1@\detokenize{#2}}}{%
0\csuse{blx@maxcitecounter@#1}}
{\csnumgdef{blx@maxcitecounter@#1}{%
\csuse{blx@count@#1@\detokenize{#2}}}}
{}%
\ifnumgreater{\csuse{blx@count@#1@\detokenize{#2}}}{%
0\csuse{blx@maxcitecounter}}
{\csnumgdef{blx@maxcitecounter}{%
\csuse{blx@count@#1@\detokenize{#2}}}}
{}}
\protected\def\blx@aux@fncount#1#2{%
\csnumgdef{blx@fncount@#1@\detokenize{#2}}{%
\csuse{blx@fncount@#1@\detokenize{#2}}+1}%
\ifnumgreater{\csuse{blx@fncount@#1@\detokenize{#2}}}{%
0\csuse{blx@maxfncitecounter@#1}}
{\csnumgdef{blx@maxfncitecounter@#1}{%
\csuse{blx@fncount@#1@\detokenize{#2}}}}
{}%
\ifnumgreater{\csuse{blx@fncount@#1@\detokenize{#2}}}{%
0\csuse{blx@maxfncitecounter}}
{\csnumgdef{blx@maxfncitecounter}{%
\csuse{blx@fncount@#1@\detokenize{#2}}}}
{}}
\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
\c@maxcitecounter0%
\csuse{blx@maxcitecounter@\the\c@refsection}%
\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
\c@maxcitecounter0%
\iftoggle{blx@footnote}
{\csuse{blx@maxfncitecounter@\the\c@refsection}}
{\csuse{blx@maxcitecounter@\the\c@refsection}}%
\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{ibid}%
\blx@ibidtracker@context}
{\blx@ibidreset@context}}%
\def\blx@ibidreset@force{%
\global\undef\blx@lastkey@text
\global\undef\blx@lastkey@foot
\blx@mpfnreset{ibid}}
\def\blx@ibidreset@global{%
\global\undef\blx@lastkey@text}
\def\blx@ibidreset@context{%
\iftoggle{blx@footnote}
{\blx@mpfnreset{ibid}%
\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}}
{}}
\def\blx@idemtracker@strict{%
\blx@imc@iffirstcitekey
{\blx@idemtracker@global}
{\blx@ifciteidem@global
{}
{\blx@idemreset@global}}}
\def\blx@idemtracker@constrict{%
\blx@imc@iffirstcitekey
{\blx@mpfnsave{idem}%
\blx@idemtracker@context}
{\blx@ifciteidem@context
{}
{\blx@idemreset@context}}}
\def\blx@idemreset@force{%
\global\undef\blx@lasthash@text
\global\undef\blx@lasthash@foot
\blx@mpfnreset{idem}}
\def\blx@idemreset@global{%
\global\undef\blx@lasthash@text}
\def\blx@idemreset@context{%
\iftoggle{blx@footnote}
{\blx@mpfnreset{idem}%
\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{opcit}%
\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{opcit}}
\def\blx@opcitreset@global{%
\blx@opcit@reset{text}}
\def\blx@opcitreset@context{%
\iftoggle{blx@footnote}
{\blx@opcit@reset{foot}%
\blx@mpfnreset{opcit}}
{\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{loccit}%
\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{loccit}}
\def\blx@loccitreset@global{%
\blx@loccit@reset{text}}
\def\blx@loccitreset@context{%
\iftoggle{blx@footnote}
{\blx@loccit@reset{foot}%
\blx@mpfnreset{loccit}}
{\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}
{}%
\blx@ifprintableinlistcs{#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{%
\ifstrequal{*}{#1}
{\blx@nocitation@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
\ifcscounter{blx@sectionciteorder@\the\c@refsection}
{}
{\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname}%
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
\blx@nocitation{#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
\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{%
\csundef{blx@defcite@wrapper@#1}%
\blx@defcitecmd@iv{#1}%
\blx@defcitecmd@v{#1}}
\long\def\blx@defcitecmd@iii#1[#2]{%
\csdef{blx@defcite@wrapper@#1}{#2}%
\blx@defcitecmd@iv{#1}%
\blx@defcitecmd@v{#1}}
\long\def\blx@defcitecmd@iv#1{%
\protected\long\csedef{blx@cite@#1}##1##2##3##4{%
\ifboolexpe{test {\ifcsundef{blx@defcite@wrapper@#1}}
and
(test {\ifcsundef{blx@citepunct@#1}}
or
test {\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}})}
{}
{\begingroup
\blx@citeinit}%
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@l}
{\noexpand\unspace##4}
{}%
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@f}
{\noexpand\iftoggle{blx@footnote}{}{\unspace##4}}
{}%
\ifcsundef{blx@defcite@wrapper@#1}
{\blxciteicmd{#1}{##1}{##2}{##3}{%
\ifcsundef{blx@citepunct@#1}{##4}{}%
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}{##4}{}}}
{\csexpandonce{blx@defcite@wrapper@#1}{%
\blxciteicmd{#1}{##1}{##2}{##3}{%
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}{##4}{}}}%
\ifcsundef{blx@citepunct@#1}{##4}{}}%
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@r}{##4}{}%
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@f}
{\noexpand\iftoggle{blx@footnote}{##4}{}}
{}%
\ifboolexpe{test {\ifcsundef{blx@defcite@wrapper@#1}}
and
(test {\ifcsundef{blx@citepunct@#1}}
or
test {\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}})}
{}
{\endgroup}}}
\long\def\blx@defcitecmd@v#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}%
\iftoggle{blx@volcite}
{\blx@defvolcitepostnote##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@macitei@#1\endcsname*%
\expandafter\noexpand
\csname blx@maciteii@#1\endcsname}
{\expandafter\noexpand
\csname blx@macitei@#1\endcsname{}%
\expandafter\noexpand
\csname blx@maciteii@#1\endcsname}}%
\csedef{blx@macitei@#1}{\csname blx@mcite@#4\endcsname}%
\protected\csedef{blx@maciteii@#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}}}
% {<command>}{<pos marker>}
% pos markers are:
% l: move punctuation before the command (i.e. left of it)
% r: leave punctuation after the command (i.e. to the right)
% f: like l in normal text, like r in footnotes
% c: pass on to the cite command,
% the punctuation will eventually end up as field 'postpunct'
% d: discard the punctuation
% o (or any other value): restores the old standard behaviour
% r for wrapped citation commands,
% c for unwrapped ones
\newrobustcmd*{\DeclareCitePunctuationPosition}[2]{%
\begingroup
\escapechar\m@ne
\edef\blx@tempa{\endgroup
\noexpand\blx@defcitepunctpos@i{\string#1}{#2}}%
\blx@tempa}
\def\blx@citepunctid@pos@l{l}
\def\blx@citepunctid@pos@r{r}
\def\blx@citepunctid@pos@f{f}
\def\blx@citepunctid@pos@c{c}
\def\blx@citepunctid@pos@d{d}
\def\blx@defcitepunctpos@i#1#2{%
\ifcsundef{blx@citepunctid@pos@#2}
{\csundef{blx@citepunct@#1}}
{\csletcs{blx@citepunct@#1}{blx@citepunctid@pos@#2}}%
\blx@defcitecmd@iv{#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\ifvolcite{\blx@TE{\iftoggle{blx@volcite}}}%
\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\ifnocite{\blx@TE{\iftoggle{abx@bool@nocite}}}%
\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}}}%
\def\ifdateyearsequal#1#2{%
\blx@TE{\blx@imc@ifdateyearsequal{#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}{\blx@enquote}
\protected\def\blx@imc@mkbibquote{%
\blx@ifuspunct\blx@usquote\blx@enquote}
\def\blx@usquote{%
\ifnum\@quotelevel>\z@
\expandafter\blx@usiquote
\else
\expandafter\blx@usoquote
\fi}
\long\def\blx@usoquote#1{%
\begingroup
\blx@initoquote
\blx@textooquote#1%
\futurelet\@let@token\blx@usoquote@i}
\def\blx@usoquote@i{%
\blx@usqcheck
{\ifx\blx@postpunct\@empty\else\blx@dopostpunct\fi
\blx@textcoquote\endgroup}
{\blx@setpostpunct\blx@textcoquote\endgroup}}
\long\def\blx@usiquote#1{%
\begingroup
\blx@initiquote
\blx@textoiquote#1%
\futurelet\@let@token\blx@usiquote@i}
\def\blx@usiquote@i{%
\blx@usqcheck
{\blx@textciquote\endgroup}
{\blx@setpostpunct\blx@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{%
\toggletrue{blx@volcite}%
\csuse{blx@hook@volcite}}%
\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{%
\toggletrue{blx@volcite}%
\csuse{blx@hook@volcite}}%
\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}[]}}
\long\def\blx@defvolcitepostnote#1#2{%
\def\abx@field@volcitevolume{#1}%
\ifblank{#2}
{}
{\def\abx@field@volcitepages{#2}}}
\newrobustcmd*{\AtVolcite}{%
\@ifstar
{\global\undef\blx@hook@volcite
\gappto\blx@hook@volcite}
{\gappto\blx@hook@volcite}}
\@onlypreamble\AtVolcite
\def\blx@imc@UseVolciteHook{\csuse{blx@hook@volcite}}
\blx@regimcs{\UseVolciteHook}
\AtVolcite{%
\DeclareFieldAlias{postnote}{volcitenote}}
%% 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#4{%
~~~~<bcf:translit #1target="#2" from="#3" to="#4"/>\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#4{%
~~~~<bcf:datasource type="#1" datatype="#2"#3>#4</bcf:datasource>\blx@nl}
\xdef\blx@xml@citekey#1#2#3{%
~~~~<bcf:citekey order="#3"#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{% GLOBAL/TYPE scope
~~~~<bcf:option datatype="#1">#2</bcf:option>\blx@nl}
\xdef\blx@xml@option@entryscope#1#2{% ENTRY scope
~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@entry@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@entry@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@entry@#2}"}{}>#2</bcf:option>\blx@nl}
\xdef\blx@xml@option@namelistscope#1#2{% NAMELIST scope
~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@namelist@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@namelist@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@namelist@#2}"}{}>#2</bcf:option>\blx@nl}
\xdef\blx@xml@option@namescope#1#2{% NAME scope
~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@name@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@name@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@name@#2}"}{}>#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{maxsortnames}{\blx@maxsortnames}%
\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{minsortnames}{\blx@minsortnames}%
\blx@xml@svalue{minitems}{\blx@minitems}%
\blx@xml@toggle{nohashothers}%
\blx@xml@toggle{noroman}%
\blx@xml@toggle{nosortothers}%
\blx@xml@toggle{singletitle}%
\blx@xml@toggle{skipbib}%
\blx@xml@toggle{skipbiblist}%
\blx@xml@toggle{skiplab}%
\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}%
\blx@xml@svalue{maxcitenames}{\blx@maxcitenames}%
\blx@xml@svalue{maxsortnames}{\blx@maxsortnames}%
\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{minsortnames}{\blx@minsortnames}%
\blx@xml@svalue{minitems}{\blx@minitems}%
\blx@xml@toggle{nohashothers}%
\blx@xml@toggle{noroman}%
\blx@xml@toggle{nosortothers}%
\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
\let\protect\relax
\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
\blx@checkoptions@type
\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@entryscope{##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@namelistscope{##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@namescope{##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@multiscript@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}{cited}[true]{% true|false
\ifstrequal{#1}{true}
{\appto\blx@tempf{ map\string_entrykey\string_cited="1"}}
{}}
\define@key{blx@sourcemap@step}{nocited}[true]{% true|false
\ifstrequal{#1}{true}
{\appto\blx@tempf{ map\string_entrykey\string_nocited="1"}}
{}}
\define@key{blx@sourcemap@step}{citedornocited}[true]{% true|false
\ifstrequal{#1}{true}
{\appto\blx@tempf{ map\string_entrykey\string_citedornocited="1"}}
{}}
\define@key{blx@sourcemap@step}{allnocited}[true]{% true|false
\ifstrequal{#1}{true}
{\appto\blx@tempf{ map\string_entrykey\string_allnocited="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}{appendstrict}[true]{% true|false
\ifstrequal{#1}{true}
{\appto\blx@tempf{ map\string_appendstrict="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}{matchi}{% characters
\appto\blx@tempf{ map\string_matchi="#1"}}
\define@key{blx@sourcemap@step}{notmatch}{% characters
\appto\blx@tempf{ map\string_notmatch="#1"}}
\define@key{blx@sourcemap@step}{notmatchi}{% characters
\appto\blx@tempf{ map\string_notmatchi="#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@DeclareBackendOption{global}[xml]{labelalphanametemplate}
\DeclareBiblatexOption{entry,namelist,name}[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@DeclareBackendOption{global,type}[xml]{labelalphatemplate}
\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@DeclareBackendOption{global}[xml]{inheritance}
% [<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}}}
% [<langids>][<entrytype>]{translitsource}{translittarget}
\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@DeclareBackendOption{global,type}[xml]{translit}
\newcommand*{\blx@translit@setup}[4][]{%
\eappto\blx@tempb{%
\ifblank{#1}
{\blx@xml@translit{}{#2}{#3}{#4}}
{\blx@xml@translit{langids="#1" }{#2}{#3}{#4}}}}
% [<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@DeclareBackendOption{global}[xml]{uniquenametemplate}
\DeclareBiblatexOption{entry,namelist,name}[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@DeclareBackendOption{global}[xml]{sortingnamekeytemplate}
\DeclareBiblatexOption{entry,namelist,name}[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@DeclareBackendOption{global}[xml]{sortingtemplate}
\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{literal="1" 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@DeclareBackendOption{global,type,entry}[string]{presort}
\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@DeclareBackendOption{type}[xml]{sortexclusion}
% {<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@DeclareBackendOption{type}[xml]{sortinclusion}
% {<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@DeclareBackendOption{global}[xml]{extradatespec}
\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@DeclareBackendOption{global,type}[xml]{labelnamespec}
\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@DeclareBackendOption{global,type}[xml]{labeltitlespec}
\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@DeclareBackendOption{global,type}[xml]{labeldatespec}
\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}}
\define@key{blx@opt@ldt}{noerroretextools}[true]{%
\blx@warning@noline{%
The option 'noerroretextools' is deprecated.\MessageBreak
Define the control sequence '\string\blx@noerroretextools'\MessageBreak
before loading biblatex instead}%
\ifstrequal{#1}{true}
{\global\cslet{blx@noerroretextools}\@empty}
{\csgundef{blx@noerroretextools}}}
% 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@DeclareBackendOption{global}[string]{sortingtemplatename}
\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
\let\blx@refcontext@labelprefix@real\@empty
\def\blx@refcontext@uniquenametemplatename{global}%
\def\blx@refcontext@labelalphanametemplatename{global}%
\blx@xdef@refcontext{%
\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}}
\DeclareBiblatexOption{global,type}[integer]{maxnames}{%
\numdef\blx@maxcitenames{#1}%
\numdef\blx@maxbibnames{#1}%
\numdef\blx@maxsortnames{#1}%
\c@maxnames#1\relax}
\DeclareBiblatexOption{global,type}[integer]{minnames}{%
\numdef\blx@mincitenames{#1}%
\numdef\blx@minbibnames{#1}%
\numdef\blx@minsortnames{#1}%
\c@minnames#1\relax}
% the per-entry option is resolved by Biber directly
\blx@DeclareBackendOption{entry}[integer]{maxnames}
\blx@DeclareBackendOption{entry}[integer]{minnames}
\gdef\blx@bcf@backendin@entry@maxnames{maxcitenames,maxbibnames,maxsortnames}%
\gdef\blx@bcf@backendin@entry@minnames{mincitenames,minbibnames,minsortnames}%
\DeclareBiblatexOption{global,type,entry}[integer]{maxbibnames}{%
\numdef\blx@maxbibnames{#1}%
\numdef\blx@maxsortnames{#1}%
\iftoggle{blx@bibliography}
{\c@maxnames#1\relax}
{}}
\DeclareBiblatexOption{global,type,entry}[integer]{minbibnames}{%
\numdef\blx@minbibnames{#1}%
\numdef\blx@minsortnames{#1}%
\iftoggle{blx@bibliography}
{\c@minnames#1\relax}
{}}
\DeclareBiblatexOption{global,type,entry}[integer]{maxcitenames}{%
\numdef\blx@maxcitenames{#1}%
\iftoggle{blx@bibliography}
{}
{\c@maxnames#1\relax}}
\DeclareBiblatexOption{global,type,entry}[integer]{mincitenames}{%
\numdef\blx@mincitenames{#1}%
\iftoggle{blx@bibliography}
{}
{\c@minnames#1\relax}}
\DeclareBiblatexOption{global,type,entry}[integer]{maxsortnames}{%
\numdef\blx@maxsortnames{#1}}
\DeclareBiblatexOption{global,type,entry}[integer]{minsortnames}{%
\numdef\blx@minsortnames{#1}}
\appto\blx@checkoptions@global{%
\blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames
\blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames
\blx@maxmin@num{maxsortnames}{minsortnames}\blx@maxsortnames\blx@minsortnames}
\appto\blx@checkoptions@type{%
\blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames
\blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames
\blx@maxmin@num{maxsortnames}{minsortnames}\blx@maxsortnames\blx@minsortnames}
\appto\blx@checkoptions@entry{%
\blx@maxmin@cnt{maxnames}{minnames}\c@maxnames\c@minnames}
\DeclareBiblatexOption{global,type,entry}[integer]{maxitems}{%
\numdef\blx@maxitems{#1}%
\c@maxitems#1\relax}
\DeclareBiblatexOption{global,type,entry}[integer]{minitems}{%
\numdef\blx@minitems{#1}%
\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\blx@minitems}
\appto\blx@checkoptions@entry{%
\blx@maxmin@cnt{maxitems}{minitems}\c@maxitems\blx@minitems}
\DeclareBiblatexOption{global,type,entry}[integer]{maxalphanames}{%
\numdef\blx@maxalphanames{#1}}
\DeclareBiblatexOption{global,type,entry}[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}
{}}
\DeclareBiblatexOption{global,type,entry,namelist,name}[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{-}}}}
\DeclareBiblatexOption{global,type,entry}[boolean]{abbreviate}[true]{%
\ifstrequal{#1}{true}
{\def\abx@str{abx@sstr}}
{\def\abx@str{abx@lstr}}}
\DeclareBiblatexOption{global,type,entry}[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}%
\undef\blx@languagename
\undef\blx@forcelanguagename
\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}}}}
\DeclareBiblatexOption{global,type,entry}[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}}
\DeclareBiblatexOption{global,type,entry}[string]{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[string]{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[string]{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[string]{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}
\DeclareBiblatexOption{global,type,entry}[string]{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}}
\DeclareBiblatexOption{global,type,entry}[string]{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}}
\DeclareBiblatexOption{global,type,entry}[string]{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}}
\DeclareBiblatexOption{global,type,entry}[string]{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}}
\DeclareBiblatexOption{global,type,entry}[string]{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}}}
\DeclareBiblatexOption{type,entry}[boolean]{labelnumber}[true]{%
\settoggle{blx@labelnumber}{#1}}
\DeclareBiblatexOption{global,type,entry}[boolean]{labelalpha}[true]{%
\settoggle{blx@labelalpha}{#1}}
\DeclareBiblatexOption{global,type,entry}[boolean]{labeltitle}[true]{%
\settoggle{blx@labeltitle}{#1}}
\DeclareBiblatexOption{global,type,entry}[boolean]{labeltitleyear}[true]{%
\settoggle{blx@labeltitleyear}{#1}}
\DeclareBiblatexOption{global,type,entry}[boolean]{labeldateparts}[true]{%
\settoggle{blx@labeldateparts}{#1}}
\DeclareBiblatexOption{global,type}[string]{uniquelist}[true]{%
\ifcsdef{blx@opt@uniquelist@#1}
{\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
{\blx@err@invopt{uniquelist=#1}{}}}
\def\blx@opt@uniquelist@false{false}
\def\blx@opt@uniquelist@true{true}
\def\blx@opt@uniquelist@minyear{minyear}
\blx@DeclareBackendOption{entry,namelist}[string]{uniquelist}
\DeclareBiblatexOption{global,type}[boolean]{nohashothers}[true]{%
\settoggle{blx@nohashothers}{#1}}
\blx@DeclareBackendOption{entry,namelist}[boolean]{nohashothers}
\DeclareBiblatexOption{global,type}[boolean]{nosortothers}[true]{%
\settoggle{blx@nosortothers}{#1}}
\blx@DeclareBackendOption{entry,namelist}[boolean]{nosortothers}
\DeclareBiblatexOption{global,type}[string]{uniquename}[true]{%
\ifcsdef{blx@opt@uniquename@#1}
{\letcs\blx@uniquename{blx@opt@uniquename@#1}}
{\blx@err@invopt{uniquename=#1}{}}}
\def\blx@opt@uniquename@false{false}
\def\blx@opt@uniquename@init{init}
\def\blx@opt@uniquename@true{full}
\def\blx@opt@uniquename@full{full}
\def\blx@opt@uniquename@allinit{allinit}
\def\blx@opt@uniquename@allfull{allfull}
\def\blx@opt@uniquename@mininit{mininit}
\def\blx@opt@uniquename@minfull{minfull}
\blx@DeclareBackendOption{entry,namelist,name}[string]{uniquename}
\DeclareBiblatexOption{global,type}[boolean]{noroman}[true]{%
\settoggle{blx@noroman}{#1}}
\blx@DeclareBackendOption{entry}[boolean]{noroman}
\DeclareBiblatexOption{global,type}[boolean]{singletitle}[true]{%
\settoggle{blx@singletitle}{#1}}
\blx@DeclareBackendOption{entry}[boolean]{singletitle}
\DeclareBiblatexOption{global,type}[boolean]{uniquetitle}[true]{%
\settoggle{blx@uniquetitle}{#1}}
\blx@DeclareBackendOption{entry}[boolean]{uniquetitle}
\DeclareBiblatexOption{global,type}[boolean]{uniquebaretitle}[true]{%
\settoggle{blx@uniquebaretitle}{#1}}
\blx@DeclareBackendOption{entry}[boolean]{uniquebaretitle}
\DeclareBiblatexOption{global,type}[boolean]{uniquework}[true]{%
\settoggle{blx@uniquework}{#1}}
\blx@DeclareBackendOption{entry}[boolean]{uniquework}
\DeclareBiblatexOption{global,type}[boolean]{uniqueprimaryauthor}[true]{%
\settoggle{blx@uniqueprimaryauthor}{#1}}
\blx@DeclareBackendOption{entry}[boolean]{uniqueprimaryauthor}
\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{\abx@locallabelwidth}{#1}}
\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{%
\DeclareBiblatexOption{global,type,entry}[boolean]{use#1}[true]{%
\settoggle{blx@use#1}{##1}}}
\abx@donames
% Entry options
\DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{useprefix}[true]{%
\settoggle{blx@useprefix}{#1}}
\DeclareBiblatexOption{global,type,entry}[boolean]{skipbib}[true]{%
\settoggle{blx@skipbib}{#1}}
\DeclareBiblatexOption{global,type,entry}[boolean]{skipbiblist}[true]{%
\settoggle{blx@skipbiblist}{#1}}
\DeclareBiblatexOption{global,type,entry}[boolean]{skiplab}[true]{%
\settoggle{blx@skiplab}{#1}}
\DeclareBiblatexOption{global,type}[boolean]{dataonly}[true]{%
\settoggle{blx@skipbib}{#1}%
\settoggle{blx@skipbiblist}{#1}%
\settoggle{blx@skiplab}{#1}}
% the entry option is resolved by Biber
\blx@DeclareBackendOption{entry}[boolean]{dataonly}
% This is handled in a special way by by biber. It indicates what to set for various options
% if the dataonly option is "true". If biber finds dataonly=false
% in an entry, the booleans here will be reversed (skip*) and the unique* options (which are not
% booleans) will be ignored, defaulting to higher scope values. biber assumes
% that \blx@bcf@backendin@entry@* options are boolean options as otherwise, negating them
% per-entry makes little sense and it is not clear what to do with such lower-scope overrides.
\gdef\blx@bcf@backendin@entry@dataonly{uniquename=false,uniquelist=false,%
skipbib=true,skipbiblist=true,skiplab=true}
% 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}
{\ifdefstrequal\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}}
{}%
\ifdefstrequal\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}}
{}%
\ifdefstrequal\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}
{\ifdefstrequal\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}
{\blx@stripfromendinto{#1}{date}\blx@datetype
\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
\fi
\blx@bblinput
\blx@maxsection\z@
\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*{\DeclareDatamodelMultiscriptEntryfields}[1]{\blx@warn@dm{DeclareDatamodelMultiscriptEntryfields}}
\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}}
\def\BiblatexHungarianWarningOff{\global\let\lbx@hu@loadinfo\@empty}
\def\BiblatexLatvianWarningOff{\global\let\lbx@lv@loadinfo\@empty}
\endinput
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment