% 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{2024/03/21} \def\abx@version{3.20} \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)} \def\abx@dmid{\abx@date\space v\abx@version\space biblatex datamodel (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.11} % 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.3} \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} % The new hook management system in LaTeX 2020-10-01 and above % no longer guarantees that \AtBeginDocument/AfterPreamble % are executed in order of use. % Instead each use of those commands gets a 'label' % and code for the same label is chunked together. % We give our \AfterPreamble invocations a new label and set up a rule to % have it executed after all normal biblatex \AtBeginDocument stuff. % Note that begindocument is a one-time hook, so we are guaranteed % immediate execution when inside \begin{document}...\end{document}. \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} \IfFormatAtLeastTF{2020/10/01} {\def\blx@AfterPreamble{\AddToHook{begindocument}[biblatex/afterpreamble]}% \DeclareHookRule{begindocument}{biblatex/afterpreamble}{after}{biblatex}% \def\blx@AtEndDocument{\AddToHook{enddocument/afterlastpage}}} {\def\blx@AfterPreamble{\AfterPreamble}% \def\blx@AtEndDocument{\AtEndDocument}} % generalised keyval interface % define a new key (possibly with a default value) % {}{}[]{} \providerobustcmd*{\blx@kv@defkey}{\define@key} % globally define new key (should only be the last resort) % {}{}[]{} \providerobustcmd*{\blx@kv@gdefkey}[2]{% \@ifnextchar[% {\blx@kv@gdefkey@default{#1}{#2}} {\blx@kv@gdefkey@nodefault{#1}{#2}}} \ifundef\blx@kv@gdefkey@nodefault {\protected\def\blx@kv@gdefkey@nodefault#1#2{\csgdef{KV@#1@#2}##1}} {} \ifundef\blx@kv@gdefkey@default {\protected\def\blx@kv@gdefkey@default#1#2[#3]{% \csgdef{KV@#1@#2@default}{\csuse{KV@#1@#2}{#3}}% \csgdef{KV@#1@#2}##1}} {} % test if key is undefined % {}{}{}{} \providecommand*{\blx@kv@ifkeyundef}[2]{% \ifcsundef{KV@#1@#2}} % undefine key % {}{} \providerobustcmd*{\blx@kv@undef}[2]{\csundef{KV@#1@#2}} % {}{} \providerobustcmd*{\blx@kv@setkeys}{\setkeys} %% 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}} \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}} %% 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} {} \@ifpackageloaded{inputenc} {\global\cslet{blx@pkgloaded@inputenc}\@empty} {} \@ifpackageloaded{inputenx} {\global\cslet{blx@pkgloaded@inputenx}\@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}}} {}% \@ifpackageloaded{inputenc} {\ifcsundef{blx@pkgloaded@inputenc} {\blx@warning@noline{Load 'inputenc' before biblatex}} {}} {}% \@ifpackageloaded{inputenx} {\ifcsundef{blx@pkgloaded@inputenx} {} {\blx@warning@noline{Load 'inputenx' before biblatex}} {}} {}% % 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}{2020/04/08} {} {\blx@warning@noline {biblatex works best with 'polyglossia' 1.49\MessageBreak or above.\MessageBreak Please update 'polyglossia' to v1.49 (2020/04/08)\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}% % we need to patch \addtocontents \toggletrue{blx@tempa}% % kernel definition \patchcmd\addtocontents {\let} {\blx@contentssafe@citecommands \let} {} {\blx@err@patch{\string\addtocontents}}% % patch footnote \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}}}} {}} {}} {}% \iftoggle{blx@trackfloats} {} {\apptocmd\@floatboxreset {\boolfalse{citetracker}% \boolfalse{pagetracker}} {} {\blx@err@patch{floats}}}% \iftoggle{blx@backreffloats} {} {\apptocmd\@floatboxreset {\boolfalse{backtracker}} {} {\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@from@pkglist{#1}}% \expandafter\docsvlist\expandafter{\xpg@bloaded}% \def\do#1{\blx@langsetup@from@auxlist{#1}}% \dolistloop\blx@lbx@auxloadlist \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@from@pkglist{#1}}% \expandafter\docsvlist\expandafter{\bbl@loaded}% \def\do#1{\blx@langsetup@from@auxlist{#1}}% \dolistloop\blx@lbx@auxloadlist \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} {}% % babel/polyglossia has loaded the (main document) language already, % so we need to explicitly enable our captions (abx@strings@) % and extras (abx@extras@) now \ifdefstring{\blx@langhook}{captions} {\blx@etb@inittoggle{blx@lang@captions@\blx@languagename}% \toggletrue{blx@lang@captions@\blx@languagename}} {}% \csuse{abx@extras@\blx@languagename}% \csuse{abx@strings@\blx@languagename}% % avoid accidental re-initialization \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}}} {}% } \protected\def\blx@providecount#1{% \ifcscounter{#1} {} {\expandafter\newcount\csname #1\endcsname}} \def\blx@citecmds{} % \autocite and \autocites are not defined via \DeclareCiteCommand \listadd\blx@citecmds{autocite} \listadd\blx@citecmds{autocites} \newcommand*{\blx@contentssafe@citecommands}{% \forlistloop{\blx@mkcitecmd@contentssafe}{\blx@citecmds}} \def\blx@mkcitecmd@contentssafe#1{% \csdef{#1}{% \blx@tocontentsinit{\the\c@refsection}% \noexpand\csuse{#1}}} \protected\def\blx@tocontentsinit#1{% \boolfalse{citerequest}% \boolfalse{citetracker}% \boolfalse{pagetracker}% \boolfalse{backtracker}% \defcounter{refsection}{#1}} % 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{}{} 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}% \def\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.\MessageBreak The command is available (via 'pdftexcmds')\MessageBreak in recent versions of pdfTeX, LuaTeX and XeTeX}} {\let\blx@mdfivesum\pdf@mdfivesum} \newtoggle{blx@bbl@rerun@requested} \ifundef\pdf@filemdfivesum {\blx@warning@noline{Command '\string\pdf@filemdfivesum' undefined.\MessageBreak Biber rerun detection may not work as expected.\MessageBreak The command is available (via 'pdftexcmds')\MessageBreak in recent versions of pdfTeX, LuaTeX and XeTeX}% \let\blx@generate@bbl@mdfivesum@found\@gobble \let\blx@generate@bbl@mdfivesum@notfound\relax \let\abx@aux@read@bblrerun\relax \let\abx@aux@read@bbl@mdfivesum\@gobble \let\blx@aux@write@bbl@mdfivesum\relax \let\blx@check@bbl@rerun@mdfivesum\relax} {\let\blx@filemdfivesum\pdf@filemdfivesum \def\blx@generate@bbl@mdfivesum@found#1{% \xdef\blx@bbl@mdfivesum@new{\blx@filemdfivesum{#1}}} % 'nobblfile' can never be equal to any md5 hash \def\blx@generate@bbl@mdfivesum@notfound{% \gdef\blx@bbl@mdfivesum@new{nobblfile}} \def\abx@aux@read@bblrerun{\global\toggletrue{blx@bbl@rerun@requested}} \def\abx@aux@read@bbl@mdfivesum{% \gdef\blx@bbl@mdfivesum@old} % If we need Biber to rerun, save the hash of the current .bbl. % That way we can detect if the Biber rerun really happened when % we run LaTeX the next time. \def\blx@aux@write@bbl@mdfivesum{% \blx@auxwrite\@mainaux{}{% \string\abx@aux@read@bbl@mdfivesum{% \ifundef\blx@bbl@mdfivesum@old {nohash} {\blx@bbl@mdfivesum@new}}}% \iftoggle{blx@runbiber} {\blx@auxwrite\@mainaux{}{\string\abx@aux@read@bblrerun}} {}} % There was a Biber rerun request last time (\blx@bbl@mdfivesum@old), % yet the bbl files are the same (as far as md5 hashes are concerned), % that means *no* Biber rerun happened. % So we need to re-request a rerun. \def\blx@check@bbl@rerun@mdfivesum{% \iftoggle{blx@bbl@rerun@requested} {\ifdefstrequal\blx@bbl@mdfivesum@old\blx@bbl@mdfivesum@new} {\@secondoftwo} {\blx@logreq@active{}} {}}} % 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 % {}{}{} % will contain the bit of % after the first occurrence of \protected\def\blx@stripfromstartinto#1#2#3{% \def\blx@stripfromstart@i ##1#2##2&{% \def#3{##2}}% \blx@stripfromstart@i #1&} % {}{}{} % will contain the bit of % before the last occurence of \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 \newcounter{blx@maxsection} \def\theblx@maxsection{\the\c@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 \expandafter\newcount\csname blx@sectionciteorderinternal@0\endcsname \newcount\blx@entrysetcounter \newcount\blx@biblioinstance \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{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@pluralothers} \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} \listadd\blx@alllastrefsections{0} % Used to track defernumbers from .aux \global\let\blx@localnumbers\@empty % 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 namehash templates \global\let\blx@nhtemplatespecs\@empty % Used to track labelalphaname templates \global\let\blx@lantemplatespecs\@empty % Used to track transliterations \global\let\blx@translits\@empty % Initialise some lists which track changing citations/sortingtemplates % etc. between runs \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@localnumaux\@empty \global\cslet{blx@cites@0}\@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} % {} => \do{}\do{}... \def\blx@imc@docsvfield#1{% \blx@imc@iffieldundef{#1} {} {\expandafter\expandafter\expandafter\docsvlist \expandafter\expandafter\expandafter{% \csname abx@field@#1\endcsname}}} % {}{} => {}{}... \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} % {|} \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} % {}{} => elements of that are in \protected\def\blx@filter#1#2{% \def\do##1{% \ifinlistcs{##1}{#2} {\listadd#1{##1}} {}}% \blx@runfilter#1} % {}{} => matches in % 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} % {}{} => elements of that are not in \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} % {}{} => {} \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} % {}{} => {} \begingroup \catcode`\<=\active \catcode`\>=\active \catcode`\&=\active \catcode`\"=\active \catcode`\'=\active \protected\gdef\blx@xmlsanitizeafter#1#2{% \begingroup \abx@hook@xsanitize \def\blx@tempa{\endgroup#1}% \edef\blx@tempb{#2}% \let\do\@makeother \dospecials \catcode`\<=\active \catcode`\>=\active \catcode`\&=\active \catcode`\"=\active \catcode`\'=\active \edef<{\string<\string;}% \edef>{\string>\string;}% \edef&{\string&\string;}% \edef"{\string"\string;}% \edef'{\string&apos\string;}% \endlinechar\m@ne \everyeof{\noexpand}% \edef\blx@tempb{\scantokens\expandafter{\blx@tempb}}% \expandafter\blx@tempa \expandafter{\detokenize\expandafter{\blx@tempb}}} \endgroup % {}{}{}{}{}{} \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}% \csuse{blx@filehook@preload@#1}% #3\@@input\@filef@und#4% \csuse{blx@filehook@postload@#1}% #5% \listxadd\blx@list@req@stat{#1}% \@addtofilelist{#1}} {\blx@info@noline{... file '#1' not found}% \csuse{blx@filehook@failure@#1}% #6}% \global\cslet{blx@file@#1}\@empty} {#5}} % {}{}{} \protected\def\blx@auxwrite#1#2#3{% \if@filesw \begingroup \blx@safe@actives \let\protect\string #2% \immediate\write#1{#3}% \endgroup \fi} % {}{}{}{} \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{}} \edef\blx@ver@bcf{% \detokenize{}} % {}{} \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@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' \blx@kv@ifkeyundef{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@ 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} \blx@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{% \blx@warning@noline{% Please (re)run Biber on the file:\MessageBreak \jobname\MessageBreak and rerun LaTeX afterwards}} \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 } \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} % 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} % {} \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} % {} \newrobustcmd*{\DeclareQuotePunctuation}[1]{% \csdef{blx@qp@comma}{\blx@postpunct}% \csdef{blx@qp@semicolon}{\blx@postpunct}% \csdef{blx@qp@colon}{\blx@postpunct}% \csdef{blx@qp@period}{\blx@postpunct}% \csdef{blx@qp@exclam}{\blx@postpunct}% \csdef{blx@qp@question}{\blx@postpunct}% \cslet{blx@pq@comma}\@empty \cslet{blx@pq@semicolon}\@empty \cslet{blx@pq@colon}\@empty \cslet{blx@pq@period}\@empty \cslet{blx@pq@exclam}\@empty \cslet{blx@pq@question}\@empty \let\blx@quotepunct\@empty \ifblank{#1} {\let\blx@ifuspunct\@secondoftwo} {\let\blx@ifuspunct\@firstoftwo \expandafter\blx@defquotepunct\detokenize{#1}&}} \def\blx@defquotepunct#1{% \ifx\relax \else \ifcsdef{blx@pm@#1} {\appto\blx@quotepunct{#1}% \cslet{blx@qp@\csuse{blx@pm@#1}}\@empty \csdef{blx@pq@\csuse{blx@pm@#1}}{\blx@postpunct}} {\blx@warning{Ignoring invalid punctuation mark '#1'}}% \expandafter\blx@defquotepunct \fi} % {}{} \newrobustcmd*{\DeclarePunctuationPairs}[2]{% \ifcsdef{blx@sf@\detokenize{#1}} {\ifnum\csname blx@sf@\detokenize{#1}\endcsname>\blx@sf@prefixchar \ifnum\csname blx@sf@\detokenize{#1}\endcsname<\blx@sf@nopunct \expandafter\blx@defpunctpairs \expandafter{\the\csname blx@sf@\detokenize{#1}\endcsname}{#2}% \else \blx@err@invarg{\detokenize{#1}{}}% \fi \else \blx@err@invarg{\detokenize{#1}{}}% \fi} {\blx@err@invarg{\detokenize{#1}{}}}} \def\blx@defpunctpairs#1#2{% \blx@undefpair{#1}{\the\blx@sf@dot}% \blx@undefpair{#1}{\the\blx@sf@comma}% \blx@undefpair{#1}{\the\blx@sf@semicolon}% \blx@undefpair{#1}{\the\blx@sf@colon}% \blx@undefpair{#1}{\the\blx@sf@period}% \blx@undefpair{#1}{\the\blx@sf@exclam}% \blx@undefpair{#1}{\the\blx@sf@question}% \ifblank{#2} {} {\begingroup \def\blx@tempa{#1}% \let\blx@tempb\@empty \blx@setfrcodes \sfcode`\*=\blx@sf@dot \expandafter\blx@defpair\detokenize{#2}&% \expandafter\endgroup\blx@tempb}} \def\blx@defpair#1{% \ifx% \else \ifnum\the\sfcode`#1>\blx@sf@prefixchar \ifnum\the\sfcode`#1<\blx@sf@nopunct \eappto\blx@tempb{% \cslet{blx@pp@\blx@tempa @\the\sfcode`#1}\noexpand\@empty}% \else \blx@err@invarg{#1}{}% \fi \else \blx@err@invarg{#1}{}% \fi \expandafter\blx@defpair \fi} \def\blx@undefpair#1#2{% \ifcsdef{blx@pp@#1@#2} {\csundef{blx@pp@#1@#2}} {}} \protected\def\blx@resetpunct{% \DeclareCapitalPunctuation{.!?}% \DeclarePunctuationPairs{dot}{}% \DeclarePunctuationPairs{comma}{*!?}% \DeclarePunctuationPairs{semicolon}{*!?}% \DeclarePunctuationPairs{colon}{*!?}% \DeclarePunctuationPairs{period}{}% \DeclarePunctuationPairs{exclam}{*}% \DeclarePunctuationPairs{question}{*}% \DeclareQuotePunctuation{}% \def\abx@dot{\ifdim\lastkern>\z@\unkern\fi.\spacefactor\blx@sf@dot}% \def\abx@comma{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{,}}% \def\abx@semicolon{\abx@puncthook{;}}% \def\abx@colon{\abx@puncthook{:}}% \def\abx@period{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{.}}% \def\abx@exclam{\abx@puncthook{!}}% \def\abx@question{\abx@puncthook{?}}% \global\let\abx@puncthook\@firstofone \global\let\blx@postpunct\@empty} \blx@resetpunct % {}{}{} \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} % {}{} \protected\def\blx@imc@ifterm{% \ifhmode \expandafter\blx@imc@ifcapital \else \expandafter\@secondoftwo \fi} % {}{} \protected\def\blx@imc@ifcapital{% \ifcsdef{blx@cap@\blx@spacefactor}} % {}{} \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} % {} \newrobustcmd*{\autocap}[1]{#1} \protected\def\blx@imc@autocap{% \blx@imc@ifcapital\MakeCapital\@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} % First part of workaround for odd XeTeX/babel-french behaviour % https://github.com/plk/biblatex/issues/979 % fix by Ulrike Fischer % https://tex.stackexchange.com/a/544914/. % The second bit lives in blx-unicode.def. \ifundef\XeTeXrevision {\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 % {} \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 % {} \newrobustcmd*{\InitializeBibliographyStyle}{\appto\blx@hook@bbxinit} \@onlypreamble\InitializeBibliographyStyle % {}{} \newrobustcmd*{\DeclareBibliographyDriver}[1]{% \blx@declarebibdriver{#1}} \@onlypreamble\DeclareBibliographyDriver \long\def\blx@declarebibdriver#1#2{\long\csdef{blx@bbx@#1}{#2}} % {} \def\blx@driver#1{% \ifcsdef{blx@bbx@#1} {\csuse{blx@bbx@#1}} {\ifcsdef{blx@bbx@*} {\blx@warning{% No driver for '#1'.\MessageBreak Using fallback driver}% \csuse{blx@bbx@*}} {\blx@error {No driver for '#1' found} {I can't find a driver for '#1'\MessageBreak (entry type '\abx@field@entrytype')\MessageBreak and there is no fallback driver either}}}} % {}{}{} \def\blx@imc@ifdriver#1{\ifcsdef{blx@bbx@#1}} % {}{} \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}}} {}} % {} \newrobustcmd*{\savebibmacro}[1]{% \blx@save{abx@macro@\detokenize{#1}}} \newrobustcmd*{\restorebibmacro}[1]{% \blx@restore{abx@macro@\detokenize{#1}}} % {}[][]{} \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} % {}{} \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}}} % {} \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}}} % {}{}{} \def\blx@imc@ifbibmacroundef#1{% \ifcsundef{abx@macro@#1}} \def\ifbibmacroundef{\blx@imc@ifbibmacroundef} % {} \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}} % {}{} \def\blx@imc@usefield#1#2{% \expandafter\expandafter\expandafter#1% \expandafter\expandafter\expandafter{\csname abx@field@#2\endcsname}} % {} \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} % {}{} % 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}} {}} % {} \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 % {} % 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}} % {} % 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@}} % {} % 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@}} % {}{} \protected\def\blx@imc@restorefield#1{\cslet{abx@field@#1}} % {}{} \protected\def\blx@imc@restorelist#1{\cslet{abx@list@#1}} % {}{} \protected\def\blx@imc@restorename#1{\cslet{abx@name@#1}} % {}{} \protected\def\blx@imc@savefield{% \@ifstar{\blx@savedata{field}}{\global\blx@savedata{field}}} \def\blx@savedata#1#2#3{\letcs#3{abx@#1@#2}} % {}{} \protected\def\blx@imc@savelist{% \@ifstar{\blx@savedata{list}}{\global\blx@savedata{list}}} % {}{} \protected\def\blx@imc@savename{% \@ifstar{\blx@savedata{name}}{\global\blx@savedata{name}}} % {}{} \protected\def\blx@imc@savefieldcs{% \@ifstar{\blx@savedatacs{field}}{\global\blx@savedatacs{field}}} \def\blx@savedatacs#1#2#3{\csletcs{#3}{abx@#1@#2}} % {}{} \protected\def\blx@imc@savelistcs{% \@ifstar{\blx@savedatacs{list}}{\global\blx@savedatacs{list}}} % {}{} \protected\def\blx@imc@savenamecs{% \@ifstar{\blx@savedatacs{name}}{\global\blx@savedatacs{name}}} % {}{}{} \def\blx@imc@iffieldundef#1{% \ifcsundef{abx@field@#1}} % {}{}{} \def\blx@imc@iflistundef#1{% \ifcsundef{abx@list@#1}} % {}{}{} \def\blx@imc@ifnameundef#1{% \ifcsundef{abx@name@#1}} % {}{}{}{} \def\blx@imc@iffieldsequal#1#2{% \ifcsequal{abx@field@#1}{abx@field@#2}} % {}{}{}{} \def\blx@imc@iflistsequal#1#2{% \ifcsequal{abx@list@#1}{abx@list@#2}} % {}{}{}{} \def\blx@imc@ifnamesequal#1#2{% \ifcsundef{abx@name@#1} {\@secondoftwo} {\ifcsundef{abx@name@#2} {\@secondoftwo} {\blx@ifnamesequalcscs{abx@name@#1}{abx@name@#2}}}} \def\blx@ifnamesequalcscs#1#2{% \expandafter\expandafter\expandafter\blx@ifnamesequaldefdef \expandafter\expandafter\expandafter{% \expandafter\csname\expandafter #1\expandafter\endcsname \expandafter}% \expandafter{\csname #2\endcsname}} \def\blx@ifnamesequalcsdef#1#2{% \expandafter\blx@ifnamesequaldefdef\expandafter{% \csname #1\endcsname}{#2}} \def\blx@ifnamesequaldefdef#1#2{% \begingroup \let\blx@tempa\@empty \expandafter\blx@ifnamesequal@i#2% \let\blx@tempb\blx@tempa \let\blx@tempa\@empty \expandafter\blx@ifnamesequal@i#1% \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{% \blx@kv@setkeys{blx@opt@name}{#1}% \blx@kv@setkeys{blx@opt@namepart}{#2}% \ifdef\abx@field@hash {\eappto\blx@tempa{{\abx@field@hash}}} {\eappto\blx@tempa{{{\namepartfamily}{\namepartgiven}{\namepartprefix}{\namepartsuffix}}}}} % {}{}{}{} \newcommand*{\blx@ifcsdefequal}[2]{% \ifcsundef{#1} {\@secondoftwo} {\ifundef#2% {\@secondoftwo} {\expandafter\ifx\csname#1\endcsname#2% \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}}} % {}{}{}{} \def\blx@imc@iffieldequals#1#2{% \blx@ifcsdefequal{abx@field@#1}{#2}} % {}{}{}{} \def\blx@imc@iflistequals#1#2{% \blx@ifcsdefequal{abx@list@#1}{#2}} % {}{}{}{} \def\blx@imc@ifnameequals#1#2{% \blx@imc@ifnameundef{#1} {\@secondoftwo} {\ifundef#2% {\@secondoftwo} {\blx@ifnamesequalcsdef{abx@name@#1}{#2}}}} % {}{}{}{} \def\blx@imc@iffieldequalcs#1{% \ifcsequal{abx@field@#1}} % {}{}{}{} \def\blx@imc@iflistequalcs#1{% \ifcsequal{abx@list@#1}} % {}{}{}{} \def\blx@imc@ifnameequalcs#1#2{% \blx@imc@ifnameundef{#1} {\@secondoftwo} {\ifcsundef{#2} {\@secondoftwo} {\blx@ifnamesequalcscs{abx@name@#1}{#2}}}} % {}{}{}{} \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}}} % {}{}{} \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}}} % {}{}{} \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} % {}{}{} \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} % {}{}{} \protected\def\blx@imc@ifcurrentfield#1{% \begingroup \def\blx@tempa{#1}% \ifx\currentfield\blx@tempa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi \endgroup} % {}{}{} \protected\def\blx@imc@ifcurrentlist#1{% \begingroup \def\blx@tempa{#1}% \ifx\currentlist\blx@tempa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi \endgroup} % {}{}{} \protected\def\blx@imc@ifcurrentname#1{% \begingroup \def\blx@tempa{#1}% \ifx\currentname\blx@tempa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi \endgroup} % {}{}{} \protected\def\blx@imc@ifentrytype#1{% \begingroup \def\blx@tempa{#1}% \ifx\abx@field@entrytype\blx@tempa \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi \endgroup} % {}{} \def\blx@imc@ifmorenames{% \ifundef\currentname {\@secondoftwo} {\iftoggle{abx@bool@more\currentname} {\@firstoftwo} {\ifnum\c@listtotal>\c@liststop \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}}} % {}{} \def\blx@imc@ifmoreitems{% \ifundef\currentlist {\@secondoftwo} {\iftoggle{abx@bool@more\currentlist} {\@firstoftwo} {\ifnum\c@listtotal>\c@liststop \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}}} % {}{} %\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@iffirstcitekey{% \ifnumequal\c@citecount\@ne {\ifnumequal\c@multicitetotal\z@ {\@firstoftwo} {\ifnumequal\c@multicitecount\@ne}} {\@secondoftwo}} \def\blx@imc@iflastcitekey{% \ifnumequal\c@citecount\c@citetotal {\ifnumequal\c@multicitecount\c@multicitetotal} {\@secondoftwo}} % {}{}{} \protected\def\blx@imc@ifcategory{% \ifdef\abx@field@entrykey {\blx@imc@ifentrycategory\abx@field@entrykey} {\expandafter\@secondoftwo\@gobble}} % {}{}{}{} \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}} % {}{}{} \protected\def\blx@imc@ifkeyword{% \ifdef\abx@field@entrykey {\blx@imc@ifentrykeyword\abx@field@entrykey} {\expandafter\@secondoftwo\@gobble}} % {}{}{}{} \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}} % {}{} \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}} % {}{}{} \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}} % {}{} \def\blx@ifciteibid@global{% \ifbool{citetracker} {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text} {\@secondoftwo}} \def\blx@ifciteibid@context{% \ifbool{citetracker} {\iftoggle{blx@footnote} {\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot} {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}} {\@secondoftwo}} \def\blx@ifciteibid@strict{% \ifbool{citetracker} {\blx@ifcitesingle {\blx@ifciteibid@global} {\@secondoftwo}} {\@secondoftwo}} \def\blx@ifciteibid@constrict{% \ifbool{citetracker} {\blx@ifcitesingle {\iftoggle{blx@footnote} {\blx@ifmpfncheck {\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot} {\@secondoftwo}} {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}} {\@secondoftwo}} {\@secondoftwo}} % {}{} \def\blx@ifciteidem@global{% \ifbool{citetracker} {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text} {\@secondoftwo}} \def\blx@ifciteidem@context{% \ifbool{citetracker} {\iftoggle{blx@footnote} {\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot} {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}} {\@secondoftwo}} \let\blx@ifciteidem@strict\blx@ifciteidem@global \def\blx@ifciteidem@constrict{% \ifbool{citetracker} {\iftoggle{blx@footnote} {\blx@ifmpfncheck {\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot} {\@secondoftwo}} {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}} {\@secondoftwo}} % {}{} \def\blx@ifopcit@global{% \ifbool{citetracker} {\blx@imc@iffieldundef{namehash} {\@secondoftwo} {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}} {\@secondoftwo}} \def\blx@ifopcit@context{% \ifbool{citetracker} {\blx@imc@iffieldundef{namehash} {\@secondoftwo} {\iftoggle{blx@footnote} {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}} {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}} {\@secondoftwo}} \def\blx@ifopcit@strict{% \ifbool{citetracker} {\blx@ifcitesingle {\blx@ifopcit@global} {\@secondoftwo}} {\@secondoftwo}} \def\blx@ifopcit@constrict{% \ifbool{citetracker} {\blx@ifcitesingle {\blx@imc@iffieldundef{namehash} {\@secondoftwo} {\iftoggle{blx@footnote} {\blx@ifmpfncheck {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}} {\@secondoftwo}} {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}} {\@secondoftwo}} {\@secondoftwo}} % {}{} \def\blx@ifloccit@global{% \ifbool{citetracker} {\blx@loccit@check{text}} {\@secondoftwo}} \def\blx@ifloccit@context{% \ifbool{citetracker} {\iftoggle{blx@footnote} {\blx@loccit@check{foot}} {\blx@loccit@check{text}}} {\@secondoftwo}} \def\blx@ifloccit@strict{% \ifbool{citetracker} {\blx@ifcitesingle {\blx@loccit@numcheck{text}} {\@secondoftwo}} {\@secondoftwo}} \def\blx@ifloccit@constrict{% \ifbool{citetracker} {\blx@ifcitesingle {\iftoggle{blx@footnote} {\blx@ifmpfncheck {\blx@loccit@numcheck{foot}} {\@secondoftwo}} {\blx@loccit@numcheck{text}}} {\@secondoftwo}} {\@secondoftwo}} \def\blx@loccit@check#1{% \blx@imc@iffieldundef{postnote} {\@secondoftwo} {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}}} \def\blx@loccit@numcheck#1{% \blx@imc@iffieldundef{postnote} {\@secondoftwo} {\expandafter\blx@imc@ifpages \expandafter{\abx@field@postnote} {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}} {\@secondoftwo}}} % {}{} \def\blx@ifmpfncheck{% \ifnum\numexpr\value\@mpfn-\blx@lastmpfn<\tw@ \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi} \def\blx@mpfnsave{% \xdef\blx@lastmpfn{\the\value\@mpfn}} \def\blx@mpfnreset{% \global\let\blx@lastmpfn\z@} \blx@mpfnreset % {}{} \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}} % {}{}{}{} \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} % {}{}{} \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% \catcode`\@=11 \catcode`\%=9 \endlinechar\m@ne \uppercase{\scantokens{\def\blx@tempa{#1}}}% \ifx\blx@tempa\@empty \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi \endgroup} % {\}{\} \protected\def\blx@defcomputableequivalent#1#2{% \appto\blx@dononasciicomputablenumerals{\do#1}% \appto\blx@initcomputableequivs{\uccode`#1=`#2}} % {}{}{} \protected\long\def\blx@imc@hascomputableequivalent#1{% \begingroup \def\do##1{\uccode`##1=`\%}% \blx@dononasciicomputablenumerals \catcode`\@=11 \catcode`\%=9 \endlinechar\m@ne \uppercase{\scantokens{\def\blx@tempa{#1}}}% \ifx\blx@tempa\@empty \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo \fi \endgroup} % {}{}{} \protected\long\def\blx@imc@ifiscomputable#1{% \blx@imc@ifinteger{#1} {\@firstofone} {\blx@imc@hascomputableequivalent{#1}}} % {}{} \protected\long\def\blx@imc@getcomputableequivalent#1#2{% \blx@imc@hascomputableequivalent{#1} {\begingroup \blx@initcomputableequivs \uppercase{\def\blx@tempa{#1}}% \edef\blx@tempb{\endgroup \noexpand\def\noexpand#2{\expandonce{\blx@tempa}}}% \blx@tempb} {\def#2{#1}}} % {}{}{} \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}}} % {}{}{} \protected\def\blx@imc@fieldhascomputableequivalent#1{% \blx@imc@iffieldundef{#1} {\@secondoftwo} {\expandafter\expandafter \expandafter\blx@imc@hascomputableequivalent \expandafter\expandafter \expandafter{\csname abx@field@#1\endcsname}}} % {}{}{} \protected\def\blx@imc@iffieldiscomputable#1{% \blx@imc@iffieldundef{#1} {\@secondoftwo} {\expandafter\expandafter \expandafter\blx@imc@ifiscomputable \expandafter\expandafter \expandafter{\csname abx@field@#1\endcsname}}} % {}{}{} \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 \catcode`\@=11 \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} % valid numerals set by the lbx file \let\lbx@dononasciinumerals\relax \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 \lbx@dononasciinumerals \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} % {}{}{} \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}}} % {} \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}} % {} \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} % {} \newrobustcmd*{\DeclareRangeCommands}{% \@ifstar {\blx@defrangecmds} {\global\let\blx@dorangecmds\@empty \blx@defrangecmds}} \def\blx@defrangecmds#1{% \ifblank{#1} {} {\blx@defrangecmds@i#1&}} \def\blx@defrangecmds@i#1{% \ifx% \else \gappto\blx@dorangecmds{\do#1}% \expandafter\blx@defrangecmds@i \fi} % {} \newrobustcmd*{\DeclarePageCommands}{% \@ifstar {\blx@defpagecmds} {\global\let\blx@dopagecmds\@empty \blx@defpagecmds}} \def\blx@defpagecmds#1{% \ifblank{#1} {} {\blx@defpagecmds@i#1&}} \def\blx@defpagecmds@i#1{% \ifx% \else \gappto\blx@dopagecmds{\do#1}% \expandafter\blx@defpagecmds@i \fi} \DeclareNumChars{.} \DeclareRangeChars{~,;-+/} \DeclareRangeCommands{% \ \,\space\nobreakspace\addspace\addnbspace \addthinspace\addnbthinspace\addlowpenspace \addhighpenspace\addlpthinspace\addhpthinspace \adddotspace\addabbrvspace\&\psq\psqq \bibrangedash\bibdaterangesep\bibtimerangesep\textendash\textemdash\bibrangessep} \DeclarePageCommands{\pno\ppno} % *{} \newrobustcmd*{\NumCheckSetup}{\appto\blx@hook@ifnum} \newcommand*{\NumcheckSetup}{\NumCheckSetup} \newrobustcmd*{\NumsCheckSetup}{\appto\blx@hook@ifnums} \newrobustcmd*{\PagesCheckSetup}{\appto\blx@hook@ifpages} \PagesCheckSetup{\let\pnfmt\@firstofone} % [][]{} \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} % [][]{} \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} % {} \newcommand*{\rangelen}[1]{% \ifcsdef{abx@range@#1} {\csuse{abx@range@#1}} {}} % <*>[]{} \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{% \protected@edef\blx@normrange@abort{% \blx@range@out@value{% \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \blx@range@out@item@process{\unexpanded{#1}}% \noexpand\bibrangedash}}% \blx@tempc} {\ifblank{#1} {\begingroup \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \noexpand\bibrangedash \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \noexpand\bibrangedash \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \blx@range@out@item@process{\expandonce\blx@tempb}% \noexpand\bibrangedash}}% \blx@tempc} {\notblank{#1} {\ifdefempty\blx@tempb {\begingroup \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \noexpand\bibrangedash \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \blx@range@out@item@process{\unexpanded{#1}}% \noexpand\bibrangedash \blx@range@out@item@process{\unexpanded{#2}}}}% \blx@tempc} % <*>[]{} \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \blx@range@out@item@process{\unexpanded{#1}}% \noexpand\bibrangedash \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 \protected@edef\blx@tempb{\endgroup \blx@range@out@value{% \blx@range@out@item@process{\blx@tempb}% \noexpand\bibrangedash \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} % <*>[]{} \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{% \protected@edef\blx@firstpage@abort{% \blx@range@out@value{% \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \noexpand\bibrangedash \blx@range@out@item@process{\unexpanded{#2}}}}% \blx@tempc} {\begingroup \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \noexpand\bibrangedash \blx@range@out@item@process{% \unexpanded{#2}}}}% \blx@tempc}} {\begingroup \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \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 \protected@edef\blx@tempc{\endgroup \blx@range@out@value{% \noexpand\bibrangedash \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 % []{}{} \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{% \ifcsdef{#1#3} {\blx@inf@delimdeclare{#3}{#2}} {}% \csdef{#1#3}{#4}} % []{}[]{} % deprecated: *[]{}[]{} % the starred version is only implemented for backwards compatibility % the only difference is that a missing first argument % implies the global/empty context \newrobustcmd*{\DeclareDelimAlias}{% \@ifstar {\blx@declaredelimalias@s} {\blx@declaredelimalias@a}} \def\blx@declaredelimalias@s{% \blx@warning{% The starred command '\string\DeclareDelimAlias*' is\MessageBreak deprecated.% \MessageBreak Use the unstarred version '\string\DeclareDelimAlias'\MessageBreak instead}% \@ifnextchar[%] {\blx@declaredelimalias@om} {\blx@declaredelimalias@om[]}} \def\blx@declaredelimalias@a{% \@ifnextchar[%] {\blx@declaredelimalias@om} {\blx@declaredelimalias@m}} \def\blx@declaredelimalias@m#1{% \@ifnextchar[%] {\blx@declaredelimalias@mom{#1}} {\blx@declaredelimalias@mm{#1}}} \def\blx@declaredelimalias@mm{% \blx@declaredelimalias@auto} \def\blx@declaredelimalias@mom{% \blx@declaredelimalias@omom[]} \def\blx@declaredelimalias@om[#1]#2{% \@ifnextchar[%] {\blx@declaredelimalias@omom[{#1}]{#2}} {\blx@declaredelimalias@omm[{#1}]{#2}}} % hrmpf ... remember that \docsvlist doesn't do anthing for empty % lists/list items \def\blx@declaredelimalias@omom[#1]#2[#3]#4{% \ifstrequal{#1}{*} {\ifstrequal{#3}{*} {\blx@declaredelimalias@auto{#2}{#4}} {\blx@cleardelim{#1}% \blx@declaredelimalias@manual{}{#2}{#3}{#4}}} {\def\do##1{\blx@declaredelimalias@manual{##1}{#2}{#3}{#4}}% \ifblank{#1} {\do{}} {\docsvlist{#1}}}} \def\blx@declaredelimalias@omm[#1]#2#3{% \ifstrequal{#1}{*} {\blx@declaredelimalias@auto{#2}{#3}} {\def\do##1{\blx@declaredelimalias@manual{##1}{#2}{##1}{#3}}% \ifblank{#1} {\do{}} {\docsvlist{#1}}}} % {}{} \def\blx@declaredelimalias@auto#1#2{% \blx@cleardelim{#1}% \blx@declaredelimalias@manual{}{#1}{}{#2}% \ifcsvoid{blx@declaredelimcontexts@#2} {} {\def\do##1{% \blx@declaredelimalias@manual{##1}{#1}{##1}{#2}}% \dolistcsloop{blx@declaredelimcontexts@#2}}} % {}{}{}{} \def\blx@declaredelimalias@manual#1#2#3#4{% \begingroup \ifblank{#1} {\def\blx@tempa{{}{}}} {\def\blx@tempa{{blx@printdelim@#1@}{#1}}}% \ifblank{#3} {\def\blx@tempb{{}{}}} {\def\blx@tempb{{blx@printdelim@#3@}{#3}}}% \edef\blx@tempc{\endgroup \noexpand\blx@declaredelimalias@def% \expandonce\blx@tempa {\unexpanded{#2}}% \expandonce\blx@tempb {\unexpanded{#4}}}% \blx@tempc} % {}{}{} % {}{}{} \def\blx@declaredelimalias@def#1#2#3#4#5#6{% \ifcsdef{#1#3} {\blx@inf@delimdeclare{#3}{#2}} {}% \ifblank{#2} {} {\ifinlistcs{#2}{blx@declaredelimcontexts@#3} {} {\listcsadd{blx@declaredelimcontexts@#3}{#2}}}% \csdef{#1#3}{\ifcsundef{#4#6}{\csuse{#6}}{\csuse{#4#6}}}} \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}} \newcommand*{\UndeclareDelimcontextAlias}[1]{% \csundef{blx@delimcontextalias@#1}} \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{% \delimcontext{bib}% \let\finentry\blx@finentry@usedrv \let\newblock\relax \let\abx@macro@bibindex\@empty \let\abx@macro@pageref\@empty} % {}{} \protected\def\blx@imc@usedriver#1#2{% \begingroup \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{% \iftoggle{blx@labeldateparts} {\iffieldundef{labeldatesource} {\@secondoftwo} {\iffieldequalstr{labeldatesource}{} {\@firstoftwo} {\iffieldequalstr{labeldatesource}{year}}}} {\@secondoftwo}} \def\blx@imc@ifdatehasyearonlyprecision#1{% \iffieldundef{#1year} {\@secondoftwo} {\ifcsstring{blx@dateformat@#1date}{year} {\@firstoftwo} {\iffieldundef{#1month} {\iffieldundef{#1yeardivision}} {\@secondoftwo}}}} \def\blx@imc@ifdatehastime#1{% \iftoggle{blx@#1dateusetime} {\iffieldundef{#1hour} {\@secondoftwo} {\@firstoftwo}} {\@secondoftwo}} \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{% \iffieldsequal{#1year}{#2year} {\iffieldundef{#1dateera} {\iffieldundef{#2dateera}} {\iffieldsequal{#1dateera}{#2dateera}}} {\@secondoftwo}} \def\blx@reconstruct@comparabledate#1{% \thefield{#1year}-\thefield{#1month}(\thefield{#1yeardivision})-% \thefield{#1day}T% \thefield{#1hour}:\thefield{#1minute}:\thefield{#1second}Z% \thefield{#1timezone}//% e\thefield{#1dateera}E% c\csuse{if#1datecirca}{T}{F}% j\csuse{if#1datejulian}{T}{F}% r\csuse{if#1dateuncertain}{T}{F}% k\csuse{if#1dateunknown}{T}{F}% } \def\blx@imc@ifdatesequal#1#2{% \begingroup \edef\blx@tempa{\blx@reconstruct@comparabledate{#1}}% \edef\blx@tempb{\blx@reconstruct@comparabledate{#2}}% \edef\blx@tempc{\endgroup \ifstrequal{\blx@tempa}{\blx@tempb}}% \blx@tempc } \def\blx@imc@ifdaterangesequal#1#2{% \blx@imc@ifdatesequal{#1}{#2} {\blx@imc@ifdatesequal{#1end}{#2end}} {\@secondoftwo}} \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 \hascomputableequivalent \ifiscomputable \getcomputableequivalent \ifnumeral \ifnumerals \ifpages \iffieldint \fieldhascomputableequivalent \iffieldiscomputable \iffieldnum \iffieldnums \iffieldpages \iflabeldateisdate \ifdatehasyearonlyprecision \ifdatehastime \ifdateshavedifferentprecision \ifdateyearsequal \ifdatesequal \ifdaterangesequal \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 %% Main formatting commands % They work by creating a \let alias: % \abx@@@ -> \blx@defformat@d % for later use in \print* % Then, \blx@defformat@d is defined by calling % \def\blx@defformat@d#1{format body} % []{}{} \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*{\DeclareListWrapperFormat}{% \@ifstar {\blx@defformat\blx@defplainformat{lwd}*} {\blx@defformat\blx@defplainformat{lwd}{}}} % {}{}{<*>} \def\blx@defformat#1#2#3{% \@ifnextchar[%] {\blx@defformat@i{#1}{#2}{#3}} {\blx@defformat@i{#1}{#2}{#3}[*]}} % {}{}{<*>}[]{} \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} % grab the argument explicitly, this avoids issues with spaces making it % into the argument specification of the macros % cf. \def\foo#1{} vs. \def\foo#1 {} \long\def\blx@defplainformat#1{% \long\def\blx@defformat@d##1{#1}} \long\def\blx@defnameformat#1{% \long\def\blx@defformat@d##1{#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}} {}} % {}{} \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}}} % {}{}{}{} \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}}} % []{} \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}} % []{}{}{} \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}} % []{}[]{} \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*{\DeclareListWrapperAlias}{\blx@defalias{lwd}} % #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}} % []{}[]{} \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*{\DeprecateListWrapperFormatWithReplacement}{% \blx@deprecateformat{lwd}{List wrapper format}} % []{} \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}}} % []{} \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}}} % []{} \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}}} % []{} \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}} % {}[][-] % => {}{}{} \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}} % [][-]{} \protected\def\blx@imc@printnames{% \blx@listargs\blx@printnames} % {}{}{}{} \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}% \ifboolexpr{test {\iftoggle{blx@pluralothers}} and test {\ifnumcomp{\value{listtotal}-\value{liststop}}{=}{1}}} {\c@liststop\c@listtotal} {}% \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} {} {\blx@kv@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 \blx@kv@defkey{blx@opt@namelist}{ul}{\c@uniquelist#1\relax} \blx@kv@defkey{blx@opt@name}{un}{\c@uniquename#1\relax} \blx@kv@defkey{blx@opt@name}{uniquepart}{\def\abx@field@uniquepart{#1}} \blx@kv@defkey{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}{\isdot\addnbspace} % [][-]{} \protected\def\blx@imc@indexnames{% \blx@listargs\blx@indexnames} % {}{}{}{} \def\blx@indexnames#1#2#3#4{% \blx@imc@ifnameundef{#4} {} {\blx@getformat\blx@theformat{nid}{#1}{#4}% \ifdefvoid\blx@theformat {} {\begingroup \blx@namesetup{#2}{#3}{#4}% \blx@indexnamesetup \expandafter\blx@nameparser\blx@thedata{}&% \endgroup}}} \def\blx@indexnamesetup{% \let\bibinitperiod\bibindexinitperiod \let\bibinitdelim\bibindexinitdelim \let\bibinithyphendelim\bibindexinithyphendelim \let\bibnamedelima\bibindexnamedelima \let\bibnamedelimb\bibindexnamedelimb \let\bibnamedelimc\bibindexnamedelimc \let\bibnamedelimd\bibindexnamedelimd \let\bibnamedelimi\bibindexnamedelimi} % {}{}{...} \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} {} {\blx@kv@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}% \blx@kv@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&{} % [][-]{} \protected\def\blx@imc@printlist{% \blx@listargs\blx@printlist} % {}{}{}{} \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}} % [][-]{} \protected\def\blx@imc@indexlist{% \blx@listargs\blx@indexlist} % {}{}{}{} \def\blx@indexlist#1#2#3#4{% \blx@imc@iflistundef{#4} {} {\blx@getformat\blx@theformat{lid}{#1}{#4}% \ifdefvoid\blx@theformat {} {\begingroup \blx@listsetup{#2}{#3}{#4}% \expandafter\blx@listparser\blx@thedata{}&% \endgroup}}} % {}{}{...} \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&{} % <*>{}{} \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} \let\blx@bibstringsets\@empty % {}{,...,} \newrobustcmd*{\DeclareBibstringSet}[1]{% \listadd\blx@bibstringsets{#1}% \def\do##1{% \csdef{blx@bibstringset@string@##1}{#1}% \listcsadd{blx@bibstringset@set@#1}{##1}}% \docsvlist} % {} \newrobustcmd*{\UndeclareBibstringSet}[1]{% \def\do##1{\csundef{blx@bibstringset@string@##1}}% \dolistcsloop{blx@bibstringset@set@#1}% \csundef{blx@bibstringset@set@#1}% \UndeclareBibstringSetFormat{#1}} \newrobustcmd*{\UndeclareBibstringSets}{% \forlistloop{\UndeclareBibstringSet}{\blx@bibstringsets}% \let\blx@bibstringsets\@empty} % {}{} \newrobustcmd*{\DeclareBibstringSetFormat}[1]{% \csdef{blx@bibstringsetformat@#1}##1} % {} \newrobustcmd*{\UndeclareBibstringSetFormat}[1]{% \csundef{blx@bibstringsetformat@#1}} % {}{}{} \def\blx@wrapbibstring#1#2#3{% \ifcsundef{blx@bibstringset@string@#2} {#1{#3}} {\ifcsundef{blx@bibstringsetformat@\csuse{blx@bibstringset@string@#2}} {#1{#3}} {#1{\csuse{blx@bibstringsetformat@\csuse{blx@bibstringset@string@#2}} {#3}}}}} %% Localization % {}{}{}{} % is executed when the bibstring is defined % it differs between the \bib...string versions % in \blx@tempa should be used as \protected\def\blx@met@bibstring#1#2#3#4{% \blx@begunit \blx@hyphenreset \blx@bibstringsimple \lowercase{\edef\blx@tempa{#3}}% \ifcsundef{#2@\blx@tempa} {\blx@warn@nostring\blx@tempa \blx@endnounit} {#4}} % []{} \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@met@bibstring{#1}{#2}{#3} {\blx@imc@ifcapital {\blx@wrapbibstring{#1}{\blx@tempa}{\MakeCapital{\csuse{#2@\blx@tempa}}}} {\blx@wrapbibstring{#1}{\blx@tempa}{\csuse{#2@\blx@tempa}}}% \blx@endunit}} % []{} \newrobustcmd*{\blx@imc@bibncpstring}[2][\@firstofone]{% \blx@bibncpstring{#1}{\abx@str}{#2}} \newrobustcmd*{\blx@imc@bibncplstring}[2][\@firstofone]{% \blx@bibncpstring{#1}{abx@lstr}{#2}} \newrobustcmd*{\blx@imc@bibncpsstring}[2][\@firstofone]{% \blx@bibncpstring{#1}{abx@sstr}{#2}} \protected\def\blx@bibncpstring#1#2#3{% \blx@met@bibstring{#1}{#2}{#3} {\blx@wrapbibstring{#1}{\blx@tempa}{\csuse{#2@\blx@tempa}}% \blx@endunit}} % []{} \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@met@bibstring{#1}{#2}{#3} {\blx@wrapbibstring{#1}{\blx@tempa}{\MakeCapital{\csuse{#2@\blx@tempa}}}% \blx@endunit}} % []{} \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@met@bibstring{#1}{#2}{#3} {\blx@wrapbibstring{#1}{\blx@tempa}{\blx@maketext@lowercase{\csuse{#2@\blx@tempa}}}% \blx@endunit}} % []{} \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@met@bibstring{#1}{#2}{#3} {\blx@wrapbibstring{#1}{\blx@tempa}{\blx@maketext@uppercase{\csuse{#2@\blx@tempa}}}% \blx@endunit}} % {} \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}}} % {}{}{} \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}} % {}{}{} \def\blx@imc@iffieldbibstring#1{% \blx@imc@iffieldundef{#1} {\@secondoftwo} {\ifcsundef{\abx@str @\detokenize\expandafter \expandafter\expandafter{% \csname abx@field@#1\endcsname}} {\@secondoftwo} {\@firstoftwo}}} % {}{}{}{} \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 \bibncpstring \bibncplstring \bibncpsstring \bibcpstring \bibcplstring \bibcpsstring \biblcstring \biblclstring \biblcsstring \bibucstring \bibuclstring \bibucsstring \ifbibstring \ifbibxstring \iffieldbibstring \iffieldplusstringbibstring} % \DeclareCaseChangeEquivalent is available in % LaTeX 2022-06-01-PL5 % the older code works-ish for LaTeX before 2022-06-01 % it errors with 2022-06-01-PL4 % but we'll not guard against this specific PL \ifundef\DeclareCaseChangeEquivalent {\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}}}} {\DeclareCaseChangeEquivalent{\bibstring}{% \CaseSwitch {\blx@imc@bibstring} {\blx@imc@bibucstring} {\blx@imc@biblcstring} {\blx@imc@bibcpstring}} \DeclareCaseChangeEquivalent{\biblstring}{% \CaseSwitch {\blx@imc@biblstring} {\blx@imc@bibuclstring} {\blx@imc@biblclstring} {\blx@imc@bibcplstring}} \DeclareCaseChangeEquivalent{\bibsstring}{% \CaseSwitch {\blx@imc@bibsstring} {\blx@imc@bibucsstring} {\blx@imc@biblcsstring} {\blx@imc@bibcpsstring}} \DeclareCaseChangeEquivalent{\biblcstring}{% \CaseSwitch {\blx@imc@bibstring} {\blx@imc@bibucstring} {\blx@imc@biblcstring} {\blx@imc@bibcpstring}} \DeclareCaseChangeEquivalent{\biblclstring}{% \CaseSwitch {\blx@imc@biblstring} {\blx@imc@bibuclstring} {\blx@imc@biblclstring} {\blx@imc@bibcplstring}} \DeclareCaseChangeEquivalent{\biblcsstring}{% \CaseSwitch {\blx@imc@bibsstring} {\blx@imc@bibucsstring} {\blx@imc@biblcsstring} {\blx@imc@bibcpsstring}} \DeclareCaseChangeEquivalent{\bibucstring}{% \CaseSwitch {\blx@imc@bibstring} {\blx@imc@bibucstring} {\blx@imc@biblcstring} {\blx@imc@bibcpstring}} \DeclareCaseChangeEquivalent{\bibuclstring}{% \CaseSwitch {\blx@imc@biblstring} {\blx@imc@bibuclstring} {\blx@imc@biblclstring} {\blx@imc@bibcplstring}} \DeclareCaseChangeEquivalent{\bibucsstring}{% \CaseSwitch {\blx@imc@bibsstring} {\blx@imc@bibucsstring} {\blx@imc@biblcsstring} {\blx@imc@bibcpsstring}} \DeclareCaseChangeEquivalent{\bibcpstring}{% \CaseSwitch {\blx@imc@bibstring} {\blx@imc@bibucstring} {\blx@imc@biblcstring} {\blx@imc@bibcpstring}} \DeclareCaseChangeEquivalent{\bibcplstring}{% \CaseSwitch {\blx@imc@biblstring} {\blx@imc@bibuclstring} {\blx@imc@biblclstring} {\blx@imc@bibcplstring}} \DeclareCaseChangeEquivalent{\bibcpsstring}{% \CaseSwitch {\blx@imc@bibsstring} {\blx@imc@bibucsstring} {\blx@imc@biblcsstring} {\blx@imc@bibcpsstring}}} \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{langbasque}% \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{langlithuanian}% \do{langmarathi}% \do{langnorwegian}% \do{langpolish}% \do{langportuguese}% \do{langserbian}% \do{langromanian}% \do{langrussian}% \do{langslovak}% \do{langslovene}% \do{langspanish}% \do{langswedish}% \do{langturkish}% \do{langukrainian}% \do{fromamerican}% \do{frombasque}% \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{fromlithuanian}% \do{fromlatvian}% \do{frommarathi}% \do{fromnorwegian}% \do{frompolish}% \do{fromportuguese}% \do{fromromanian}% \do{fromrussian}% \do{fromserbian}% \do{fromslovak}% \do{fromslovene}% \do{fromspanish}% \do{fromswedish}% \do{fromturkish}% \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{springN}% \do{summerN}% \do{autumnN}% \do{winterN}% \do{springS}% \do{summerS}% \do{autumnS}% \do{winterS}% \do{Q1}% \do{Q2}% \do{Q3}% \do{Q4}% \do{QD1}% \do{QD2}% \do{QD3}% \do{S1}% \do{S2}% \do{am}% \do{pm}% } \newrobustcmd*{\NewBibliographyString}[1]{% \forcsvlist\blx@newstring{#1}} \def\blx@newstring#1{% \blx@kv@ifkeyundef{blx@lbx}{#1} {\gappto\abx@dostrings{\do{#1}}% \blx@kv@gdefkey{blx@lbx}{#1}{\blx@defstring{#1}{##1}}} {}} % in *.cbx/bbx/tex: = {}, % in *.lbx: = {{}{}}, \def\do#1{\blx@kv@defkey{blx@lbx}{#1}{\blx@defstring{#1}{##1}}} \abx@dostrings % in *.cbx/bbx/tex: (implicit) % in *.lbx: inherit = {}, \blx@kv@defkey{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}} % {} \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}}}} % {}{} \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}} % {}{} \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}}% % {}{} \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}% \blx@kv@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}}} % this one is special, it's basically ours and probably not defined % by anyone else, so we had better make sure it exists \providecommand*{\biblistname}{\blx@warn@nostring{shorthands}} \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}} % {}{} \def\blx@letbibstrings#1#2{% \blx@lbxinput@strings{#2}{}{\blx@err@nolang{#2}}% \global\csletcs{abx@strings@#1}{abx@strings@#2}}% % {}{} \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}} % {} \newrobustcmd*{\DeclareLanguageMappingSuffix}[1]{% \gdef\blx@lng@suff{#1}} \@onlypreamble\DeclareLanguageMappingSuffix \let\blx@lng@suff\@empty % {}{} \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 % {}{}{} \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'}}} % {}{} \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 % {}{}{}{}{}{} \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}% \csuse{blx@lbxfilehook@simple@preload@#1}% #3% \@@input\@filef@und #4% \csuse{blx@lbxfilehook@simple@postload@#1}% #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}% \csuse{blx@lbxfilehook@simple@failure@#1}% #6}} % {}{}{}{}{}{} \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}% \csuse{blx@lbxfilehook@once@preload@#1}% #3% \@@input\@filef@und #4% \csuse{blx@lbxfilehook@once@postload@#1}% #5% \ifcsundef{blx@file@lbx@simple@#1} {\listxadd\blx@list@req@stat{#1}% \@addtofilelist{#1}} {}} {\blx@info@noline{... file '#1' not found}% \csuse{blx@lbxfilehook@once@failure@#1}% #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}} % {}{}{} \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} % {} \protected\def\blx@langsetup#1{% \blx@lbxinput{#1} {\edef\blx@languagename{#1}} {\blx@warning {Language '#1' not supported.\MessageBreak Using dummy definitions}}} \protected\def\blx@langsetup@from@pkglist#1{% \global\cslet{blx@lbx@loaded@from@pkglist@#1}\@empty \blx@langsetup{#1}} \protected\def\blx@langsetup@from@auxlist#1{% \global\cslet{blx@lbx@loaded@from@auxlist@#1}\@empty \blx@langsetup{#1}} \newcommand*{\blx@lbx@loadlist}{} \protected\def\blx@langsetup@indoc#1{% \ifcsundef{blx@lbx@loaded@from@pkglist@#1} {\xifinlist{#1}\blx@lbx@loadlist {} {\listxadd\blx@lbx@loadlist{#1}}% \ifcsundef{blx@lbx@loaded@from@auxlist@#1} {\ifcsundef{blx@lbx@loaded@nolistload@#1} {\blx@warning@noline{% No localisation for language '#1' loaded.\MessageBreak Please rerun LaTeX to ensure languages can\MessageBreak be requested properly}% \global\cslet{blx@lbx@loaded@nolistload@#1}\@empty} {}} {\edef\blx@languagename{#1}}} {\edef\blx@languagename{#1}}% } \newcommand*{\blx@lbx@auxloadlist}{} \def\abx@aux@lbx@loadrequest{% \listgadd\blx@lbx@auxloadlist} \protected\def\blx@lbx@writeloaderequest#1{% \blx@auxwrite\@mainaux{}{% \string\abx@aux@lbx@loadrequest{#1}}} % auxiliary macros % {} \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>}{} \newrobustcmd*{\mktimerange}[2]{% \begingroup \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}}}}}% \endgroup} % {}{''|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]{% \iftoggle{blx@#1dateusetime} {\iffieldundef{#1#2hour} {\@secondoftwo} {\@firstoftwo}} {\@secondoftwo}} \newcommand*{\blx@if@printanytimes}[1]{% \iftoggle{blx@#1dateusetime} {\iffieldundef{#1hour} {\iffieldundef{#1endhour} {\@secondoftwo} {\@firstoftwo}} {\@firstoftwo}} {\@secondoftwo}} % {}{'' | end} \newrobustcmd*{\blx@printtime}[2]{% \blx@if@printtime{#1}{#2} {\blx@timepre{#1}{#2}% \bibdatetimesep% \printtext[{#1time}]{% \csuse{mkbibtime\csuse{blx@timeformat@#1time}} {#1#2hour}{#1#2minute}{#1#2second}{#1#2timezone}}} {}} % {}{} \newrobustcmd*{\mkdaterangefull}[2]{% \begingroup \blx@metadateinfo{#2}% \iffieldundef{#2year} {\blx@nounit} {\printtext[{#2date}]{% \datecircaprint % Such a year division component can only come from an ISO8601 year division which replaces % a normal month so if it exists, we know that a normal date print is ruled out \iffieldundef{#2yeardivision} {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% % Optionally print the time after the date \blx@printtime{#2}{}} {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}}% \dateuncertainprint \dateeraprint{#2year}% \iffieldundef{#2endyear} {} {\iffieldequalstr{#2endyear}{} {\mbox{\bibdaterangesep}} {\bibdaterangesep \enddatecircaprint \iffieldundef{#2endyeardivision} {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}% % Optionally print the time after the date \blx@printtime{#2}{end}} {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}% \enddateuncertainprint \dateeraprint{#2endyear}}}}}% \endgroup} \newrobustcmd*{\mkdaterangefullextra}[2]{% \begingroup \blx@metadateinfo{#2}% \iffieldundef{#2year} {\blx@nounit} {\printtext[{#2date}]{% \datecircaprint % Such a year division component can only come from an ISO8601 year division which replaces % a normal month so if it exists, we know that a normal date print is ruled out \iffieldundef{#2yeardivision} {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% % Optionally print the time after the date \blx@printtime{#2}{}} {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}}% \dateuncertainprint \dateeraprint{#2year}% \iffieldundef{#2endyear} {\printfield{extradate}} {\iffieldequalstr{#2endyear}{} {\printfield{extradate}% \mbox{\bibdaterangesep}} {\bibdaterangesep \enddatecircaprint \iffieldundef{#2endyeardivision} {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}% % Optionally print the time after the date \blx@printtime{#2}{end}} {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}}% \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 year division component can only come from an ISO8601 year division which replaces % a normal month so if it exists, we know that a normal date print is ruled out \iffieldundef{#2yeardivision} {\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{mkbibyeardivisiondate#1}{}{#2yeardivision}} {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}% \iffieldsequal{#2dateera}{#2enddateera}{} {\dateeraprint{#2year}}}}% \dateuncertainprint \iffieldundef{#2endyear} {} {\iffieldequalstr{#2endyear}{} {\mbox{\bibdaterangesep}} {\bibdaterangesep \enddatecircaprint \iffieldundef{#2endyeardivision} {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}} {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}% \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 year division component can only come from an ISO8601 year division which replaces % a normal month so if it exists, we know that a normal date print is ruled out \iffieldundef{#2yeardivision} {\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{mkbibyeardivisiondate#1}{}{#2yeardivision}} {\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}% \iffieldsequal{#2dateera}{#2enddateera}{} {\dateeraprint{#2year}}}}% \dateuncertainprint \iffieldundef{#2endyear} {\printfield{extradate}} {\iffieldequalstr{#2endyear}{} {\printfield{extradate}% \mbox{\bibdaterangesep}} {\bibdaterangesep \enddatecircaprint \iffieldundef{#2endyeardivision} {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}} {\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}}% \printfield{extradate}% \enddateuncertainprint \dateeraprint{#2endyear}}}}% \endgroup} \newrobustcmd*{\mkdaterangeyear}[1]{% \begingroup \blx@imc@clearfield{#1yeardivision}% \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{#1endyeardivision}% \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}% \endgroup} % {} \newrobustcmd*{\mkdaterangeymd}[1]{% \begingroup \blx@metadateinfo{#1}% \iffieldundef{#1year} {\blx@nounit} {\printtext[{#1date}]{% \datecircaprint % Such a year division component can only come from an ISO8601 year division which replaces % a normal month so if it exists, we know that a normal date print is ruled out \iffieldundef{#1yeardivision} {\blx@ymddate{#1}{}% % Optionally print the time after the date \blx@printtime{#1}{}} {\csuse{mkbibyeardivisiondateshort}{#1year}{#1yeardivision}}% \dateuncertainprint \dateeraprint{#1year}% \iffieldundef{#1endyear} {} {\iffieldequalstr{#1endyear}{} {\mbox{\bibdaterangesep}} {\bibdaterangesep \enddatecircaprint \iffieldundef{#1yeardivision} {\blx@ymddate{#1}{end}% % Optionally print the time after the date \blx@printtime{#1}{end}} {\csuse{mkbibyeardivisiondateshort}{#1endyear}{#1endyeardivision}}% \enddateuncertainprint \dateeraprint{#1endyear}}}}}% \endgroup} % {} \newrobustcmd*{\mkdaterangeymdextra}[1]{% \begingroup \blx@metadateinfo{#1}% \iffieldundef{#1year} {\blx@nounit} {\printtext[{#1date}]{% \datecircaprint % Such a year division component can only come from an ISO8601 year division which replaces % a normal month so if it exists, we know that a normal date print is ruled out \iffieldundef{#1yeardivision} {\blx@ymddate[extradate]{#1}{}% % Optionally print the time after the date \blx@printtime{#1}{}} {\csuse{mkbibyeardivisiondateshort}{#1year}{#1yeardivision}}% \dateuncertainprint \dateeraprint{#1year}% \iffieldundef{#1endyear} {} {\iffieldequalstr{#1endyear}{} {\mbox{\bibdaterangesep}} {\bibdaterangesep \enddatecircaprint \iffieldundef{#1yeardivision} {\blx@ymddate{#1}{end}% % Optionally print the time after the date \blx@printtime{#1}{end}} {\csuse{mkbibyeardivisiondateshort}{#1endyear}{#1endyeardivision}}}% \enddateuncertainprint \dateeraprint{#1endyear}}}}% \endgroup} % [extradate]{}{''|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]{% \begingroup \blx@imc@clearfield{#1yeardivision}% \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{#1endyeardivision}% \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}% \endgroup} \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}}} {\bibdatetimesep% \blx@isotime{#1}{}} {}% \dateuncertainprint \datecircaprintiso \iffieldundef{#1endyear} {} {\addslash \blx@isodate{#1}{end}% \ifboolexpr{% togl {blx@#1dateusetime} and not test {\iffieldundef{#1endhour}}} {\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}}} {\bibdatetimesep% \blx@isotime{#1}{}} {}% \dateuncertainprint \datecircaprintiso \iffieldundef{#1endyear} {} {\addslash \blx@isodate{#1}{end}}% \ifboolexpr{% togl {blx@#1dateusetime} and not test {\iffieldundef{#1endhour}}} {\bibdatetimesep% \blx@isotime{#1}{end}} {}% \enddateuncertainprint \enddatecircaprintiso}}% \endgroup} % [extradate]{}{''|end} \newrobustcmd*{\blx@isodate}[3][]{% \dateeraprintpre{#2#3year}% \blx@imc@forcezerosy{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}% % Such a year division component can only come from an ISO8601 year division which replaces % a normal month so if it exists, we know that a normal date print is ruled out \iffieldundef{#2#3yeardivision} {\iffieldundef{#2#3month}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3month}}}% \iffieldundef{#2#3day}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3day}}}} {\hyphen\blx@yeardivisionmap{\thefield{#2#3yeardivision}}}} \def\blx@yeardivisionmap#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*{\bibdatendsep}{\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} {} {\mktimezeros{\thefield{#1}}% \iffieldundef{#2}{}{\bibtimesep}}% \iffieldundef{#2} {} {\mktimezeros{\thefield{#2}}% \iffieldundef{#3}{}{\bibtimesep}}% \iffieldundef{#3} {} {\mktimezeros{\thefield{#3}}}% \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 \mkbibparens{\mkbibtimezone{\thefield{#4}}}}} \newrobustcmd*{\mkbibyeardivisiondateshort}[2]{% \blx@warning@noline{% Using fallback definition for \string\mkbibyeardivisiondateshort.\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\mkbibyeardivisiondateshort }% \mkbibyeardivision{\thefield{#2}}% \iffieldundef{#1}{}{\space}% \dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}} \def\mkbibseasondateshort{% LEGACY \blx@warning@noline{% '\string\mkbibseasondateshort' is deprecated in favour of\MessageBreak '\string\mkbibyeardivisiondateshort'}% \mkbibyeardivisiondateshort} \newrobustcmd*{\mkbibyeardivisiondatelong}[2]{% \blx@warning@noline{% Using fallback definition for \string\mkbibyeardivisiondatelong.\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\mkbibyeardivisiondatelong }% \mkbibyeardivision{\thefield{#2}}% \iffieldundef{#1}{}{\space}% \dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}} \def\mkbibseasondatelong{% LEGACY \blx@warning@noline{% '\string\mkbibseasondatelong' is deprecated in favour of\MessageBreak '\string\mkbibyeardivisiondatelong'}% \mkbibyeardivisiondatelong} \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*{\mkbibyeardivision}[1]{\abx@bibyeardivision{#1}} \newrobustcmd*\mkbibseason{% LEGACY \blx@warning@noline{% '\string\mkbibseason' is deprecated in favour of\MessageBreak '\string\mkbibyeardivision'}% \mkbibyeardivision} \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} % We need to be able to prefix \providetoggle with \global, % plus we don't need the testing from \providetoggle anway. % This uses internal implementation details of etoolbox's % toggles, so is a bit meh, but it's better than rolling our own % version of toggles just for that. \newcommand*{\blx@etb@inittoggle}[1]{\cslet{etb@tgl@#1}\@secondoftwo} % There is no \nocaptions..., so if we send everything to \captions... % we need to find a way to call our noextras only in situations where % \noextras... is called to clean up \extras... AND \captions... % and not just \extras... % We detect this by setting a toggle in the \captions... % {}{} \def\blx@maplang@babel#1#2{% \global\blx@etb@inittoggle{blx@lang@captions@#2}% \ifdefstring{\blx@langhook}{captions} {\csgappto{captions#1}{% \toggletrue{blx@lang@captions@#2}% \blx@resetpunct \csuse{abx@extras@#2}% \csuse{abx@strings@#2}}% \csgappto{noextras#1}{% \iftoggle{blx@lang@captions@#2} {\blx@resetpunct \csuse{abx@noextras@#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{% \global\blx@etb@inittoggle{blx@lang@captions@#2}% \ifdefstring{\blx@langhook}{captions} {\csgappto{captions@bbl@#1}{% \toggletrue{blx@lang@captions@#2}% \blx@resetpunct \csuse{abx@extras@#2}% \csuse{abx@strings@#2}}% \csgappto{noextras@bbl@#1}{% \iftoggle{blx@lang@captions@#2} {\blx@resetpunct \csuse{abx@noextras@#2}} {}}} {\csgappto{blockextras@bbl@#1}{% \blx@resetpunct \csuse{abx@extras@#2}% \csuse{abx@strings@#2}}% \csgappto{inlineextras@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 \let\blx@imc@textmainlang\@firstofone \let\blx@imc@textouterlang\@firstofone \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} \def\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}% \let\blx@outer@language\blx@main@language % use afterreset to get in a bit earlier % we want to be there before \captions... is issued % beforeextras is before extras, but captions come before extras % afterreset was added in 3.9i (~2014-03-16) % way before 3.9r (2016-04-23), which we require \AddBabelHook{biblatex@langsetup}{afterreset}{% \expandafter\blx@langsetup@indoc\expandafter{\languagename}}% \ifdef\blx@thelangenv {\def\blx@beglang{% \blx@clearlang \begingroup % track outer language (i.e. language not selected by biblatex) \ifundef\blx@outer@language@set {\let\blx@outer@language\blx@languagename \let\blx@outer@language@set\@empty} {}% % Need to override all entries, regardless of if there is a % langid if language= option is given \ifboolexpr { test {\ifdef\abx@field@langid } or test {\ifdef\blx@forcelanguagename} } % override local langid if we forced it with % 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 \expandafter\end\expandafter{\blx@thelangenv}% \endgroup}% \iftoggle{blx@autolangbib} {\let\blx@endlangbib\blx@endlang} {}% \iftoggle{blx@autolangcite} {\let\blx@endlangcite\blx@endlang} {}% \expandafter\expandafter\expandafter\begin \expandafter\expandafter\expandafter{% \expandafter\blx@thelangenv\expandafter}% \expandafter{\abx@field@langid}}} {}}} {}% \def\blx@imc@mainlang{% \ifundef\blx@warn@mainlang {\blx@warning@noline{% '\string\mainlang' is deprecated in favour of\MessageBreak '\string\textmainlang'.% \MessageBreak Please consider using the new command,\MessageBreak but note that the syntax is different.\MessageBreak Using the old, problematic definition}% \global\let\blx@warn@mainlang\@empty} {}% \expandafter\selectlanguage\expandafter{\blx@main@language}}% \def\blx@imc@textmainlang##1{% {{\expandafter\selectlanguage\expandafter{\blx@main@language}##1}}}% \def\blx@imc@textouterlang##1{% {{\expandafter\selectlanguage\expandafter{\blx@outer@language}##1}}}% \expandafter\blx@langsetup@from@pkglist\expandafter{\blx@main@language}% } \def\blx@beglang@spacefactors{\frenchspacing} \def\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}% \let\blx@outer@language\blx@main@language \ifundef\polyglossia@language@switched {\apptocmd\select@language {\expandafter\blx@langsetup@indoc\expandafter{\babelname}} {} {\blx@err@patch{'polyglossia' package}% \blx@mknoautolang}} {\appto\polyglossia@language@switched{% \expandafter\blx@langsetup@indoc\expandafter{\babelname}}}% \ifdef\blx@thelangenv {\def\blx@beglang{% \blx@clearlang \begingroup % track outer language (i.e. language not selected by biblatex) \ifundef\blx@outer@language@set {\let\blx@outer@language\blx@languagename \let\blx@outer@language@set\@empty} {}% % Need to override all entries, regardless of if there is a % langid if language= option is given \ifboolexpr { test {\ifdef\abx@field@langid } or test {\ifdef\blx@forcelanguagename} } % override local langid if we forced it with % 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 \[] \ifcsstring{blx@thelangenv}{langname} {\expandafter\end\expandafter{\abx@field@langid}} {\expandafter\end\expandafter{\blx@thelangenv}}% \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 {\expandafter\expandafter\expandafter\begin \expandafter\expandafter\expandafter{% \expandafter\abx@field@langid\expandafter}% \expandafter[\abx@field@langidopts]} {\expandafter\begin\expandafter{\abx@field@langid}}} {\expandafter\expandafter\expandafter\begin \expandafter\expandafter\expandafter{% \expandafter\blx@thelangenv\expandafter}% \expandafter{\abx@field@langid}}% \blx@beglang@spacefactors}} {}}} {}% \def\blx@imc@mainlang{% \ifundef\blx@warn@mainlang {\blx@warning@noline{% '\string\mainlang' is deprecated in favour of\MessageBreak '\string\textmainlang'.% \MessageBreak Please consider using the new command,\MessageBreak but note that the syntax is different.\MessageBreak Using the old, problematic definition}% \global\let\blx@warn@mainlang\@empty} {}% \select@language{\blx@main@language}}% \def\blx@imc@textmainlang##1{{{\select@language{\blx@main@language}##1}}}% \def\blx@imc@textouterlang##1{{{\select@language{\blx@outer@language}##1}}}% \expandafter\blx@langsetup@from@pkglist\expandafter{\blx@main@language}} \def\blx@mknoautolang{% \blx@lbxinput{\blx@languagename} {} {\blx@err@nolang{\blx@languagename}}} \blx@regimcs{\mainlang \textmainlang \textouterlang} \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@dolabelwidths{% \do{labelnumber}% \do{labelalpha}% \abx@dolabelfields} \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: % .dbx %