% 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{2023/03/08} \def\abx@version{4.0} \def\abx@bbxid{\abx@date\space v\abx@version\space biblatex bibliography style (PK/MW)} \def\abx@cbxid{\abx@date\space v\abx@version\space biblatex citation style (PK/MW)} \def\abx@lbxid{\abx@date\space v\abx@version\space biblatex localization (PK/MW)} \def\abx@cptid{\abx@date\space v\abx@version\space biblatex compatibility (PK/MW)} % This is not updated by build script as the control file version % does not necessarily change with the package version. % This is used when writing the .bcf \def\blx@bcfversion{4.0} % 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{4.0} % Postfix for biblatex internal files in case this version is supposed to be installed % in parallel with a standard biblatex installation. This postfix will be appended to % all searched for files like this: % % . % % If a file with this name is found it will be used, otherwise the filename % without the postfix will be used. Normally, this will be empty. % The build script will normally put something in here before packaging or install % rather than it being set manually \def\abx@filespf{-ms} \NeedsTeXFormat{LaTeX2e}[2005/12/01] \ProvidesPackage{biblatex-ms} [\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{xparse} %\RequirePackage{trace} % pretend we're the real biblatex \ifcsundef{ver@biblatex.sty} {\cslet{ver@biblatex.sty}\abx@date} {} % Turn off xparse redefine warnings as we do this a lot \ExplSyntaxOn \msg_redirect_name:nnn { LaTeX } { xparse / redefine-command } { none } \ExplSyntaxOff % Globals holding the name of the filename being resolved % Better to have globals to avoid messy localisation code % as these are used in heavily nested macros \let\blx@fnext\@empty \let\blx@fnnoext\@empty \@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\glossary\@gobble} {\let\glossary\@gobble \blx@contentssafe@citecommands} {} {\togglefalse{blx@tempa}}% % try tag.sto's definition \iftoggle{blx@tempa} {} {\patchcmd\addtocontents {\let\glossary\Gobble} {\let\glossary\Gobble \blx@contentssafe@citecommands} {} {% give up \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}}} {}% % There are several scopes of blx@mslang - they are summarised here for clarity % \blx@gmslang - global option setting as this needs passing to biber % \blx@mslang - setting which varies depending on refcontext % \blx@lmslang - if the langid field exists, the BCP47 tag for this, otherwise same as \blx@mslang % \blx@nmslang - the value of an individual name "mslang" data annotation, if it exists. This is % just a convenient was of getting such an annotation as individual names have % a keyval list in which to store it, the "mslang" data annotation is also available % too. Non-name list "mslang" data annotations don't have this convenience variable % because there is nowhere to store them in the .bbl format and so the annotation % must be fetched directly using the annotation macros. % Set default mslang from babel/polyglossia or a fallback % mslang is a biblatex global option but we don't identify it as one as it is not % passed in the .bcf as a biblatex option but rather as a biber option since it is used % to set the default biber option. \ifdef\blx@main@language {\edef\blx@mslang{\csuse{blx@msmaplangr@\blx@main@language}}} {\def\blx@mslang{en-us}}% fallback when no babel/polyglossia \let\blx@gmslang\blx@mslang } \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} \newbool{selectms} \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@dynamiclabel} \newtoggle{blx@autolangbib} \newtoggle{blx@autofieldlangstrings} \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 document forms and langs \global\let\blx@msforms\@empty \global\let\blx@mslangs\@empty % 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 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]{% \blx@imc@ifmsentryfield{#1} {\def\blx@tempa{abx@field@\blx@msform@\blx@mslang@#1}} {\def\blx@tempa{abx@field@@@#1}}% \csdef{\blx@tempa}{% \ifcsundef{abx@legacywarning@field@#1} {\blx@warning@noline{Field '#1' is deprecated. #2}} {}% \global\cslet{abx@legacywarning@field@#1}\@empty}}% \newrobustcmd*{\DeprecateList}[2]{% \blx@imc@ifmsentryfield{#1} {\def\blx@tempa{abx@list@\blx@msform@\blx@mslang@#1}} {\def\blx@tempa{abx@list@@@#1}}% \csdef{\blx@tempa}{% \ifcsundef{abx@legacywarning@list@#1} {\blx@warning@noline{List '#1' is deprecated. #2}} {}% \global\cslet{abx@legacywarning@list@#1}\@empty}} \newrobustcmd*{\DeprecateName}[2]{% \blx@imc@ifmsentryfield{#1} {\def\blx@tempa{abx@name@\blx@msform@\blx@mslang@#1}} {\def\blx@tempa{abx@name@@@#1}}% \csdef{\blx@tempa}{% \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} {}% {\blx@imc@ifmsentryfield{#2} {\begingroup \csgdef{blx@datamodel@multiscript@entryfield@#1}{1}% \def\do##1{% \begingroup \def\do####1{% \csgdef{abx@field@##1@####1@#1}{% \csuse{abx@field@##1@####1@#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}}% \dolistcsloop{abx@fieldmslangs@#2}% \endgroup}% \dolistcsloop{abx@fieldmsforms@#2}% \endgroup} {\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} {}% {\blx@imc@ifmsentryfield{#2} {\begingroup \csgdef{blx@datamodel@multiscript@entryfield@#1}{1}% \def\do##1{% \begingroup \def\do####1{% \csgdef{abx@list@##1@####1@#1}{% \csuse{abx@list@##1@####1@#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}}% \dolistcsloop{abx@fieldmslangs@#2}% \endgroup}% \dolistcsloop{abx@fieldmsforms@#2}% \endgroup} {\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} {}% {\blx@imc@ifmsentryfield{#2} {\begingroup \csgdef{blx@datamodel@multiscript@entryfield@#1}{1}% \def\do##1{% \begingroup \def\do####1{% \csgdef{abx@name@##1@####1@#1}{% \csuse{abx@name@##1@####1@#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}}% \dolistcsloop{abx@fieldmslangs@#2}% \endgroup}% \dolistcsloop{abx@fieldmsforms@#2}% \endgroup} {\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{}... \DeclareExpandableDocumentCommand{\blx@imc@docsvfield} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter\expandafter\docsvlist \expandafter\expandafter\expandafter{% \csname\blx@tempa\endcsname}}} % {}[][]{} => {}{}... \DeclareExpandableDocumentCommand{\blx@imc@forcsvfield} {m O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#2}][{#3}]{#4} {} {\blx@imc@ifmsentryfield{#4} {\def\blx@tempa{abx@field@#2@#3@#4}} {\def\blx@tempa{abx@field@@@#4}}% \expandafter\expandafter\expandafter\blx@imc@forcsvfield@i \expandafter\expandafter\expandafter{% \csname\blx@tempa\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} % {}{} => matches 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} % {}{} => neg. matches 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 % Generate altername filename with any global package postfix and then test % for existence of file with postfix, then bare file. % Used to look for files in versions of biblatex which are installed in parallel % with the standard version. Such versions have a suffix appended to all filenames % which is stored in \abx@filespf % Returns the found filename in \blx@fnext (with extension) and \blx@fnnoext (without extension) or % both \@empty if no file found \def\blx@altfile#1{% \begingroup \edef\blx@tempa{#1}% filename can contain macros \let\blx@tempb\@empty \let\blx@tempc\@empty \global\let\blx@fnext\@empty \global\let\blx@fnnoext\@empty % Gives everything up to extension \expandafter\blx@stripfromendinto\expandafter{\blx@tempa}{.}\blx@tempb % Gives the extension \expandafter\expandafter\expandafter\blx@stripfromstartinto\expandafter\expandafter\expandafter{\expandafter\blx@tempa\expandafter}\expandafter{\blx@tempb.}\blx@tempc \xdef\blx@fnext{\blx@tempb\abx@filespf.\blx@tempc}% \xdef\blx@fnnoext{\blx@tempb\abx@filespf}% \expandafter\IfFileExists\expandafter{\blx@fnext} {} {\expandafter\IfFileExists\expandafter{\blx@tempa} {\global\let\blx@fnext\blx@tempa \global\let\blx@fnnoext\blx@tempb} {\global\let\blx@fnext\@empty \global\let\blx@fnnoext\@empty}} \endgroup} % {}{}{}{}{}{} \protected\long\def\blx@inputonce#1{% \blx@altfile{#1}% \ifdefempty\blx@fnext {\blx@inputonce@i{#1}} {\expandafter\blx@inputonce@i\expandafter{\blx@fnext}}} \protected\long\def\blx@inputonce@i#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} % [][]{} \DeclareExpandableDocumentCommand{\blx@imc@thefield} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\csuse{abx@field@#1@#2@#3}} {\csuse{abx@field@@@#3}}} % [][]{} \DeclareExpandableDocumentCommand{\blx@imc@strfield} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\ifcsdef{abx@field@#1@#2@#3} {\detokenize\expandafter\expandafter\expandafter {\csname abx@field@#1@#2@#3\endcsname}} {}} {\ifcsdef{abx@field@@@#3} {\detokenize\expandafter\expandafter\expandafter {\csname abx@field@@@#3\endcsname}} {}}} \def\blx@imc@csfield{\usefield{\unexpanded}} % {}[msform][mslang]{} \DeclareExpandableDocumentCommand{\blx@imc@usefield} {m O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#4} {\expandafter\expandafter\expandafter#1% \expandafter\expandafter\expandafter{\csname abx@field@#2@#3@#4\endcsname}} {\expandafter\expandafter\expandafter#1% \expandafter\expandafter\expandafter{\csname abx@field@@@#4\endcsname}}} % [msform][mslang]{} \DeclareExpandableDocumentCommand{\blx@imc@thelist} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\csuse{abx@list@#1@#2@#3}} {\csuse{abx@list@@@#3}}} \DeclareExpandableDocumentCommand{\blx@imc@strlist} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\ifcsdef{abx@list@#1@#2@#3} {\detokenize\expandafter\expandafter\expandafter {\csname abx@list@#1@#2@#3\endcsname}} {}} {\ifcsdef{abx@list@@@#3} {\detokenize\expandafter\expandafter\expandafter {\csname abx@list@@@#3\endcsname}} {}}} \DeclareExpandableDocumentCommand{\blx@imc@thefirstlistitem} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\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@#2@#3}}} {\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@@@#3}}}} \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} % {}[msform][mslang]{} % needs 7 levels of expansion, i.e. 2^7-1=127 '\expandafter's \DeclareExpandableDocumentCommand{\blx@imc@usefirstlistitem} {m O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\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}][{#3}]{#4}}} {\expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\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{#4}}}} \DeclareExpandableDocumentCommand{\blx@imc@strfirstlistitem} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\ifcsdef{abx@list@#1@#2@#3} {\blx@imc@usefirstlistitem{\detokenize}[{#1}][{#2}]{#3}} {}} {\ifcsdef{abx@list@@@#3} {\blx@imc@usefirstlistitem{\detokenize}{#3}} {}}} % [msform][mslang]{} \DeclareExpandableDocumentCommand{\blx@imc@thename} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\csuse{abx@name@#1@#2@#3}} {\csuse{abx@name@@@#3}}} \DeclareExpandableDocumentCommand{\blx@imc@strname} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\ifcsdef{abx@name@#1@#2@#3} {\detokenize\expandafter\expandafter\expandafter {\csname abx@name@#1@#2@#3\endcsname}} {}} {\ifcsdef{abx@name@@@#3} {\detokenize\expandafter\expandafter\expandafter {\csname abx@name@@@#3\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@saverelfield \DeclareDocumentCommand{\blx@imc@clearfield} {O{} O{} m} {\blx@imc@ifmsentryfield{#3} {\ifboolexpr{ test {\ifblank{#1}} and test {\ifblank{#2}} } % clear all alternates of a multiscript field {\blx@imc@iffieldundef{#3} {} {\let\blx@tempi\@empty \begingroup \def\do##1{% \begingroup \def\do####1{% \ifdef\abx@field@@@related {\gappto\blx@tempi{\csletcs{abx@field@##1@####1@relsaved#3}{abx@field@##1@####1@#3}}% \gappto\blx@tempi{\listadd\abx@dorelfields{{{##1}{####1}{#3}}}}} {}% \gappto\blx@tempi{\csundef{abx@field@##1@####1@#3}}}% \dolistcsloop{abx@fieldmslangs@#3}% \endgroup}% \dolistcsloop{abx@fieldmsforms@#3}% \endgroup \blx@tempi\global\undef\blx@tempi}} % clear specific alternate of a multiscript field {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {} {\ifdef\abx@field@@@related {\csletcs{abx@field@#1@#2@relsaved#3}{abx@field@#1@#2@#3}% \listadd\abx@dorelfields{{{#1}{#2}{#3}}}} {}% \csundef{abx@field@#1@#2@#3}}}% \csundef{abx@field@#3}} % clear non multiscript field {\blx@imc@iffieldundef{#3} {} {\ifdef\abx@field@@@related {\csletcs{abx@field@@@relsaved#3}{abx@field@@@#3}% \listadd\abx@dorelfields{{{}{}{#3}}}} {}% \csundef{abx@field@@@#3}% \csundef{abx@field@#3}}}} % [][]{} % 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@saverellist \DeclareDocumentCommand{\blx@imc@clearlist} {O{} O{} m} {\blx@imc@ifmsentryfield{#3} {\ifboolexpr{ test {\ifblank{#1}} and test {\ifblank{#2}} } % clear all alternates of a multiscript list {\blx@imc@iflistundef{#3} {} {\let\blx@tempi\@empty \begingroup \def\do##1{% \begingroup \def\do####1{% \ifdef\abx@field@@@related {\gappto\blx@tempi{\csletcs{abx@list@##1@####1@relsaved#3}{abx@list@##1@####1@#3}}% \gappto\blx@tempi{\csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}}% \gappto\blx@tempi{\csletcs{c@relsaved#3}{c@#3}}% \gappto\blx@tempi{\listadd\abx@dorellists{{##1}{####1}{#3}}}} {}% \gappto\blx@tempi{\togglefalse{abx@bool@more#3}}% \gappto\blx@tempi{\csundef{abx@list@##1@####1@#3}}% \gappto\blx@tempi{\csname c@#3\endcsname\z@}}% \dolistcsloop{abx@fieldmslangs@#3}% \endgroup}% \dolistcsloop{abx@fieldmsforms@#3}% \endgroup \blx@tempi\global\undef\blx@tempi}} % clear specific alternate of a multiscript list {\blx@imc@iflistundef[{#1}][{#2}]{#3} {} {\ifdef\abx@field@@@related {\csletcs{abx@list@#1@#2@relsaved#3}{abx@list@#1@#2@#3}% \listadd\abx@dorellists{{#1}{#2}{#3}}} {}% \csundef{abx@list@#1@#2@#3}}}% \csundef{abx@list@#3}} % clear non multiscript list {\blx@imc@iflistundef{#3} {} {\ifdef\abx@field@@@related {\csletcs{abx@list@@@relsaved#3}{abx@list@@@#3}% \csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}% \csletcs{c@relsaved#3}{c@#3}% \listadd\abx@dorellists{{}{}{#3}}} {}% \togglefalse{abx@bool@more#3}% \csundef{abx@list@@@#3}% \csname c@#3\endcsname\z@ \csundef{abx@list@#3}}}} % [][]{} % 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@saverelname \DeclareDocumentCommand{\blx@imc@clearname} {O{} O{} m} {\blx@imc@ifmsentryfield{#3} {\ifboolexpr{ test {\ifblank{#1}} and test {\ifblank{#2}} } % clear all alternates of a multiscript list {\blx@imc@ifnameundef{#3} {} {\let\blx@tempi\@empty \begingroup \def\do##1{% \begingroup \def\do####1{% \ifdef\abx@field@@@related {\gappto\blx@tempi{\csletcs{abx@name@##1@####1@relsaved#3}{abx@name@##1@####1@#3}}% \gappto\blx@tempi{\csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}}% \gappto\blx@tempi{\csletcs{c@relsaved#3}{c@#3}}% \gappto\blx@tempi{\listadd\abx@dorelnames{{##1}{####1}{#3}}}} {}% \gappto\blx@tempi{\togglefalse{abx@bool@more#3}}% \gappto\blx@tempi{\csundef{abx@name@##1@####1@#3}}% \gappto\blx@tempi{\csname c@#3\endcsname\z@}}% \dolistcsloop{abx@fieldmslangs@#3}% \endgroup}% \dolistcsloop{abx@fieldmsforms@#3}% \endgroup \blx@tempi\global\undef\blx@tempi}} % clear specific alternate of a multiscript list {\blx@imc@ifnameundef[{#1}][{#2}]{#3} {} {\ifdef\abx@field@@@related {\csletcs{abx@name@#1@#2@relsaved#3}{abx@name@#1@#2@#3}% \listadd\abx@dorelnames{{#1}{#2}{#3}}} {}% \csundef{abx@name@#1@#2@#3}}}% \csundef{abx@name@#3}} % clear non multiscript list {\blx@imc@ifnameundef{#3} {} {\ifdef\abx@field@@@related {\csletcs{abx@name@@@relsaved#3}{abx@name@@@#3}% \csletcs{etb@tgl@abx@bool@morerelsaved#3}{etb@tgl@abx@bool@more#3}% \csletcs{c@relsaved#3}{c@#3}% \listadd\abx@dorelnames{{}{}{#3}}} {}% \togglefalse{abx@bool@more#3}% \csundef{abx@name@@@#3}% \csname c@#3\endcsname\z@ \csundef{abx@name@#3}}}} % {field|list|name}[][]{}{} \DeclareExpandableDocumentCommand{\blx@savedata} {m O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@ifmsentryfield{#4} {\letcs#5{abx@#1@#2@#3@#4}} {\letcs#5{abx@#1@@@#4}}} % {field|list|name}[][]{}{} \DeclareExpandableDocumentCommand{\blx@savedatacs} {m O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@ifmsentryfield{#4} {\csletcs{#5}{abx@#1@#2@#3@#4}} {\csletcs{#5}{abx@#1@@@#4}}} % [][]{}{} \DeclareDocumentCommand{\blx@imc@restorefield} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\cslet{abx@field@#1@#2@#3}} {\cslet{abx@field@@@#3}}} % [][]{}{} \DeclareDocumentCommand{\blx@imc@restorelist} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\cslet{abx@list@#1@#2@#3}} {\cslet{abx@list@@@#3}}} % [][]{}{} \DeclareDocumentCommand{\blx@imc@restorename} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\cslet{abx@name@#1@#2@#3}} {\cslet{abx@name@@@#3}}} % [][]{}{} \protected\def\blx@imc@savefield{% \@ifstar{\blx@savedata{field}}{\global\blx@savedata{field}}} % {}{} \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}}} % {}{} \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@ifentryfieldundef#1{% \ifcsundef{abx@entryfield@#1}} % {field|list|name}[][]{}{}{} \DeclareExpandableDocumentCommand{\blx@ifmsundef} {m O{} O{} m} {\blx@imc@ifmsentryfield{#4} {\ifstrempty{#2} {\ifstrempty{#3} {\ifcsundef{abx@#1@#4}} {\ifcsundef{abx@#1@\blx@msform @#3@#4}}} {\ifstrempty{#3} {\ifcsundef{abx@#1@#2@\blx@mslang @#4}} {\ifcsundef{abx@#1@#2@#3@#4}}}} {\ifcsundef{abx@#1@@@#4}}}% ignore form/lang for non-multiscript % [][]{}{}{} \def\blx@imc@iffieldundef{% \blx@ifmsundef{field}} % [][]{}{}{} \def\blx@imc@iflistundef{% \blx@ifmsundef{list}} % [][]{}{}{} \def\blx@imc@ifnameundef{% \blx@ifmsundef{name}} % [][]{}[][]{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iffieldsequal} {O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \blx@imc@ifmsentryfield{#6} {\def\blx@tempb{abx@field@#4@#5@#6}} {\def\blx@tempb{abx@field@@@#6}}% \ifcsequal{\blx@tempa}{\blx@tempb}} % [][]{}[][]{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iflistsequal} {O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@list@#1@#2@#3}} {\def\blx@tempa{abx@list@@@#3}}% \blx@imc@ifmsentryfield{#6} {\def\blx@tempb{abx@list@#4@#5@#6}} {\def\blx@tempb{abx@list@@@#6}}% \ifcsequal\blx@tempa\blx@tempb} % This works by extracting a list of all of the name list hashes "{hash1}{hash2}..." % from the individual names and comparing these lists of hashes % [][]{}[][]{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@ifnamesequal} {O{\blx@msform} O{\blx@lmslang} m O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@name@#1@#2@#3}} {\def\blx@tempa{abx@name@@@#3}}% \blx@imc@ifmsentryfield{#6} {\def\blx@tempb{abx@name@#4@#5@#6}} {\def\blx@tempb{abx@name@@@#6}}% \ifcsundef\blx@tempa {\@secondoftwo} {\ifcsundef\blx@tempb {\@secondoftwo} {\blx@ifnamesequal\blx@tempa\blx@tempb}}} \def\blx@ifnamesequal#1#2{% \begingroup \let\blx@tempc\@empty \expandafter\expandafter \expandafter\blx@ifnamesequal@i\csname #2\endcsname \let\blx@tempd\blx@tempc \let\blx@tempc\@empty \expandafter\expandafter \expandafter\blx@ifnamesequal@i\csname #1\endcsname \expandafter\endgroup \ifx\blx@tempc\blx@tempd \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@tempc{{\abx@field@@@hash}}} {\eappto\blx@tempc{{{\namepartfamily}{\namepartgiven}{\namepartprefix}{\namepartsuffix}}}}} % [][]{}{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iffieldequals} {O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\edef\blx@tempa{\csuse{abx@field@#1@#2@#3}}} {\edef\blx@tempa{\csuse{abx@field@@@#3}}}% \ifundef#4% {\@secondoftwo} {\ifx\blx@tempa#4% \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}}} % [][]{}{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iflistequals} {O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@iflistundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\edef\blx@tempa{\csuse{abx@list@#1@#2@#3}}} {\edef\blx@tempa{\csuse{abx@list@@@#3}}}% \ifundef#4% {\@secondoftwo} {\ifx\blx@tempa#4% \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}}} % This works in much the same way as \blx@imc@ifnamesequal and shares some macros with it % [][]{}{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@ifnameequals} {O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@ifnameundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@name@#1@#2@#3}} {\def\blx@tempa{abx@name@@@#3}}% \ifundef#4% {\@secondoftwo} {\blx@ifnameequals\blx@tempa#4}}} \def\blx@ifnameequals#1#2{% \begingroup \let\blx@tempc\@empty \expandafter\blx@ifnamesequal@i#2 \let\blx@tempd\blx@tempc \let\blx@tempc\@empty \expandafter\expandafter \expandafter\blx@ifnamesequal@i\csname #1\endcsname \expandafter\endgroup \ifx\blx@tempc\blx@tempd \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi} % [][]{}{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iffieldequalcs} {O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@ifmsentryfield{#3} {\ifcsequal{abx@field@#1@#2@#3}{#4}} {\ifcsequal{abx@field@@@#3}{#4}}} % [][]{}{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iflistequalcs} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifmsentryfield{#3} {\ifcsequal{abx@list@#1@#2@#3}} {\ifcsequal{abx@list@@@#3}}} % [][]{}{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@ifnameequalcs} {O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@ifnameundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@name@#1@#2@#3}} {\def\blx@tempa{abx@name@@@#3}}% \ifcsundef{#4}% {\@secondoftwo} {\blx@ifnameequalcs\blx@tempa{#4}}}} \def\blx@ifnameequalcs#1#2{% \begingroup \let\blx@tempc\@empty \expandafter\expandafter\expandafter\blx@ifnamesequal@i\csname #2\endcsname \let\blx@tempd\blx@tempc \let\blx@tempc\@empty \expandafter\expandafter \expandafter\blx@ifnamesequal@i\csname #1\endcsname \expandafter\endgroup \ifx\blx@tempc\blx@tempd \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi} % [][]{}{}{}{} \DeclareDocumentCommand{\blx@imc@iffieldequalstr} {O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter\expandafter\ifstrequal \expandafter\expandafter\expandafter{% \csname\blx@tempa\endcsname}{#4}}} % [][]{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iffieldxref} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@whichxref {\blx@iffieldxref{#1}{#2}{#3}} {\@secondoftwo}}} % {}{}{field}{xref|crossref} \def\blx@iffieldxref#1#2#3#4{% \begingroup \blx@imc@ifmsentryfield{#3} {\letcs\blx@tempb{abx@field@#1@#2@#3}} {\letcs\blx@tempb{abx@field@@@#3}}% \letcs\blx@tempa{abx@field@@@#4}% xref|crossref - non multi \blx@resetdata \blx@getdata{\blx@tempa}% \blx@imc@iffieldequals[{#1}][{#2}]{#3}\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}}} % [][]{}{}{} \DeclareDocumentCommand{\blx@imc@iflistxref} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iflistundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@whichxref {\blx@iflistxref{#1}{#2}{#3}} {\@secondoftwo}}} % {}{}{field}{xref|crossref} \def\blx@iflistxref#1#2#3#4{% \begingroup \blx@imc@ifmsentryfield{#3} {\letcs\blx@tempb{abx@list@#1@#2@#3}} {\letcs\blx@tempb{abx@list@@@#3}}% \letcs\blx@tempa{abx@field@@@#4}% xref|crossref - non multi \blx@resetdata \blx@getdata{\blx@tempa}% \blx@imc@iflistequals[{#1}][{#2}]{#3}\blx@tempb {\aftergroup\@firstoftwo} {\aftergroup\@secondoftwo}% \endgroup} % [][]{}{}{} \DeclareDocumentCommand{\blx@imc@ifnamexref} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@ifnameundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@whichxref {\blx@ifnamexref{#1}{#2}{#3}} {\@secondoftwo}}} % {}{}{field}{xref|crossref} \def\blx@ifnamexref#1#2#3#4{% \begingroup \blx@imc@ifmsentryfield{#3} {\letcs\blx@tempb{abx@name@#1@#2@#3}} {\letcs\blx@tempb{abx@name@@@#3}}% \letcs\blx@tempa{abx@field@@@#4}% xref|crossref - non multi \blx@resetdata \blx@getdata{\blx@tempa}% \blx@imc@ifnameequals[{#1}][{#2}]{#3}\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}}} % [][]{}{}{} \DeclareDocumentCommand{\blx@imc@iffieldint} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter \expandafter\blx@imc@ifinteger \expandafter\expandafter \expandafter{\csname\blx@tempa\endcsname}}} % [][]{}{}{} \DeclareDocumentCommand{\blx@imc@fieldhascomputableequivalent} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter \expandafter\blx@imc@hascomputableequivalent \expandafter\expandafter \expandafter{\csname\blx@tempa\endcsname}}} % [][]{}{}{} \DeclareDocumentCommand{\blx@imc@iffieldiscomputable} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter \expandafter\blx@imc@ifiscomputable \expandafter\expandafter \expandafter{\csname\blx@tempa\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} % [msform][mslang]{}{}{} \DeclareDocumentCommand{\blx@imc@iffieldnum} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter \expandafter\blx@imc@ifnumeral \expandafter\expandafter \expandafter{\csname\blx@tempa\endcsname}}} \DeclareDocumentCommand{\blx@imc@iffieldnums} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter \expandafter\blx@imc@ifnumerals \expandafter\expandafter \expandafter{\csname\blx@tempa\endcsname}}} \DeclareDocumentCommand{\blx@imc@iffieldpages} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \expandafter\expandafter \expandafter\blx@imc@ifpages \expandafter\expandafter \expandafter{\csname\blx@tempa\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}} \def\blx@imc@ifmsentryfield#1{% \ifcsdef{blx@datamodel@multiscript@entryfield@#1}} \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 \ifentryfieldundef \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 \ifmsentryfield} \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}}} % This loops over all form/lang pairs defined for a lang and uses the first one it finds % by defining \blx@cmsform/\blx@cmslang according to what it finds % {bcp47tag}{entryfield}{entryfieldtype} \DeclareDocumentCommand{\blx@ifmsselect} {m m m} {\blx@imc@ifmsentryfield{#2} {\boolfalse{selectms}% % First check the current \blx@msform/\blx@mslang % Must explicitly specify form/lang here and not rely on defaults as \blx@ifmsundef % checks if *any* alternates are defined if no form/lang is passed \blx@ifmsundef{#3}[\blx@msform][\blx@mslang]{#2} % If not defined, then check the select list for the language (tag) of the entry {\ifcsdef{blx@msselect@#1} {\let\blx@tempa\@empty \begingroup \def\do##1{\do@i##1}% \blx@msselect@* list contains pairs like {form}{lang}|{form}{lang} \def\do@i##1##2{% \blx@ifmsundef{#3}[{##1}][{##2}]{#2} {} {% Found a field alternate, save form/lang values and exit listloop \gappto\blx@tempa{\def\blx@cmsform{##1}}% \gappto\blx@tempa{\def\blx@cmslang{##2}}% \gappto\blx@tempa{\booltrue{selectms}}% \listbreak}}% \dolistcsloop{blx@msselect@#1}% \endgroup \blx@tempa\undef\blx@tempa} {}} {\booltrue{selectms}% \let\blx@cmsform\blx@msform \let\blx@cmslang\blx@mslang}% Found the current form/lang alternate \ifbool{selectms} {\@secondoftwo}% found an alternate {\blx@imc@iffieldundef{langid}% No alternate found, check form/langid as last resort {\@firstoftwo} {\blx@ifmsundef{#3}[\blx@msform][\blx@lmslang]{#2} {\@firstoftwo} {\let\blx@cmsform\blx@msform \let\blx@cmslang\blx@lmslang}% \@secondoftwo}}} {\blx@ifmsundef{#3}{#2}}} % Not a multiscript field, just do a normal undef check % [][][]{field} % O{} is an optional arg which defaults to nothing rather than xparse "-NoValue-" \DeclareDocumentCommand{\blx@imc@printfield} {O{} O{} O{} m} {\ifboolexpr {test {\ifblank{#2}} and test {\ifblank{#3}}} {\blx@imc@iffieldundef{langid} {\blx@ifmsselect{\blx@mslang}{#4}{field}} {\blx@ifmsselect{\blx@lmslang}{#4}{field}}} {\let\blx@cmsform\blx@msform% \let\blx@cmslang\blx@mslang% \ifblank{#2}{}{\edef\blx@cmsform{#2}}% \ifblank{#3}{}{\edef\blx@cmslang{#3}}% \blx@imc@iffieldundef[\blx@cmsform][\blx@cmslang]{#4}}% {\blx@nounit} {\blx@getformat\blx@theformat{ffd}{#1}{#4}% \ifdefvoid\blx@theformat {\blx@nounit} {\blx@begunit \edef\currentfield{#4}% \blx@imc@ifmsentryfield{#4} {\let\currentmsform\@empty \let\currentmslang\@empty \let\currentmsforms\@empty \let\currentmslangs\@empty \begingroup % begin language for field mslang \let\currentmsform\blx@cmsform% \let\currentmslang\blx@cmslang% \letcs\currentmsforms{abx@fieldmsforms@#4}% \letcs\currentmslangs{abx@fieldmslangs@#4}% \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}% % Override language from any field-level mslang annotation \ifcsdef{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentfield @mslang} {\edef\currentmslang{\csuse{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentfield @mslang}}% \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}}% {}% \ifdef\blx@thefieldlangenv {\iftoggle{blx@autofieldlangstrings} {\blx@langsetup{\blx@tempa}% must call this to load the .lbx \csuse{abx@extras@\blx@tempa}% \csuse{abx@strings@\blx@tempa}} {}% \blx@hook@initfieldlang \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}} {}% \expandafter\expandafter \expandafter\blx@theformat \expandafter\expandafter \expandafter{\csname abx@field@\currentmsform @\currentmslang @#4\endcsname}% % end language for field mslang \ifdef\blx@thefieldlangenv {\blx@hook@endfieldlang \csname end\blx@thefieldlangenv\endcsname} {}% \endgroup} {\expandafter\expandafter \expandafter\blx@theformat \expandafter\expandafter \expandafter{\csname abx@field@@@#4\endcsname}}% \blx@endunit}}} % [][][]{field} \DeclareExpandableDocumentCommand{\blx@imc@indexfield} {O{} O{} O{} m} {\ifboolexpr {test {\ifblank{#2}} and test {\ifblank{#3}}} {\blx@imc@iffieldundef{langid} {\blx@ifmsselect{\blx@mslang}{#4}{field}} {\blx@ifmsselect{\blx@lmslang}{#4}{field}}} {\let\blx@cmsform\blx@msform% \let\blx@cmslang\blx@mslang% \ifblank{#2}{}{\edef\blx@cmsform{#2}}% \ifblank{#3}{}{\edef\blx@cmslang{#3}}% \blx@imc@iffieldundef[\blx@cmsform][\blx@cmslang]{#4}}% {} {\blx@getformat\blx@theformat{fid}{#1}{#4}% \ifdefvoid\blx@theformat {} {\begingroup \edef\currentfield{#4}% \let\currentmsform\@empty \let\currentmslang\@empty \let\currentmsforms\@empty \let\currentmslangs\@empty \blx@imc@ifmsentryfield{#4} {\let\currentmsform\blx@cmsform% \let\currentmslang\blx@cmslang% \letcs\currentmsforms{abx@fieldmsforms@#4}% \letcs\currentmslangs{abx@fieldmslangs@#4}% \edef\blx@tempa{\csuse{blx@msmaplang@\curentmslang}}% \letcs\blx@tempb{abx@field@\currentmsform @\currentmslang @#4}% \expandafter\blx@theformat\expandafter{\blx@tempb}} {\letcs\blx@tempb{abx@field@@@#4}% \expandafter\blx@theformat\expandafter{\blx@tempb}}% \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}} % {}[][-][][] % => {}{}{}{}{} \DeclareDocumentCommand\blx@listargs {m O{} >{\SplitArgument{1}{-}}O{} O{} O{}} {\let\Start\@empty% \let\Stop\@empty% \ifblank{#3} {}% {\edef\Start{\@firstoftwo#3}% \edef\Stop{\@secondoftwo#3}}% \expandafter\IfNoValueTF\expandafter{\Stop}% Work around bug in xparse {\def\Stop{}} {}% \protected@edef\z{\noexpand#1{#2}{\Start}{\Stop}{#4}{#5}}\z} % [][-]{} \protected\def\blx@imc@printnames{% \blx@listargs\blx@printnames} % {}{}{}{}{}{} \def\blx@printnames#1#2#3#4#5#6{% \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}} {\blx@imc@iffieldundef{langid} {\blx@ifmsselect{\blx@mslang}{#6}{name}} {\blx@ifmsselect{\blx@lmslang}{#6}{name}}} {\let\blx@cmsform\blx@msform% \let\blx@cmslang\blx@mslang% \ifblank{#4}{}{\edef\blx@cmsform{#4}}% \ifblank{#5}{}{\edef\blx@cmslang{#5}}% \blx@imc@ifnameundef[\blx@cmsform][\blx@cmslang]{#6}}% {\blx@nounit} {\blx@getformat\blx@thewrapperformat{nwd}{#1}{#6}% \ifdefvoid\blx@thewrapperformat {\blx@nounit} {\blx@getformat\blx@theformat{nfd}{#1}{#6}% \ifdefvoid\blx@theformat {\blx@nounit} {\blx@begunit \blx@namesetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}% \blx@imc@ifmsentryfield{\currentname} {% begin language for name list mslang \begingroup \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}% % Override language from any field-level mslang annotation \ifcsdef{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentname @mslang} {\edef\currentmslang{\csuse{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentname @mslang}}% \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}}% {}% \ifdef\blx@thefieldlangenv {\iftoggle{blx@autofieldlangstrings} {\blx@langsetup{\blx@tempa}% must call this to load the .lbx \csuse{abx@extras@\blx@tempa}% \csuse{abx@strings@\blx@tempa}} {}% \blx@hook@initfieldlang \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}} {}} {}% \blx@thewrapperformat{\expandafter\blx@nameparser\blx@thedata{}&}% \blx@imc@ifmsentryfield{\currentname} {% end language for name list mslang \ifdef\blx@thefieldlangenv {\blx@hook@endfieldlang \csname end\blx@thefieldlangenv\endcsname} {}% \endgroup} {}% \blx@endunit}}}} \def\blx@namesetup#1#2#3#4#5{% \def\currentname{#5}% \let\currentmsform\@empty \let\currentmslang\@empty \let\currentmsforms\@empty \let\currentmslangs\@empty \c@listcount\@ne \c@listtotal\csname c@#5\endcsname \blx@namesetup@i{#3}{#4}{#5}% \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#2#3{% \blx@imc@ifmsentryfield{#3} {\edef\currentmsform{#1}% \edef\currentmslang{#2}% \letcs\currentmsforms{abx@fieldmsforms@#3}% \letcs\currentmslangs{abx@fieldmslangs@#3}% \expandafter\expandafter \expandafter\blx@namesetup@ii\csname abx@name@#1@#2@#3\endcsname} {\expandafter\expandafter \expandafter\blx@namesetup@ii\csname abx@name@@@#3\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}{mslang}{\def\blx@nmslang{#1}} \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#5#6{% \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}} {\blx@imc@iffieldundef{langid} {\blx@ifmsselect{\blx@mslang}{#6}{name}} {\blx@ifmsselect{\blx@lmslang}{#6}{name}}} {\let\blx@cmsform\blx@msform% \let\blx@cmslang\blx@mslang% \ifblank{#4}{}{\edef\blx@cmsform{#4}}% \ifblank{#5}{}{\edef\blx@cmslang{#5}}% \blx@imc@ifnameundef[\blx@cmsform][\blx@cmslang]{#6}}% {} {\blx@getformat\blx@theformat{nid}{#1}{#6}% \ifdefvoid\blx@theformat {} {\begingroup \blx@namesetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}% \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@indexnameparser#1{% \ifblank{#1} {\blx@namebreak} {\ifnum\c@listcount<\c@liststart \else \blx@indexnameparser@i#1% \fi \advance\c@listcount\@ne \ifnum\c@listcount>\c@liststop \expandafter\blx@namebreak \fi \blx@indexnameparser}} % {name opts}{nameparts} \long\def\blx@indexnameparser@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 \cslet{namepart##1un}\@empty}% \expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}% \blx@kv@setkeys{blx@opt@namepart}{#2}% Extract nameparts information \blx@theformat{}% \endgroup} % {}{}{...} \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 \let\blx@nmslang\@empty \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 \cslet{namepart##1un}\@empty}% \expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}% \blx@kv@setkeys{blx@opt@namepart}{#2}% Extract nameparts information % Extract all alternate nameparts for use in format \begingroup \edef\blx@tempc{\endgroup \noexpand\blx@kv@setkeys{blx@opt@nameparts}{\csuse{abx@nameparts@\currentname @\thelistcount}}}% \blx@tempc % For per-name lang switching, see name:langswitchon/off in biblatex.def % This is because the format wraps everything, including namelist delims like "and" % which then are set according to the lang strings of the name list item and this is % not what we want - putting the lang switching in the format makes it granular % to just the name list item data \blx@theformat{}% \endgroup} \long\def\blx@namebreak#1&{} % [][-][][]{} \protected\def\blx@imc@printlist{% \blx@listargs\blx@printlist} % {}{}{}{}{}{} \def\blx@printlist#1#2#3#4#5#6{% \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}} {\blx@imc@iffieldundef{langid} {\blx@ifmsselect{\blx@mslang}{#6}{list}} {\blx@ifmsselect{\blx@lmslang}{#6}{list}}} {\let\blx@cmsform\blx@msform% \let\blx@cmslang\blx@mslang% \ifblank{#4}{}{\edef\blx@cmsform{#4}}% \ifblank{#5}{}{\edef\blx@cmslang{#5}}% \blx@imc@iflistundef[\blx@cmsform][\blx@cmslang]{#6}}% {\blx@nounit} {\blx@getformat\blx@thewrapperformat{lwd}{#1}{#6}% \ifdefvoid\blx@thewrapperformat {\blx@nounit} {\blx@getformat\blx@theformat{lfd}{#1}{#6}% \ifdefvoid\blx@theformat {\blx@nounit} {\blx@begunit \blx@listsetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}% \blx@imc@ifmsentryfield{\currentlist} {% begin language for list mslang \begingroup \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}% % Override language from any field-level mslang annotation \ifcsdef{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentlist @mslang} {\edef\currentmslang{\csuse{abx@annotation@literal@field@\currentmsform @\currentmslang @\currentlist @mslang}}% \edef\blx@tempa{\csuse{blx@msmaplang@\currentmslang}}}% {}% \ifdef\blx@thefieldlangenv {\iftoggle{blx@autofieldlangstrings} {\blx@langsetup{\blx@tempa}% must call this to load the .lbx \csuse{abx@extras@\blx@tempa}% \csuse{abx@strings@\blx@tempa}} \blx@hook@initfieldlang \csname\blx@thefieldlangenv\expandafter\endcsname\expandafter{\blx@tempa}} {}} {}% \blx@thewrapperformat{\expandafter\blx@listparser\blx@thedata{}&}% \blx@imc@ifmsentryfield{\currentlist} {% end language for list mslang \ifdef\blx@thefieldlangenv {\blx@hook@endfieldlang \csname end\blx@thefieldlangenv\endcsname} {}% \endgroup} {}% \blx@endunit}}}} \def\blx@listsetup#1#2#3#4#5{% \def\currentlist{#5}% \let\currentmsform\@empty \let\currentmslang\@empty \let\currentmsforms\@empty \let\currentmslangs\@empty \c@listcount\@ne \expandafter\c@listtotal\csname c@#5\endcsname \blx@imc@ifmsentryfield{#5} {\letcs\blx@thedata{abx@list@#3@#4@#5}% \edef\currentmsform{#3}% \edef\currentmslang{#4}% \letcs\currentmsforms{abx@fieldmsforms@#5}% \letcs\currentmslangs{abx@fieldmslangs@#5}} {\letcs\blx@thedata{abx@list@@@#5}}% \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#5#6{% \ifboolexpr {test {\ifblank{#4}} and test {\ifblank{#5}}} {\blx@imc@iffieldundef{langid} {\blx@ifmsselect{\blx@mslang}{#6}{list}} {\blx@ifmsselect{\blx@lmslang}{#6}{list}}} {\let\blx@cmsform\blx@msform% \let\blx@cmslang\blx@mslang% \ifblank{#4}{}{\edef\blx@cmsform{#4}}% \ifblank{#5}{}{\edef\blx@cmslang{#5}}% \blx@imc@iflistundef[\blx@cmsform][\blx@cmslang]{#6}}% {} {\blx@getformat\blx@theformat{lid}{#1}{#6}% \ifdefvoid\blx@theformat {} {\begingroup \blx@listsetup{#2}{#3}{\blx@cmsform}{\blx@cmslang}{#6}% \expandafter\blx@listparser\blx@thedata{}&% \endgroup}}} % {}{}{...} \long\def\blx@indexlistparser#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@indexlistparser}} % {}{}{...} \long\def\blx@listparser#1{% \ifblank{#1} {\blx@listbreak} {\ifnum\c@listcount<\c@liststart \else \blx@imc@ifmsentryfield{\currentlist} {% Extract all alternate listitems for use in format \begingroup % Need expand the actual value here only once, as in fielddef otherwise % we get into problems with setkeys when values contain things like \emph{} % Since setkeys needs a string of keyvals, we have to edef when the keyvals % are the value of some macro and this fully expands output macros which might % in plain list values like \emph{} etc. \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\blx@tempb\expandafter\expandafter\expandafter{\expandafter\expandonce\csname abx@listitems@\currentlist @\thelistcount\endcsname}% \edef\blx@tempd{\endgroup \noexpand\blx@kv@setkeys{blx@opt@listitems}{\blx@tempb}}% \blx@tempd} {}% % per-list item lang switching is done in list:langswitchon/off in biblatex.def % This is because the format wraps everything, including list delims like "and" % which then are set according to the lang strings of the list item and this is % not what we want - putting the lang switching in the format makes it granular % to just the list item data \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}} % [][]{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iffieldbibstring} {O{\blx@msform} O{\blx@lmslang} m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \ifcsundef{\abx@str @\detokenize\expandafter \expandafter\expandafter{% \csname\blx@tempa\endcsname}} {\@secondoftwo} {\@firstoftwo}}} % [][]{}{}{}{} \DeclareExpandableDocumentCommand{\blx@imc@iffieldplusstringbibstring} {O{\blx@msform} O{\blx@lmslang} m m} {\blx@imc@iffieldundef[{#1}][{#2}]{#3} {\@secondoftwo} {\blx@imc@ifmsentryfield{#3} {\def\blx@tempa{abx@field@#1@#2@#3}} {\def\blx@tempa{abx@field@@@#3}}% \ifcsundef{\abx@str @\detokenize\expandafter \expandafter\expandafter{% \csname\blx@tempa\endcsname}#4} {\@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{% \begingroup \ifcsdef{blx@lng@#1} {\edef\blx@tempa{\csuse{blx@lng@#1}.lbx}} {\def\blx@tempa{#1.lbx}}% \expandafter\blx@altfile\expandafter{\blx@tempa}% \ifdefempty\blx@fnext {\blx@err@nolang{#1}} {}% \endgroup} % {}{} \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@altfile{#1.lbx}% \ifdefempty\blx@fnext {\blx@lbxinput@iv{#1}{#1}{language '#1'}} {\blx@lbxinput@iv{#1}{\blx@fnnoext}{language '#1'}}}} % {}{} \def\blx@lbxinput@iii#1#2{% \global\csundef{blx@lng@#2}% \blx@altfile{#1.lbx}% \ifdefempty\blx@fnext {\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'}} {\blx@lbxinput@iv{#2}{\blx@fnnoext}{language '#2' -> '#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} % .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}} % {} \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*{\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 \csname end\blx@thelangenv\endcsname \endgroup}% \iftoggle{blx@autolangbib} {\let\blx@endlangbib\blx@endlang} {}% \iftoggle{blx@autolangcite} {\let\blx@endlangcite\blx@endlang} {}% \csname\blx@thelangenv\expandafter\endcsname \expandafter{\abx@field@@@langid}}} {}}} {}% \def\blx@imc@mainlang{% \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} {\csname end\abx@field@@@langid\endcsname} {\csname end\blx@thelangenv\endcsname}% \endgroup}% \iftoggle{blx@autolangbib} {\let\blx@endlangbib\blx@endlang} {}% \iftoggle{blx@autolangcite} {\let\blx@endlangcite\blx@endlang} {}% \ifcsstring{blx@thelangenv}{langname} {\ifdef\abx@field@@@langidopts {\csname\abx@field@@@langid\expandafter\endcsname \expandafter[\abx@field@@@langidopts]} {\csname\abx@field@@@langid\endcsname}} {\csname\blx@thelangenv\expandafter\endcsname \expandafter{\abx@field@@@langid}}% \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 %