Created
September 15, 2020 15:32
-
-
Save moewew/55f8a7de54f5b7033ed9cb00efbd3371 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Copyright (c) 2006-2011 Philipp Lehman. | |
% 2012-2017 Philip Kime, Audrey Boruvka, Joseph Wright | |
% 2018- Philip Kime, Moritz Wemheuer | |
% | |
% Permission is granted to copy, distribute and/or modify this | |
% software under the terms of the LaTeX Project Public License | |
% (LPPL), version 1.3c. | |
% | |
% This software is provided 'as is', without warranty of any kind, | |
% either expressed or implied, including, but not limited to, the | |
% implied warranties of merchantability and fitness for a | |
% particular purpose. | |
% Set up the version strings here | |
\def\abx@date{2020/09/15} | |
\def\abx@version{3.15b-dev} | |
\typeout{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!} | |
\PackageWarning{biblatex}{% | |
This is just a test file for\MessageBreak | |
https://github.com/plk/biblatex/issues/1041\MessageBreak | |
Please do not use it in a production environment.\MessageBreak | |
Make sure to remove the file once v3.15b is released\@gobble} | |
\typeout{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!} | |
\def\abx@bbxid{\abx@date\space v\abx@version\space biblatex bibliography style (PK/MW)} | |
\def\abx@cbxid{\abx@date\space v\abx@version\space biblatex citation style (PK/MW)} | |
\def\abx@lbxid{\abx@date\space v\abx@version\space biblatex localization (PK/MW)} | |
\def\abx@cptid{\abx@date\space v\abx@version\space biblatex compatibility (PK/MW)} | |
% This is not updated by build script as the control file version | |
% does not necessarily change with the package version. | |
% This is used when writing the .bcf | |
\def\blx@bcfversion{3.7} | |
% This is not updated by build script as the bbl version | |
% does not necessarily change with the package version. | |
% This is used when checking the .bbl | |
\def\blx@bblversion{3.1} | |
\NeedsTeXFormat{LaTeX2e}[2005/12/01] | |
\ProvidesPackage{biblatex} | |
[\abx@date\space v\abx@version\space programmable bibliographies (PK/MW)] | |
%% Dependencies | |
\RequirePackage{pdftexcmds}[2018/01/30] | |
\RequirePackage{etoolbox} | |
\RequirePackage{keyval} | |
\RequirePackage{kvoptions} | |
\RequirePackage{logreq} | |
\RequirePackage{ifthen} | |
\RequirePackage{url} | |
%\RequirePackage{trace} | |
\@ifpackagelater{etoolbox}{2010/11/29} | |
{} | |
{\PackageError{biblatex} | |
{Outdated 'etoolbox' package} | |
{Upgrade to etoolbox v2.1 (2010/11/29) or later.\MessageBreak | |
I found: '\csuse{ver@etoolbox.sty}'.\MessageBreak | |
This is a fatal error. I'm aborting now}% | |
\endinput} | |
% generalised keyval interface | |
% define a new key (possibly with a default value) | |
% {<family>}{<key>}[<default>]{<code>} | |
\providerobustcmd*{\blx@kv@defkey}{\define@key} | |
% globally define new key (should only be the last resort) | |
% {<family>}{<key>}[<default>]{<code>} | |
\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 | |
% {<family>}{<key>}{<true>}{<false>} | |
\providecommand*{\blx@kv@ifkeyundef}[2]{% | |
\ifcsundef{KV@#1@#2}} | |
% undefine key | |
% {<family>}{<key>} | |
\providerobustcmd*{\blx@kv@undef}[2]{\csundef{KV@#1@#2}} | |
% {<family>}{<key-vals>} | |
\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}} | |
%% Compatibility | |
% this hook is executed once at the beginning of loading the package | |
% just a few lines down | |
% and again later in an \AtEndPreamble hook | |
\def\blx@packageincompatibility{% | |
\def\do##1{% | |
\@ifpackageloaded{##1} | |
{\ifcsundef{blx@pkgloaded@##1} | |
{\global\cslet{blx@pkgloaded@##1}\@empty | |
\blx@error | |
{Incompatible package '##1'} | |
{The '##1' package and biblatex are incompatible}} | |
{}} | |
{}}% | |
\docsvlist{% | |
amsrefs,apacite,babelbib,backref,bibtopic,bibunits,chapterbib, | |
cite,citeref,drftcite,footbib,inlinebib,jurabib,mcite,mciteplus, | |
mlbib,multibbl,multibib,natbib,opcit,overcite,splitbib,ucs}% | |
% etextools is special, it gets an option to demote the error to a warning | |
% remind people to restore \forlistloop | |
\ifcsdef{blx@noerroretextools} | |
{\@ifpackageloaded{etextools} | |
{\ifcsundef{blx@pkgloaded@etextools} | |
{\global\cslet{blx@pkgloaded@etextools}\@empty | |
\blx@warning@noline{% | |
Incompatible package 'etextools' loaded,\MessageBreak | |
no error is thrown because you defined\MessageBreak | |
'\string\blx@noerroretextools'.\MessageBreak | |
'etextools' redefines '\string\forlistloop', you must\MessageBreak | |
restore the definition from 'etoolbox'\MessageBreak | |
before you load biblatex}} | |
{}} | |
{}} | |
{\@ifpackageloaded{etextools} | |
{\ifcsundef{blx@pkgloaded@etextools} | |
{\global\cslet{blx@pkgloaded@etextools}\@empty | |
\blx@error | |
{Incompatible package 'etextools'} | |
{The 'etextools' package and biblatex are | |
incompatible.\MessageBreak | |
If you must load 'etextools' at all costs, define the command% | |
\MessageBreak '\string\blx@noerroretextools'}} | |
{}} | |
{}}} | |
% Call this right here, almost immediately after loading to give sensible | |
% errors for incompatibilities that arise at loading-time. | |
% The macro is called again a second time in \AtEndPreamble when all packages | |
% should be loaded. | |
% This still can't catch all cases, \usepackage{biblatex}\usepackage{natbib} | |
% still gives a weird error. | |
\blx@packageincompatibility | |
% this part is only executed now | |
\@ifpackageloaded{polyglossia} | |
{\global\cslet{blx@pkgloaded@polyglossia}\@empty} | |
{} | |
% this part is deferred to \AtEndPreamble | |
\def\blx@packageincompatibility@endpreambleonly{% | |
% people should not be abusing noerroretextools, | |
% so warn if it is not needed | |
\ifcsdef{blx@noerroretextools} | |
{\@ifpackageloaded{etextools} | |
{} | |
{\blx@warning@noline{% | |
You defined '\string\blx@noerroretextools',\MessageBreak | |
but 'etextools' is not loaded.\MessageBreak | |
Please do not define '\string\blx@noerroretextools'\MessageBreak | |
unless you really need it}}} | |
{}% | |
% polyglossia pretends to be babel, so the nested structure helps | |
% to make sure that babel really is babel | |
\@ifpackageloaded{polyglossia} | |
{\ifcsundef{blx@pkgloaded@polyglossia} | |
{\blx@error | |
{'polyglossia' loaded after biblatex} | |
{'polyglossia' must be loaded before biblatex}} | |
{}% | |
\@ifpackagelater{polyglossia}{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}% | |
\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}}} | |
{}% | |
} | |
% our copy of \addtocontents with \immediate (not @protected, | |
% so a bit different, but we are only going to use it for very | |
% specific input, so that doesn't matter) | |
\def\blx@immediate@addtocontents#1#2{% | |
\blx@auxwrite\@auxout | |
{\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}% | |
{\string\@writefile{#1}{#2}}} | |
\AtBeginDocument{% | |
\blx@immediate@addtocontents{toc}{% | |
\boolfalse{citerequest}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\boolfalse{backtracker}\relax}% | |
\blx@immediate@addtocontents{lof}{% | |
\boolfalse{citerequest}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\boolfalse{backtracker}\relax}% | |
\blx@immediate@addtocontents{lot}{% | |
\boolfalse{citerequest}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\boolfalse{backtracker}\relax}} | |
\begingroup | |
\@makeother\# | |
% \relax: gobble newline -> titletoc.sty | |
\AtEndPreamble{% | |
\patchcmd\addtocontents | |
{\string\@writefile} | |
{\string\@writefile{#1}{\defcounter{refsection}{\the\c@refsection}\relax}% | |
\string\@writefile} | |
{} | |
{\blx@err@patch{\string\addtocontents}}} | |
\endgroup | |
% trick hyperref into believing we're natbib | |
\let\NAT@parse\@empty | |
% trick showkeys into believing we're havard | |
\let\HAR@checkdef\@empty | |
\providecommand{\@gobblefive}[5]{} | |
\providecommand{\@gobblethree}[3]{} | |
% etoolbox helpers | |
% \ifinlist{<item>}{<list>} is not a good idea | |
% for printable stuff according to the etoolbox docs | |
% for \ifinlist (p. 31) | |
\newrobustcmd{\blx@ifprintableinlist}[2]{% | |
\begingroup | |
\def\blx@tempa{\endgroup | |
\@secondoftwo}% | |
\renewcommand*{\do}[1]{% | |
\ifstrequal{##1}{#1} | |
{\def\blx@tempa{\endgroup | |
\@firstoftwo}% | |
\listbreak} | |
{}}% | |
\dolistloop{#2}% | |
\expandafter\blx@tempa} | |
\newrobustcmd{\blx@ifprintableinlistcs}[2]{% | |
\expandafter\blx@ifprintableinlistcs@i\csname #2\endcsname{#1}} | |
\long\def\blx@ifprintableinlistcs@i#1#2{\blx@ifprintableinlist{#2}{#1}} | |
\ifundef\pdf@mdfivesum | |
{\let\blx@mdfivesum\@firstofone | |
\blx@warning@noline{Command '\string\pdf@mdfivesum' undefined.\MessageBreak | |
'labelprefix' may not be able to accept all input.\MessageBreak | |
The command is available (via 'pdftexcmds')\MessageBreak | |
in recent versions of pdfTeX, LuaTeX and XeTeX}} | |
{\let\blx@mdfivesum\pdf@mdfivesum} | |
\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\relax | |
\let\blx@generate@bbl@mdfivesum@notfound\relax | |
\let\blx@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{% | |
\xdef\blx@bbl@mdfivesum@new{\blx@filemdfivesum{\jobname.bbl}}} | |
\def\blx@generate@bbl@mdfivesum@notfound{% | |
\gdef\blx@bbl@mdfivesum@new{nobblfile}} | |
\def\blx@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{% | |
\iftoggle{blx@runbiber} | |
{\blx@auxwrite\@mainaux{}{% | |
\string\blx@aux@read@bbl@mdfivesum{\blx@bbl@mdfivesum@new}}} | |
{}} | |
% 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{% | |
\ifdefstrequal\blx@bbl@mdfivesum@old\blx@bbl@mdfivesum@new | |
{\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 | |
% {<string>}{<strip>}{<result>} | |
% <result> will contain the bit of <string> | |
% after the first occurrence of <strip> | |
\protected\def\blx@stripfromstartinto#1#2#3{% | |
\def\blx@stripfromstart@i ##1#2##2&{% | |
\def#3{##2}}% | |
\blx@stripfromstart@i #1&} | |
% {<string>}{<strip>}{<result>} | |
% <result> will contain the bit of <string> | |
% before the last occurence of <strip> | |
\protected\def\blx@stripfromendinto#1#2#3{% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@stripfromstartinto{\blx@revstr{#1}}{\blx@revstr{#2}}}% | |
\blx@tempa{#3}% | |
\edef#3{\noexpand\blx@revstr{#3}}% | |
\edef#3{#3}} | |
%% Allocation | |
% Counter to track nested tabularx environemnts so we don't | |
% try to patch the commands more than once below as this undefs some | |
% macros and an error is thrown | |
\newcounter{tabx@nest} | |
\setcounter{tabx@nest}{0} | |
\newcounter{listtotal} | |
\def\thelisttotal{\the\c@listtotal} | |
\newcounter{listcount} | |
\def\thelistcount{\the\c@listcount} | |
\newcounter{liststart} | |
\def\theliststart{\the\c@liststart} | |
\newcounter{liststop} | |
\def\theliststop{\the\c@liststop} | |
\newcounter{citecount} | |
\def\thecitecount{\the\c@citecount} | |
\newcounter{citetotal} | |
\def\thecitetotal{\the\c@citetotal} | |
\newcounter{multicitecount} | |
\def\themulticitecount{\the\c@multicitecount} | |
\newcounter{multicitetotal} | |
\def\themulticitetotal{\the\c@multicitetotal} | |
\newcounter{instcount} | |
\def\theinstcount{\the\c@instcount} | |
\newcounter{maxnames} | |
\def\themaxnames{\the\c@maxnames} | |
\newcounter{minnames} | |
\def\theminnames{\the\c@minnames} | |
\newcounter{maxitems} | |
\def\themaxitems{\the\c@maxitems} | |
\newcounter{minitems} | |
\def\theminitems{\the\c@minitems} | |
\newcounter{citecounter} | |
\def\thecitecount{\the\c@citecounter} | |
\newcounter{maxcitecounter} | |
\def\themaxcitecounter{\the\c@maxcitecounter} | |
\newcounter{savedcitecounter} | |
\def\thecitecount{\the\c@savedcitecounter} | |
\newcounter{uniquelist} | |
\def\theuniquelist{\the\c@uniquelist} | |
\newcounter{uniquename} | |
\def\theuniquename{\the\c@uniquename} | |
\newcounter{refsection} | |
\def\therefsection{\the\c@refsection} | |
\newcounter{refsegment} | |
\def\therefsegment{\the\c@refsegment} | |
\newcounter{maxextratitle} | |
\def\themaxextratitle{\the\c@maxextratitle} | |
\newcounter{maxextratitleyear} | |
\def\themaxextratitleyear{\the\c@maxextratitleyear} | |
\newcounter{maxextraname} | |
\def\themaxextraname{\the\c@maxextraname} | |
\newcounter{maxextradate} | |
\def\themaxextradate{\the\c@maxextradate} | |
\newcounter{maxextraalpha} | |
\def\themaxextraalpha{\the\c@maxextraalpha} | |
\newcounter{abbrvpenalty} | |
\def\theabbrvpenalty{\the\c@abbrvpenalty} | |
\newcounter{highnamepenalty} | |
\def\thehighnamepenalty{\the\c@highnamepenalty} | |
\newcounter{lownamepenalty} | |
\def\thelownamepenalty{\the\c@lownamepenalty} | |
\newcounter{maxparens} | |
\def\themaxparens{\the\c@maxparens} | |
\newcounter{parenlevel} | |
\def\theparenlevel{\the\c@parenlevel} | |
\newcount\blx@tempcnta | |
\newcount\blx@tempcntb | |
\newcount\blx@tempcntc | |
\newcount\blx@maxsection | |
\expandafter\newcount\csname blx@maxsegment@0\endcsname | |
\newcount\blx@notetype | |
\newcount\blx@parenlevel@text | |
\newcount\blx@parenlevel@foot | |
\expandafter\newcount\csname blx@sectionciteorder@0\endcsname | |
\newcount\blx@entrysetcounter | |
\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{refcontextdefaults} | |
\booltrue{refcontextdefaults}% | |
\newbool{sourcemap} | |
\newbool{citetracker} | |
\newbool{pagetracker} | |
\newbool{backtracker} | |
\newbool{citerequest} | |
\booltrue{citerequest} | |
\newbool{sortcites} | |
\newtoggle{blx@bbldone} | |
\newtoggle{blx@tempa} | |
\newtoggle{blx@tempb} | |
\newtoggle{blx@runltx} | |
\newtoggle{blx@runbiber} | |
\newtoggle{blx@block} | |
\newtoggle{blx@unit} | |
\newtoggle{blx@skipentry} | |
\newtoggle{blx@insert} | |
\newtoggle{blx@lastins} | |
\newtoggle{blx@keepunit} | |
\newtoggle{blx@bibtex} | |
\newtoggle{blx@debug} | |
\newtoggle{blx@sortcase} | |
\newtoggle{blx@sortupper} | |
\newtoggle{blx@autolangbib} | |
\newtoggle{blx@autolangcite} | |
\newtoggle{blx@clearlang} | |
\newtoggle{blx@defernumbers} | |
\newtoggle{blx@omitnumbers} | |
\newtoggle{blx@footnote} | |
\newtoggle{blx@labelalpha} | |
\newtoggle{blx@labelnumber} | |
\newtoggle{blx@labeltitle} | |
\newtoggle{blx@labeltitleyear} | |
\newtoggle{blx@labeldateparts} | |
\newtoggle{blx@natbib} | |
\newtoggle{blx@mcite} | |
\newtoggle{blx@loadfiles} | |
\newtoggle{blx@sortsets} | |
\newtoggle{blx@crossrefsource} | |
\newtoggle{blx@xrefsource} | |
\newtoggle{blx@terseinits} | |
\newtoggle{blx@useprefix} | |
\newtoggle{blx@addset} | |
\newtoggle{blx@setonly} | |
\newtoggle{blx@dataonly} | |
\newtoggle{blx@skipbib} | |
\newtoggle{blx@skipbiblist} | |
\newtoggle{blx@skiplab} | |
\newtoggle{blx@citation} | |
\newtoggle{blx@volcite} | |
\newtoggle{blx@bibliography} | |
\newtoggle{blx@citeindex} | |
\newtoggle{blx@bibindex} | |
\newtoggle{blx@localnumber} | |
\newtoggle{blx@refcontext} | |
\newtoggle{blx@noroman} | |
\newtoggle{blx@nohashothers} | |
\newtoggle{blx@nosortothers} | |
\newtoggle{blx@singletitle} | |
\newtoggle{blx@uniquebaretitle} | |
\newtoggle{blx@uniqueprimaryauthor} | |
\newtoggle{blx@uniquetitle} | |
\newtoggle{blx@uniquework} | |
\newcommand*{\blx@xifstrequal}[2]{% | |
\begingroup | |
\edef\blx@tempa{% | |
\endgroup | |
\noexpand\ifstrequal{#1}{#2}}% | |
\blx@tempa} | |
% Special fields which need resolution using the information provided by biber | |
\listadd\abx@rfields{labeltitle} | |
\def\abx@dorfields{% | |
\dolistloop\abx@rfields% | |
} | |
\listadd\abx@rnames{labelname} | |
\def\abx@dornames{% | |
\dolistloop\abx@rnames% | |
} | |
% Used to track default refcontexts for citations | |
\cslet{blx@defaultrefcontexts@0}\@empty | |
\listadd\blx@allrefsections{0} | |
% Used to track sorting name key specifications | |
\global\let\blx@sortingnamekeytemplates\@empty | |
% Used to track uniquename templates | |
\global\let\blx@untemplatespecs\@empty | |
% Used to track labelalphaname templates | |
\global\let\blx@lantemplatespecs\@empty | |
% Used to track transliterations | |
\global\let\blx@translits\@empty | |
% Use to track every entry found in .bbl | |
% Used to issue defernumbers warning about missing keys because this causes | |
% defernumbers labelling to fail. | |
\global\let\blx@entries\@empty | |
% Initialise some lists which track changing citations/sortingtemplates | |
% etc. between runs | |
\global\let\blx@cites\@empty | |
\global\let\blx@nocites\@empty | |
\global\let\blx@directcites\@empty | |
\global\let\blx@refcontexts\@empty | |
\global\let\blx@lastrefcontexts\@empty | |
\global\let\blx@sortingtemplatenames\@empty | |
\global\let\blx@dlistnames\@empty | |
\global\let\blx@biblists\@empty | |
\global\let\blx@lastbiblists\@empty | |
\global\let\blx@lastcites\@empty | |
\global\let\blx@localnumaux\@empty | |
\newread\blx@bcfin | |
\newwrite\blx@bcfout | |
\def\blx@onlypreamble#1{% | |
\gappto\blx@dopreamblecmds{\do#1}} | |
\def\blx@dopreamblecmds{% | |
\do\blx@dopreamblecmds | |
\do\blx@onlypreamble} | |
% Deprecations | |
\newrobustcmd*{\DeprecateField}[2]{% | |
\csdef{abx@field@#1}{% | |
\ifcsundef{abx@legacywarning@field@#1} | |
{\blx@warning@noline{Field '#1' is deprecated. #2}} | |
{}% | |
\global\cslet{abx@legacywarning@field@#1}\@empty}}% | |
\newrobustcmd*{\DeprecateList}[2]{% | |
\csdef{abx@list@#1}{% | |
\ifcsundef{abx@legacywarning@list@#1} | |
{\blx@warning@noline{List '#1' is deprecated. #2}} | |
{}% | |
\global\cslet{abx@legacywarning@list@#1}\@empty}} | |
\newrobustcmd*{\DeprecateName}[2]{% | |
\csdef{abx@name@#1}{% | |
\ifcsundef{abx@legacywarning@name@#1} | |
{\blx@warning@noline{Name '#1' is deprecated. #2}} | |
{}% | |
\global\cslet{abx@legacywarning@name@#1}\@empty}} | |
\let\blx@aliasfields\@empty | |
\newrobustcmd*{\DeprecateFieldWithReplacement}[2]{% | |
\appto\blx@aliasfields{% | |
\ifcsundef{abx@field@#2} | |
{} | |
{\csdef{abx@field@#1}{% | |
\csuse{abx@field@#2}% | |
\ifcsundef{abx@legacywarning@field@#1} | |
{\blx@warning@noline{Field '#1' is deprecated.\MessageBreak | |
Please use '#2' instead.\MessageBreak | |
Using '#2' now}} | |
{}% | |
\global\cslet{abx@legacywarning@field@#1}\@empty}}}} | |
\newrobustcmd*{\DeprecateListWithReplacement}[2]{% | |
\appto\blx@aliasfields{% | |
\ifcsundef{abx@list@#2} | |
{} | |
{\csdef{abx@list@#1}{% | |
\csuse{abx@list@#2}% | |
\ifcsundef{abx@legacywarning@list@#1} | |
{\blx@warning@noline{List '#1' is deprecated.\MessageBreak | |
Please use '#2' instead.\MessageBreak | |
Using '#2' now}} | |
{}% | |
\global\cslet{abx@legacywarning@list@#1}\@empty}}}} | |
\newrobustcmd*{\DeprecateNameWithReplacement}[2]{% | |
\appto\blx@aliasfields{% | |
\ifcsundef{abx@name@#2} | |
{} | |
{\csdef{abx@name@#1}{% | |
\csuse{abx@name@#2}% | |
\ifcsundef{abx@legacywarning@name@#1} | |
{\blx@warning@noline{Name '#1' is deprecated.\MessageBreak | |
Please use '#2' instead.\MessageBreak | |
Using '#2' now}} | |
{}% | |
\global\cslet{abx@legacywarning@name@#1}\@empty}}}} | |
%% Initialisation | |
\def\blx@blxinit{% | |
\let\blx@blxinit\relax | |
\blx@initunit} | |
\def\blx@secinit{% | |
\csgdef{blx@sections@\the\c@refsection}{true}% just to say we have a section for tests later | |
\ifcsundef{blx@bsee@\the\c@refsection} | |
{\global\cslet{blx@bsee@\the\c@refsection}\@empty} | |
{}% | |
\ifcsundef{blx@fsee@\the\c@refsection} | |
{\global\cslet{blx@fsee@\the\c@refsection}\@empty} | |
{}% | |
\blx@ibidreset@force | |
\blx@idemreset@force | |
\blx@opcitreset@force | |
\blx@loccitreset@force | |
% List to track all aliases in a section. We need to output all aliases | |
% to the .bcf every time so that they are visible to biber | |
% Reset only if undefined | |
\ifcsundef{blx@keyaliases@\the\c@refsection} | |
{\global\cslet{blx@keyaliases@\the\c@refsection}\@empty} | |
{}% | |
\ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty} | |
{}} | |
%% Auxiliary commands | |
\protected\def\blx@regimc#1{% | |
\xappto\blx@blxinit{% | |
\let\noexpand#1\expandafter\noexpand\csname | |
blx@imc@\expandafter\@gobble\string#1\endcsname}} | |
\protected\def\blx@regimcs#1{\blx@regimcs@i#1&} | |
\def\blx@regimcs@i#1{% | |
\ifx#1&\else | |
\blx@regimc#1% | |
\expandafter\blx@regimcs@i | |
\fi} | |
% {<field>} => \do{<item1>}\do{<item2>}... | |
\def\blx@imc@docsvfield#1{% | |
\blx@imc@iffieldundef{#1} | |
{} | |
{\expandafter\expandafter\expandafter\docsvlist | |
\expandafter\expandafter\expandafter{% | |
\csname abx@field@#1\endcsname}}} | |
% {<handler>}{<field>} => <handler>{<item1>}<handler>{<item2>}... | |
\def\blx@imc@forcsvfield#1#2{% | |
\blx@imc@iffieldundef{#2} | |
{} | |
{\expandafter\expandafter\expandafter\blx@imc@forcsvfield@i | |
\expandafter\expandafter\expandafter{% | |
\csname abx@field@#2\endcsname}{#1}}} | |
\def\blx@imc@forcsvfield@i#1#2{\forcsvlist{#2}{#1}} | |
\blx@regimcs{\docsvfield \forcsvfield} | |
% {<list>|<listmacro>} | |
\protected\long\def\blx@listloop#1{% | |
\expandafter\blx@listloop@i#1|&} | |
\long\def\blx@listloop@i#1|{% | |
\ifblank{#1} | |
{\blx@break} | |
{\blx@do{#1}\blx@listloop@i}} | |
\long\def\blx@break#1&{% | |
\blx@done | |
\undef\blx@do | |
\undef\blx@done} | |
% {<listmacro>}{<listcsname>} => matches in <listmacro> | |
\protected\def\blx@filter#1#2{% | |
\def\do##1{% | |
\ifinlistcs{##1}{#2} | |
{\listadd#1{##1}} | |
{}}% | |
\blx@runfilter#1} | |
% {<listmacro>}{<listcsname>} => matches in <listmacro> | |
% Slightly odd use of filtering to do citation sorting. | |
% Same as blx@filter but it keeps \tempcnta in step with the | |
% resulting number of things in the filtered list. This is | |
% because \tempcnta is used to set citetotal - this use | |
% of filtering for cite sorting has the side-effect of stripping | |
% duplicates like \cite{foo,foo} but we need then to keep citetotal | |
% in sync. | |
\protected\def\blx@filtercitesort#1#2{% | |
\blx@tempcnta\z@ | |
\def\do##1{% | |
\ifinlistcs{##1}{#2} | |
{\listadd#1{##1}% | |
\advance\blx@tempcnta\@ne} | |
{}}% | |
\blx@runfilter#1} | |
% {<listmacro>}{<listcsname>} => neg. matches in <listmacro> | |
\protected\def\blx@notfilter#1#2{% | |
\def\do##1{% | |
\ifinlistcs{##1}{#2} | |
{} | |
{\listadd#1{##1}}}% | |
\blx@runfilter#1} | |
\def\blx@runfilter#1{% | |
\begingroup\edef#1{\endgroup | |
\unexpanded{\let#1\@empty\dolistloop}{#1}}% | |
#1\let\do\noexpand} | |
% {<code>}{<string>} => <code>{<string>} | |
\protected\def\blx@xsanitizeafter#1#2{% | |
\begingroup | |
\abx@hook@xsanitize | |
\def\blx@tempa{\endgroup#1}% | |
\edef\blx@tempb{#2}% | |
\expandafter\blx@tempa | |
\expandafter{\detokenize\expandafter{\blx@tempb}}} | |
\def\abx@hook@xsanitize{% | |
\blx@safe@actives | |
\let\protect\string} | |
% {<code>}{<string>} => <code>{<string>} | |
\begingroup | |
\catcode`\<=\active | |
\catcode`\>=\active | |
\catcode`\&=\active | |
\catcode`\"=\active | |
\catcode`\'=\active | |
\protected\gdef\blx@xmlsanitizeafter#1#2{% | |
\begingroup | |
\abx@hook@xsanitize | |
\def\blx@tempa{\endgroup#1}% | |
\edef\blx@tempb{#2}% | |
\let\do\@makeother | |
\dospecials | |
\catcode`\<=\active | |
\catcode`\>=\active | |
\catcode`\&=\active | |
\catcode`\"=\active | |
\catcode`\'=\active | |
\edef<{\string<\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 | |
% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>} | |
\protected\long\def\blx@inputonce#1#2#3#4#5#6{% | |
\ifcsundef{blx@file@#1} | |
{\blx@info@noline{Trying to load #2..}% | |
\IfFileExists{#1} | |
{\blx@info@noline{... file '#1' found}% | |
\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}} | |
% {<write>}{<precode>}{<string>} | |
\protected\def\blx@auxwrite#1#2#3{% | |
\if@filesw | |
\begingroup | |
\blx@safe@actives | |
\let\protect\string | |
#2% | |
\immediate\write#1{#3}% | |
\endgroup | |
\fi} | |
% {<file>}{<signature>}{<true>}{<false>} | |
\def\blx@ifsigned#1#2{% | |
\begingroup | |
\let\blx@tempa\@firstoftwo | |
\edef\blx@tempb{\csuse{blx@sig@#2}}% | |
\edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}% | |
\openin\blx@bcfin #1.#2\relax | |
\ifeof\blx@bcfin | |
\else | |
\endlinechar\m@ne | |
\readline\blx@bcfin to \blx@tempc | |
\ifeof\blx@bcfin | |
\else | |
\ifx\blx@tempb\blx@tempc | |
\readline\blx@bcfin to \blx@tempc | |
\edef\blx@tempb{\csuse{blx@ver@#2}}% | |
\edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}% | |
\ifx\blx@tempb\blx@tempc | |
\else | |
\blx@warning@noline{% | |
File '#1.#2' is wrong format version - expected \blx@bblversion} | |
\fi | |
\else | |
\blx@error | |
{File '#1.#2' not created by biblatex} | |
{This file was apparently not created by biblatex. | |
Rename it or\MessageBreak move it to a location were | |
TeX will not find it. If this error\MessageBreak | |
persists, consider redefining \string\blxauxsuffix.% | |
See the biblatex\MessageBreak manual for details}% | |
\let\blx@tempa\@secondoftwo | |
\fi | |
\fi | |
\fi | |
\closein\blx@bcfin | |
\expandafter\endgroup\blx@tempa} | |
\edef\blx@sig@bbl{\@percentchar\space $ biblatex auxiliary file $} | |
\edef\blx@ver@bbl{\@percentchar\space $ biblatex bbl format version \blx@bblversion\space $} | |
\edef\blx@sig@bcf{\detokenize{<?xml version="1.0" encoding="UTF-8"?>}} | |
\edef\blx@ver@bcf{% | |
\detokenize{<bcf:controlfile version="}\blx@bcfversion | |
\detokenize{" bltxversion="}\abx@version | |
\detokenize{" xmlns:bcf="https://sourceforge.net/projects/biblatex">}} | |
% {<true>}{<false>} | |
\newrobustcmd*{\lbx@ifutfinput}{% | |
\ifboolexpr{% | |
test {\ifdefstring\inputencodingname{utf8}} | |
or | |
test {\ifdefstring\inputencodingname{utf8x}} | |
or | |
test {\ifdefstring\inputencodingname{lutf8}} | |
or | |
( test {\ifundef\inputencodingname} | |
and | |
( not test {\ifundef\XeTeXrevision} | |
or | |
not test {\ifundef\luatexversion} | |
) | |
) | |
}% | |
} | |
%% More user feedback | |
\protected\def\blx@warning@entry#1{% | |
\ifdef\abx@field@entrykey | |
{\blx@warning{#1\MessageBreak at entry '\abx@field@entrykey'}} | |
{\blx@warning{#1}}} | |
\protected\def\blx@info@noline#1{% | |
\begingroup | |
\blx@safe@actives | |
\PackageInfo{biblatex}{#1\@gobble}% | |
\endgroup} | |
\let\blx@info\blx@info@noline | |
\AtEndOfPackage{% | |
\protected\def\blx@info#1{% | |
\begingroup | |
\blx@safe@actives | |
\PackageInfo{biblatex}{#1}% | |
\endgroup}} | |
\let\blx@noline\@gobble | |
\AtEndOfPackage{\let\blx@noline\@empty} | |
\def\blx@imc@BibliographyWarning{\blx@warning@entry} | |
\blx@regimc\BibliographyWarning | |
\protected\def\abx@missing#1{% | |
\mbox{\reset@font\bfseries#1}} | |
\def\blx@err@patch#1{% | |
\blx@error | |
{Patching #1 failed} | |
{This is an internal issue typically caused by a | |
conflict\MessageBreak between biblatex and some | |
other package. Modifying\MessageBreak the package | |
loading order may fix the problem}} | |
\def\blx@err@nolang#1{% | |
\blx@error | |
{Language '#1' not found} | |
{The localization module for '#1' could not be found}} | |
\def\blx@err@invarg#1#2{% | |
\blx@error | |
{Argument '#1' invalid} | |
{\ifblank{#2} | |
{The argument you have supplied is invalid.\MessageBreak | |
See the biblatex manual for details} | |
{#2}}} | |
\def\blx@err@invopt#1#2{% | |
\blx@error | |
{Option '#1' invalid} | |
{\ifblank{#2} | |
{The option you have supplied is invalid.\MessageBreak | |
See the biblatex manual for valid option keys and | |
possible values} | |
{#2}}} | |
\def\blx@err@confopt#1#2{% | |
\blx@error | |
{Conflicting options\ifblank{#1}{}{ (#1)}} | |
{\ifblank{#2} | |
{The option you have supplied conflicts with another one.\MessageBreak | |
See the biblatex manual for valid option keys and possible values} | |
{#2}}} | |
\def\blx@err@optdef#1#2{% | |
\blx@error | |
{Option '#1' already defined} | |
{The option '#1' is already defined in scope '#2'}} | |
\def\blx@err@nodocdiv#1{% | |
\blx@error | |
{\@backslashchar#1 not provided by class} | |
{The document class does not seems to support #1s}} | |
\def\blx@err@nosec#1{% | |
\blx@error | |
{Section '#1' not found} | |
{The reference section '#1' could not be found}} | |
\def\blx@err@nosort#1{% | |
\blx@error | |
{Sorting template '#1' not found} | |
{The sorting template '#1' does not seem to have been defined anywhere}} | |
\def\blx@err@secfirst{% | |
\blx@error | |
{'section' not first filter} | |
{When passing multiple filter options, | |
the 'section' filter must be given first}} | |
\protected\def\blx@err@nestcite{% | |
\blx@error | |
{Nested citation command} | |
{Citation commands may not be nested}} | |
\def\blx@err@nestenv#1{% | |
\blx@error | |
{Nested '#1' environment} | |
{This environment may not be nested}} | |
\protected\def\blx@err@citecmd#1{% | |
\begingroup | |
\escapechar\m@ne | |
\blx@error | |
{Command '\@backslashchar\string#1' undefined} | |
{The citation command '\@backslashchar\string#1' | |
has not been defined\MessageBreak by the | |
selected citation style}% | |
\endgroup} | |
\def\blx@err@endnote#1{% | |
\blx@error | |
{Missing or incomplete endnote support} | |
{There does not seem to be endnote support available\MessageBreak | |
or the available support is incomplete.\MessageBreak | |
If you continue, I will fall back to '\string#1'}% | |
#1} | |
\def\blx@err@matchparen#1{% | |
\blx@error | |
{Unbalanced parentheses or brackets} | |
{\iftoggle{blx@footnote}{#1 in foot or endnote}{#1}.\MessageBreak | |
This error is triggered if \string\bibopenparen\space and | |
\string\bibcloseparen\MessageBreak or | |
\string\bibopenbracket\space and \string\bibclosebracket\space | |
are unbalanced\MessageBreak or mismatched}} | |
\def\blx@err@nestparen#1{% | |
\blx@error | |
{Too deeply nested parentheses or brackets} | |
{#1 nested too deeply% | |
\iftoggle{blx@footnote}{\space in foot or endnote}{}.\MessageBreak | |
This error may also be triggered if \string\mkbibparens\MessageBreak | |
or \string\mkbibbrackets\space are nested too deeply}} | |
\def\blx@err@filter{% | |
\blx@error | |
{Invalid filter expression} | |
{The filter expression you have supplied is invalid.\MessageBreak | |
See the biblatex manual for details}} | |
\def\blx@warn@nohyph#1{% | |
\blx@warning{No hyphenation patterns for '#1'}} | |
\protected\def\blx@warn@citecmd#1#2{% | |
\blx@warning{% | |
'\string#1' not defined by citation style.\MessageBreak | |
Falling back to '\string#2'}% | |
#2} | |
\protected\def\blx@warn@nostring#1{% | |
\blx@warning@entry{Bibliography string '#1' | |
\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@<auxfile> aux file -> bib file mapping (refsections) | |
% aux file (basename) -> bib files (full) | |
% [internal list] | |
\let\blx@list@active\@empty | |
\let\blx@list@inactive\@empty | |
\listeadd\blx@list@inactive{\jobname} | |
\protected\def\blx@regbibfiles#1#2{% | |
\forlistloop{\blx@regbibfile{#1}}{#2}} | |
\def\blx@regbibfile#1#2{% | |
\ifcsundef{blx@res@loca@#2} | |
{\blx@regbibfile@i{#1}{#2}} | |
{\ifcsstring{blx@res@loca@#2}{local} | |
{\blx@regbibfile@i{#1}{#2}} | |
{}}} | |
\def\blx@regbibfile@i#1#2{% | |
\ifinlistcs{#2}{blx@list@bibfiles@#1} | |
{} | |
{\listcsxadd{blx@list@bibfiles@#1}{#2}}} | |
\def\blx@check@logreq{% | |
\begingroup | |
\ltxrequest{biblatex}{{\iftoggle{blx@runltx}{1}{0}}}{% | |
\provides[type=dynamic]{ | |
\file{\jobname.bcf} | |
} | |
\requires[type=dynamic]{ | |
\file{\jobname.bbl} | |
} | |
\ifdef\blx@list@req@edit | |
{\requires[type=editable]{ | |
\forlistloop\file\blx@list@req@edit | |
}} | |
{} | |
\ifdef\blx@list@req@stat | |
{\requires[type=static]{ | |
\forlistloop\file\blx@list@req@stat | |
}} | |
{} | |
}% | |
\logrequest[package=biblatex,priority=5,active={{\iftoggle{blx@runbiber}{1}{0}}}]{% | |
\generic{biber} | |
\cmdline{ | |
\binary{biber} | |
\infile{\jobname} | |
} | |
\input{ | |
\file{\jobname.bcf} | |
} | |
\output{ | |
\file{\jobname.bbl} | |
} | |
\provides[type=dynamic]{ | |
\file{\jobname.bbl} | |
} | |
\requires[type=dynamic]{ | |
\file{\jobname.bcf} | |
} | |
\ifcsdef{blx@list@bibfiles@\jobname} | |
{\requires[type=editable]{ | |
\def\do{\file} | |
\dolistcsloop{blx@list@bibfiles@\jobname} | |
}} | |
{} | |
}% | |
\endgroup} | |
\def\blx@logreq@active#1{% | |
\ifblank{#1} | |
{} | |
{\@latex@warning{#1}}% | |
\blx@rerun@latex | |
\blx@rerun@biber} | |
\def\blx@rerun@latex{% | |
\G@refundefinedtrue | |
\global\toggletrue{blx@runltx}% | |
\global\let\blx@rerun@latex\relax} | |
\def\blx@rerun@biber{% | |
\global\toggletrue{blx@runbiber}% | |
\global\let\blx@rerun@biber\relax} | |
\let\blx@checksum@old\@empty | |
\let\blx@checksum@new\@empty | |
\let\blx@pagesum@old\@empty | |
\let\blx@pagesum@new\@empty | |
\def\blx@checksum#1#2#3{% | |
\begingroup | |
\blx@tempcnta\the\numexpr0#2*0#3\relax | |
\blx@tempcntb\blx@tempcnta | |
\divide\blx@tempcntb10 | |
\multiply\blx@tempcntb10 | |
\advance\blx@tempcnta-\blx@tempcntb | |
\xdef#1{#1\the\blx@tempcnta}% | |
\endgroup} | |
\def\blx@addchecksum{\blx@checksum\blx@checksum@old} | |
\def\blx@addpagesum{\blx@checksum\blx@pagesum@old} | |
\AtEndDocument{% | |
\def\blx@addchecksum{\blx@checksum\blx@checksum@new}% | |
\def\blx@addpagesum{\blx@checksum\blx@pagesum@new}} | |
\protected\def\blx@check@rerun{% | |
\begingroup | |
\blx@tempcnta\z@ | |
\iftoggle{blx@runltx} | |
{\blx@tempcnta\@ne} | |
{\ifx\blx@checksum@old\blx@checksum@new | |
\ifx\blx@pagesum@old\blx@pagesum@new | |
\else | |
\blx@tempcnta\@ne | |
\fi | |
\else | |
\blx@tempcnta\@ne | |
\fi}% | |
\iftoggle{blx@runbiber} | |
{\advance\blx@tempcnta\tw@} | |
{}% | |
\ifcase\blx@tempcnta | |
\or | |
\blx@rerun@latex | |
\blx@warning@noline{% | |
Please rerun LaTeX% | |
\ifx\blx@pagesum@old\blx@pagesum@new\else | |
.\MessageBreak Page breaks have changed% | |
\fi}% | |
\else | |
\blx@rerun@latex | |
\blx@warn@auxlist | |
\fi | |
\endgroup} | |
\def\blx@warn@auxlist{% | |
\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} | |
% {<characters>} | |
\newrobustcmd*{\DeclareCapitalPunctuation}[1]{% | |
\cslet{blx@cap@\the\blx@sf@par}\@empty | |
\csundef{blx@cap@\the\blx@sf@comma}% | |
\csundef{blx@cap@\the\blx@sf@semicolon}% | |
\csundef{blx@cap@\the\blx@sf@colon}% | |
\csundef{blx@cap@\the\blx@sf@period}% | |
\csundef{blx@cap@\the\blx@sf@exclam}% | |
\csundef{blx@cap@\the\blx@sf@question}% | |
\ifblank{#1} | |
{} | |
{\expandafter\blx@defcapstring\detokenize{#1}\relax}} | |
\def\blx@defcapstring#1{% | |
\ifx#1\relax | |
\else | |
\begingroup | |
\blx@setfrcodes | |
\ifcsdef{blx@pm@#1} | |
{\expandafter\endgroup | |
\expandafter\let | |
\csname blx@cap@\the\sfcode`#1\endcsname\@empty} | |
{\blx@warning{Ignoring invalid punctuation mark '#1'}% | |
\endgroup}% | |
\expandafter\blx@defcapstring | |
\fi} | |
% {<characters>} | |
\newrobustcmd*{\DeclareQuotePunctuation}[1]{% | |
\csdef{blx@qp@comma}{\blx@postpunct}% | |
\csdef{blx@qp@semicolon}{\blx@postpunct}% | |
\csdef{blx@qp@colon}{\blx@postpunct}% | |
\csdef{blx@qp@period}{\blx@postpunct}% | |
\csdef{blx@qp@exclam}{\blx@postpunct}% | |
\csdef{blx@qp@question}{\blx@postpunct}% | |
\cslet{blx@pq@comma}\@empty | |
\cslet{blx@pq@semicolon}\@empty | |
\cslet{blx@pq@colon}\@empty | |
\cslet{blx@pq@period}\@empty | |
\cslet{blx@pq@exclam}\@empty | |
\cslet{blx@pq@question}\@empty | |
\let\blx@quotepunct\@empty | |
\ifblank{#1} | |
{\let\blx@ifuspunct\@secondoftwo} | |
{\let\blx@ifuspunct\@firstoftwo | |
\expandafter\blx@defquotepunct\detokenize{#1}&}} | |
\def\blx@defquotepunct#1{% | |
\ifx\relax | |
\else | |
\ifcsdef{blx@pm@#1} | |
{\appto\blx@quotepunct{#1}% | |
\cslet{blx@qp@\csuse{blx@pm@#1}}\@empty | |
\csdef{blx@pq@\csuse{blx@pm@#1}}{\blx@postpunct}} | |
{\blx@warning{Ignoring invalid punctuation mark '#1'}}% | |
\expandafter\blx@defquotepunct | |
\fi} | |
% {<mark>}{<characters>} | |
\newrobustcmd*{\DeclarePunctuationPairs}[2]{% | |
\ifcsdef{blx@sf@\detokenize{#1}} | |
{\ifnum\csname blx@sf@\detokenize{#1}\endcsname>\blx@sf@prefixchar | |
\ifnum\csname blx@sf@\detokenize{#1}\endcsname<\blx@sf@nopunct | |
\expandafter\blx@defpunctpairs | |
\expandafter{\the\csname blx@sf@\detokenize{#1}\endcsname}{#2}% | |
\else | |
\blx@err@invarg{\detokenize{#1}{}}% | |
\fi | |
\else | |
\blx@err@invarg{\detokenize{#1}{}}% | |
\fi} | |
{\blx@err@invarg{\detokenize{#1}{}}}} | |
\def\blx@defpunctpairs#1#2{% | |
\blx@undefpair{#1}{\the\blx@sf@dot}% | |
\blx@undefpair{#1}{\the\blx@sf@comma}% | |
\blx@undefpair{#1}{\the\blx@sf@semicolon}% | |
\blx@undefpair{#1}{\the\blx@sf@colon}% | |
\blx@undefpair{#1}{\the\blx@sf@period}% | |
\blx@undefpair{#1}{\the\blx@sf@exclam}% | |
\blx@undefpair{#1}{\the\blx@sf@question}% | |
\ifblank{#2} | |
{} | |
{\begingroup | |
\def\blx@tempa{#1}% | |
\let\blx@tempb\@empty | |
\blx@setfrcodes | |
\sfcode`\*=\blx@sf@dot | |
\expandafter\blx@defpair\detokenize{#2}&% | |
\expandafter\endgroup\blx@tempb}} | |
\def\blx@defpair#1{% | |
\ifx% | |
\else | |
\ifnum\the\sfcode`#1>\blx@sf@prefixchar | |
\ifnum\the\sfcode`#1<\blx@sf@nopunct | |
\eappto\blx@tempb{% | |
\cslet{blx@pp@\blx@tempa @\the\sfcode`#1}\noexpand\@empty}% | |
\else | |
\blx@err@invarg{#1}{}% | |
\fi | |
\else | |
\blx@err@invarg{#1}{}% | |
\fi | |
\expandafter\blx@defpair | |
\fi} | |
\def\blx@undefpair#1#2{% | |
\ifcsdef{blx@pp@#1@#2} | |
{\csundef{blx@pp@#1@#2}} | |
{}} | |
\protected\def\blx@resetpunct{% | |
\DeclareCapitalPunctuation{.!?}% | |
\DeclarePunctuationPairs{dot}{}% | |
\DeclarePunctuationPairs{comma}{*!?}% | |
\DeclarePunctuationPairs{semicolon}{*!?}% | |
\DeclarePunctuationPairs{colon}{*!?}% | |
\DeclarePunctuationPairs{period}{}% | |
\DeclarePunctuationPairs{exclam}{*}% | |
\DeclarePunctuationPairs{question}{*}% | |
\DeclareQuotePunctuation{}% | |
\def\abx@dot{\ifdim\lastkern>\z@\unkern\fi.\spacefactor\blx@sf@dot}% | |
\def\abx@comma{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{,}}% | |
\def\abx@semicolon{\abx@puncthook{;}}% | |
\def\abx@colon{\abx@puncthook{:}}% | |
\def\abx@period{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{.}}% | |
\def\abx@exclam{\abx@puncthook{!}}% | |
\def\abx@question{\abx@puncthook{?}}% | |
\global\let\abx@puncthook\@firstofone | |
\global\let\blx@postpunct\@empty} | |
\blx@resetpunct | |
% {<character>}{<true>}{<false>} | |
\protected\def\blx@imc@ifpunctmark#1{% | |
\ifhmode | |
\begingroup | |
\sfcode`\*=\blx@sf@dot | |
\ifnum\sfcode`#1=\spacefactor | |
\endgroup | |
\expandafter\expandafter | |
\expandafter\@firstoftwo | |
\else | |
\endgroup | |
\expandafter\expandafter | |
\expandafter\@secondoftwo | |
\fi | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<true>}{<false>} | |
\protected\def\blx@imc@ifterm{% | |
\ifhmode | |
\expandafter\blx@imc@ifcapital | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<true>}{<false>} | |
\protected\def\blx@imc@ifcapital{% | |
\ifcsdef{blx@cap@\blx@spacefactor}} | |
% {<true>}{<false>} | |
\protected\def\blx@imc@ifpunct{% | |
\ifnum\blx@spacefactor>\blx@sf@threshold@low | |
\ifnum\blx@spacefactor<\blx@sf@threshold@high | |
\expandafter\expandafter | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\expandafter | |
\expandafter\@secondoftwo | |
\fi | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<character>} | |
\newrobustcmd*{\autocap}[1]{#1} | |
\protected\def\blx@imc@autocap{% | |
\blx@imc@ifcapital\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 | |
% {<bibstyle>} | |
\newrobustcmd*{\RequireBibliographyStyle}[1]{% | |
\blx@inputonce{#1.bbx}{bibliography style '#1'}{}{}{} | |
{\blx@error | |
{Style '#1' not found} | |
{The bibliography style '#1' could not be found}}} | |
\@onlypreamble\RequireBibliographyStyle | |
% {<code>} | |
\newrobustcmd*{\InitializeBibliographyStyle}{\appto\blx@hook@bbxinit} | |
\@onlypreamble\InitializeBibliographyStyle | |
% {<entry type>}{<driverdef>} | |
\newrobustcmd*{\DeclareBibliographyDriver}[1]{% | |
\long\csdef{blx@bbx@#1}} | |
\@onlypreamble\DeclareBibliographyDriver | |
% {<entry type>} | |
\def\blx@driver#1{% | |
\ifcsdef{blx@bbx@#1} | |
{\csuse{blx@bbx@#1}} | |
{\ifcsdef{blx@bbx@*} | |
{\blx@warning{% | |
No driver for entry type '#1'.\MessageBreak | |
Using fallback driver}% | |
\csuse{blx@bbx@*}} | |
{\blx@error | |
{No driver for '\abx@field@entrytype' found} | |
{I can't find a driver for the entry type | |
'\abx@field@entrytype'\MessageBreak | |
and there is no fallback driver either}}}} | |
% {<type>}{<true>}{<false>} | |
\def\blx@imc@ifdriver#1{\ifcsdef{blx@bbx@#1}} | |
% {<alias>}{<type>} | |
\newrobustcmd*{\DeclareBibliographyAlias}[2]{% | |
\csedef{blx@bbx@#1}{% | |
\expandafter\noexpand\csname blx@bbx@#2\endcsname}} | |
\@onlypreamble\DeclareBibliographyAlias | |
%% Auxiliary commands | |
\newrobustcmd*{\citereset}{% | |
\csuse{blx@hook@cbxinit}% | |
\@ifstar | |
{} | |
{\global\cslet{blx@bsee@\the\c@refsection}\@empty | |
\global\cslet{blx@fsee@\the\c@refsection}\@empty | |
\blx@ibidreset@force | |
\blx@idemreset@force | |
\blx@opcitreset@force | |
\blx@loccitreset@force}} | |
\def\blx@save#1{% | |
\ifcsdef{blx@saved@#1} | |
{} | |
{\blx@safe@actives | |
\csletcs{blx@saved@#1}{#1}% | |
\blx@rest@actives}} | |
\def\blx@restore#1{% | |
\ifcsdef{blx@saved@#1} | |
{\blx@safe@actives | |
\csletcs{#1}{blx@saved@#1}% | |
\csundef{blx@saved@#1}% | |
\blx@rest@actives} | |
{}} | |
\newrobustcmd*{\savecommand}[1]{% | |
\ifcsdef{blx@saved@cmd@\detokenize{#1}} | |
{} | |
{\cslet{blx@saved@cmd@\detokenize{#1}}{#1}}} | |
\newrobustcmd*{\restorecommand}[1]{% | |
\ifcsdef{blx@saved@cmd@\detokenize{#1}} | |
{\letcs{#1}{blx@saved@cmd@\detokenize{#1}}% | |
\csundef{blx@saved@cmd@\detokenize{#1}}} | |
{}} | |
% {<name>} | |
\newrobustcmd*{\savebibmacro}[1]{% | |
\blx@save{abx@macro@\detokenize{#1}}} | |
\newrobustcmd*{\restorebibmacro}[1]{% | |
\blx@restore{abx@macro@\detokenize{#1}}} | |
% {<name>}[<args>][<optarg>]{<definition>} | |
\newrobustcmd*{\newbibmacro}{% | |
\@star@or@long\blx@newbibmacro} | |
\def\blx@newbibmacro#1{% | |
\ifcsundef{abx@macro@\detokenize{#1}} | |
{\blx@defbibmacro\new@command{#1}} | |
{\blx@warning{% | |
Macro '\detokenize{#1}' already defined.\MessageBreak | |
Using \string\renewbibmacro} | |
\blx@defbibmacro\renew@command{#1}}} | |
\newrobustcmd*{\renewbibmacro}{% | |
\@star@or@long\blx@renewbibmacro} | |
\def\blx@renewbibmacro#1{% | |
\ifcsundef{abx@macro@\detokenize{#1}} | |
{\blx@warning{% | |
Macro '\detokenize{#1}' undefined.\MessageBreak | |
Using \string\newbibmacro} | |
\blx@defbibmacro\new@command{#1}} | |
{\blx@defbibmacro\renew@command{#1}}} | |
\newrobustcmd*{\providebibmacro}{% | |
\@star@or@long{\blx@defbibmacro\provide@command}} | |
\def\blx@defbibmacro#1#2{% | |
\expandafter#1\csname abx@macro@\detokenize{#2}\endcsname} | |
% {<alias>}{<name>} | |
\newrobustcmd*{\letbibmacro}{% | |
\@ifstar | |
{\blx@letbibmacro@i} | |
{\blx@letbibmacro}} | |
\def\blx@letbibmacro#1#2{% | |
\blx@letbibmacro@i{\detokenize{#1}}{\detokenize{#2}}} | |
\def\blx@letbibmacro@i#1#2{% | |
\ifcsundef{abx@macro@#2} | |
{\blx@error | |
{Bibliography macro '#2' undefined} | |
{Use '\string\newbibmacro' to define this macro}} | |
{\csletcs{abx@macro@#1}{abx@macro@#2}}} | |
% {<name>} | |
\newrobustcmd*{\usebibmacro}{% | |
\@ifstar | |
{\blx@usebibmacro@i} | |
{\blx@usebibmacro}} | |
\def\blx@usebibmacro#1{% | |
\blx@usebibmacro@i{\detokenize{#1}}} | |
\def\blx@usebibmacro@i#1{% | |
\ifcsundef{abx@macro@#1} | |
{\blx@error | |
{Bibliography macro '#1' undefined} | |
{Use '\string\newbibmacro' to define this macro}} | |
{\csuse{abx@macro@#1}}} | |
% {<name>}{<true>}{<false>} | |
\def\blx@imc@ifbibmacroundef#1{% | |
\ifcsundef{abx@macro@#1}} | |
\def\ifbibmacroundef{\blx@imc@ifbibmacroundef} | |
% {<field>} | |
\def\blx@imc@thefield#1{\csuse{abx@field@#1}} | |
\def\blx@imc@strfield#1{% | |
\ifcsdef{abx@field@#1} | |
{\detokenize\expandafter\expandafter\expandafter | |
{\csname abx@field@#1\endcsname}} | |
{}} | |
\def\blx@imc@csfield#1{\usefield{\unexpanded}{#1}} | |
% {<command>}{<field>} | |
\def\blx@imc@usefield#1#2{% | |
\expandafter\expandafter\expandafter#1% | |
\expandafter\expandafter\expandafter{\csname abx@field@#2\endcsname}} | |
% {<plainlist>} | |
\def\blx@imc@thelist#1{\csuse{abx@list@#1}} | |
\def\blx@imc@strlist#1{% | |
\ifcsdef{abx@list@#1} | |
{\detokenize\expandafter\expandafter\expandafter | |
{\csname abx@list@#1\endcsname}} | |
{}} | |
\def\blx@imc@thefirstlistitem#1{% | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\blx@imc@thefirstlistitem@grab | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
{\csuse{abx@list@#1}}} | |
\def\blx@imc@thefirstlistitem@grab#1{% | |
\blx@imc@thefirstlistitem@grab@i | |
#1{}{}% | |
\blx@imc@thefirstlistitem@grab@i@end} | |
\def\blx@imc@thefirstlistitem@grab@i#1#2\blx@imc@thefirstlistitem@grab@i@end{#1} | |
% {<command>}{<field>} | |
% needs 7 levels of expansion, i.e. 2^7-1=127 '\expandafter's | |
\def\blx@imc@usefirstlistitem#1#2{% | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter | |
#1% | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter\expandafter\expandafter\expandafter | |
\expandafter\expandafter | |
{\blx@imc@thefirstlistitem{#2}}} | |
\def\blx@imc@strfirstlistitem#1{% | |
\ifcsdef{abx@list@#1} | |
{\blx@imc@usefirstlistitem{\detokenize}{#1}} | |
{}} | |
% {<namelist>} | |
\def\blx@imc@thename#1{\csuse{abx@name@#1}} | |
\def\blx@imc@strname#1{% | |
\ifcsdef{abx@name@#1} | |
{\detokenize\expandafter\expandafter\expandafter | |
{\csname abx@name@#1\endcsname}} | |
{}} | |
% We have to save cleared fields/lists/names in case a related entry | |
% needs them for tests | |
\let\abx@dorelfields\@empty | |
\let\abx@dorellists\@empty | |
\let\abx@dorelnames\@empty | |
% {<field>} | |
% If there is a related field in the entry, save a special copy in case | |
% the related entry needs it for tests. See the corresponding tests in | |
% \blx@save{field,list,name} | |
\protected\def\blx@imc@clearfield#1{% | |
\ifdef\abx@field@related | |
{\csletcs{abx@field@relsaved#1}{abx@field@#1}% | |
\listadd\abx@dorelfields{#1}} | |
{}% | |
\csundef{abx@field@#1}} | |
% {<plainlist>} | |
% If there is a related field in the entry, save a special copy in case | |
% the related entry needs it for tests. See the corresponding tests in | |
% \blx@save{field,list,name} | |
\protected\def\blx@imc@clearlist#1{% | |
\ifcsundef{abx@list@#1} | |
{} | |
{\ifdef\abx@field@related | |
{\csletcs{abx@list@relsaved#1}{abx@list@#1}% | |
\csletcs{etb@tgl@abx@bool@morerelsaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{c@relsaved#1}{c@#1}% | |
\listadd\abx@dorellists{#1}} | |
{}% | |
\togglefalse{abx@bool@more#1}% | |
\csundef{abx@list@#1}% | |
\csname c@#1\endcsname\z@}} | |
% {<namelist>} | |
% If there is a related field in the entry, save a special copy in case | |
% the related entry needs it for tests. See the corresponding tests in | |
% \blx@save{field,list,name} | |
\protected\def\blx@imc@clearname#1{% | |
\ifcsundef{abx@name@#1} | |
{} | |
{\ifdef\abx@field@related | |
{\csletcs{abx@name@relsaved#1}{abx@name@#1}% | |
\csletcs{etb@tgl@abx@bool@morerelsaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{c@relsaved#1}{c@#1}% | |
\listadd\abx@dorelnames{#1}} | |
{}% | |
\togglefalse{abx@bool@more#1}% | |
\csundef{abx@name@#1}% | |
\csname c@#1\endcsname\z@}} | |
% {<field>}{<macro>} | |
\protected\def\blx@imc@restorefield#1{\cslet{abx@field@#1}} | |
% {<plainlist>}{<macro>} | |
\protected\def\blx@imc@restorelist#1{\cslet{abx@list@#1}} | |
% {<namelist>}{<macro>} | |
\protected\def\blx@imc@restorename#1{\cslet{abx@name@#1}} | |
% {<field>}{<macro>} | |
\protected\def\blx@imc@savefield{% | |
\@ifstar{\blx@savedata{field}}{\global\blx@savedata{field}}} | |
\def\blx@savedata#1#2#3{\letcs#3{abx@#1@#2}} | |
% {<plainlist>}{<macro>} | |
\protected\def\blx@imc@savelist{% | |
\@ifstar{\blx@savedata{list}}{\global\blx@savedata{list}}} | |
% {<namelist>}{<macro>} | |
\protected\def\blx@imc@savename{% | |
\@ifstar{\blx@savedata{name}}{\global\blx@savedata{name}}} | |
% {<field>}{<csname>} | |
\protected\def\blx@imc@savefieldcs{% | |
\@ifstar{\blx@savedatacs{field}}{\global\blx@savedatacs{field}}} | |
\def\blx@savedatacs#1#2#3{\csletcs{#3}{abx@#1@#2}} | |
% {<plainlist>}{<csname>} | |
\protected\def\blx@imc@savelistcs{% | |
\@ifstar{\blx@savedatacs{list}}{\global\blx@savedatacs{list}}} | |
% {<namelist>}{<csname>} | |
\protected\def\blx@imc@savenamecs{% | |
\@ifstar{\blx@savedatacs{name}}{\global\blx@savedatacs{name}}} | |
% {<field>}{<true>}{<false>} | |
\def\blx@imc@iffieldundef#1{% | |
\ifcsundef{abx@field@#1}} | |
% {<plainlist>}{<true>}{<false>} | |
\def\blx@imc@iflistundef#1{% | |
\ifcsundef{abx@list@#1}} | |
% {<namelist>}{<true>}{<false>} | |
\def\blx@imc@ifnameundef#1{% | |
\ifcsundef{abx@name@#1}} | |
% {<field1>}{<field2>}{<true>}{<false>} | |
\def\blx@imc@iffieldsequal#1#2{% | |
\ifcsequal{abx@field@#1}{abx@field@#2}} | |
% {<plainlist1>}{<plainlist2>}{<true>}{<false>} | |
\def\blx@imc@iflistsequal#1#2{% | |
\ifcsequal{abx@list@#1}{abx@list@#2}} | |
% {<namelist1>}{<namelist2>}{<true>}{<false>} | |
\def\blx@imc@ifnamesequal#1#2{% | |
\ifcsundef{abx@name@#1} | |
{\@secondoftwo} | |
{\ifcsundef{abx@name@#2} | |
{\@secondoftwo} | |
{\blx@ifnamesequalcscs{abx@name@#1}{abx@name@#2}}}} | |
\def\blx@ifnamesequalcscs#1#2{% | |
\expandafter\expandafter\expandafter\blx@ifnamesequaldefdef | |
\expandafter\expandafter\expandafter{% | |
\expandafter\csname\expandafter #1\expandafter\endcsname | |
\expandafter}% | |
\expandafter{\csname #2\endcsname}} | |
\def\blx@ifnamesequalcsdef#1#2{% | |
\expandafter\blx@ifnamesequaldefdef\expandafter{% | |
\csname #1\endcsname}{#2}} | |
\def\blx@ifnamesequaldefdef#1#2{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\expandafter\blx@ifnamesequal@i#2% | |
\let\blx@tempb\blx@tempa | |
\let\blx@tempa\@empty | |
\expandafter\blx@ifnamesequal@i#1% | |
\expandafter\endgroup | |
\ifx\blx@tempa\blx@tempb | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
\def\blx@ifnamesequal@i#1#2{% | |
\expandafter\blx@ifnamesequal@ii#2{}&} | |
\def\blx@ifnamesequal@ii#1{% | |
\ifblank{#1} | |
{\blx@namebreak} | |
{\blx@ifnamesequal@iii#1% | |
\blx@ifnamesequal@ii}} | |
% These explicit nameparts are alright as they are for bibtex only | |
% biber names will always have a hash generated from all nameparts in datamodel | |
\def\blx@ifnamesequal@iii#1#2{% | |
\blx@kv@setkeys{blx@opt@name}{#1}% | |
\blx@kv@setkeys{blx@opt@namepart}{#2}% | |
\ifdef\abx@field@hash | |
{\eappto\blx@tempa{{\abx@field@hash}}} | |
{\eappto\blx@tempa{{{\namepartfamily}{\namepartgiven}{\namepartprefix}{\namepartsuffix}}}}} | |
% {<csname>}{<def>}{<true>}{<false>} | |
\newcommand*{\blx@ifcsdefequal}[2]{% | |
\ifcsundef{#1} | |
{\@secondoftwo} | |
{\ifundef#2% | |
{\@secondoftwo} | |
{\expandafter\ifx\csname#1\endcsname#2% | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<field>}{<macro>}{<true>}{<false>} | |
\def\blx@imc@iffieldequals#1#2{% | |
\blx@ifcsdefequal{abx@field@#1}{#2}} | |
% {<plainlist>}{<macro>}{<true>}{<false>} | |
\def\blx@imc@iflistequals#1#2{% | |
\blx@ifcsdefequal{abx@list@#1}{#2}} | |
% {<namelist>}{<macro>}{<true>}{<false>} | |
\def\blx@imc@ifnameequals#1#2{% | |
\blx@imc@ifnameundef{#1} | |
{\@secondoftwo} | |
{\ifundef#2% | |
{\@secondoftwo} | |
{\blx@ifnamesequalcsdef{abx@name@#1}{#2}}}} | |
% {<field>}{<csname>}{<true>}{<false>} | |
\def\blx@imc@iffieldequalcs#1{% | |
\ifcsequal{abx@field@#1}} | |
% {<plainlist>}{<csname>}{<true>}{<false>} | |
\def\blx@imc@iflistequalcs#1{% | |
\ifcsequal{abx@list@#1}} | |
% {<namelist>}{<csname>}{<true>}{<false>} | |
\def\blx@imc@ifnameequalcs#1#2{% | |
\blx@imc@ifnameundef{#1} | |
{\@secondoftwo} | |
{\ifcsundef{#2} | |
{\@secondoftwo} | |
{\blx@ifnamesequalcscs{abx@name@#1}{#2}}}} | |
% {<field>}{<string>}{<true>}{<false>} | |
\protected\long\def\blx@imc@iffieldequalstr#1#2{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter\expandafter\ifstrequal | |
\expandafter\expandafter\expandafter{% | |
\csname abx@field@#1\endcsname}{#2}}} | |
% {<field>}{<true>}{<false>} | |
\protected\def\blx@imc@iffieldxref#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\blx@whichxref | |
{\blx@iffieldxref{#1}} | |
{\@secondoftwo}}} | |
\def\blx@iffieldxref#1#2{% | |
\begingroup | |
\letcs\blx@tempa{abx@field@#2}% | |
\letcs\blx@tempb{abx@field@#1}% | |
\blx@resetdata | |
\blx@getdata{\blx@tempa}% | |
\blx@imc@iffieldequals{#1}\blx@tempb | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\endgroup} | |
\def\blx@whichxref#1#2{% | |
\blx@imc@iffieldundef{crossref} | |
{\blx@imc@iffieldundef{xref} | |
{#2} | |
{#1{xref}}} | |
{#1{crossref}}} | |
% {<plainlist>}{<true>}{<false>} | |
\protected\def\blx@imc@iflistxref#1{% | |
\blx@imc@iflistundef{#1} | |
{\@secondoftwo} | |
{\blx@whichxref | |
{\blx@iflistxref{#1}} | |
{\@secondoftwo}}} | |
\def\blx@iflistxref#1#2{% | |
\begingroup | |
\letcs\blx@tempa{abx@field@#2}% | |
\letcs\blx@tempb{abx@list@#1}% | |
\blx@resetdata | |
\blx@getdata{\blx@tempa}% | |
\blx@imc@iflistequals{#1}\blx@tempb | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\endgroup} | |
% {<namelist>}{<true>}{<false>} | |
\protected\def\blx@imc@ifnamexref#1{% | |
\blx@imc@ifnameundef{#1} | |
{\@secondoftwo} | |
{\blx@whichxref | |
{\blx@ifnamexref{#1}} | |
{\@secondoftwo}}} | |
\def\blx@ifnamexref#1#2{% | |
\begingroup | |
\letcs\blx@tempa{abx@field@#2}% | |
\letcs\blx@tempb{abx@name@#1}% | |
\blx@resetdata | |
\blx@getdata{\blx@tempa}% | |
\blx@imc@ifnameequals{#1}\blx@tempb | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcurrentfield#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\currentfield\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcurrentlist#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\currentlist\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcurrentname#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\currentname\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifentrytype#1{% | |
\begingroup | |
\def\blx@tempa{#1}% | |
\ifx\abx@field@entrytype\blx@tempa | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<true>}{<false>} | |
\def\blx@imc@ifmorenames{% | |
\ifundef\currentname | |
{\@secondoftwo} | |
{\iftoggle{abx@bool@more\currentname} | |
{\@firstoftwo} | |
{\ifnum\c@listtotal>\c@liststop | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<true>}{<false>} | |
\def\blx@imc@ifmoreitems{% | |
\ifundef\currentlist | |
{\@secondoftwo} | |
{\iftoggle{abx@bool@more\currentlist} | |
{\@firstoftwo} | |
{\ifnum\c@listtotal>\c@liststop | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi}}} | |
% {<true>}{<false>} | |
%\def\blx@imc@iffirstcitekey{% | |
% \ifboolexpr{ ( test {\ifnumequal\c@multicitetotal\z@} | |
% and test {\ifnumequal\c@citecount\@ne} ) | |
% or ( test {\ifnumgreater\c@multicitetotal\z@} | |
% and test {\ifnumequal\c@multicitecount\@ne} | |
% and test {\ifnumequal\c@citecount\@ne} ) }} | |
\def\blx@imc@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}} | |
% {<category>}{<true>}{<false>} | |
\protected\def\blx@imc@ifcategory{% | |
\ifdef\abx@field@entrykey | |
{\blx@imc@ifentrycategory\abx@field@entrykey} | |
{\expandafter\@secondoftwo\@gobble}} | |
% {<entrykey>}{<category>}{<true>}{<false>} | |
\protected\def\blx@imc@ifentrycategory{% | |
\blx@xsanitizeafter\blx@imc@ifentrycategory@i} | |
\def\blx@imc@ifentrycategory@i#1#2{% | |
\ifcsdef{blx@catg@\detokenize{#2}} | |
{\ifinlistcs{#1}{blx@catg@\detokenize{#2}}} | |
{\@secondoftwo}} | |
% {<keyword>}{<true>}{<false>} | |
\protected\def\blx@imc@ifkeyword{% | |
\ifdef\abx@field@entrykey | |
{\blx@imc@ifentrykeyword\abx@field@entrykey} | |
{\expandafter\@secondoftwo\@gobble}} | |
% {<entrykey>}{<keyword>}{<true>}{<false>} | |
\protected\def\blx@imc@ifentrykeyword{% | |
\blx@xsanitizeafter\blx@imc@ifentrykeyword@i} | |
\def\blx@imc@ifentrykeyword@i#1#2{% | |
\ifcsdef{blx@keyw@\the\c@refsection @\detokenize{#2}} | |
{\ifinlistcs{#1}{blx@keyw@\the\c@refsection @\detokenize{#2}}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\protected\def\blx@ifciteseen@global{% | |
\ifbool{citetracker} | |
{\ifdef\abx@field@entrykey | |
{\expandafter\blx@ifseen@global | |
\expandafter{\abx@field@entrykey}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\protected\def\blx@ifciteseen@context{% | |
\ifbool{citetracker} | |
{\ifdef\abx@field@entrykey | |
{\expandafter\blx@ifseen@context | |
\expandafter{\abx@field@entrykey}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\protected\def\blx@ifciteseen@context{% | |
\ifbool{citetracker} | |
{\ifdef\abx@field@entrykey | |
{\expandafter\blx@ifseen@context | |
\expandafter{\abx@field@entrykey}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
% {<entrykey>}{<true>}{<false>} | |
\protected\def\blx@ifentryseen@global{% | |
\blx@xsanitizeafter\blx@ifseen@global} | |
\protected\def\blx@ifentryseen@context{% | |
\blx@xsanitizeafter\blx@ifseen@context} | |
\def\blx@ifseen@global#1{% | |
\ifbool{citetracker} | |
{\ifinlistcs{#1}{blx@bsee@\the\c@refsection}} | |
{\@secondoftwo}} | |
\def\blx@ifseen@context#1{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\ifinlistcs{#1}{blx@fsee@\the\c@refsection}} | |
{\ifinlistcs{#1}{blx@bsee@\the\c@refsection}}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifciteibid@global{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text} | |
{\@secondoftwo}} | |
\def\blx@ifciteibid@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}} | |
{\@secondoftwo}} | |
\def\blx@ifciteibid@strict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@ifciteibid@global} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@ifciteibid@constrict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot} | |
{\@secondoftwo}} | |
{\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifciteidem@global{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@text} | |
{\@secondoftwo}} | |
\def\blx@ifciteidem@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}} | |
{\@secondoftwo}} | |
\let\blx@ifciteidem@strict\blx@ifciteidem@global | |
\def\blx@ifciteidem@constrict{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot} | |
{\@secondoftwo}} | |
{\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifopcit@global{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldundef{namehash} | |
{\@secondoftwo} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}} | |
{\@secondoftwo}} | |
\def\blx@ifopcit@context{% | |
\ifbool{citetracker} | |
{\blx@imc@iffieldundef{namehash} | |
{\@secondoftwo} | |
{\iftoggle{blx@footnote} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}} | |
{\@secondoftwo}} | |
\def\blx@ifopcit@strict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@ifopcit@global} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@ifopcit@constrict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@imc@iffieldundef{namehash} | |
{\@secondoftwo} | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}} | |
{\@secondoftwo}} | |
{\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
% {<true>}{<false>} | |
\def\blx@ifloccit@global{% | |
\ifbool{citetracker} | |
{\blx@loccit@check{text}} | |
{\@secondoftwo}} | |
\def\blx@ifloccit@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@loccit@check{foot}} | |
{\blx@loccit@check{text}}} | |
{\@secondoftwo}} | |
\def\blx@ifloccit@strict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\blx@loccit@numcheck{text}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@ifloccit@constrict{% | |
\ifbool{citetracker} | |
{\blx@ifcitesingle | |
{\iftoggle{blx@footnote} | |
{\blx@ifmpfncheck | |
{\blx@loccit@numcheck{foot}} | |
{\@secondoftwo}} | |
{\blx@loccit@numcheck{text}}} | |
{\@secondoftwo}} | |
{\@secondoftwo}} | |
\def\blx@loccit@check#1{% | |
\blx@imc@iffieldundef{postnote} | |
{\@secondoftwo} | |
{\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}}} | |
\def\blx@loccit@numcheck#1{% | |
\blx@imc@iffieldundef{postnote} | |
{\@secondoftwo} | |
{\expandafter\blx@imc@ifpages | |
\expandafter{\abx@field@postnote} | |
{\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}} | |
{\@secondoftwo}}} | |
% {<true>}{<false>} | |
\def\blx@ifmpfncheck{% | |
\ifnum\numexpr\value\@mpfn-\blx@lastmpfn<\tw@ | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
\def\blx@mpfnsave{% | |
\xdef\blx@lastmpfn{\the\value\@mpfn}} | |
\def\blx@mpfnreset{% | |
\global\let\blx@lastmpfn\z@} | |
\blx@mpfnreset | |
% {<true>}{<false>} | |
\def\blx@imc@iffirstonpage{% | |
\ifbool{pagetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@iffirstonpage{fnpage}} | |
{\blx@iffirstonpage{page}}} | |
{\@secondoftwo}} | |
\def\blx@iffirstonpage#1{% | |
\ifcsundef{blx@#1@\number\c@instcount} | |
{\@secondoftwo} | |
{\expandafter\blx@iffirstonpage@i | |
\expandafter{\number\numexpr\c@instcount-1}{#1}}} | |
\def\blx@iffirstonpage@i#1#2{% | |
\ifcsundef{blx@#2@#1} | |
{\ifnum#1>\@ne | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\expandafter\blx@iffirstonpage@i | |
\expandafter{\number\numexpr#1-1}{#2}} | |
{\@firstoftwo}} | |
{\ifnum\csuse{blx@#2@\number\c@instcount}=% | |
\csuse{blx@#2@#1} % | |
\expandafter\@secondoftwo | |
\else | |
\expandafter\@firstoftwo | |
\fi}} | |
% {<count1>}{<count2>}{<true>}{<false>} | |
\def\blx@imc@ifsamepage#1#2{% | |
\ifbool{pagetracker} | |
{\ifcsundef{blx@page@\number\numexpr#1} | |
{\ifcsundef{blx@fnpage@\number\numexpr#1} | |
{\@secondoftwo} | |
{\blx@ifsamepage{#1}{#2}{fnpage}}} | |
{\blx@ifsamepage{#1}{#2}{page}}} | |
{\@secondoftwo}} | |
\def\blx@ifsamepage#1#2#3{% | |
\ifcsundef{blx@page@\number\numexpr#2} | |
{\ifcsundef{blx@fnpage@\number\numexpr#2} | |
{\@secondoftwo} | |
{\blx@ifsamepage@i{#1}{#2}{#3}{fnpage}}} | |
{\blx@ifsamepage@i{#1}{#2}{#3}{page}}} | |
\def\blx@ifsamepage@i#1#2#3#4{% | |
\ifnum\csuse{blx@#3@\number\numexpr#1}=% | |
\csuse{blx@#4@\number\numexpr#2} % | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% {<string>}{<true>}{<false>} | |
\protected\long\def\blx@imc@ifinteger#1{% | |
\begingroup | |
\def\do##1{\uccode`##1=`\%}% | |
\do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9% | |
\catcode`\@=11 | |
\catcode`\%=9 | |
\endlinechar\m@ne | |
\uppercase{\scantokens{\def\blx@tempa{#1}}}% | |
\ifx\blx@tempa\@empty | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi | |
\endgroup} | |
% {<field>}{<true>}{<false>} | |
\protected\def\blx@imc@iffieldint#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\blx@imc@ifinteger | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
% {<string>}{<true>}{<false>} | |
\protected\def\blx@imc@ifnumeral{% | |
\blx@ifnum\blx@hook@ifnum} | |
\protected\def\blx@imc@ifnumerals{% | |
\blx@ifnum\blx@hook@ifnums} | |
\protected\def\blx@imc@ifpages{% | |
\blx@ifnum\blx@hook@ifpages} | |
\long\def\blx@ifnum#1#2{% | |
\begingroup | |
\let\protect\@unexpandable@protect | |
\uppercase{\edef\blx@tempa{#2}}% | |
\ifx\blx@tempa\@empty | |
\aftergroup\@secondoftwo | |
\else | |
\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} | |
\def\blx@hook@ifnum{% | |
\def\do##1{\uccode`##1=`\%}% | |
\do\ \do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9% | |
\do\i\do\v\do\x\do\l\do\c\do\d\do\m | |
\do\I\do\V\do\X\do\L\do\C\do\D\do\M | |
\blx@donumchars | |
\let\RN\@firstofone | |
\let\Rn\@firstofone} | |
\def\blx@hook@ifnums{% | |
\blx@hook@ifnum | |
\def\do##1{\uccode`##1=`\%}% | |
\blx@dorangechars | |
\def\do##1{\let##1\@empty}% | |
\blx@dorangecmds} | |
\def\blx@hook@ifpages{% | |
\blx@hook@ifnum | |
\blx@hook@ifnums | |
\def\do##1{\let##1\@empty}% | |
\blx@dopagecmds} | |
% {<field>}{<true>}{<false>} | |
\protected\def\blx@imc@iffieldnum#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\blx@imc@ifnumeral | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
\protected\def\blx@imc@iffieldnums#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\blx@imc@ifnumerals | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
\protected\def\blx@imc@iffieldpages#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\expandafter\expandafter | |
\expandafter\blx@imc@ifpages | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#1\endcsname}}} | |
% {<chars>} | |
\newrobustcmd*{\DeclareNumChars}{% | |
\@ifstar | |
{\blx@defnumchars} | |
{\global\let\blx@donumchars\@empty | |
\blx@defnumchars}} | |
\def\blx@defnumchars#1{% | |
\ifblank{#1} | |
{} | |
{\expandafter\blx@defdochars | |
\expandafter\blx@donumchars | |
\detokenize{#1}\relax}} | |
% {<chars>} | |
\newrobustcmd*{\DeclareRangeChars}{% | |
\@ifstar | |
{\blx@defrangechars} | |
{\global\let\blx@dorangechars\@empty | |
\blx@defrangechars}} | |
\def\blx@defrangechars#1{% | |
\ifblank{#1} | |
{} | |
{\expandafter\blx@defdochars | |
\expandafter\blx@dorangechars | |
\detokenize{#1}\relax}} | |
\def\blx@defdochars#1#2{% | |
\ifx#2\relax | |
\else | |
\xdef#1{% | |
\expandonce#1\noexpand\do | |
\expandafter\noexpand\csname#2\endcsname}% | |
\expandafter\blx@defdochars | |
\expandafter#1% | |
\fi} | |
% {<cstokens>} | |
\newrobustcmd*{\DeclareRangeCommands}{% | |
\@ifstar | |
{\blx@defrangecmds} | |
{\global\let\blx@dorangecmds\@empty | |
\blx@defrangecmds}} | |
\def\blx@defrangecmds#1{% | |
\ifblank{#1} | |
{} | |
{\blx@defrangecmds@i#1&}} | |
\def\blx@defrangecmds@i#1{% | |
\ifx% | |
\else | |
\gappto\blx@dorangecmds{\do#1}% | |
\expandafter\blx@defrangecmds@i | |
\fi} | |
% {<cstokens>} | |
\newrobustcmd*{\DeclarePageCommands}{% | |
\@ifstar | |
{\blx@defpagecmds} | |
{\global\let\blx@dopagecmds\@empty | |
\blx@defpagecmds}} | |
\def\blx@defpagecmds#1{% | |
\ifblank{#1} | |
{} | |
{\blx@defpagecmds@i#1&}} | |
\def\blx@defpagecmds@i#1{% | |
\ifx% | |
\else | |
\gappto\blx@dopagecmds{\do#1}% | |
\expandafter\blx@defpagecmds@i | |
\fi} | |
\DeclareNumChars{.} | |
\DeclareRangeChars{~,;-+/} | |
\DeclareRangeCommands{% | |
\ \,\space\nobreakspace\addspace\addnbspace | |
\addthinspace\addnbthinspace\addlowpenspace | |
\addhighpenspace\addlpthinspace\addhpthinspace | |
\adddotspace\addabbrvspace\&\psq\psqq | |
\bibrangedash\bibdaterangesep\bibtimerangesep\textendash\textemdash\bibrangessep} | |
\DeclarePageCommands{\pno\ppno} | |
% *{<code>} | |
\newrobustcmd*{\NumCheckSetup}{\appto\blx@hook@ifnum} | |
\newcommand*{\NumcheckSetup}{\NumCheckSetup} | |
\newrobustcmd*{\NumsCheckSetup}{\appto\blx@hook@ifnums} | |
\newrobustcmd*{\PagesCheckSetup}{\appto\blx@hook@ifpages} | |
\PagesCheckSetup{\let\pnfmt\@firstofone} | |
% [<pagination>][<postpro>]{<string>} | |
\newrobustcmd*{\blx@imc@mkpageprefix}[1][pagination]{% | |
\begingroup | |
\def\blx@tempa{\blx@mkpageprefix{page}}% | |
\iffieldundef{#1} | |
{} | |
{\iffieldequalstr{#1}{none} | |
{\def\blx@tempa{\blx@mkpageprefix@i}} | |
{\iffieldbibstring{#1} | |
{\edef\blx@tempa{\blx@mkpageprefix{\thefield{#1}}}} | |
{\blx@warning@entry{% | |
Unknown pagination type '\strfield{#1}'}}}}% | |
\@ifnextchar[%] | |
{\blx@tempa} | |
{\blx@tempa[\@firstofone]}} | |
\protected\long\def\blx@mkpageprefix#1[#2]#3{% | |
\ifnumeral{#3} | |
{\bibstring{#1}\ppspace} | |
{\ifnumerals{#3} | |
{\bibstring{#1s}\ppspace} | |
{\def\pno{\bibstring{#1}}% | |
\def\ppno{\bibstring{#1s}}}}% | |
\blx@mkpageprefix@i[{#2}]{#3}} | |
\long\def\blx@mkpageprefix@i[#1]#2{#1{#2}\endgroup} | |
% [<pagination>][<postpro>]{<string>} | |
\newrobustcmd*{\blx@imc@mkpagetotal}[1][bookpagination]{% | |
\begingroup | |
\def\blx@tempa{\blx@mkpagetotal{pagetotal}}% | |
\iffieldundef{#1} | |
{} | |
{\iffieldequalstr{#1}{none} | |
{\def\blx@tempa{\blx@mkpagetotal@i}} | |
{\iffieldplusstringbibstring{#1}{total} | |
{\edef\blx@tempa{\blx@mkpagetotal{\thefield{#1}total}}} | |
{\blx@warning@entry{% | |
Unknown pagination type '\strfield{#1}total'}}}}% | |
\@ifnextchar[%] | |
{\blx@tempa} | |
{\blx@tempa[\@firstofone]}} | |
\protected\long\def\blx@mkpagetotal#1[#2]#3{% | |
\ifnumeral{#3} | |
{\setbox\@tempboxa=\hbox{% | |
\blx@tempcnta0#3\relax | |
\ifnum\blx@tempcnta=\@ne | |
\aftergroup\@firstoftwo | |
\else | |
\aftergroup\@secondoftwo | |
\fi}% | |
{#2{#3}\ppspace\bibstring{#1}} | |
{#2{#3}\ppspace\bibstring{#1s}}} | |
{\def\pno{\bibstring{#1}}% | |
\def\ppno{\bibstring{#1s}}% | |
#2{#3}}% | |
\endgroup} | |
\long\def\blx@mkpagetotal@i[#1]#2{#1{#2}\endgroup} | |
\newcounter{mincomprange} | |
\newcounter{maxcomprange} | |
\newcounter{mincompwidth} | |
\setcounter{mincomprange}{10} | |
\setcounter{maxcomprange}{100000} | |
\setcounter{mincompwidth}{1} | |
\def\abx@rangeproclimit{100000} | |
% {<rangefield>} | |
\newcommand*{\rangelen}[1]{% | |
\ifcsdef{abx@range@#1} | |
{\csuse{abx@range@#1}} | |
{}} | |
% <*>[<postpro>]{<string>} | |
\newrobustcmd*{\mknormrange}{% | |
\begingroup | |
\@ifstar | |
{\blx@range@aux\blx@normrange@ii} | |
{\blx@range@aux\blx@normrange@i}} | |
\def\blx@range@aux#1{% | |
\@ifnextchar[{\blx@range@aux@i#1}{#1[\@firstofone][\@firstofone]}} | |
\def\blx@range@aux@i#1[#2]{% | |
\@ifnextchar[{#1[{#2}]}{#1[{#2}][\@firstofone]}} | |
\def\blx@normrange@i[#1][#2]#3{% | |
\let\blx@tempa\@empty | |
\protected\def\blx@range@out@value{\appto\blx@tempa}% | |
\def\blx@range@out@item@process{#2}% | |
\let\blx@range@out@delim\blx@range@out@value | |
\let\blx@range@split\blx@genrange@split | |
\let\blx@range@process\blx@normrange@process | |
\blx@range@chunk{#3}% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\unexpanded{#1}{\expandonce\blx@tempa}}% | |
\blx@tempa | |
\endgroup} | |
\def\blx@normrange@ii[#1][#2]#3{% | |
\protected\def\blx@range@out@value{#1}% | |
\def\blx@range@out@item@process{#2}% | |
\let\blx@range@out@delim\@firstofone | |
\let\blx@range@split\blx@genrange@split | |
\let\blx@range@process\blx@normrange@process | |
\blx@range@chunk{#3}% | |
\endgroup} | |
\def\blx@range@chunk#1{% | |
\blx@range@chunk@semcol#1;&} | |
\def\blx@range@chunk@semcol#1;#2&{% | |
\notblank{#1} | |
{\blx@range@chunk@comma#1,&} | |
{}% | |
\notblank{#2} | |
{\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}% | |
\blx@range@chunk@semcol#2&} | |
{}} | |
\def\blx@range@chunk@comma#1,#2&{% | |
\notblank{#1} | |
{\blx@range@chunk@sep#1\bibrangessep&} | |
{}% | |
\notblank{#2} | |
{\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}% | |
\blx@range@chunk@comma#2&} | |
{}} | |
\def\blx@range@chunk@sep#1\bibrangessep#2&{% | |
\notblank{#1} | |
{\expandafter\blx@range@split | |
\expandafter{\@firstofone#1}} | |
{}% | |
\notblank{#2} | |
{\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}% | |
\blx@range@chunk@sep#2&} | |
{}} | |
% Unicode en-dashes are supported in blx-unicode.def | |
\def\blx@genrange@split#1{% | |
\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} | |
% <*>[<postpro>]{<string>} | |
\newrobustcmd*{\mkcomprange}{% | |
\begingroup | |
\@ifstar | |
{\blx@range@aux\blx@comprange@ii} | |
{\blx@range@aux\blx@comprange@i}} | |
\def\blx@comprange@i[#1][#2]#3{% | |
\let\blx@tempa\@empty | |
\protected\def\blx@range@out@value{\appto\blx@tempa}% | |
\def\blx@range@out@item@process{#2}% | |
\let\blx@range@out@delim\blx@range@out@value | |
\let\blx@range@split\blx@genrange@split | |
\let\blx@range@process\blx@comprange@check | |
\blx@range@chunk{#3}% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\unexpanded{#1}{\expandonce\blx@tempa}}% | |
\blx@tempa | |
\endgroup} | |
\def\blx@comprange@ii[#1][#2]#3{% | |
\protected\def\blx@range@out@value{#1}% | |
\def\blx@range@out@item@process{#2}% | |
\let\blx@range@out@delim\@firstofone | |
\let\blx@range@split\blx@genrange@split | |
\let\blx@range@process\blx@comprange@check | |
\blx@range@chunk{#3}% | |
\endgroup} | |
\def\blx@comprange@check#1#2{% | |
\blx@imc@ifinteger{#1} | |
{\blx@imc@ifinteger{#2} | |
{\@firstoftwo} | |
{\@secondoftwo}} | |
{\@secondoftwo} | |
{\blx@comprange@comp{#1}{#2}} | |
{\begingroup | |
\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} | |
% <*>[<postpro>]{<string>} | |
\newrobustcmd*{\mkfirstpage}{% | |
\begingroup | |
\@ifstar | |
{\blx@range@aux\blx@firstpage@ii} | |
{\blx@range@aux\blx@firstpage@i}} | |
\def\blx@firstpage@i[#1][#2]#3{% | |
\let\blx@tempa\@empty | |
\protected\def\blx@range@out@value{\appto\blx@tempa}% | |
\def\blx@range@out@item@process{#2}% | |
\let\blx@range@out@delim\blx@range@out@value | |
\let\blx@range@split\blx@firstpage@split | |
\blx@range@chunk{#3}% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\unexpanded{#1}{\expandonce\blx@tempa}}% | |
\blx@tempa | |
\endgroup} | |
\def\blx@firstpage@ii[#1][#2]#3{% | |
\protected\def\blx@range@out@value{#1}% | |
\def\blx@range@out@item@process{#2}% | |
\let\blx@range@out@delim\@firstofone | |
\let\blx@range@split\blx@firstpage@split | |
\blx@range@chunk{#3}% | |
\endgroup} | |
% Unicode en-dashes are supported in blx-unicode.def | |
\def\blx@firstpage@split#1{% | |
\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 | |
% [<contextname, ...>]{<name, ...>}{<code>} | |
\newrobustcmd*{\DeclareDelimFormat}{% | |
\@ifstar | |
{\blx@declaredelimclear} | |
{\blx@declaredelim}} | |
\def\blx@cleardelim#1{% | |
\ifcsvoid{blx@declaredelimcontexts@#1} | |
{} | |
{\def\do##1{\csundef{blx@printdelim@##1@#1}}% | |
\dolistcsloop{blx@declaredelimcontexts@#1}}% | |
\cslet{blx@declaredelimcontexts@#1}\@empty} | |
\newrobustcmd*{\blx@declaredelimclear}[3][]{% | |
\blx@cleardelim{#2}% | |
\ifblank{#1} | |
{\blx@declaredelim{#2}{#3}} | |
{\blx@declaredelim[{#1}]{#2}{#3}}} | |
\newrobustcmd*{\blx@declaredelim}[3][]{% | |
\ifblank{#1} | |
{\blx@declaredelim@i{}{}{#2}{#3}} | |
{\def\do##1{% | |
\listcsadd{blx@declaredelimcontexts@#2}{##1}% | |
\blx@declaredelim@i{blx@printdelim@##1@}{##1}{#2}{#3}}% | |
\docsvlist{#1}}}% | |
\def\blx@declaredelim@i#1#2#3#4{% | |
\def\do@i##1{% | |
\ifcsdef{#1##1} | |
{\blx@inf@delimdeclare{##1}{#2}} | |
{}% | |
\csdef{#1##1}{#4}}% | |
\forcsvlist{\do@i}{#3}} | |
% [<alias context, ...>]{<alias>}[<delim context>]{<delim>} | |
% deprecated: *[<alias context, ...>]{<alias>}[<delim context>]{<delim>} | |
% 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}}}} | |
% {<alias>}{<source>} | |
\def\blx@declaredelimalias@auto#1#2{% | |
\blx@cleardelim{#1}% | |
\blx@declaredelimalias@def{}{#1}{}{#2}% | |
\ifcsvoid{blx@declaredelimcontexts@#2} | |
{} | |
{\def\do##1{% | |
\blx@declaredelimalias@def | |
{blx@printdelim@##1@}{#1}{blx@printdelim@##1@}{#2}}% | |
\dolistcsloop{blx@declaredelimcontexts@#2}}} | |
% {<alias context>}{<alias>}{<source context>}{<source>} | |
\def\blx@declaredelimalias@manual#1#2#3#4{% | |
\ifblank{#1} | |
{\ifblank{#3} | |
{\blx@declaredelimalias@def{}{#2}{}{#4}} | |
{\blx@declaredelimalias@def{}{#2}{blx@printdelim@#3@}{#4}}} | |
{\ifblank{#3} | |
{\blx@declaredelimalias@def{blx@printdelim@#1@}{#2}{}{#4}}} | |
{\blx@declaredelimalias@def{blx@printdelim@#1@}{#2}{blx@printdelim@#3@}{#4}}} | |
\def\blx@declaredelimalias@def#1#2#3#4{% | |
\ifcsdef{#1#2} | |
{\blx@inf@delimdeclare{#2}{#1}} | |
{}% | |
\ifblank{#1} | |
{} | |
{\ifinlistcs{#1}{blx@declaredelimcontexts@#2} | |
{} | |
{\listcsadd{blx@declaredelimcontexts@#2}{#1}}}% | |
\csdef{#1#2}{\ifcsundef{#3#4}{\csuse{#4}}{\csuse{#3#4}}}} | |
\def\blx@delimcontext{none} | |
\newcommand*{\printdelim}[2][]{% | |
\ifblank{#1} | |
{\ifcsdef{blx@printdelim@\blx@delimcontext @#2} | |
{\csuse{blx@printdelim@\blx@delimcontext @#2}} | |
{\ifcsdef{#2}% fall back on legacy macros | |
{\csuse{#2}} | |
{\blx@warn@delimuse{#2}{*}}}} | |
{\ifcsdef{blx@printdelim@#1@#2} | |
{\csuse{blx@printdelim@#1@#2}} | |
{\blx@warn@delimuse{#2}{#1}}}} | |
\newcommand*{\delimcontext}[1]{% | |
\edef\blx@delimcontext{\blx@delimcontextalias{#1}}} | |
\def\blx@delimcontextalias#1{% | |
\ifcsdef{blx@delimcontextalias@#1} | |
{\csuse{blx@delimcontextalias@#1}} | |
{#1}} | |
\newcommand*{\DeclareDelimcontextAlias}[2]{% | |
\csdef{blx@delimcontextalias@#1}{#2}} | |
\newrobustcmd*{\AtUsedriver}{% | |
\@ifstar | |
{\global\undef\blx@hook@usedriver | |
\gappto\blx@hook@usedriver} | |
{\gappto\blx@hook@usedriver}} | |
\@onlypreamble\AtUsedriver | |
\def\blx@imc@UseUsedriverHook{\csuse{blx@hook@usedriver}} | |
\blx@regimcs{\UseUsedriverHook} | |
\AtUsedriver{% | |
\delimcontext{bib}% | |
\let\finentry\blx@finentry@usedrv | |
\let\newblock\relax | |
\let\abx@macro@bibindex\@empty | |
\let\abx@macro@pageref\@empty} | |
% {<init>}{<entrytype>} | |
\protected\def\blx@imc@usedriver#1#2{% | |
\begingroup | |
\csuse{blx@hook@usedriver}% | |
\csuse{blx@hook@bbxinit}#1% | |
\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{#1season}} | |
{\@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{#1season})-% | |
\thefield{#1day}T% | |
\thefield{#1hour}:\thefield{#1minute}:\thefield{#1second}Z% | |
\thefield{#1timezone}//% | |
e\thefield{#1dateera}E% | |
c\csuse{if#1datecirca}{T}{F}% | |
j\csuse{if#1datejulian}{T}{F}% | |
r\csuse{if#1dateuncertain}{T}{F}% | |
k\csuse{if#1dateunknown}{T}{F}% | |
} | |
\def\blx@imc@ifdatesequal#1#2{% | |
\begingroup | |
\edef\blx@tempa{\blx@reconstruct@comparabledate{#1}}% | |
\edef\blx@tempb{\blx@reconstruct@comparabledate{#2}}% | |
\edef\blx@tempc{\endgroup | |
\ifstrequal{\blx@tempa}{\blx@tempb}}% | |
\blx@tempc | |
} | |
\def\blx@imc@ifdaterangesequal#1#2{% | |
\blx@imc@ifdatesequal{#1}{#2} | |
{\blx@imc@ifdatesequal{#1end}{#2end}} | |
{\@secondoftwo}} | |
\blx@regimcs{% | |
\ifdriver \thefield \strfield \csfield \usefield \thelist \strlist | |
\thefirstlistitem \usefirstlistitem \strfirstlistitem | |
\thename \strname | |
\clearfield \clearlist \clearname \restorefield \restorelist \restorename | |
\ifcategory \ifkeyword | |
\ifciteseen \ifciteibid \ifciteidem \ifopcit \ifloccit | |
\ifcurrentfield \ifcurrentlist \ifcurrentname \ifentrytype | |
\iffieldequalcs \iffieldequals \iffieldequalstr \iffieldsequal | |
\iffieldundef \iffieldxref \iflistequalcs \iflistequals | |
\iflistsequal \iflistundef \iflistxref | |
\ifmorenames \ifmoreitems \iffirstcitekey \iflastcitekey | |
\ifnameequalcs \ifnameequals \ifnamesequal \ifnameundef \ifnamexref | |
\iffirstonpage \ifsamepage \savefield \savefieldcs \savelist | |
\savelistcs \savename \savenamecs \usedriver | |
\ifinteger \ifnumeral \ifnumerals \ifpages | |
\iffieldint \iffieldnum \iffieldnums \iffieldpages | |
\iflabeldateisdate \ifdatehasyearonlyprecision \ifdatehastime | |
\ifdateshavedifferentprecision | |
\ifdateyearsequal \ifdatesequal \ifdaterangesequal | |
\mkpageprefix \mkpagetotal | |
\newblock \newunit \setunit \printunit \finentry} | |
\appto\blx@blxinit{% | |
\def\ifnatbibmode{\iftoggle{blx@natbib}}% | |
\def\ifcitation{\iftoggle{blx@citation}}% | |
\def\ifvolcite{\iftoggle{blx@volcite}}% | |
\def\ifbibliography{\iftoggle{blx@bibliography}}% | |
\def\ifciteindex{\iftoggle{blx@citeindex}}% | |
\def\ifbibindex{\iftoggle{blx@bibindex}}% | |
\def\iffootnote{\iftoggle{blx@footnote}}% | |
\def\ifuseprefix{\iftoggle{blx@useprefix}}% | |
\def\ifterseinits{\iftoggle{blx@terseinits}}% | |
\def\ifcrossrefsource{\iftoggle{abx@bool@crossrefsource}}% | |
\def\ifxrefsource{\iftoggle{abx@bool@xrefsource}}% | |
\def\ifsingletitle{\iftoggle{abx@bool@singletitle}}% | |
\def\ifnocite{\iftoggle{abx@bool@nocite}}% | |
\def\ifuniquetitle{\iftoggle{abx@bool@uniquetitle}}% | |
\def\ifuniquebaretitle{\iftoggle{abx@bool@uniquebaretitle}}% | |
\def\ifuniquework{\iftoggle{abx@bool@uniquework}}% | |
\def\ifuniqueprimaryauthor{\iftoggle{abx@bool@uniqueprimaryauthor}}% | |
\def\ifandothers#1{\iftoggle{abx@bool@more#1}}% | |
\protected\def\pnfmt{\printtext[postnote]}% | |
\protected\def\pno{\bibstring{page}}% | |
\protected\def\ppno{\bibstring{pages}}% | |
\let\nopp\relax | |
\protected\def\psq{\sqspace\bibstring{sequens}}% | |
\protected\def\psqq{\sqspace\bibstring{sequentes}}} | |
% Make sure that commands which might pop up inside an \edef will be defined | |
% as something. If they are taken \AtBeginDocument then we assume that all will | |
% be well. If not, then provide a definition which will give an error outside | |
% of a citation context. | |
\AtBeginDocument{% | |
\protected\def\do#1{% | |
\ifdefined#1% | |
\else | |
\protected\def#1{\ERROR}% | |
\fi | |
}% | |
\docsvlist{\pnfmt,\pno,\ppno,\nopp,\psq,\psqq}% | |
} | |
%% Global formatting hooks | |
%% Main formatting commands | |
% They work by creating a \let alias: | |
% \abx@<class>@<entrytype>@<formatname> -> \blx@defformat@d | |
% for later use in \print* | |
% Then, \blx@defformat@d is defined by calling | |
% \def\blx@defformat@d#1{format body} | |
% [<entrytype>]{<name>}{<definiton>} | |
\newrobustcmd*{\DeclareNameFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defnameformat{nfd}*} | |
{\blx@defformat\blx@defnameformat{nfd}{}}} | |
\newrobustcmd*{\DeclareIndexNameFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defnameformat{nid}*} | |
{\blx@defformat\blx@defnameformat{nid}{}}} | |
\newrobustcmd*{\DeclareListFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{lfd}*} | |
{\blx@defformat\blx@defplainformat{lfd}{}}} | |
\newrobustcmd*{\DeclareIndexListFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{lid}*} | |
{\blx@defformat\blx@defplainformat{lid}{}}} | |
\newrobustcmd*{\DeclareFieldFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{ffd}*} | |
{\blx@defformat\blx@defplainformat{ffd}{}}} | |
\newrobustcmd*{\DeclareIndexFieldFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{fid}*} | |
{\blx@defformat\blx@defplainformat{fid}{}}} | |
\newrobustcmd*{\DeclareNameWrapperFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defnameformat{nwd}*} | |
{\blx@defformat\blx@defnameformat{nwd}{}}} | |
\newrobustcmd*{\DeclareListWrapperFormat}{% | |
\@ifstar | |
{\blx@defformat\blx@defplainformat{lwd}*} | |
{\blx@defformat\blx@defplainformat{lwd}{}}} | |
% {<macro>}{<class>}{<*>} | |
\def\blx@defformat#1#2#3{% | |
\@ifnextchar[%] | |
{\blx@defformat@i{#1}{#2}{#3}} | |
{\blx@defformat@i{#1}{#2}{#3}[*]}} | |
% {<macro>}{<class>}{<*>}[<entrytype>]{<name>} | |
\def\blx@defformat@i#1#2#3[#4]#5{% | |
\notblank{#3} | |
{\blx@resetformat{#2}{#5}} | |
{}% | |
\def\blx@defformat@a{#2}% | |
\def\blx@defformat@b{#4}% | |
\blx@xsanitizeafter{\def\blx@defformat@c}{#5}% | |
\afterassignment\blx@defformat@ii | |
#1} | |
\def\blx@defformat@ii{% | |
\expandafter\forcsvlist | |
\expandafter\blx@defformat@iii | |
\expandafter{\blx@defformat@b}} | |
\def\blx@defformat@iii#1{% | |
\cslet{abx@\blx@defformat@a @#1@\blx@defformat@c}\blx@defformat@d} | |
% grab the argument explicitly, this avoids issues with spaces making it | |
% into the argument specification of the macros | |
% cf. \def\foo#1{<stuff>} vs. \def\foo#1 {<stuff>} | |
\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}} | |
{}} | |
% {<name>}{<name>} | |
\def\blx@letformat#1#2{% | |
\blx@safe@actives | |
\afterassignment\blx@rest@actives | |
\csletcs{#1}{#2}} | |
% [aliastype]{aliasname}[formattype]{formatname} | |
\def\blx@defalias#1{% | |
\@ifnextchar[%] | |
{\blx@defalias@i{#1}} | |
{\blx@defalias@i{#1}[*]}} | |
\def\blx@defalias@i#1[#2]#3{% | |
\@ifnextchar[%] | |
{\blx@defalias@ii{#1}{#2}{#3}} | |
{\blx@defalias@ii{#1}{#2}{#3}[*]}} | |
\def\blx@defalias@ii#1#2#3[#4]#5{% | |
\blx@safe@actives | |
\afterassignment\blx@rest@actives | |
\csedef{abx@#1@#2@#3}{% | |
\expandonce{\csname abx@#1@#4@#5\endcsname}}} | |
% {<macro>}{<class>}{<name>}{<field>} | |
\def\blx@getformat#1#2#3#4{% | |
\blx@safe@actives | |
\afterassignment\blx@rest@actives | |
\ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#3} | |
{\ifcsundef{abx@#2@*@#3} | |
{\ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#4} | |
{\ifcsundef{abx@#2@*@#4} | |
{\letcs#1{abx@#2@*@default}} | |
{\letcs#1{abx@#2@*@#4}}} | |
{\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#4}}} | |
{\letcs#1{abx@#2@*@#3}}} | |
{\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#3}}} | |
% [<entrytype>]{<name>} | |
\newrobustcmd*{\savefieldformat}[2][*]{\blx@save{abx@ffd@#1@#2}} | |
\newrobustcmd*{\savelistformat}[2][*]{\blx@save{abx@lfd@#1@#2}} | |
\newrobustcmd*{\savenameformat}[2][*]{\blx@save{abx@nfd@#1@#2}} | |
\newrobustcmd*{\savelistwrapperformat}[2][*]{\blx@save{abx@lwd@#1@#2}} | |
\newrobustcmd*{\savenamewrapperformat}[2][*]{\blx@save{abx@nwd@#1@#2}} | |
\newrobustcmd*{\restorefieldformat}[2][*]{\blx@restore{abx@ffd@#1@#2}} | |
\newrobustcmd*{\restorelistformat}[2][*]{\blx@restore{abx@lfd@#1@#2}} | |
\newrobustcmd*{\restorenameformat}[2][*]{\blx@restore{abx@nfd@#1@#2}} | |
\newrobustcmd*{\restorelistwrapperformat}[2][*]{\blx@restore{abx@lwd@#1@#2}} | |
\newrobustcmd*{\restorenamewrapperformat}[2][*]{\blx@restore{abx@nwd@#1@#2}} | |
% [<entrytype>]{<name>}{<true>}{<false>} | |
\newrobustcmd*{\iffieldformatundef}[2][*]{\ifcsundef{abx@ffd@#1@#2}} | |
\newrobustcmd*{\iflistformatundef}[2][*]{\ifcsundef{abx@lfd@#1@#2}} | |
\newrobustcmd*{\ifnameformatundef}[2][*]{\ifcsundef{abx@nfd@#1@#2}} | |
\newrobustcmd*{\iflistwrapperformatundef}[2][*]{\ifcsundef{abx@lwd@#1@#2}} | |
\newrobustcmd*{\ifnamewrapperformatundef}[2][*]{\ifcsundef{abx@nwd@#1@#2}} | |
% [<entrytype>]{<alias>}[<entrytype>]{<name>} | |
\newrobustcmd*{\DeclareNameAlias}{\blx@defalias{nfd}} | |
\newrobustcmd*{\DeclareIndexNameAlias}{\blx@defalias{nid}} | |
\newrobustcmd*{\DeclareListAlias}{\blx@defalias{lfd}} | |
\newrobustcmd*{\DeclareIndexListAlias}{\blx@defalias{lid}} | |
\newrobustcmd*{\DeclareFieldAlias}{\blx@defalias{ffd}} | |
\newrobustcmd*{\DeclareIndexFieldAlias}{\blx@defalias{fid}} | |
\newrobustcmd*{\DeclareNameWrapperAlias}{\blx@defalias{nwd}} | |
\newrobustcmd*{\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}} | |
% [<entrytype>]{<alias>}[<entrytype>]{<name>} | |
\newrobustcmd*{\DeprecateNameFormatWithReplacement}{% | |
\blx@deprecateformat{nfd}{Name format}} | |
\newrobustcmd*{\DeprecateIndexNameFormatWithReplacement}{% | |
\blx@deprecateformat{nid}{Index name format}} | |
\newrobustcmd*{\DeprecateListFormatWithReplacement}{% | |
\blx@deprecateformat{lfd}{List format}} | |
\newrobustcmd*{\DeprecateIndexListFormatWithReplacement}{% | |
\blx@deprecateformat{lid}{Index list format}} | |
\newrobustcmd*{\DeprecateFieldFormatWithReplacement}{% | |
\blx@deprecateformat{ffd}{Field format}} | |
\newrobustcmd*{\DeprecateIndexFieldFormatWithReplacement}{% | |
\blx@deprecateformat{fid}{Index field format}} | |
\newrobustcmd*{\DeprecateNameWrapperFormatWithReplacement}{% | |
\blx@deprecateformat{nwd}{Name wrapper format}} | |
\newrobustcmd*{\DeprecateListWrapperFormatWithReplacement}{% | |
\blx@deprecateformat{lwd}{List wrapper format}} | |
% [<format>]{<text>} | |
\newrobustcmd{\blx@imc@printtext}[2][]{% | |
\ifblank{#2} | |
{\blx@nounit} | |
{\ifblank{#1} | |
{\let\blx@theformat\@firstofone} | |
{\blx@getformat\blx@theformat{ffd}{#1}{}}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\blx@theformat{#2}% | |
\blx@endunit}}} | |
% [<format>]{<field>} | |
\newrobustcmd*{\blx@imc@printfield}[2][]{% | |
\blx@imc@iffieldundef{#2} | |
{\blx@nounit} | |
{\blx@getformat\blx@theformat{ffd}{#1}{#2}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\edef\currentfield{#2}% | |
\expandafter\expandafter | |
\expandafter\blx@theformat | |
\expandafter\expandafter | |
\expandafter{\csname abx@field@#2\endcsname}% | |
\blx@endunit}}} | |
% [<format>]{<field>} | |
\newcommand*{\blx@imc@indexfield}[2][]{% | |
\blx@imc@iffieldundef{#2} | |
{} | |
{\blx@getformat\blx@theformat{fid}{#1}{#2}% | |
\ifdefvoid\blx@theformat | |
{} | |
{\begingroup | |
\edef\currentfield{#2}% | |
\letcs\blx@tempa{abx@field@#2}% | |
\expandafter\blx@theformat\expandafter{\blx@tempa}% | |
\endgroup}}} | |
% [<format>]{<file>} | |
\newrobustcmd*{\blx@imc@printfile}[2][]{% | |
\iftoggle{blx@loadfiles} | |
{\IfFileExists{#2} | |
{\listxadd\blx@list@req@edit{#2}% | |
\blx@imc@printtext[{#1}]{\input{#2}\unspace}} | |
{\blx@nounit}} | |
{\blx@nounit}} | |
% {<macro>}[<format>][<start>-<stop>] | |
% => <macro>{<format>}{<start>}{<stop>} | |
\def\blx@listargs#1{% | |
\@ifnextchar[%] | |
{\blx@listargs@i{#1}} | |
{#1{}{}{}}} | |
\def\blx@listargs@i#1[#2]{% | |
\@ifnextchar[%] | |
{\blx@listargs@ii{#1}{#2}} | |
{#1{#2}{}{}}} | |
\def\blx@listargs@ii#1#2[#3]{% | |
\blx@listargs@iii{#1}{#2}#3&} | |
\def\blx@listargs@iii#1#2#3-#4&{% | |
#1{#2}{#3}{#4}} | |
% [<format>][<start>-<stop>]{<namelist>} | |
\protected\def\blx@imc@printnames{% | |
\blx@listargs\blx@printnames} | |
% {<format>}{<start>}{<stop>}{<namelist>} | |
\def\blx@printnames#1#2#3#4{% | |
\blx@imc@ifnameundef{#4} | |
{\blx@nounit} | |
{\blx@getformat\blx@thewrapperformat{nwd}{#1}{#4}% | |
\ifdefvoid\blx@thewrapperformat | |
{\blx@nounit} | |
{\blx@getformat\blx@theformat{nfd}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\blx@namesetup{#2}{#3}{#4}% | |
\blx@thewrapperformat{\expandafter\blx@nameparser\blx@thedata{}&}% | |
\blx@endunit}}}} | |
\def\blx@namesetup#1#2#3{% | |
\def\currentname{#3}% | |
\c@listcount\@ne | |
\c@listtotal\csname c@#3\endcsname | |
\blx@namesetup@i{#3}% | |
\ifblank{#1} | |
{\c@liststart\@ne} | |
{\ifnum#1<\@ne | |
\c@liststart\@ne | |
\else | |
\c@liststart#1\relax | |
\fi}% | |
\ifblank{#2} | |
{\c@liststop\c@listtotal | |
\ifnum\c@liststop>\c@maxnames | |
\c@liststop\c@minnames | |
\ifnum\c@uniquelist>\c@liststop | |
\c@liststop\c@uniquelist | |
\fi | |
\fi} | |
{\ifnum#2>\c@listtotal | |
\c@liststop\c@listtotal | |
\else | |
\ifnum#2<\@ne | |
\c@liststop\@ne | |
\else | |
\c@liststop#2\relax | |
\fi | |
\fi}% | |
\blx@namecodes} | |
\def\blx@namesetup@i#1{% | |
\expandafter\expandafter | |
\expandafter\blx@namesetup@ii\csname abx@name@#1\endcsname} | |
\def\blx@namesetup@ii#1#2{% | |
\c@uniquelist\z@ | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@opt@namelist}{#1}}% | |
\def\blx@thedata{#2}} | |
% Biber-calculated info passed back to biblatex as an option in the .bbl | |
% unlike stuff defined with \DeclareBiblatexOption and | |
% \blx@DeclareBackendOption these are not 'real' options | |
\blx@kv@defkey{blx@opt@namelist}{ul}{\c@uniquelist#1\relax} | |
\blx@kv@defkey{blx@opt@name}{un}{\c@uniquename#1\relax} | |
\blx@kv@defkey{blx@opt@name}{uniquepart}{\def\abx@field@uniquepart{#1}} | |
\blx@kv@defkey{blx@opt@name}{hash}{\edef\abx@field@hash{\detokenize{#1}}} | |
\newrobustcmd*{\bibinitperiod}{\adddot} | |
\newrobustcmd*{\bibinitdelim}{\addnbspace} | |
\newrobustcmd*{\bibinithyphendelim}{.\mbox{-}} | |
\newrobustcmd*{\bibnamedelima}{\addhighpenspace} | |
\newrobustcmd*{\bibnamedelimb}{\addlowpenspace} | |
\newrobustcmd*{\bibnamedelimc}{\addhighpenspace} | |
\newrobustcmd*{\bibnamedelimd}{\addlowpenspace} | |
\newrobustcmd*{\bibnamedelimi}{\addnbspace} | |
% [<format>][<start>-<stop>]{<namelist>} | |
\protected\def\blx@imc@indexnames{% | |
\blx@listargs\blx@indexnames} | |
% {<format>}{<start>}{<stop>}{<namelist>} | |
\def\blx@indexnames#1#2#3#4{% | |
\blx@imc@ifnameundef{#4} | |
{} | |
{\blx@getformat\blx@theformat{nid}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{} | |
{\begingroup | |
\blx@namesetup{#2}{#3}{#4}% | |
\blx@indexnamesetup | |
\expandafter\blx@nameparser\blx@thedata{}&% | |
\endgroup}}} | |
\def\blx@indexnamesetup{% | |
\let\bibinitperiod\bibindexinitperiod | |
\let\bibinitdelim\bibindexinitdelim | |
\let\bibinithyphendelim\bibindexinithyphendelim | |
\let\bibnamedelima\bibindexnamedelima | |
\let\bibnamedelimb\bibindexnamedelimb | |
\let\bibnamedelimc\bibindexnamedelimc | |
\let\bibnamedelimd\bibindexnamedelimd | |
\let\bibnamedelimi\bibindexnamedelimi} | |
% {<name1>}{<name2>}{...} | |
\long\def\blx@nameparser#1{% | |
\ifblank{#1} | |
{\blx@namebreak} | |
{\ifnum\c@listcount<\c@liststart | |
\else | |
\blx@nameparser@i#1% | |
\fi | |
\advance\c@listcount\@ne | |
\ifnum\c@listcount>\c@liststop | |
\expandafter\blx@namebreak | |
\fi | |
\blx@nameparser}} | |
% {name opts}{nameparts} | |
\long\def\blx@nameparser@i#1#2{% | |
\begingroup | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@opt@name}{#1}}% | |
% reset all the nameparts to empty between names | |
\def\do##1{% | |
\cslet{namepart##1}\@empty | |
\cslet{namepart##1i}\@empty}% | |
\expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}% | |
\blx@kv@setkeys{blx@opt@namepart}{#2}% Extract nameparts information | |
% Still pass the nameparts forward for backwards compat | |
% When \nameparts is finally removed, remove the "{2}" and remove the | |
% arg to \blx@defformat@d in def of \blx@defnameformat | |
\blx@theformat{#2}% | |
\endgroup} | |
\long\def\blx@namebreak#1&{} | |
% [<format>][<start>-<stop>]{<plainlist>} | |
\protected\def\blx@imc@printlist{% | |
\blx@listargs\blx@printlist} | |
% {<format>}{<start>}{<stop>}{<plainlist>} | |
\def\blx@printlist#1#2#3#4{% | |
\blx@imc@iflistundef{#4} | |
{\blx@nounit} | |
{\blx@getformat\blx@thewrapperformat{lwd}{#1}{#4}% | |
\ifdefvoid\blx@thewrapperformat | |
{\blx@nounit} | |
{\blx@getformat\blx@theformat{lfd}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{\blx@nounit} | |
{\blx@begunit | |
\blx@listsetup{#2}{#3}{#4}% | |
\blx@thewrapperformat{\expandafter\blx@listparser\blx@thedata{}&}% | |
\blx@endunit}}}} | |
\def\blx@listsetup#1#2#3{% | |
\def\currentlist{#3}% | |
\c@listcount\@ne | |
\expandafter\c@listtotal\csname c@#3\endcsname | |
\letcs\blx@thedata{abx@list@#3}% | |
\ifblank{#1} | |
{\c@liststart\@ne} | |
{\ifnum#1<\@ne | |
\c@liststart\@ne | |
\else | |
\c@liststart#1\relax | |
\fi}% | |
\ifblank{#2} | |
{\c@liststop\c@listtotal | |
\ifnum\c@listtotal>\c@maxitems | |
\c@liststop\c@minitems | |
\fi} | |
{\ifnum#2>\c@listtotal | |
\c@liststop\c@listtotal | |
\else | |
\ifnum#2<\@ne | |
\c@liststop\@ne | |
\else | |
\c@liststop#2\relax | |
\fi | |
\fi}} | |
% [<format>][<start>-<stop>]{<plainlist>} | |
\protected\def\blx@imc@indexlist{% | |
\blx@listargs\blx@indexlist} | |
% {<format>}{<start>}{<stop>}{<plainlist>} | |
\def\blx@indexlist#1#2#3#4{% | |
\blx@imc@iflistundef{#4} | |
{} | |
{\blx@getformat\blx@theformat{lid}{#1}{#4}% | |
\ifdefvoid\blx@theformat | |
{} | |
{\begingroup | |
\blx@listsetup{#2}{#3}{#4}% | |
\expandafter\blx@listparser\blx@thedata{}&% | |
\endgroup}}} | |
% {<item1>}{<item2>}{...} | |
\long\def\blx@listparser#1{% | |
\ifblank{#1} | |
{\blx@listbreak} | |
{\ifnum\c@listcount<\c@liststart | |
\else | |
\blx@theformat{#1}% | |
\fi | |
\advance\c@listcount\@ne | |
\ifnum\c@listcount>\c@liststop | |
\expandafter\blx@listbreak | |
\fi | |
\blx@listparser}} | |
\long\def\blx@listbreak#1&{} | |
% <*>{<key>}{<code>} | |
\protected\def\blx@imc@entrydata{% | |
\@ifstar | |
{\blx@xsanitizeafter{\blx@imc@entrydata@i\blx@saveentry}} | |
{\blx@xsanitizeafter{\blx@imc@entrydata@i{}}}} | |
\long\def\blx@imc@entrydata@i#1#2#3{% | |
\blx@getrefcontext{#2}% | |
\blx@ifdata{#2} | |
{\begingroup | |
#1% | |
\blx@resetdata | |
\blx@getdata{#2}% | |
\blx@entrysetcount | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\addtocounter{instcount}\@ne | |
\blx@execute | |
\blx@beglangbib#3\blx@endlangbib | |
\endgroup} | |
{}} | |
\protected\def\blx@imc@entryset#1#2{% | |
\blx@imc@iffieldundef{entrykey} | |
{} | |
{\begingroup | |
\long\def\blx@entryset@precode{#1}% | |
\long\def\blx@entryset@postcode{#2}% | |
\let\finentry\blx@finentry@inset | |
\let\do\blx@entryset | |
\blx@imc@docsvfield{entryset}% | |
\endgroup}} | |
\def\blx@entryset#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@imc@clearlist{pageref}% | |
\blx@getdata{#1}% | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\global\blx@entrysetcounter\@ne | |
\edef\abx@field@entrysetcount{\the\blx@entrysetcounter}% | |
\blx@execute | |
\blx@beglangbib | |
\blx@begunit | |
\blx@anchor | |
\blx@entryset@precode | |
\blx@driver{\blx@imc@thefield{entrytype}}% | |
\blx@entryset@postcode | |
\blx@endunit | |
\blx@endlangbib | |
\endgroup} | |
{}% | |
\let\do\blx@entryset@i} | |
\def\blx@entryset@i#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@resetdata | |
\blx@getdata{#1}% | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\global\advance\blx@entrysetcounter\@ne | |
\edef\abx@field@entrysetcount{\the\blx@entrysetcounter}% | |
\addtocounter{instcount}\@ne | |
\blx@execute | |
\blx@beglangbib | |
\blx@begunit | |
\blx@anchor | |
\blx@entryset@precode | |
\blx@driver{\blx@imc@thefield{entrytype}}% | |
\blx@entryset@postcode | |
\blx@endunit | |
\blx@endlangbib | |
\endgroup} | |
{\blx@nounit}} | |
\blx@regimcs{% | |
\printtext \printfield \printlist \printnames \printfile | |
\indexfield \indexlist \indexnames \entrydata \entryset} | |
%% Localization | |
% {<wrapper>}{<long/short>}{<string>}{<print code>} | |
% <print code> is executed when the bibstring is defined | |
% it differs between the \bib...string versions | |
% in <print code> \blx@tempa should be used as <string> | |
\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}} | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@bibstring}[2][\@firstofone]{% | |
\blx@bibstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@biblstring}[2][\@firstofone]{% | |
\blx@bibstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@bibsstring}[2][\@firstofone]{% | |
\blx@bibstring{#1}{abx@sstr}{#2}} | |
\def\blx@bibstringsimple{% | |
\let\bibstring\blx@imc@bibxstring | |
\let\biblstring\blx@imc@bibxlstring | |
\let\bibsstring\blx@imc@bibxsstring} | |
\def\blx@bibstringnormal{% | |
\let\bibstring\blx@imc@bibstring | |
\let\biblstring\blx@imc@biblstring | |
\let\bibsstring\blx@imc@bibsstring} | |
\protected\def\blx@bibstring#1#2#3{% | |
\blx@met@bibstring{#1}{#2}{#3} | |
{\blx@imc@ifcapital | |
{#1{\MakeCapital{\csuse{#2@\blx@tempa}}}} | |
{#1{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% [<wrapper>]{<string>} | |
\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} | |
{#1{\csuse{#2@\blx@tempa}}% | |
\blx@endunit}} | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@bibcpstring}[2][\@firstofone]{% | |
\blx@bibcpstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@bibcplstring}[2][\@firstofone]{% | |
\blx@bibcpstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@bibcpsstring}[2][\@firstofone]{% | |
\blx@bibcpstring{#1}{abx@sstr}{#2}} | |
\protected\def\blx@bibcpstring#1#2#3{% | |
\blx@met@bibstring{#1}{#2}{#3} | |
{#1{\MakeCapital{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@biblcstring}[2][\@firstofone]{% | |
\blx@biblcstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@biblclstring}[2][\@firstofone]{% | |
\blx@biblcstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@biblcsstring}[2][\@firstofone]{% | |
\blx@biblcstring{#1}{abx@sstr}{#2}} | |
\protected\def\blx@biblcstring#1#2#3{% | |
\blx@met@bibstring{#1}{#2}{#3} | |
{#1{\blx@maketext@lowercase{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% [<wrapper>]{<string>} | |
\newrobustcmd*{\blx@imc@bibucstring}[2][\@firstofone]{% | |
\blx@bibucstring{#1}{\abx@str}{#2}} | |
\newrobustcmd*{\blx@imc@bibuclstring}[2][\@firstofone]{% | |
\blx@bibucstring{#1}{abx@lstr}{#2}} | |
\newrobustcmd*{\blx@imc@bibucsstring}[2][\@firstofone]{% | |
\blx@bibucstring{#1}{abx@sstr}{#2}} | |
\protected\def\blx@bibucstring#1#2#3{% | |
\blx@met@bibstring{#1}{#2}{#3} | |
{#1{\blx@maketext@uppercase{\csuse{#2@\blx@tempa}}}% | |
\blx@endunit}} | |
% {<string>} | |
\def\blx@imc@bibxstring#1{% | |
\blx@bibxstring{\abx@str}{#1}} | |
\def\blx@imc@bibxlstring#1{% | |
\blx@bibxstring{abx@lstr}{#1}} | |
\def\blx@imc@bibxsstring#1{% | |
\blx@bibxstring{abx@sstr}{#1}} | |
\def\blx@bibxstring#1#2{% | |
\ifcsundef{#1@#2} | |
{\protect\blx@warn@nostring{#2}} | |
{\csuse{#1@#2}}} | |
% {<string>}{<true>}{<false>} | |
\def\blx@imc@ifbibstring#1{% | |
\ifcsundef{\abx@str @\detokenize{#1}} | |
{\@secondoftwo} | |
{\@firstoftwo}} | |
\def\blx@imc@ifbibxstring#1{% | |
\blx@xsanitizeafter\ifcsundef{\abx@str @#1} | |
{\@secondoftwo} | |
{\@firstoftwo}} | |
% {<field>}{<true>}{<false>} | |
\def\blx@imc@iffieldbibstring#1{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\ifcsundef{\abx@str @\detokenize\expandafter | |
\expandafter\expandafter{% | |
\csname abx@field@#1\endcsname}} | |
{\@secondoftwo} | |
{\@firstoftwo}}} | |
% {<field>}{<string>}{<true>}{<false>} | |
\def\blx@imc@iffieldplusstringbibstring#1#2{% | |
\blx@imc@iffieldundef{#1} | |
{\@secondoftwo} | |
{\ifcsundef{\abx@str @\detokenize\expandafter | |
\expandafter\expandafter{% | |
\csname abx@field@#1\endcsname}#2} | |
{\@secondoftwo} | |
{\@firstoftwo}}} | |
\blx@regimcs{% | |
\bibstring \biblstring \bibsstring | |
\bibxstring \bibxlstring \bibxsstring | |
\bibncpstring \bibncplstring \bibncpsstring | |
\bibcpstring \bibcplstring \bibcpsstring | |
\biblcstring \biblclstring \biblcsstring | |
\bibucstring \bibuclstring \bibucsstring | |
\ifbibstring \ifbibxstring \iffieldbibstring | |
\iffieldplusstringbibstring} | |
\let\blx@hook@uc\relax | |
\let\blx@hook@lc\relax | |
\AtEndPreamble{% | |
\toggletrue{blx@tempa}% | |
\toggletrue{blx@tempb}% | |
\expandafter\patchcmd\csname MakeUppercase \endcsname | |
{\protected@edef} | |
{\blx@hook@uc\protected@edef} | |
{\togglefalse{blx@tempa}} | |
{}% | |
\expandafter\patchcmd\csname MakeLowercase \endcsname | |
{\protected@edef} | |
{\blx@hook@lc\protected@edef} | |
{\togglefalse{blx@tempb}} | |
{}% | |
\@ifpackageloaded{textcase} | |
{\expandafter\patchcmd\csname MakeUppercase \endcsname | |
{\def\i} | |
{\blx@hook@uc\def\i} | |
{\togglefalse{blx@tempa}} | |
{}% | |
\expandafter\patchcmd\csname MakeLowercase \endcsname | |
{\@uclcnotmath{}} | |
{\@uclcnotmath{\blx@hook@lc}} | |
{\togglefalse{blx@tempb}} | |
{}% | |
\expandafter\patchcmd\csname MakeTextUppercase \endcsname | |
{\def\i} | |
{\blx@hook@uc\def\i} | |
{} | |
{}% | |
\expandafter\patchcmd\csname MakeTextLowercase \endcsname | |
{\@uclcnotmath{}} | |
{\@uclcnotmath{\blx@hook@lc}} | |
{} | |
{}} | |
{}% | |
\iftoggle{blx@tempa}{\blx@err@patch{\string\MakeUppercase}}{}% | |
\iftoggle{blx@tempb}{\blx@err@patch{\string\MakeLowercase}}{}% | |
} | |
\appto\blx@blxinit{% | |
\def\blx@hook@uc{% | |
\def\bibstring{\blx@imc@bibucstring}% | |
\def\biblstring{\blx@imc@bibuclstring}% | |
\def\bibsstring{\blx@imc@bibucsstring}% | |
\def\biblcstring{\blx@imc@bibucstring}% | |
\def\biblclstring{\blx@imc@bibuclstring}% | |
\def\biblcsstring{\blx@imc@bibucsstring}% | |
\def\bibcpstring{\blx@imc@bibucstring}% | |
\def\bibcplstring{\blx@imc@bibuclstring}% | |
\def\bibcpsstring{\blx@imc@bibucsstring}}% | |
\def\blx@hook@lc{% | |
\def\bibstring{\blx@imc@biblcstring}% | |
\def\biblstring{\blx@imc@biblclstring}% | |
\def\bibsstring{\blx@imc@biblcsstring}% | |
\def\bibucstring{\blx@imc@biblcstring}% | |
\def\bibuclstring{\blx@imc@biblclstring}% | |
\def\bibucsstring{\blx@imc@biblcsstring}% | |
\def\bibcpstring{\blx@imc@biblcstring}% | |
\def\bibcplstring{\blx@imc@biblclstring}% | |
\def\bibcpsstring{\blx@imc@biblcsstring}}} | |
\def\abx@dostrings{% | |
\do{bibliography}% | |
\do{references}% | |
\do{shorthands}% | |
\do{editor}% | |
\do{editors}% | |
\do{compiler}% | |
\do{compilers}% | |
\do{redactor}% | |
\do{redactors}% | |
\do{reviser}% | |
\do{revisers}% | |
\do{founder}% | |
\do{founders}% | |
\do{continuator}% | |
\do{continuators}% | |
\do{collaborator}% | |
\do{collaborators}% | |
\do{translator}% | |
\do{translators}% | |
\do{commentator}% | |
\do{commentators}% | |
\do{annotator}% | |
\do{annotators}% | |
\do{commentary}% | |
\do{annotations}% | |
\do{introduction}% | |
\do{foreword}% | |
\do{afterword}% | |
\do{editortr}% | |
\do{editorstr}% | |
\do{editorco}% | |
\do{editorsco}% | |
\do{editoran}% | |
\do{editorsan}% | |
\do{editorin}% | |
\do{editorsin}% | |
\do{editorfo}% | |
\do{editorsfo}% | |
\do{editoraf}% | |
\do{editorsaf}% | |
\do{editortrco}% | |
\do{editorstrco}% | |
\do{editortran}% | |
\do{editorstran}% | |
\do{editortrin}% | |
\do{editorstrin}% | |
\do{editortrfo}% | |
\do{editorstrfo}% | |
\do{editortraf}% | |
\do{editorstraf}% | |
\do{editorcoin}% | |
\do{editorscoin}% | |
\do{editorcofo}% | |
\do{editorscofo}% | |
\do{editorcoaf}% | |
\do{editorscoaf}% | |
\do{editoranin}% | |
\do{editorsanin}% | |
\do{editoranfo}% | |
\do{editorsanfo}% | |
\do{editoranaf}% | |
\do{editorsanaf}% | |
\do{editortrcoin}% | |
\do{editorstrcoin}% | |
\do{editortrcofo}% | |
\do{editorstrcofo}% | |
\do{editortrcoaf}% | |
\do{editorstrcoaf}% | |
\do{editortranin}% | |
\do{editorstranin}% | |
\do{editortranfo}% | |
\do{editorstranfo}% | |
\do{editortranaf}% | |
\do{editorstranaf}% | |
\do{translatorco}% | |
\do{translatorsco}% | |
\do{translatoran}% | |
\do{translatorsan}% | |
\do{translatorin}% | |
\do{translatorsin}% | |
\do{translatorfo}% | |
\do{translatorsfo}% | |
\do{translatoraf}% | |
\do{translatorsaf}% | |
\do{translatorcoin}% | |
\do{translatorscoin}% | |
\do{translatorcofo}% | |
\do{translatorscofo}% | |
\do{translatorcoaf}% | |
\do{translatorscoaf}% | |
\do{translatoranin}% | |
\do{translatorsanin}% | |
\do{translatoranfo}% | |
\do{translatorsanfo}% | |
\do{translatoranaf}% | |
\do{translatorsanaf}% | |
\do{byauthor}% | |
\do{byeditor}% | |
\do{bycompiler}% | |
\do{byredactor}% | |
\do{byreviser}% | |
\do{byreviewer}% | |
\do{byfounder}% | |
\do{bycontinuator}% | |
\do{bycollaborator}% | |
\do{bytranslator}% | |
\do{bycommentator}% | |
\do{byannotator}% | |
\do{withcommentator}% | |
\do{withannotator}% | |
\do{withintroduction}% | |
\do{withforeword}% | |
\do{withafterword}% | |
\do{organizer}% | |
\do{organizers}% | |
\do{byorganizer}% | |
\do{byeditortr}% | |
\do{byeditorco}% | |
\do{byeditoran}% | |
\do{byeditorin}% | |
\do{byeditorfo}% | |
\do{byeditoraf}% | |
\do{byeditortrco}% | |
\do{byeditortran}% | |
\do{byeditortrin}% | |
\do{byeditortrfo}% | |
\do{byeditortraf}% | |
\do{byeditorcoin}% | |
\do{byeditorcofo}% | |
\do{byeditorcoaf}% | |
\do{byeditoranin}% | |
\do{byeditoranfo}% | |
\do{byeditoranaf}% | |
\do{byeditortrcoin}% | |
\do{byeditortrcofo}% | |
\do{byeditortrcoaf}% | |
\do{byeditortranin}% | |
\do{byeditortranfo}% | |
\do{byeditortranaf}% | |
\do{bytranslatorco}% | |
\do{bytranslatoran}% | |
\do{bytranslatorin}% | |
\do{bytranslatorfo}% | |
\do{bytranslatoraf}% | |
\do{bytranslatorcoin}% | |
\do{bytranslatorcofo}% | |
\do{bytranslatorcoaf}% | |
\do{bytranslatoranin}% | |
\do{bytranslatoranfo}% | |
\do{bytranslatoranaf}% | |
\do{and}% | |
\do{andothers}% | |
\do{andmore}% | |
\do{volume}% | |
\do{volumes}% | |
\do{involumes}% | |
\do{part}% | |
\do{jourvol}% | |
\do{jourser}% | |
\do{newseries}% | |
\do{oldseries}% | |
\do{edition}% | |
\do{reprint}% | |
\do{reprintof}% | |
\do{reprintas}% | |
\do{reprintfrom}% | |
\do{reviewof}% | |
\do{translationof}% | |
\do{translationas}% | |
\do{translationfrom}% | |
\do{origpubas}% | |
\do{origpubin}% | |
\do{astitle}% | |
\do{bypublisher}% | |
\do{nodate}% | |
\do{page}% | |
\do{pages}% | |
\do{column}% | |
\do{columns}% | |
\do{line}% | |
\do{lines}% | |
\do{verse}% | |
\do{verses}% | |
\do{section}% | |
\do{sections}% | |
\do{paragraph}% | |
\do{paragraphs}% | |
\do{pagetotal}% | |
\do{pagetotals}% | |
\do{columntotal}% | |
\do{columntotals}% | |
\do{linetotal}% | |
\do{linetotals}% | |
\do{versetotal}% | |
\do{versetotals}% | |
\do{sectiontotal}% | |
\do{sectiontotals}% | |
\do{paragraphtotal}% | |
\do{paragraphtotals}% | |
\do{in}% | |
\do{inseries}% | |
\do{ofseries}% | |
\do{book}% | |
\do{issue}% | |
\do{number}% | |
\do{chapter}% | |
\do{bathesis}% | |
\do{mathesis}% | |
\do{phdthesis}% | |
\do{candthesis}% | |
\do{resreport}% | |
\do{techreport}% | |
\do{software}% | |
\do{datacd}% | |
\do{audiocd}% | |
\do{version}% | |
\do{url}% | |
\do{urlfrom}% | |
\do{urlseen}% | |
\do{file}% | |
\do{inpreparation}% | |
\do{submitted}% | |
\do{inpress}% | |
\do{prepublished}% | |
\do{forthcoming}% | |
\do{library}% | |
\do{abstract}% | |
\do{annotation}% | |
\do{citedas}% | |
\do{seenote}% | |
\do{quotedin}% | |
\do{opcit}% | |
\do{loccit}% | |
\do{ibidem}% | |
\do{idem}% | |
\do{idemsf}% | |
\do{idemsm}% | |
\do{idemsn}% | |
\do{idempf}% | |
\do{idempm}% | |
\do{idempn}% | |
\do{idempp}% | |
\do{confer}% | |
\do{sequens}% | |
\do{sequentes}% | |
\do{passim}% | |
\do{see}% | |
\do{seealso}% | |
\do{backrefpage}% | |
\do{backrefpages}% | |
\do{thiscite}% | |
\do{january}% | |
\do{february}% | |
\do{march}% | |
\do{april}% | |
\do{may}% | |
\do{june}% | |
\do{july}% | |
\do{august}% | |
\do{september}% | |
\do{october}% | |
\do{november}% | |
\do{december}% | |
\do{langamerican}% | |
\do{langbrazilian}% | |
\do{langbulgarian}% | |
\do{langcatalan}% | |
\do{langcroatian}% | |
\do{langczech}% | |
\do{langdanish}% | |
\do{langdutch}% | |
\do{langenglish}% | |
\do{langestonian}% | |
\do{langfinnish}% | |
\do{langfrench}% | |
\do{langgalician}% | |
\do{langgerman}% | |
\do{langgreek}% | |
\do{langhungarian}% | |
\do{langitalian}% | |
\do{langjapanese}% | |
\do{langlatin}% | |
\do{langlatvian}% | |
\do{langlithuanian}% | |
\do{langnorwegian}% | |
\do{langpolish}% | |
\do{langportuguese}% | |
\do{langserbian}% | |
\do{langrussian}% | |
\do{langslovak}% | |
\do{langslovene}% | |
\do{langspanish}% | |
\do{langswedish}% | |
\do{langturkish}% | |
\do{langukrainian}% | |
\do{fromamerican}% | |
\do{frombrazilian}% | |
\do{frombulgarian}% | |
\do{fromcatalan}% | |
\do{fromcroatian}% | |
\do{fromczech}% | |
\do{fromdanish}% | |
\do{fromdutch}% | |
\do{fromenglish}% | |
\do{fromestonian}% | |
\do{fromfinnish}% | |
\do{fromfrench}% | |
\do{fromgalician}% | |
\do{fromgerman}% | |
\do{fromgreek}% | |
\do{fromhungarian}% | |
\do{fromitalian}% | |
\do{fromjapanese}% | |
\do{fromlatin}% | |
\do{fromlithuanian}% | |
\do{fromlatvian}% | |
\do{fromnorwegian}% | |
\do{frompolish}% | |
\do{fromportuguese}% | |
\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{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: <key> = {<string>}, | |
% in *.lbx: <key> = {{<longstring>}{<abbrevstring>}}, | |
\def\do#1{\blx@kv@defkey{blx@lbx}{#1}{\blx@defstring{#1}{##1}}} | |
\abx@dostrings | |
% in *.cbx/bbx/tex: (implicit) | |
% in *.lbx: inherit = {<language>}, | |
\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}} | |
% {<language>} | |
\def\blx@lbxcheck#1{% | |
\ifcsdef{blx@lng@#1} | |
{\expandafter\expandafter\expandafter\IfFileExists | |
\expandafter\expandafter\expandafter{% | |
\csname blx@lng@#1\endcsname.lbx} | |
{} | |
{\blx@err@nolang{#1}}} | |
{\IfFileExists{#1.lbx} | |
{} | |
{\blx@err@nolang{#1}}}} | |
% {<language>}{<definitions>} | |
\newrobustcmd*{\DefineBibliographyExtras}[2]{% | |
\blx@lbxcheck{#1}% | |
\csgappto{blx@hook@extras@#1}{% | |
\blx@defbibextras{#1}{#2}}} | |
\@onlypreamble\DefineBibliographyExtras | |
\newrobustcmd*{\UndefineBibliographyExtras}[2]{% | |
\blx@lbxcheck{#1}% | |
\csgappto{blx@hook@noextras@#1}{% | |
\blx@undefbibextras{#1}{#2}}} | |
\@onlypreamble\UndefineBibliographyExtras | |
\def\blx@defbibextras#1{\csgappto{abx@extras@#1}} | |
\def\blx@undefbibextras#1{\csgappto{abx@noextras@#1}} | |
% {<language>}{<language>} | |
\def\blx@letbibextras#1#2{% | |
\blx@lbxinput@extras{#2}{}{\blx@err@nolang{#2}}% | |
\global\csletcs{abx@extras@#1}{abx@extras@#2} | |
\global\csletcs{abx@noextras@#1}{abx@noextras@#2}}% | |
% {<language>}{<strings>} | |
\newrobustcmd*{\DefineBibliographyStrings}[2]{% | |
\blx@lbxcheck{#1}% | |
\csgappto{blx@hook@strings@#1}{% | |
\begingroup | |
\let\blx@defstring\blx@cfg@defstring | |
\blx@defbibstrings{#1}{#2}% | |
\endgroup}} | |
\@onlypreamble\DefineBibliographyStrings | |
\def\blx@defbibstrings#1#2{% | |
\def\do##1{\csundef{abx@lstr@##1}\csundef{abx@sstr@##1}}% | |
\abx@dostrings | |
\csuse{abx@strings@#1}% | |
\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}} | |
% {<language>}{<language>} | |
\def\blx@letbibstrings#1#2{% | |
\blx@lbxinput@strings{#2}{}{\blx@err@nolang{#2}}% | |
\global\csletcs{abx@strings@#1}{abx@strings@#2}}% | |
% {<language>}{<exceptions>} | |
\newrobustcmd*{\DefineHyphenationExceptions}[2]{% | |
\blx@ifhyphenationundef{#1} | |
{\blx@warn@nohyph{#1}} | |
{}% | |
\csgappto{blx@hook@hyph@#1}{\blx@hyphexcept{#1}{#2}}} | |
\@onlypreamble\DefineHyphenationExceptions | |
\def\blx@hyphexcept#1#2{% | |
\blx@ifhyphenationundef{#1} | |
{\blx@warn@nohyph{#1}} | |
{\begingroup | |
\language\csname l@#1\endcsname\relax | |
\hyphenation{#2}% | |
\endgroup}} | |
% {<mapping suffix>} | |
\newrobustcmd*{\DeclareLanguageMappingSuffix}[1]{% | |
\gdef\blx@lng@suff{#1}} | |
\@onlypreamble\DeclareLanguageMappingSuffix | |
\let\blx@lng@suff\@empty | |
% {<language>}{<mapping>} | |
\newrobustcmd*{\DeclareLanguageMapping}[2]{% | |
\csgdef{blx@lng@#1}{#2}% | |
\csgdef{blx@lng@explicit@#1}{#2}} | |
\@onlypreamble\DeclareLanguageMapping | |
% to avoid copying, these commands simply redefine the input handlers and | |
% process and postprocess code | |
% {<language>}{<success>}{<failure>} | |
\def\blx@lbxinput#1{% | |
\csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@once}% | |
\csletcs{blx@lbx@input@process}{blx@lbx@input@process@all}% | |
\csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@all}% | |
\blx@lbxinput@i{#1}} | |
\def\blx@lbxinput@strings#1{% | |
\csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@simple}% | |
\csletcs{blx@lbx@input@process}{blx@lbx@input@process@strings}% | |
\csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@strings}% | |
\blx@lbxinput@i{#1}} | |
\def\blx@lbxinput@extras#1{% | |
\csletcs{blx@lbx@input@handler}{blx@lbx@input@handler@simple}% | |
\csletcs{blx@lbx@input@process}{blx@lbx@input@process@extras}% | |
\csletcs{blx@lbx@input@postprocess}{blx@lbx@input@postprocess@extras}% | |
\blx@lbxinput@i{#1}} | |
\def\blx@lbxinput@i#1{% | |
\ifcsundef{blx@nolbxrecurse@#1} | |
{\ifcsdef{blx@lng@explicit@#1} | |
{\global\csletcs{blx@lng@#1}{blx@lng@explicit@#1}} | |
{\ifdefempty\blx@lng@suff | |
{} | |
{\csgdef{blx@lng@#1}{#1\blx@lng@suff}}}} | |
{}% | |
\blx@lbxinput@ii{#1}} | |
\def\blx@lbxinput@ii#1{% | |
\ifcsdef{blx@lng@#1} | |
{\expandafter\expandafter\expandafter\blx@lbxinput@iii | |
\expandafter\expandafter\expandafter{% | |
\csname blx@lng@#1\endcsname}{#1}} | |
{\blx@lbxinput@iv{#1}{#1}{language '#1'}}} | |
% {<mapping>}{<language>} | |
\def\blx@lbxinput@iii#1#2{% | |
\global\csundef{blx@lng@#2}% | |
\IfFileExists{#1.lbx} | |
{\blx@lbxinput@iv{#2}{#1}{language '#2' -> '#1'}} | |
{\ifcsdef{blx@suffmaptried@#2} | |
{} | |
{\blx@warning@noline{% | |
File '#1.lbx' not found!\MessageBreak | |
Ignoring mapping '#2' -> '#1'}% | |
\global\cslet{blx@suffmaptried@#2}\@empty}% | |
\blx@lbxinput@iv{#2}{#2}{language '#2'}}} | |
% .lbx files must be read with one of the two following commands, | |
% do not use \blx@inputonce. Only the commands here make sure that the file | |
% is read as many times as necessary. | |
% blx@file@lbx@simple@#1 only blocks the file being added to the file list | |
% blx@file@lbx@once@#1 blocks a file from being loaded again by the input-once | |
% routine | |
% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>} | |
\protected\long\def\blx@lbx@input@handler@simple#1#2#3#4#5#6{% | |
\blx@info@noline{Trying to load #2..}% | |
\IfFileExists{#1} | |
{\blx@info@noline{... file '#1' found}% | |
\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}} | |
% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>} | |
\protected\long\def\blx@lbx@input@handler@once#1#2#3#4#5#6{% | |
\ifcsundef{blx@file@lbx@once@#1} | |
{\blx@info@noline{Trying to load #2..}% | |
\IfFileExists{#1} | |
{\blx@info@noline{... file '#1' found}% | |
\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}} | |
% {<language>}{<lbxfile>}{<message>} | |
\def\blx@lbxinput@iv#1#2#3{% | |
\begingroup | |
\blx@lbx@input@handler{#2.lbx}{#3} | |
{\let\InheritBibliographyStrings\@gobble | |
\let\DeclareBibliographyStrings\@gobble | |
\let\InheritBibliographyExtras\@gobble | |
\let\DeclareBibliographyExtras\@gobble | |
\let\UndeclareBibliographyExtras\@gobble | |
\blx@lbx@input@process{#1}% | |
\begingroup | |
\cslet{blx@nolbxrecurse@#1}\@empty | |
\blx@saneccodes | |
\makeatletter} | |
{\endgroup | |
\blx@lbx@input@postprocess{#1}} | |
{\aftergroup\@firstoftwo} | |
{\aftergroup\@secondoftwo}% | |
\endgroup} | |
% {<language>} | |
\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 | |
% {<field base name>} | |
\newrobustcmd*{\mkdaterangeshort}{% | |
\mkdaterangefull{short}} | |
\newrobustcmd*{\mkdaterangelong}{% | |
\mkdaterangefull{long}} | |
\newrobustcmd*{\mkdaterangeterse}{% | |
\mkdaterangetrunc{short}} | |
\newrobustcmd*{\mkdaterangecomp}{% | |
\mkdaterangetrunc{long}} | |
\newrobustcmd*{\mkdaterangeshortextra}{% | |
\mkdaterangefullextra{short}} | |
\newrobustcmd*{\mkdaterangelongextra}{% | |
\mkdaterangefullextra{long}} | |
\newrobustcmd*{\mkdaterangeterseextra}{% | |
\mkdaterangetruncextra{short}} | |
\newrobustcmd*{\mkdaterangecompextra}{% | |
\mkdaterangetruncextra{long}} | |
% calls to \blx@metadateinfo should be grouped to avoid name clashes | |
\def\blx@metadateinfo#1{% | |
\letcs\ifdateera{if#1dateera}% | |
\letcs\ifenddateera{if#1enddateera}% | |
\letcs\ifdatecirca{if#1datecirca}% | |
\letcs\ifenddatecirca{if#1enddatecirca}% | |
\letcs\ifdatejulian{if#1datejulian}% | |
\letcs\ifenddatejulian{if#1enddatejulian}% | |
\letcs\ifdateuncertain{if#1dateuncertain}% | |
\letcs\ifenddateuncertain{if#1enddateuncertain}% | |
\letcs\ifdateunknown{if#1dateunknown}% | |
\letcs\ifenddateunknown{if#1enddateunknown}} | |
\expandafter\newrobustcmd\expandafter*\csname mktimerange24h\endcsname{% | |
\mktimerange{24h}} | |
\expandafter\newrobustcmd\expandafter*\csname mktimerange12h\endcsname{% | |
\mktimerange{12h}} | |
\expandafter\newrobustcmd\expandafter*\csname mktimerange24hcomp\endcsname[1]{% | |
\iffieldundef{#1hour} | |
{} | |
{\ifboolexpr{test {\iffieldundef{#1endhour}} | |
or | |
test {\iffieldequalstr{#1endhour}{}}} | |
{\mktimerange{24h}{#1}} | |
{\iffieldsequal{#1hour}{#1endhour} | |
% 14:xx:xx 14:xx:xx | |
{\iffieldsequal{#1minute}{#1endminute} | |
% 14:13:xx 14:13:xx | |
{\toggletrue{blx@seconds}% | |
\printtext[{#1time}]{% | |
\csuse{mkbibtime24h}{#1hour}{#1minute}{#1second}{}% | |
\bibtimerangesep | |
\csuse{mkbibtime24h}{}{}{#1endsecond}{}}} | |
% 14:13:xx 14:14:xx | |
{\toggletrue{blx@seconds}% | |
\printtext[{#1time}]{\csuse{mkbibtime24h}{#1hour}{#1minute}{}{}% | |
\bibtimerangesep | |
\csuse{mkbibtime24h}{}{#1endminute}{}{}}}} | |
% 14:xx:xx 15:xx:xx | |
{\mktimerange{24h}{#1}}}}} | |
% {<24h|24hcomp|12h>}{<datetype>} | |
\newrobustcmd*{\mktimerange}[2]{% | |
\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} | |
% {<datetype>}{''|end} | |
\newrobustcmd*{\blx@timepre}[2]{% | |
\iftoggle{blx@timezones}{} | |
{\blx@imc@clearfield{#1#2timezone}}% | |
\iftoggle{blx@seconds}{} | |
{\blx@imc@clearfield{#1#2second}}} | |
\newcommand*{\blx@if@printtime}[2]{% | |
\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}} | |
% {<datetype>}{'' | 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}}} | |
{}} | |
% {<short|long>}{<datetype>} | |
\newrobustcmd*{\mkdaterangefull}[2]{% | |
\begingroup | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{\blx@nounit} | |
{\printtext[{#2date}]{% | |
\datecircaprint | |
% Such a season component can only come from an ISO8601 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season}}% | |
\dateuncertainprint | |
\dateeraprint{#2year}% | |
\iffieldundef{#2endyear} | |
{} | |
{\iffieldequalstr{#2endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2endseason} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{end}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}}% | |
\endgroup} | |
\newrobustcmd*{\mkdaterangefullextra}[2]{% | |
\begingroup | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{\blx@nounit} | |
{\printtext[{#2date}]{% | |
\datecircaprint | |
% Such a season component can only come from an ISO8601 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season}}% | |
\dateuncertainprint | |
\dateeraprint{#2year}% | |
\iffieldundef{#2endyear} | |
{\printfield{extradate}} | |
{\iffieldequalstr{#2endyear}{} | |
{\printfield{extradate}% | |
\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2endseason} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}% | |
% Optionally print the time after the date | |
\blx@printtime{#2}{end}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}% | |
\printfield{extradate}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}% | |
\endgroup} | |
\newrobustcmd*{\mkdaterangetrunc}[2]{% | |
\blx@if@printanytimes{#2} | |
{\mkdaterangefull{#1}{#2}} | |
{\mkdaterangetrunc@i{#1}{#2}}} | |
\newrobustcmd*{\mkdaterangetrunc@i}[2]{% | |
\begingroup | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{\blx@nounit} | |
{\printtext[{#2date}]{% | |
\datecircaprint | |
% Such a season component can only come from an ISO8601 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\ifdateyearsequal{#2}{#2end} | |
{\iffieldsequal{#2month}{#2endmonth} | |
{\csuse{mkbibdate#1}{}{}{#2day}} | |
{\csuse{mkbibdate#1}{}{#2month}{#2day}}} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}} | |
{\ifdateyearsequal{#2}{#2end} | |
{\csuse{mkbibseasondate#1}{}{#2season}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season}% | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}}% | |
\dateuncertainprint | |
\iffieldundef{#2endyear} | |
{} | |
{\iffieldequalstr{#2endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2endseason} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}}% | |
\endgroup} | |
\newrobustcmd*{\mkdaterangetruncextra}[2]{% | |
\blx@if@printanytimes{#2} | |
{\mkdaterangefullextra{#1}{#2}} | |
{\mkdaterangetruncextra@i{#1}{#2}}} | |
\newrobustcmd*{\mkdaterangetruncextra@i}[2]{% | |
\begingroup | |
\blx@metadateinfo{#2}% | |
\iffieldundef{#2year} | |
{\blx@nounit} | |
{\printtext[{#2date}]{% | |
\datecircaprint | |
% Such a season component can only come from an ISO8601 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2season} | |
{\ifdateyearsequal{#2}{#2end} | |
{\iffieldsequal{#2month}{#2endmonth} | |
{\csuse{mkbibdate#1}{}{}{#2day}} | |
{\csuse{mkbibdate#1}{}{#2month}{#2day}}} | |
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}% | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}} | |
{\ifdateyearsequal{#2}{#2end} | |
{\csuse{mkbibseasondate#1}{}{#2season}} | |
{\csuse{mkbibseasondate#1}{#2year}{#2season}% | |
\iffieldsequal{#2dateera}{#2enddateera}{} | |
{\dateeraprint{#2year}}}}% | |
\dateuncertainprint | |
\iffieldundef{#2endyear} | |
{\printfield{extradate}} | |
{\iffieldequalstr{#2endyear}{} | |
{\printfield{extradate}% | |
\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#2endseason} | |
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}} | |
{\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}% | |
\printfield{extradate}% | |
\enddateuncertainprint | |
\dateeraprint{#2endyear}}}}% | |
\endgroup} | |
\newrobustcmd*{\mkdaterangeyear}[1]{% | |
\begingroup | |
\blx@imc@clearfield{#1season}% | |
\blx@imc@clearfield{#1month}% | |
\blx@imc@clearfield{#1day}% | |
\blx@imc@clearfield{#1hour}% | |
\blx@imc@clearfield{#1minute}% | |
\blx@imc@clearfield{#1second}% | |
\blx@imc@clearfield{#1timezone}% | |
\blx@imc@clearfield{#1endseason}% | |
\blx@imc@clearfield{#1endmonth}% | |
\blx@imc@clearfield{#1endday}% | |
\blx@imc@clearfield{#1endhour}% | |
\blx@imc@clearfield{#1endminute}% | |
\blx@imc@clearfield{#1endsecond}% | |
\blx@imc@clearfield{#1endtimezone}% | |
\ifdateyearsequal{#1}{#1end} | |
{\blx@imc@clearfield{#1endyear}} | |
{}% | |
\mkdaterangefull{short}{#1}% | |
\endgroup} | |
% {<datetype>} | |
\newrobustcmd*{\mkdaterangeymd}[1]{% | |
\begingroup | |
\blx@metadateinfo{#1}% | |
\iffieldundef{#1year} | |
{\blx@nounit} | |
{\printtext[{#1date}]{% | |
\datecircaprint | |
% Such a season component can only come from an ISO8601 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#1season} | |
{\blx@ymddate{#1}{}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{}} | |
{\csuse{mkbibseasondateshort}{#1year}{#1season}}% | |
\dateuncertainprint | |
\dateeraprint{#1year}% | |
\iffieldundef{#1endyear} | |
{} | |
{\iffieldequalstr{#1endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#1season} | |
{\blx@ymddate{#1}{end}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{end}} | |
{\csuse{mkbibseasondateshort}{#1endyear}{#1endseason}}% | |
\enddateuncertainprint | |
\dateeraprint{#1endyear}}}}}% | |
\endgroup} | |
% {<datetype>} | |
\newrobustcmd*{\mkdaterangeymdextra}[1]{% | |
\begingroup | |
\blx@metadateinfo{#1}% | |
\iffieldundef{#1year} | |
{\blx@nounit} | |
{\printtext[{#1date}]{% | |
\datecircaprint | |
% Such a season component can only come from an ISO8601 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#1season} | |
{\blx@ymddate[extradate]{#1}{}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{}} | |
{\csuse{mkbibseasondateshort}{#1year}{#1season}}% | |
\dateuncertainprint | |
\dateeraprint{#1year}% | |
\iffieldundef{#1endyear} | |
{} | |
{\iffieldequalstr{#1endyear}{} | |
{\mbox{\bibdaterangesep}} | |
{\bibdaterangesep | |
\enddatecircaprint | |
\iffieldundef{#1season} | |
{\blx@ymddate{#1}{end}% | |
% Optionally print the time after the date | |
\blx@printtime{#1}{end}} | |
{\csuse{mkbibseasondateshort}{#1endyear}{#1endseason}}}% | |
\enddateuncertainprint | |
\dateeraprint{#1endyear}}}}% | |
\endgroup} | |
% [extradate]{<datetype>}{''|end} | |
\newrobustcmd*{\blx@ymddate}[3][]{% | |
\dateeraprintpre{#2#3year}% | |
\mkyearzeros{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}% | |
\iffieldundef{#2#3month}{}{\bibdatesep\mkmonthzeros{\thefield{#2#3month}}}% | |
\iffieldundef{#2#3day}{}{\bibdatesep\mkdayzeros{\thefield{#2#3day}}}} | |
\newrobustcmd*{\mkdaterangeyearextra}[1]{% | |
\begingroup | |
\blx@imc@clearfield{#1season}% | |
\blx@imc@clearfield{#1month}% | |
\blx@imc@clearfield{#1day}% | |
\blx@imc@clearfield{#1hour}% | |
\blx@imc@clearfield{#1minute}% | |
\blx@imc@clearfield{#1second}% | |
\blx@imc@clearfield{#1timezone}% | |
\blx@imc@clearfield{#1endseason}% | |
\blx@imc@clearfield{#1endmonth}% | |
\blx@imc@clearfield{#1endday}% | |
\blx@imc@clearfield{#1endhour}% | |
\blx@imc@clearfield{#1endminute}% | |
\blx@imc@clearfield{#1endsecond}% | |
\blx@imc@clearfield{#1endtimezone}% | |
\ifdateyearsequal{#1}{#1end} | |
{\blx@imc@clearfield{#1endyear}} | |
{}% | |
\mkdaterangefullextra{short}{#1}% | |
\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]{<datetype>}{''|end} | |
\newrobustcmd*{\blx@isodate}[3][]{% | |
\dateeraprintpre{#2#3year}% | |
\blx@imc@forcezerosy{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}% | |
% Such a season component can only come from an ISO8601 season which replaces | |
% a normal month so if it exists, we know that a normal date print is ruled out | |
\iffieldundef{#2#3season} | |
{\iffieldundef{#2#3month}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3month}}}% | |
\iffieldundef{#2#3day}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3day}}}} | |
{\hyphen\blx@seasonmap{\thefield{#2#3season}}}} | |
\def\blx@seasonmap#1{% | |
\blx@xifstrequal{#1}{spring}{21} | |
{\blx@xifstrequal{#1}{summer}{22} | |
{\blx@xifstrequal{#1}{autumn}{23} | |
{\blx@xifstrequal{#1}{winter}{24}{}}}}} | |
\newrobustcmd*{\blx@isotime}[2]{% | |
\blx@imc@forcezerosmdt{\thefield{#1#2hour}}% | |
:\blx@imc@forcezerosmdt{\thefield{#1#2minute}}% | |
:\blx@imc@forcezerosmdt{\thefield{#1#2second}}% | |
\iftoggle{blx@timezones} | |
{\mkbibtimezone{\thefield{#1#2timezone}}} | |
{}} | |
% some sane defaults for bibliography extras | |
% many of these should be redefined in the .lbx files | |
% all .lbx files should have date and time handling, so the fallback values | |
% issue a warning to make people aware of the deficiency in their file | |
% \mkbibordinal should also only be used if it is defined, so it warns as well | |
% times | |
\newrobustcmd*{\bibtimesep}{:} | |
\newrobustcmd*{\bibtimerangesep}{\textendash} | |
\newrobustcmd*{\bibutctimezone}{Z} | |
\newrobustcmd*{\bibtimezonesep}{} | |
\newrobustcmd*{\bibtzminsep}{\bibtimesep} | |
% dates | |
\newrobustcmd*{\bibdateuncertain}{?} | |
% \textminus is only guaranteed for non-PDFTeX | |
\newrobustcmd*{\bibdateeraprefix}{\ifdef\textminus\textminus\textendash} | |
\newrobustcmd*{\bibdateeraendprefix}{\,\bibdateeraprefix} | |
\newrobustcmd*{\bibdatesep}{\hyphen} | |
\newrobustcmd*{\bibdaterangesep}{\bibrangedash} | |
% date+times | |
\newrobustcmd*{\bibdatetimesep}{\space} | |
% ranges | |
\newrobustcmd*{\bibrangedash}{\textendash} | |
\newrobustcmd*{\bibrangessep}{,\space} | |
% formatters | |
\newrobustcmd*{\mkbibtimezone}[1]{\blx@xifstrequal{#1}{Z}{\bibutctimezone}{#1}} | |
% you should never end up needing the next few definitions | |
% but it is safer to do something than just swallow the input | |
\newrobustcmd*{\mkbibdatelong}[3]{% | |
\blx@warning@noline{% | |
Using fallback definition for \string\mkbibdatelong.\MessageBreak | |
The command should be defined in the .lbx file.\MessageBreak | |
If you see this message, the .lbx file could not be\MessageBreak | |
loaded, is faulty or does not contain a definition\MessageBreak | |
for \string\mkbibdatelong | |
}% | |
\iffieldundef{#3} | |
{} | |
{\mkbibordinal{\thefield{#3}}% | |
\iffieldundef{#2}{}{\nobreakspace}}% | |
\iffieldundef{#2} | |
{} | |
{\mkbibmonth{\thefield{#2}}% | |
\iffieldundef{#1}{}{\space}}% | |
\iffieldbibstring{#1} | |
{\bibstring{\thefield{#1}}} | |
{\dateeraprintpre{#1}\stripzeros{\thefield{#1}}}} | |
\newrobustcmd*{\mkbibdateshort}[3]{% | |
\blx@warning@noline{% | |
Using fallback definition for \string\mkbibdateshort.\MessageBreak | |
The command should be defined in the .lbx file.\MessageBreak | |
If you see this message, the .lbx file could not be\MessageBreak | |
loaded, is faulty or does not contain a definition\MessageBreak | |
for \string\mkbibdateshort | |
}% | |
\iffieldundef{#3} | |
{} | |
{\mkdayzeros{\thefield{#3}}% | |
\iffieldundef{#2}{}{/}}% | |
\iffieldundef{#2} | |
{} | |
{\mkmonthzeros{\thefield{#2}}% | |
\iffieldundef{#1}{}{/}}% | |
\iffieldbibstring{#1} | |
{\bibstring{\thefield{#1}}} | |
{\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}} | |
\expandafter\newrobustcmd\expandafter*\csname mkbibtime24h\endcsname[4]{% | |
\blx@warning@noline{% | |
Using fallback definition for | |
\expandafter\string\csname mkbibtime24h\endcsname.\MessageBreak | |
The command should be defined in the .lbx file.\MessageBreak | |
If you see this message, the .lbx file could not be\MessageBreak | |
loaded, is faulty or does not contain a definition\MessageBreak | |
for \expandafter\string\csname mkbibtime24h\endcsname | |
}% | |
\iffieldundef{#1} | |
{} | |
{\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*{\mkbibseasondateshort}[2]{% | |
\blx@warning@noline{% | |
Using fallback definition for \string\mkbibseasondateshort.\MessageBreak | |
The command should be defined in the .lbx file.\MessageBreak | |
If you see this message, the .lbx file could not be\MessageBreak | |
loaded, is faulty or does not contain a definition\MessageBreak | |
for \string\mkbibseasondateshort | |
}% | |
\mkbibseason{\thefield{#2}}% | |
\iffieldundef{#1}{}{\space}% | |
\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}} | |
\newrobustcmd*{\mkbibseasondatelong}[2]{% | |
\blx@warning@noline{% | |
Using fallback definition for \string\mkbibseasondatelong.\MessageBreak | |
The command should be defined in the .lbx file.\MessageBreak | |
If you see this message, the .lbx file could not be\MessageBreak | |
loaded, is faulty or does not contain a definition\MessageBreak | |
for \string\mkbibseasondatelong | |
}% | |
\mkbibseason{\thefield{#2}}% | |
\iffieldundef{#1}{}{\space}% | |
\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}} | |
\newrobustcmd*{\bibdatedash}{\bibrangedash} | |
\newrobustcmd*{\finalandcomma}{} | |
\newrobustcmd*{\finalandsemicolon}{} | |
\newrobustcmd*{\mkbibordinal}[1]{% | |
\blx@warning@noline{% | |
Using fallback definition for \string\mkbibordinal.\MessageBreak | |
The command should be defined in the .lbx file.\MessageBreak | |
If you see this message, the .lbx file could not be\MessageBreak | |
loaded, is faulty or does not contain a definition\MessageBreak | |
for \string\mkbibordinal | |
}% | |
#1% | |
} | |
\newrobustcmd*{\mkbibmascord}{\mkbibordinal} | |
\newrobustcmd*{\mkbibfemord}{\mkbibordinal} | |
\newrobustcmd*{\mkbibneutord}{\mkbibordinal} | |
% the following is usually not redefined in an .lbx | |
\newrobustcmd*{\mkbibseason}[1]{\abx@bibseason{#1}} | |
\newrobustcmd*{\mkbibmonth}[1]{% | |
\ifcase0#1\relax | |
\blx@warning@entry{Month out of range or not an integer}% | |
\or\abx@bibmonth{january}% | |
\or\abx@bibmonth{february}% | |
\or\abx@bibmonth{march}% | |
\or\abx@bibmonth{april}% | |
\or\abx@bibmonth{may}% | |
\or\abx@bibmonth{june}% | |
\or\abx@bibmonth{july}% | |
\or\abx@bibmonth{august}% | |
\or\abx@bibmonth{september}% | |
\or\abx@bibmonth{october}% | |
\or\abx@bibmonth{november}% | |
\or\abx@bibmonth{december}% | |
\else | |
\blx@warning@entry{Month out of range}#1% | |
\fi} | |
% strip leading zeros and prepend zero for month/day/timeparts | |
% Allow for non numeric labelyear values | |
\protected\def\blx@imc@forcezerosmdt#1{% | |
\protected@edef\blx@tempa{#1}% | |
\expandafter\blx@imc@forcezerosmdt@i\expandafter{\blx@tempa}} | |
\protected\def\blx@imc@forcezerosmdt@i#1{% | |
\notblank{#1} | |
{\blx@imc@ifinteger{#1} | |
{\ifnumless{#1}{10} | |
{0\the\numexpr(#1)\relax} | |
{#1}} | |
{#1}} | |
{#1}} | |
% strip leading zeros and prepend zero(s) for year | |
% Allow for non numeric labelyear values | |
\protected\def\blx@imc@forcezerosy#1{% | |
\protected@edef\blx@tempa{#1}% | |
\expandafter\blx@imc@forcezerosy@i\expandafter{\blx@tempa}} | |
\protected\def\blx@imc@forcezerosy@i#1{% | |
\notblank{#1} | |
{\blx@imc@ifinteger{#1} | |
{\ifnumless{#1}{10}% 1-digit year | |
{000\the\numexpr(#1)\relax} | |
{\ifnumless{#1}{100}% 2-digit year | |
{00\the\numexpr(#1)\relax} | |
{\ifnumless{#1}{1000}% 3-digit year | |
{0\the\numexpr(#1)\relax} | |
{#1}}}} | |
{#1}} | |
{#1}}% | |
\let\blx@imc@mkyearzeros\blx@imc@forcezerosy | |
\let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt | |
\let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt | |
\protected\def\blx@imc@stripzeros#1{% | |
\begingroup | |
\setbox\@tempboxa=\hbox\bgroup | |
\aftergroup\endgroup | |
\abx@hook@xsanitize | |
\if0#1\relax | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\@tempcnta#1\relax | |
\expandafter\egroup | |
\number\@tempcnta | |
\@tempcnta#1\relax} | |
{\egroup#1}} | |
\let\blx@imc@printlabeldate\@empty | |
\let\blx@imc@printlabeltime\@empty | |
\let\blx@imc@printlabeldateextra\@empty | |
\blx@regimcs{\printlabeldate \printlabeltime \printlabeldateextra | |
\stripzeros \forcezerosy \forcezerosmdt | |
\mkyearzeros \mkmonthzeros \mkdayzeros \mktimezeros} | |
% User macro for retrieving currrent language | |
\def\currentlang{\blx@languagename} | |
% 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... | |
% {<language>}{<strings>} | |
\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 | |
\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}% | |
% 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 | |
% Need to override all entries, regardless of if there is a | |
% langid if language=<language> option is given | |
\ifboolexpr { test {\ifdef\abx@field@langid } | |
or | |
test {\ifdef\blx@forcelanguagename} } | |
% override local langid if we forced it with | |
% language=<language> option | |
{\ifdef\blx@forcelanguagename | |
{\let\abx@field@langid\blx@forcelanguagename} | |
{}% | |
\let\blx@languagename\abx@field@langid% track global language | |
\blx@ifhyphenationundef{\abx@field@langid} | |
{\blx@warn@nohyph{\abx@field@langid}} | |
{\blx@hook@initlang | |
\def\blx@endlang{% | |
\blx@hook@endlang | |
\csname end\blx@thelangenv\endcsname | |
\endgroup}% | |
\iftoggle{blx@autolangbib} | |
{\let\blx@endlangbib\blx@endlang} | |
{}% | |
\iftoggle{blx@autolangcite} | |
{\let\blx@endlangcite\blx@endlang} | |
{}% | |
\csname\blx@thelangenv\expandafter\endcsname | |
\expandafter{\abx@field@langid}}} | |
{}}} | |
{}% | |
\def\blx@imc@mainlang{% | |
\expandafter\selectlanguage\expandafter{\blx@main@language}}% | |
\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}% | |
\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 | |
% Need to override all entries, regardless of if there is a | |
% langid if language=<language> option is given | |
\ifboolexpr { test {\ifdef\abx@field@langid } | |
or | |
test {\ifdef\blx@forcelanguagename} } | |
% override local langid if we forced it with | |
% language=<language> option | |
{\ifdef\blx@forcelanguagename | |
{\let\abx@field@langid\blx@forcelanguagename} | |
{}% | |
\let\blx@languagename\abx@field@langid% track global language | |
\blx@ifhyphenationundef{\abx@field@langid} | |
{\blx@warn@nohyph{\abx@field@langid}} | |
{\blx@hook@initlang | |
\def\blx@endlang{% | |
\blx@hook@endlang | |
% Polyglossia language envs are \<lang>[] | |
\ifcsstring{blx@thelangenv}{langname} | |
{\csname end\abx@field@langid\endcsname} | |
{\csname end\blx@thelangenv\endcsname}% | |
\endgroup}% | |
\iftoggle{blx@autolangbib} | |
{\let\blx@endlangbib\blx@endlang} | |
{}% | |
\iftoggle{blx@autolangcite} | |
{\let\blx@endlangcite\blx@endlang} | |
{}% | |
\ifcsstring{blx@thelangenv}{langname} | |
{\ifdef\abx@field@langidopts | |
{\csname\abx@field@langid\expandafter\endcsname | |
\expandafter[\abx@field@langidopts]} | |
{\csname\abx@field@langid\endcsname}} | |
{\csname\blx@thelangenv\expandafter\endcsname | |
\expandafter{\abx@field@langid}}% | |
\blx@beglang@spacefactors}} | |
{}}} | |
{}% | |
\def\blx@imc@mainlang{\select@language{\blx@main@language}}% | |
\expandafter\blx@langsetup@from@pkglist\expandafter{\blx@main@language}} | |
\def\blx@mknoautolang{% | |
\blx@lbxinput{\blx@languagename} | |
{} | |
{\blx@err@nolang{\blx@languagename}}} | |
\blx@regimcs{\mainlang} | |
\newrobustcmd*{\DeclareRedundantLanguages}[2]{% | |
\begingroup | |
\ifblank{#2} | |
{\def\do##1{% | |
\global\csundef{blx@rlm@##1}% | |
\global\csundef{blx@rlm@lang##1}}} | |
{\def\do##1{% | |
\csxdef{blx@rlm@##1}{#2}% | |
\csxdef{blx@rlm@lang##1}{#2}}}% | |
\docsvlist{#1}% | |
\endgroup} | |
\def\blx@clearlang{% | |
\iftoggle{blx@clearlang} | |
{\iflistundef{language} | |
{} | |
{\ifnumgreater{\value{language}}{1} | |
{} | |
{\expandafter\blx@clearlang@i\abx@list@language}}} | |
{}} | |
\def\blx@clearlang@i#1{% | |
\ifcsdef{blx@rlm@#1} | |
{\expandafter\expandafter\expandafter\forcsvlist | |
\expandafter\expandafter\expandafter\blx@clearlang@ii | |
\expandafter\expandafter\expandafter{% | |
\csname blx@rlm@#1\endcsname}} | |
{}} | |
\def\blx@clearlang@ii#1{% | |
\ifdefstring\languagename{#1} | |
{\clearlist{language}} | |
{}} | |
%% Biber equivalents to bibtex data interface | |
\def\abx@doentrytypes{\dolistloop\blx@datamodel@entrytypes} | |
% fields which can be used as labels - we auto-create some macros for these | |
\def\abx@dolabelfields{\dolistloop\blx@datamodel@labelfields} | |
\def\abx@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: | |
% <datamodel option>.dbx | |
% <style option>.dbx | |
% <citestyle option>.dbx and <bibstyle option>.dbx | |
% This has to be done before the real options processing so we need to | |
% pick out just these four options to look at. You can't do this with keyval, | |
% you have to use kvoptions. So, pick out these four, pass through all | |
% others and delete datamodel option as we don't care about it when we come | |
% to really set options below | |
\SetupKeyvalOptions{ | |
family=blx@opt@eldt, | |
prefix=blx@opt@eldt@} | |
\DeclareStringOption{datamodel} | |
\DeclareStringOption{style} | |
\DeclareStringOption{citestyle} | |
\DeclareStringOption{bibstyle} | |
\DeclareDefaultOption{} | |
\ProcessLocalKeyvalOptions{blx@opt@eldt} | |
\ifx\blx@opt@eldt@datamodel\@empty | |
\ifx\blx@opt@eldt@style\@empty | |
\ifx\blx@opt@eldt@citestyle\@empty | |
\else | |
\blx@inputonce{\blx@opt@eldt@citestyle.dbx}{biblatex citestyle data model}{}{}{}{} | |
\fi | |
\ifx\blx@opt@eldt@bibstyle\@empty | |
\else | |
\blx@inputonce{\blx@opt@eldt@bibstyle.dbx}{biblatex bibstyle data model}{}{}{}{} | |
\fi | |
\else | |
\blx@inputonce{\blx@opt@eldt@style.dbx}{biblatex style data model}{}{}{}{} | |
\fi | |
\else | |
\blx@inputonce{\blx@opt@eldt@datamodel.dbx}{biblatex style data model}{}{}{}{} | |
\fi | |
\DisableKeyvalOption[action=undef,local]{blx@opt@eldt}{datamodel} | |
% Override with user-defined data model if there is one | |
\blx@inputonce{biblatex-dm.cfg}{biblatex custom data model}{}{}{}{} | |
% Initialise option datatypes lists | |
\global\let\blx@bcf@options@scope@global\@empty | |
\global\let\blx@bcf@options@scope@type\@empty | |
\global\let\blx@bcf@options@scope@entry\@empty | |
\global\let\blx@bcf@options@scope@namelist\@empty | |
\global\let\blx@bcf@options@scope@name\@empty | |
\global\let\blx@globalopts@datatypes\@empty | |
\global\let\blx@typeopts@datatypes\@empty | |
\global\let\blx@entryopts@datatypes\@empty | |
\global\let\blx@namelistopts@datatypes\@empty | |
\global\let\blx@nameopts@datatypes\@empty | |
\def\do#1{% | |
\global\cslet{blx@globalopts@#1}\@empty | |
\global\cslet{blx@typeopts@#1}\@empty | |
\global\cslet{blx@entryopts@#1}\@empty | |
\global\cslet{blx@namelistopts@#1}\@empty | |
\global\cslet{blx@nameopts@#1}\@empty} | |
\expandafter\expandafter\expandafter | |
\docsvlist | |
\expandafter\expandafter\expandafter | |
{\csname blx@datamodel@constant@optiondatatypes\endcsname} | |
% Helper for collecting options and datatypes | |
% {<datatype>}{<scope>}{<name>} | |
\def\blx@collectopts#1#2#3{% | |
\ifinlistcs{#1}{#2@datatypes} | |
{} | |
{\listcsgadd{#2@datatypes}{#1}}% | |
\ifinlistcs{#3}{#2@#1} | |
{} | |
{\listcsgadd{#2@#1}{#3}}} | |
% entry, namelist, name scopes are input/handled on the backend side | |
% if we want to see the info back on the biblatex side, we need the backend | |
% to pass the info through via the .bbl file | |
\def\blx@declareblxopt@extrahandler@entry#1{% | |
\csgdef{blx@bcf@backendout@entry@#1}{1}} | |
\def\blx@declareblxopt@extrahandler@namelist#1{% | |
\csgdef{blx@bcf@backendout@namelist@#1}{1}} | |
\def\blx@declareblxopt@extrahandler@name#1{% | |
\csgdef{blx@bcf@backendout@name@#1}{1}} | |
% {<option scope>}[<datatype>]{<key>}[<value>]{<code>} | |
\protected\def\blx@declareblxopt#1{% | |
\@ifnextchar[%] | |
{\blx@declareblxopt@i#1} | |
{\blx@declareblxopt@i#1[]}} | |
\def\blx@declareblxopt@i#1[#2]#3{% | |
\begingroup | |
\ifblank{#2} | |
{\def\blx@tempa{boolean}} | |
{\ifcsundef{blx@#1opts@#2} | |
{\blx@warn@badoptdt{#2}% | |
\def\blx@tempa{boolean}} | |
{\def\blx@tempa{#2}}}% | |
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@#1opts}{#3}% | |
\ifcsundef{blx@declareblxopt@extrahandler@#1} | |
{} | |
{\csuse{blx@declareblxopt@extrahandler@#1}{#3}}% | |
\endgroup | |
\@ifnextchar[%] | |
{\csuse{blx@defblxopt@#1opt}{#3}} | |
{\csuse{blx@defblxopt@#1opt}{#3}[]}} | |
\long\def\blx@defblxopt@globalopt#1[#2]#3{% | |
\blx@kv@ifkeyundef{blx@opt@ldt}{#1} | |
{\blx@kv@ifkeyundef{blx@opt@pre}{#1} | |
{\ifblank{#2} | |
{\blx@kv@defkey{blx@opt@pre}{#1}{#3}} | |
{\blx@kv@defkey{blx@opt@pre}{#1}[{#2}]{#3}}} | |
{\blx@err@optdef{#1}{pre/global}}} | |
{\blx@err@optdef{#1}{ldt/global}}} | |
\long\def\blx@defblxopt@typeentryopt#1#2[#3]#4{% | |
\blx@kv@ifkeyundef{blx@opt@#1}{#2} | |
{\ifblank{#3} | |
{\blx@kv@defkey{blx@opt@#1}{#2}{#4}} | |
{\blx@kv@defkey{blx@opt@#1}{#2}[{#3}]{#4}}} | |
{\blx@err@optdef{#2}{#1}}} | |
\def\blx@defblxopt@typeopt{\blx@defblxopt@typeentryopt{typ}} | |
\def\blx@defblxopt@entryopt{\blx@defblxopt@typeentryopt{ent}} | |
\def\blx@defblxopt@nameopt{\blx@defblxopt@typeentryopt{name}} | |
\def\blx@defblxopt@namelistopt{\blx@defblxopt@typeentryopt{namelist}} | |
% The Declare*Option macros are for options which need to be visible | |
% to biblatex. For options which only biber needs to see, they can be | |
% passed to the .bcf directly using \blx@collectopts | |
% [<datatype>]{<key>}[<default value>]{<code>} | |
\newcommand*{\DeclareBibliographyOption}{\blx@declareblxopt{global}} | |
\newcommand*{\DeclareTypeOption}{\blx@declareblxopt{type}} | |
\newcommand*{\DeclareEntryOption}{\blx@declareblxopt{entry}} | |
% we'll assume that \blx@optscopes is non-empty from now on | |
\newcommand*{\blx@optscopes}{} | |
\forcsvlist{\listadd\blx@optscopes}{global,type,entry} | |
\long\def\blx@defblxopt@loopscopes@i#1[#2]#3#4{% | |
\csuse{blx@defblxopt@#4opt}{#1}[{#2}]{#3}} | |
\long\def\blx@defblxopt@loopscopes#1[#2]#3{% | |
\forlistloop{\blx@defblxopt@loopscopes@i{#1}[{#2}]{#3}}{\blx@optscopes}} | |
% {<option scopes>}[<datatype>]{<key>}[<default value>]{<code>} | |
\newrobustcmd*{\DeclareBiblatexOption}[1]{% | |
\let\blx@optscopes\@empty | |
\forcsvlist{\listadd\blx@optscopes}{#1}% | |
\blx@DeclareBiblatexOption@i} | |
\newrobustcmd*{\blx@DeclareBiblatexOption@i}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@tempa{boolean}} | |
{\let\blx@tempb\@secondoftwo | |
\def\do##1{% | |
\ifcsundef{blx@##1opts@#1} | |
{\let\blx@tempb\@firstoftwo\listbreak} | |
{}}% | |
\dolistloop{\blx@optscopes}% | |
\blx@tempb | |
{\blx@warn@badoptdt{#1}% | |
\def\blx@tempa{boolean}} | |
{\def\blx@tempa{#1}}}% | |
\def\do##1{% | |
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@##1opts}{#2}% | |
\ifcsundef{blx@declareblxopt@extrahandler@##1} | |
{} | |
{\csuse{blx@declareblxopt@extrahandler@##1}{#2}}}% | |
\dolistloop{\blx@optscopes}% | |
\endgroup | |
\@ifnextchar[%] | |
{\blx@defblxopt@loopscopes{#2}} | |
{\blx@defblxopt@loopscopes{#2}[]}} | |
% this macro is internal for now because options declared with it need | |
% support on the backend side and are not useful for document or style authors | |
% {<option scopes>}[<datatype>]{<key>} | |
\newrobustcmd*{\blx@DeclareBackendOption}[1]{% | |
\let\blx@optscopes\@empty | |
\forcsvlist{\listadd\blx@optscopes}{#1}% | |
\blx@DeclareBackendOption@i} | |
\newrobustcmd*{\blx@DeclareBackendOption@i}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@tempa{boolean}} | |
{\let\blx@tempb\@secondoftwo | |
\def\do##1{% | |
\ifcsundef{blx@##1opts@#1} | |
{\let\blx@tempb\@firstoftwo\listbreak} | |
{}}% | |
\dolistloop{\blx@optscopes}% | |
\blx@tempb | |
{\blx@warn@badoptdt{#1}% | |
\def\blx@tempa{boolean}} | |
{\def\blx@tempa{#1}}}% | |
\def\do##1{% | |
\expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@##1opts}{#2}}% | |
\dolistloop{\blx@optscopes}% | |
\endgroup} | |
% per-entry inheritance blocking option for biber | |
\blx@DeclareBackendOption{entry}[string]{noinherit} | |
% nametemplates meta-option entry/namelist/name scope | |
% this meta option is resolved by Biber | |
\blx@DeclareBackendOption{entry,namelist,name}[string]{nametemplates} | |
\gdef\blx@bcf@backendin@entry@nametemplates{sortingnamekeytemplatename,% | |
uniquenametemplatename,labelalphanametemplatename}% | |
\gdef\blx@bcf@backendin@namelist@nametemplates{sortingnamekeytemplatename,% | |
uniquenametemplatename,labelalphanametemplatename}% | |
\gdef\blx@bcf@backendin@name@nametemplates{sortingnamekeytemplatename,% | |
uniquenametemplatename,labelalphanametemplatename}% | |
% Misc globalopts | |
\blx@DeclareBackendOption{global}[xml]{datamodel} | |
\blx@collectopts{string}{blx@globalopts}{controlversion} | |
\newcommand*{\labelalphaothers}{+} | |
\newcommand*{\sortalphaothers}{\labelalphaothers} | |
\blx@DeclareBackendOption{global,type}[string]{alphaothers} | |
\blx@DeclareBackendOption{global,type}[string]{sortalphaothers} | |
% date, eventdate, urldate etc. | |
\def\abx@dodates{\dolistloop\blx@datamodel@dates} | |
% year, endyear, month, endmonth etc. | |
\def\abx@dodateparts{\expandafter\docsvlist\expandafter{\blx@dateparts}} | |
% '', event, url, orig etc. | |
\def\do#1{% | |
\blx@stripfromendinto{#1}{date}\blx@datetype | |
\listxadd\blx@datetypes{\blx@datetype}} | |
\abx@dodates | |
% main date field has an empty prefix (''date) which can't be added to a list | |
% and so do it explicity | |
% This is one of the few (only?) hard-coded datamodel assumptions but it is | |
% very unlikely that anyone would *remove* the main date field in a custom application ... | |
\def\abx@dodatetypes{\do{}\dolistloop\blx@datetypes} | |
% Sanity check on date field names - they *must* end in 'date' to make things easier/possible later | |
\def\do#1{% | |
\blx@ifstrendswith{#1}{date} | |
{} | |
{\blx@error | |
{Invalid date field name '#1'} | |
{Date fields in the datamodel must end in the string 'date' but '#1' doesn't}}} | |
\abx@dodates | |
% date meta-information option fallbacks | |
\def\do#1{% | |
\cslet{#1datecircaprint}\@empty | |
\cslet{#1enddatecircaprint}\@empty | |
\cslet{#1datecircaprintiso}\@empty | |
\cslet{#1enddatecircaprintiso}\@empty | |
\cslet{#1dateuncertainprint}\@empty | |
\cslet{#1enddateuncertainprint}\@empty | |
\cslet{#1dateeraprint}\@gobble | |
\cslet{#1dateeraprintpre}\@gobble | |
\csdef{if#1dateera}##1{\@secondoftwo}% | |
\csdef{if#1enddateera}##1{\@secondoftwo}% | |
\cslet{if#1datecirca}\@secondoftwo | |
\cslet{if#1enddatecirca}\@secondoftwo | |
\cslet{if#1datejulian}\@secondoftwo | |
\cslet{if#1enddatejulian}\@secondoftwo | |
\cslet{if#1dateuncertain}\@secondoftwo | |
\cslet{if#1enddateuncertain}\@secondoftwo | |
\cslet{if#1dateunknown}\@secondoftwo | |
\cslet{if#1enddateunknown}\@secondoftwo} | |
\abx@dodatetypes | |
\do{labeldate} | |
% These are internal fields/booleans which are not part of the data model but | |
% which need to be dealt with along with data model fields in places | |
\def\do#1{% | |
\listxadd\blx@datemetafields{#1dateera}% | |
\listxadd\blx@datemetafields{#1enddateera}% | |
\listxadd\blx@datemetafields{#1dateunspecified}} | |
\abx@dodatetypes | |
\def\do#1{% | |
\listxadd\blx@datemetabooleans{#1datecirca}% | |
\listxadd\blx@datemetabooleans{#1enddatecirca}% | |
\listxadd\blx@datemetabooleans{#1datejulian}% | |
\listxadd\blx@datemetabooleans{#1enddatejulian}% | |
\listxadd\blx@datemetabooleans{#1dateuncertain}% | |
\listxadd\blx@datemetabooleans{#1enddateuncertain}% | |
\listxadd\blx@datemetabooleans{#1dateunknown}% | |
\listxadd\blx@datemetabooleans{#1enddateunknown}} | |
\abx@dodatetypes | |
\def\do#1{% | |
\listxadd\blx@namepartmetafields{#1namehash}% | |
\listxadd\blx@namepartmetafields{#1fullhash}% | |
\listxadd\blx@namepartmetafields{#1bibnamehash}} | |
\abx@donameparts | |
\def\do#1{% | |
\listxadd\blx@labeldatepartfields{label#1}} | |
\abx@dodateparts | |
\def\abx@dointernalfields{% | |
\do{clonesourcekey}% | |
\do{labeldate}% | |
\do{labeldatesource}% | |
\do{labeldateera}% | |
\do{labelenddateera}% | |
\do{labelyear}% | |
\do{labelendyear}% | |
\do{labelmonth}% | |
\do{labelendmonth}% | |
\do{labelday}% | |
\do{labelendday}% | |
\do{labelhour}% | |
\do{labelendhour}% | |
\do{labelminute}% | |
\do{labelendminute}% | |
\do{labelsecond}% | |
\do{labelendsecond}% | |
\do{labeltimezone}% | |
\do{labelendtimezone}% | |
\do{labelseason}% | |
\do{labelendseason}% | |
\do{entrykey}% | |
\do{entryset}% | |
\do{entrysetcount}% | |
\do{entrytype}% | |
\do{extraalpha}% | |
\do{extraname}% | |
\do{extratitle}% | |
\do{extratitleyear}% | |
\do{extradate}% | |
\do{fullhash}% | |
\do{labelalpha}% | |
\do{labelnumber}% | |
\do{labelprefix}% | |
\do{labeltitleyear}% | |
\do{localnumber}% | |
\do{namehash}% | |
\do{bibnamehash}% | |
\do{options}% | |
\do{sortinit}% | |
\do{sortinithash}% | |
\dolistloop\blx@datemetafields | |
\dolistloop\blx@namepartmetafields | |
\dolistloop\blx@labeldatepartfields} | |
\def\abx@dobooleans{% | |
\do{crossrefsource}% | |
\do{xrefsource}% | |
\do{singletitle}% | |
\do{uniquetitle}% | |
\do{uniquebaretitle}% | |
\do{uniquework}% | |
\do{uniqueprimaryauthor}% | |
\do{nocite}% | |
\dolistloop\blx@datemetabooleans} | |
% Date datatype fields | |
\def\do#1{% | |
\protected\csdef{blx@imc@print#1date}{}% | |
\protected\csdef{blx@imc@print#1dateextra}{}% | |
\protected\csdef{blx@imc@print#1time}{}} | |
\abx@dodatetypes | |
% \blx@regimcs doesn't work in do-lists nicely so use internal macro it calls | |
\def\do#1{% | |
\xappto\blx@blxinit{\csletcs{print#1date}{blx@imc@print#1date}}% | |
\xappto\blx@blxinit{\csletcs{print#1time}{blx@imc@print#1time}}% | |
\xappto\blx@blxinit{\csletcs{print#1dateextra}{blx@imc@print#1dateextra}}} | |
\abx@dodatetypes | |
% Set up circa, julian and uncertain date internals | |
\def\blx@makeifdatemeta@bools@i#1#2{% | |
\appto\blx@blxinit{% | |
\blx@makeifdatemeta@bools{#1}{#2}}} | |
\def\blx@makeifdatemeta@bools#1#2{% | |
\csdef{if#1date#2}{\iftoggle{abx@bool@#1date#2}}% | |
\csdef{if#1enddate#2}{\iftoggle{abx@bool@#1enddate#2}}% | |
\appto\blx@TE@hook{% | |
\csdef{if#1date#2}{\blx@TE{\iftoggle{abx@bool@#1date#2}}}% | |
\csdef{if#1enddate#2}{\blx@TE{\iftoggle{abx@bool@#1enddate#2}}}}} | |
% Set up date era internals | |
\def\blx@makeifdatemeta@fields@i#1{% | |
\appto\blx@blxinit{% | |
\blx@makeifdatemeta@fields{#1}}} | |
\def\blx@makeifdatemeta@fields#1{% | |
\csdef{if#1dateera}##1{\ifcsstring{abx@field@#1dateera}{##1}}% | |
\csdef{if#1enddateera}##1{\ifcsstring{abx@field@#1enddateera}{##1}}% | |
\appto\blx@TE@hook{% | |
\csdef{if#1dateera}##1{\blx@TE{\ifcsstring{abx@field@#1dateera}{##1}}}% | |
\csdef{if#1enddateera}##1{\blx@TE{\ifcsstring{abx@field@#1enddateera}{##1}}}}} | |
% Create date meta information boolean tests | |
\def\do#1{% | |
\blx@makeifdatemeta@bools@i{#1}{circa}% | |
\blx@makeifdatemeta@bools@i{#1}{julian}% | |
\blx@makeifdatemeta@bools@i{#1}{uncertain}% | |
\blx@makeifdatemeta@bools@i{#1}{unknown}} | |
\abx@dodatetypes | |
% Create date meta information field tests | |
\def\do#1{% | |
\blx@makeifdatemeta@fields@i{#1}} | |
\abx@dodatetypes | |
% Resolve date meta information tests and print routines for labeldate | |
% We have to test here, in each \def, whether the labeldatesource | |
% is a real date field or not. If it's not, then we don't want to use | |
% any of the meta-information and so make the conditionals always return false | |
% This can't be neater by testing for the \abx@field@labeldatesource value | |
% earlier because its not available until the tests are in scope. | |
\appto\blx@blxinit{% | |
\ifdefstring\blx@dateera{astronomical} | |
{\protected\def\dateeraprintpre#1{% | |
\iffieldnum{#1} | |
{\begingroup | |
\let\blx@tempa\@empty | |
\blx@ifstrendswith{#1}{endyear} | |
{\blx@stripfromendinto{#1}{endyear}\blx@datetype | |
\def\blx@tempa{end}} | |
{\blx@stripfromendinto{#1}{year}\blx@datetype}% | |
\csuse{if\blx@datetype\blx@tempa dateera}{bce} | |
{\ifnumless{0-\thefield{#1}}{0} | |
{\csuse{bibdateera\blx@tempa prefix}} | |
{}} | |
{}% | |
\endgroup} | |
{}}} | |
{\protected\def\dateeraprint#1{% | |
\iffieldnum{#1} | |
{\begingroup | |
\let\blx@tempa\@empty | |
\blx@ifstrendswith{#1}{endyear} | |
{\blx@stripfromendinto{#1}{endyear}\blx@datetype | |
\def\blx@tempa{end}} | |
{\blx@stripfromendinto{#1}{year}\blx@datetype}% | |
\csuse{if\blx@datetype\blx@tempa dateera}{bce} | |
{\ifnum\numexpr0-\thefield{#1}\relax<\blx@dateeraauto | |
% \midsentence is to suppress automatic capitalisation | |
\printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@bce}\relax | |
\fi} | |
{\ifnumless{\thefield{#1}}\blx@dateeraauto | |
{\printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@ce}} | |
{}}% | |
\endgroup} | |
{}}}% | |
\iftoggle{blx@labeldateparts} | |
{\def\iflabeldateera#1{% start era | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\ifcsstring{abx@field@\abx@field@labeldatesource dateera}{#1}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldateera#1{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\ifcsstring{abx@field@\abx@field@labeldatesource dateera}{#1}}} | |
{\@secondoftwo}}}% | |
% end era | |
\def\iflabelenddateera#1{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\ifcsstring{abx@field@\abx@field@labeldatesource enddateera}{#1}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddateera#1{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\ifcsstring{abx@field@\abx@field@labeldatesource enddateera}{#1}}} | |
{\@secondoftwo}}}% | |
% start circa | |
\def\iflabeldatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource datecirca}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource datecirca}}} | |
{\@secondoftwo}}}% | |
% end circa | |
\def\iflabelenddatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource enddatecirca}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddatecirca{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddatecirca}}} | |
{\@secondoftwo}}}% | |
% start julian | |
\def\iflabeldatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource datejulian}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource datejulian}}} | |
{\@secondoftwo}}}% | |
% end julian | |
\def\iflabelenddatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource enddatejulian}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddatejulian{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddatejulian}}} | |
{\@secondoftwo}}}% | |
% start uncertain | |
\def\iflabeldateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource dateuncertain}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabeldateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource dateuncertain}}} | |
{\@secondoftwo}}}% | |
% end uncertain | |
\def\iflabelenddateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\iftoggle{abx@bool@\abx@field@labeldatesource enddateuncertain}} | |
{\@secondoftwo}}% | |
\appto\blx@TE@hook{\def\iflabelenddateuncertain{% | |
\xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates | |
{\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddateuncertain}}} | |
{\@secondoftwo}}}}% | |
{}} | |
% Name toggles like \ifauthor etc. need to be dynamically created for all | |
% name datatypes in the data model and we have to do this here after the | |
% datamodel is available. Need to be careful about expansions here as these | |
% go into hooks to be executed later | |
% toggle to say if we have set any <name>inits to true. Used for conflict | |
% tests with uniquename settings (see \AtEndPreamble below) | |
\newtoggle{abx@bool@xinits} | |
% define <name>inits options and tests (terseinits is global for all initials) | |
\def\do#1{% | |
\newtoggle{abx@bool@#1inits}% | |
\appto\blx@blxinit{% | |
\csdef{if#1inits}{\iftoggle{abx@bool@#1inits}}% | |
\appto\blx@TE@hook{% | |
\csdef{if#1inits}{\blx@TE{\iftoggle{abx@bool@#1inits}}}}}% | |
\DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{#1inits}[true]{% | |
\settoggle{abx@bool@#1inits}{##1}}} | |
\abx@donameparts | |
\def\do#1{% | |
% Define use<name> options scope for biber | |
\blx@DeclareBackendOption{global,type,entry}[boolean]{use#1}% | |
% Define name toggles | |
\newtoggle{blx@use#1}\toggletrue{blx@use#1}% | |
% Define tests | |
\appto\blx@blxinit{% | |
\csdef{ifuse#1}{\iftoggle{blx@use#1}}% | |
\appto\blx@TE@hook{% | |
\csdef{ifuse#1}{\blx@TE{\iftoggle{blx@use#1}}}}}} | |
\abx@donames | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Since these are bare counters which define \the<string>, save any current values | |
% (memoir, titling, koma etc. have a \theauthor macro, for example) and restore at | |
% end of package | |
\def\do#1{% | |
\csletcs{blx@compat@the#1}{the#1}% | |
\newcounter{#1}% | |
\newcounter{saved#1}% | |
\appto\abx@dobooleans{\do{more#1}}} | |
\abx@donames | |
\abx@dornames | |
\abx@dolists | |
%\abx@dorlists | |
\AtEndOfPackage{% | |
\def\do#1{\csletcs{the#1}{blx@compat@the#1}}% | |
\abx@donames | |
\abx@dornames | |
\abx@dolists} | |
\def\do#1{\newtoggle{abx@bool@#1}} | |
\abx@dobooleans | |
\def\do#1{\expandafter\newlength\expandafter{\csname #1width\endcsname}} | |
\abx@dolabelfields | |
\def\do#1{\expandafter\newlength\expandafter{\csname local#1width\endcsname}} | |
\abx@dolabelwidths | |
\protected\def\blx@resetdata{% | |
\let\blx@saved@do\do | |
\let\do\blx@imc@clearname | |
\abx@donames | |
\let\do\blx@imc@clearlist | |
\abx@dolists | |
\let\do\blx@imc@clearfield | |
\abx@dofields | |
\abx@dointernalfields | |
\ifundef\abx@annotation@defined | |
{} | |
{\def\do##1{\csundef{abx@annotation@##1}}% | |
\dolistloop\abx@annotation@defined}% | |
\let\abx@annotation@defined\@empty | |
\def\do##1{\togglefalse{abx@bool@##1}}% | |
\abx@dobooleans | |
\let\do\blx@saved@do | |
\c@citecounter\z@ | |
\iftoggle{blx@bibliography} | |
{\c@maxnames\blx@maxbibnames\relax | |
\c@minnames\blx@minbibnames\relax} | |
{\c@maxnames\blx@maxcitenames\relax | |
\c@minnames\blx@mincitenames\relax}% | |
\c@maxitems\blx@maxitems\relax | |
\c@minitems\blx@minitems\relax} | |
\protected\def\blx@saveentry{% | |
\let\blx@saved@do\do | |
\let\do\blx@savename | |
\abx@donames | |
\let\do\blx@saverelname | |
\dolistloop\abx@dorelnames | |
\let\do\blx@savelist | |
\abx@dolists | |
\let\do\blx@saverellist | |
\dolistloop\abx@dorellists | |
\let\do\blx@savefield | |
\abx@dofields | |
\abx@dointernalfields | |
\let\do\blx@saverelfield | |
\dolistloop\abx@dorelfields | |
\ifundef\abx@savedannotation@defined | |
{} | |
{\def\do##1{\csundef{abx@annotation@\blx@saveannotations@makesaved##1}}% | |
\dolistloop\abx@savedannotation@defined}% | |
\let\abx@savedannotation@defined\@empty | |
\ifundef\abx@annotation@defined | |
{} | |
{\let\do\blx@saveannotations | |
\dolistloop\abx@annotation@defined}% | |
\let\abx@savedannotation@defined\abx@annotation@defined | |
\let\do\blx@savebool | |
\abx@dobooleans | |
\let\do\blx@savedatetype | |
\abx@dodatetypes | |
\do{label}% | |
\c@savedcitecounter\c@citecounter | |
\let\do\blx@saved@do} | |
\protected\def\blx@savename#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{abx@name@saved#1}{abx@name@#1}% | |
\csname c@saved#1\endcsname\csname c@#1\endcsname} | |
% override with name saved from \clearfield for related processing | |
\protected\def\blx@saverelname#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@morerelsaved#1}% | |
\csletcs{abx@name@saved#1}{abx@name@relsaved#1}% | |
\csname c@saved#1\endcsname\csname c@relsaved#1\endcsname} | |
\protected\def\blx@savelist#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}% | |
\csletcs{abx@list@saved#1}{abx@list@#1}% | |
\csname c@saved#1\endcsname\csname c@#1\endcsname} | |
% override with list saved from \clearfield for related processing | |
\protected\def\blx@saverellist#1{% | |
\csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@morerelsaved#1}% | |
\csletcs{abx@list@saved#1}{abx@list@relsaved#1}% | |
\csname c@saved#1\endcsname\csname c@relsaved#1\endcsname} | |
\protected\def\blx@savefield#1{% | |
\csletcs{abx@field@saved#1}{abx@field@#1}} | |
% override with field saved from \clearfield for related processing | |
\protected\def\blx@saverelfield#1{% | |
\csletcs{abx@field@saved@#1}{abx@field@relsaved#1}} | |
\protected\def\blx@savebool#1{% | |
\csletcs{etb@tgl@abx@bool@saved#1}{etb@tgl@abx@bool@#1}} | |
\protected\def\blx@savedatetype#1{% | |
\csletcs{blx@dateformat@saved#1date}{blx@dateformat@#1date}% | |
\protected\csedef{blx@imc@printsaved#1date}{% | |
\noexpand\csuse{mkdaterange\csuse{blx@dateformat@saved#1date}} | |
{saved#1}}% | |
\protected\csedef{blx@imc@printsaved#1dateextra}{% | |
\begingroup | |
% extradate is hard-coded in date macros, so reset it temporarily | |
\csletcs{abx@field@extradate}{abx@field@savedextradate}% | |
\noexpand\csuse{mkdaterange\csuse{blx@dateformat@saved#1date}extra} | |
{saved#1}% | |
\endgroup}% | |
\csletcs{blx@timeformat@saved#1time}{blx@timeformat@#1time}% | |
\protected\csedef{blx@imc@printsaved#1time}{% | |
\noexpand\csuse{mktimerange\csuse{blx@timeformat@saved#1time}} | |
{saved#1}}% | |
\csletcs{etb@tgl@blx@saved#1dateusetime}{etb@tgl@blx@#1dateusetime}% | |
% the datemetabooleans are here again for labeldate | |
\blx@savebool{#1datecirca}% | |
\blx@savebool{#1enddatecirca}% | |
\blx@savebool{#1datejulian}% | |
\blx@savebool{#1enddatejulian}% | |
\blx@savebool{#1dateuncertain}% | |
\blx@savebool{#1enddateuncertain}% | |
\blx@savebool{#1dateunknown}% | |
\blx@savebool{#1enddateunknown}% | |
\blx@makeifdatemeta@bools{saved#1}{circa}% | |
\blx@makeifdatemeta@bools{saved#1}{julian}% | |
\blx@makeifdatemeta@bools{saved#1}{uncertain}% | |
\blx@makeifdatemeta@bools{saved#1}{unknown}% | |
\blx@makeifdatemeta@fields{saved#1}% | |
\csletcs{printsaved#1date}{blx@imc@printsaved#1date}% | |
\csletcs{printsaved#1time}{blx@imc@printsaved#1time}% | |
\csletcs{printsaved#1dateextra}{blx@imc@printsaved#1dateextra}} | |
\def\blx@saveannotations@makesaved#1@#2{#1@saved#2} | |
\protected\def\blx@saveannotations#1{% | |
\csletcs{abx@annotation@\blx@saveannotations@makesaved#1}{abx@annotation@#1}} | |
% {<code>} | |
\protected\long\def\blx@bbl@preamble#1{% | |
\gappto\abx@preamble{#1}} | |
% {<message>} | |
\protected\def\blx@bbl@warn#1{% | |
\begingroup | |
\def\item{\MessageBreak-\space}% | |
\def\break{\MessageBreak\space\space}% | |
\blx@warning@noline{% | |
Biber reported the following issues% | |
\ifdef\abx@field@entrykey | |
{\MessageBreak with '\abx@field@entrykey'} | |
{}% | |
:#1}% | |
\endgroup} | |
% {<field>}{<code>} | |
\newrobustcmd{\DeclareFieldInputHandler}[2]{% | |
\ifblank{#2} | |
{\csundef{blx@fih@#1}} | |
{\long\csdef{blx@fih@#1}##1{#2}}} | |
\@onlypreamble\DeclareFieldInputHandler | |
% {<list>}{<code>} | |
\newrobustcmd*{\DeclareListInputHandler}[2]{% | |
\ifblank{#2} | |
{\csundef{blx@lih@#1}} | |
{\csdef{blx@lih@#1}##1{#2}}} | |
\@onlypreamble\DeclareListInputHandler | |
% {<name>}{<code>} | |
\newrobustcmd*{\DeclareNameInputHandler}[2]{% | |
\ifblank{#2} | |
{\csundef{blx@nih@#1}} | |
{\csdef{blx@nih@#1}##1{#2}}} | |
\@onlypreamble\DeclareNameInputHandler | |
% {<entrykey>}{<refsection>}{<field>}{<refcontext>}{<value>} | |
\long\def\blx@bbl@addentryfield#1#2#3#4#5{% | |
\csxappto{blx@data@#2@#4@#1}{% | |
\def\expandafter\noexpand\csname abx@field@#3\endcsname{#5}}} | |
% {<rangefield>}{<value>} | |
\protected\def\blx@bbl@rangedef#1#2{% | |
\csxappto\blx@bbl@data{% | |
\def\expandafter\noexpand\csname abx@range@#1\endcsname{#2}}} | |
% {<field>}{<value>} | |
\long\def\blx@bbl@addfield#1#2{% | |
\csxappto\blx@bbl@data{% | |
\def\expandafter\noexpand\csname abx@field@#1\endcsname{#2}}} | |
\protected\long\def\blx@bbl@fielddef#1#2{% | |
\def\NewValue{#2}% | |
\ifcsdef{blx@fih@#1} | |
{\csname blx@fih@#1\endcsname{#2}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\blx@bbl@addfield{#1}{\expandonce\NewValue}}} | |
\protected\long\def\blx@bbl@fieldedef#1#2{% | |
\edef\NewValue{#2}% | |
\ifcsdef{blx@fih@#1} | |
{\csname blx@fih@#1\expandafter | |
\endcsname\expandafter{\NewValue}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\blx@bbl@addfield{#1}{\NewValue}}} | |
\protected\long\def\blx@bbl@stringdef#1#2{% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\blx@bbl@fielddef{#1}{\detokenize{#2}}}% | |
\blx@tempa} | |
% Verbatim lists | |
% {<list>}{<listcount>} | |
\protected\def\blx@bbl@verbldef#1#2{% | |
\begingroup | |
\let\lverb\blx@bbl@verbladd | |
\def\blx@tempa{#1}% | |
\def\blx@tempb{#2}% | |
\let\blx@tempc\@empty | |
\let\NewValue\@empty} | |
\protected\def\blx@bbl@verblend{% | |
\expandafter\blx@bbl@listdef\expandafter{\expandafter\blx@tempa\expandafter}\expandafter{\expandafter\blx@tempb\expandafter}\expandafter{\blx@tempc}% | |
\endgroup} | |
\protected\def\blx@bbl@verbladd{% | |
\begingroup | |
\let\do\@makeother | |
\dospecials | |
\catcode\endlinechar=12\relax | |
\blx@bbl@verbladd@i} | |
% Verbatim fields | |
% {<field>} | |
\protected\def\blx@bbl@verbdef#1{% | |
\begingroup | |
\let\verb\blx@bbl@verbadd | |
\def\blx@tempa{#1}% | |
\let\NewValue\@empty} | |
\protected\def\blx@bbl@verbend{% | |
\ifcsdef{blx@fih@\blx@tempa} | |
{\csname blx@fih@\blx@tempa\expandafter | |
\endcsname\expandafter{\NewValue}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\blx@bbl@addfield{\blx@tempa}{\NewValue}}% | |
\endgroup} | |
\protected\def\blx@bbl@verbadd{% | |
\begingroup | |
\let\do\@makeother | |
\dospecials | |
\catcode\endlinechar=12\relax | |
\blx@bbl@verbadd@i} | |
% {<scope>}{<field>}{<name>}{<itemcount>}{<part>}{<isliteral>}{<value>} | |
\protected\def\blx@bbl@annotationdef#1#2#3#4#5#6#7{% | |
\ifstrequal{#1}{field} | |
{\csxappto\blx@bbl@data{% | |
\listadd\noexpand\abx@annotation@defined{field@#2@#3}}% | |
\ifstrequal{#6}{1} | |
{\csgappto\blx@bbl@data{% | |
\csdef{abx@annotation@literal@field@#2@#3}{#7}}} | |
{\csxappto\blx@bbl@data{% | |
\def\do####1{\listcsadd{abx@annotation@field@#2@#3}{####1}}% | |
\docsvlist{#7}}}} | |
{}% | |
\ifstrequal{#1}{item} | |
{\csxappto\blx@bbl@data{% | |
\listadd\noexpand\abx@annotation@defined{item@#2@#3@#4}}% | |
\ifstrequal{#6}{1} | |
{\csgappto\blx@bbl@data{% | |
\csdef{abx@annotation@literal@item@#2@#3@#4}{#7}}} | |
{\csxappto\blx@bbl@data{% | |
\def\do####1{\listcsadd{abx@annotation@item@#2@#3@#4}{####1}}% | |
\docsvlist{#7}}}} | |
{}% | |
\ifstrequal{#1}{part} | |
{\csxappto\blx@bbl@data{% | |
\listadd\noexpand\abx@annotation@defined{part@#2@#3@#4@#5}}% | |
\ifstrequal{#6}{1} | |
{\csgappto\blx@bbl@data{% | |
\csdef{abx@annotation@literal@part@#2@#3@#4@#5}{#7}}} | |
{\csxappto\blx@bbl@data{% | |
\def\do####1{\listcsadd{abx@annotation@part@#2@#3@#4@#5}{####1}}% | |
\docsvlist{#7}}}} | |
{}} | |
% [<field>][<annotationname>] | |
\def\blx@imc@getfieldannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@getfieldannotation@i} | |
{\blx@imc@getfieldannotation@i[\blx@tempa]}} | |
\def\blx@imc@getfieldannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@getfieldannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@getfieldannotation@ii{#1}} | |
{\blx@imc@getfieldannotation@ii{#1}[default]}}} | |
\def\blx@imc@getfieldannotation@ii#1[#2]{% | |
\def\blx@tempb{#1}% | |
\blx@resolve@annotation@label{\blx@tempb}% | |
\ifcsdef{abx@annotation@literal@field@\blx@tempb @#2} | |
{\csuse{abx@annotation@literal@field@\blx@tempb @#2}} | |
{}} | |
% [<field>][<annotationname>][<item>] | |
\def\blx@imc@getitemannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@getitemannotation@i} | |
{\blx@imc@getitemannotation@i[\blx@tempa]}} | |
\def\blx@imc@getitemannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@getitemannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@getitemannotation@ii{#1}} | |
{\blx@imc@getitemannotation@ii{#1}[default]}}} | |
\def\blx@imc@getitemannotation@ii#1[#2]{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\@ifnextchar[%] | |
{\blx@imc@getitemannotation@iii{#1}{\blx@tempb}} | |
{\blx@imc@getitemannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}} | |
\def\blx@imc@getitemannotation@iii#1#2[#3]{% | |
\def\blx@tempc{#1}% | |
\blx@resolve@annotation@label{\blx@tempc}% | |
\ifcsdef{abx@annotation@literal@item@\blx@tempc @#2@#3} | |
{\csuse{abx@annotation@literal@item@\blx@tempc @#2@#3}} | |
{}} | |
% [<field>][<annotationname>][<item>]{<part>} | |
\def\blx@imc@getpartannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@getpartannotation@i} | |
{\blx@imc@getpartannotation@i[\blx@tempa]}} | |
\def\blx@imc@getpartannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@getpartannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@getpartannotation@ii{#1}} | |
{\blx@imc@getpartannotation@ii{#1}[default]}}} | |
\def\blx@imc@getpartannotation@ii#1[#2]{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\@ifnextchar[%] | |
{\blx@imc@getpartannotation@iii{#1}{\blx@tempb}} | |
{\blx@imc@getpartannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}} | |
\def\blx@imc@getpartannotation@iii#1#2[#3]#4{% | |
\ifstrempty{#3} | |
{\def\blx@tempc{\the\value{listcount}}} | |
{\def\blx@tempc{#3}}% | |
\def\blx@tempd{#1}% | |
\blx@resolve@annotation@label{\blx@tempd}% | |
\ifcsdef{abx@annotation@literal@part@\blx@tempd @#2@\blx@tempc @#4} | |
{\csuse{abx@annotation@literal@part@\blx@tempd @#2@\blx@tempc @#4}} | |
{}} | |
% [<field>][<annotationname>]{<annotation>} | |
\def\blx@imc@iffieldannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@iffieldannotation@i} | |
{\blx@imc@iffieldannotation@i[\blx@tempa]}} | |
\def\blx@imc@iffieldannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@iffieldannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@iffieldannotation@ii{#1}} | |
{\blx@imc@iffieldannotation@ii{#1}[default]}}} | |
\def\blx@imc@iffieldannotation@ii#1[#2]#3{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\def\blx@tempc{#1}% | |
\blx@resolve@annotation@label{\blx@tempc}% | |
\ifinlistcs{#3}{abx@annotation@field@\blx@tempc @\blx@tempb}} | |
% [<field>][<annotationname>][<item>]{<annotation>} | |
\def\blx@imc@ifitemannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@ifitemannotation@i} | |
{\blx@imc@ifitemannotation@i[\blx@tempa]}} | |
\def\blx@imc@ifitemannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@ifitemannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@ifitemannotation@ii{#1}} | |
{\blx@imc@ifitemannotation@ii{#1}[default]}}} | |
\def\blx@imc@ifitemannotation@ii#1[#2]{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\@ifnextchar[%] | |
{\blx@imc@ifitemannotation@iii{#1}{\blx@tempb}} | |
{\blx@imc@ifitemannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}} | |
\def\blx@imc@ifitemannotation@iii#1#2[#3]#4{% | |
\def\blx@tempc{#1}% | |
\blx@resolve@annotation@label{\blx@tempc}% | |
\ifinlistcs{#4}{abx@annotation@item@\blx@tempc @#2@#3}} | |
% [<field>][<annotationname>][<item>]{<part>}{<annotation>} | |
\def\blx@imc@ifpartannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@ifpartannotation@i} | |
{\blx@imc@ifpartannotation@i[\blx@tempa]}} | |
\def\blx@imc@ifpartannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@ifpartannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@ifpartannotation@ii{#1}} | |
{\blx@imc@ifpartannotation@ii{#1}[default]}}} | |
\def\blx@imc@ifpartannotation@ii#1[#2]{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\@ifnextchar[%] | |
{\blx@imc@ifpartannotation@iii{#1}{\blx@tempb}} | |
{\blx@imc@ifpartannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}} | |
\def\blx@imc@ifpartannotation@iii#1#2[#3]#4#5{% | |
\ifstrempty{#3} | |
{\def\blx@tempc{\the\value{listcount}}} | |
{\def\blx@tempc{#3}}% | |
\def\blx@tempd{#1}% | |
\blx@resolve@annotation@label{\blx@tempd}% | |
\ifinlistcs{#5}{abx@annotation@part@\blx@tempd @#2@\blx@tempc @#4}} | |
% [<field>][<annotationname>] | |
\def\blx@imc@hasfieldannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@hasfieldannotation@i} | |
{\blx@imc@hasfieldannotation@i[\blx@tempa]}} | |
\def\blx@imc@hasfieldannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@hasfieldannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@hasfieldannotation@ii{#1}} | |
{\blx@imc@hasfieldannotation@ii{#1}[default]}}} | |
\def\blx@imc@hasfieldannotation@ii#1[#2]{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\def\blx@tempc{#1}% | |
\blx@resolve@annotation@label{\blx@tempc}% | |
\ifcsdef{abx@annotation@literal@field@\blx@tempc @\blx@tempb}} | |
% [<field>][<annotationname>][<item>] | |
\def\blx@imc@hasitemannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@hasitemannotation@i} | |
{\blx@imc@hasitemannotation@i[\blx@tempa]}} | |
\def\blx@imc@hasitemannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@hasitemannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@hasitemannotation@ii{#1}} | |
{\blx@imc@hasitemannotation@ii{#1}[default]}}} | |
\def\blx@imc@hasitemannotation@ii#1[#2]{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\@ifnextchar[%] | |
{\blx@imc@hasitemannotation@iii{#1}{\blx@tempb}} | |
{\blx@imc@hasitemannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}} | |
\def\blx@imc@hasitemannotation@iii#1#2[#3]{% | |
\def\blx@tempc{#1}% | |
\blx@resolve@annotation@label{\blx@tempc}% | |
\ifcsdef{abx@annotation@literal@item@\blx@tempc @#2@#3}} | |
% [<field>][<annotationname>][<item>]{<part>} | |
\def\blx@imc@haspartannotation{% | |
\let\blx@tempa\@empty | |
\ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}% | |
\ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}% | |
\ifdefvoid\currentname{}{\let\blx@tempa\currentname}% | |
\@ifnextchar[%] | |
{\blx@imc@haspartannotation@i} | |
{\blx@imc@haspartannotation@i[\blx@tempa]}} | |
\def\blx@imc@haspartannotation@i[#1]{% | |
\ifstrempty{#1} | |
{\blx@imc@haspartannotation@i[\blx@tempa]} | |
{\@ifnextchar[%] | |
{\blx@imc@haspartannotation@ii{#1}} | |
{\blx@imc@haspartannotation@ii{#1}[default]}}} | |
\def\blx@imc@haspartannotation@ii#1[#2]{% | |
\ifstrempty{#2} | |
{\def\blx@tempb{default}} | |
{\def\blx@tempb{#2}}% | |
\@ifnextchar[%] | |
{\blx@imc@haspartannotation@iii{#1}{\blx@tempb}} | |
{\blx@imc@haspartannotation@iii{#1}{\blx@tempb}[\the\value{listcount}]}} | |
\def\blx@imc@haspartannotation@iii#1#2[#3]#4{% | |
\ifstrempty{#3} | |
{\def\blx@tempc{\the\value{listcount}}} | |
{\def\blx@tempc{#3}}% | |
\def\blx@tempd{#1}% | |
\blx@resolve@annotation@label{\blx@tempd}% | |
\ifcsdef{abx@annotation@literal@part@\blx@tempd @#2@\blx@tempc @#4}} | |
% labeldatesource has a slightly different format than other <field>sources | |
% that's one reason for a dedicated command, the other being that this command | |
% is probably only used in contexts where \currentfield is not defined, so | |
% the <datetype> argument is always required | |
% [<annotationname>]{<datetype>}{<annotation>} | |
\newcommand*{\blx@imc@ifdateannotation}[3][]{% | |
\ifblank{#1} | |
{\def\blx@tempa{default}} | |
{\def\blx@tempa{#1}}% | |
\def\blx@tempb{#2}% | |
\ifcsundef{abx@field@\blx@tempb source} | |
{}% | |
{\letcs\blx@tempa{abx@field@\blx@tempb source}% | |
\edef\blx@tempb{\blx@tempb date}}% | |
\ifinlistcs{#3}{abx@annotation@field@\blx@tempb @\blx@tempa}} | |
% [<annotationname>]{<datetype>} | |
\newcommand*{\blx@imc@hasdateannotation}[2][]{% | |
\ifblank{#1} | |
{\def\blx@tempa{default}} | |
{\def\blx@tempa{#1}}% | |
\def\blx@tempb{#2}% | |
\ifcsundef{abx@field@\blx@tempb source} | |
{}% | |
{\letcs\blx@tempa{abx@field@\blx@tempb source}% | |
\edef\blx@tempb{\blx@tempb date}}% | |
\ifboolexpr { test {\ifcsdef{abx@annotation@field@\blx@tempb @\blx@tempa}} | |
or | |
test {\ifcsdef{abx@annotation@literal@field@\blx@tempb @\blx@tempa}} }} | |
% [<annotationname>]{<datetype>} | |
\newcommand*{\blx@imc@getdateannotation}[2][]{% | |
\ifblank{#1} | |
{\def\blx@tempa{default}} | |
{\def\blx@tempa{#1}}% | |
\def\blx@tempb{#1}% | |
\ifcsundef{abx@field@\blx@tempb source} | |
{}% | |
{\letcs\blx@tempb{abx@field@\blx@tempb source}% | |
\edef\blx@tempb{\blx@tempb date}}% | |
\ifcsdef{abx@annotation@literal@field@\blx@tempb @\blx@tempa} | |
{\csuse{abx@annotation@literal@field@\blx@tempb @\blx@tempa}} | |
{}} | |
\blx@regimcs{\iffieldannotation \ifitemannotation \ifpartannotation | |
\ifdateannotation \getfieldannotation \getitemannotation \getpartannotation | |
\getdateannotation \hasfieldannotation \hasitemannotation \haspartannotation | |
\hasdateannotation} | |
% {<fieldname>} | |
\def\blx@resolve@annotation@label#1{% | |
\ifcsundef{abx@field@#1source} | |
{}% | |
{\letcs\blx@tempa{abx@field@#1source}}} | |
\begingroup | |
\catcode`\<=12 | |
\catcode`\>=12 | |
\uccode`\<=`\ % | |
\uccode`\>=\endlinechar | |
\uppercase{\gdef\blx@bbl@verbadd@i<#1>}{% | |
\endgroup | |
\edef\NewValue{\NewValue\detokenize{#1}}} | |
\uppercase{\gdef\blx@bbl@verbladd@i<#1>}{% | |
\endgroup | |
\eappto\blx@tempc{{\detokenize{#1}}}}% | |
\endgroup | |
% {<counter>}{<value>} | |
\protected\long\def\blx@bbl@cntdef#1#2{% | |
\csxappto\blx@bbl@data{% | |
\csname c@#1\endcsname#2\relax}} | |
% {<boolean>} | |
\protected\def\blx@bbl@booltrue#1{% | |
\csgappto\blx@bbl@data{% | |
\toggletrue{abx@bool@#1}}} | |
\protected\def\blx@bbl@boolfalse#1{% | |
\csgappto\blx@bbl@data{% | |
\togglefalse{abx@bool@#1}}} | |
% {<list>}{<itemcount>}{<value>} | |
\protected\def\blx@bbl@listdef#1#2#3{% | |
\def\NewCount{#2}% | |
\def\NewValue{#3}% | |
\ifcsdef{blx@lih@#1} | |
{\csname blx@lih@#1\endcsname{#3}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\csxappto\blx@bbl@data{% | |
\csname c@#1\endcsname\NewCount\relax | |
\def\expandafter\noexpand\csname abx@list@#1\endcsname | |
{\expandonce\NewValue}}}} | |
% {<name>}{<itemcount>}{<nameoptions>}{<value>} | |
\protected\def\blx@bbl@namedef#1#2#3#4{% | |
\def\NewCount{#2}% | |
\def\NewOption{#3}% | |
\def\NewValue{#4}% | |
\ifcsdef{blx@nih@#1} | |
{\csname blx@nih@#1\endcsname{#4}% | |
\ifdefvoid\NewValue} | |
{\@secondoftwo} | |
{} | |
{\csxappto\blx@bbl@data{% | |
\csname c@#1\endcsname\NewCount\relax | |
\def\expandafter\noexpand\csname abx@name@#1\endcsname | |
{{\expandonce\NewOption}{\expandonce\NewValue}}}}} | |
% blx@setp@<rs>@<sp> = map of set parent <sp> in a refsection <rs> to csv | |
% of set children | |
% blx@seti@<rs>@<sc> = position of set child <sc> in entry set in | |
% refsection <rs> | |
% blx@setc@<rs>@<sc> = map of set child <sc> in refsection <rs> to set parent | |
% {<entrykey>,...} | |
\protected\def\blx@bbl@set#1{% | |
\blx@bbl@fieldedef{entryset}{\detokenize{#1}}% | |
\csxdef{blx@setp@\the\c@refsection @\abx@field@entrykey}{\detokenize{#1}}% | |
\begingroup | |
\blx@tempcnta\z@ | |
\expandafter\forcsvlist | |
\expandafter\blx@bbl@set@i | |
\expandafter{\detokenize{#1}}% | |
\endgroup} | |
\def\blx@bbl@set@i#1{% | |
\advance\blx@tempcnta\@ne | |
\csxdef{blx@seti@\the\c@refsection @#1}{\the\blx@tempcnta}} | |
% {<entrykey>} | |
\protected\def\blx@bbl@inset#1{% | |
\toggletrue{blx@setonly}% | |
\blx@bbl@fieldedef{entryset}{\detokenize{#1}}% | |
\csxdef{blx@setc@\the\c@refsection @\abx@field@entrykey}{\detokenize{#1}}} | |
% {<entrykey>} | |
\protected\def\blx@bbl@xref#1{}% No-op to avoid an error with BibTeX .bbl | |
\protected\def\blx@bbl@fakeset#1{}% No-op to avoid an error with BibTeX .bbl | |
% {<keyword>,...} | |
\protected\def\blx@bbl@keyw#1{% | |
\forcsvlist{\blx@addkeyword{\abx@field@entrykey}}{#1}% | |
\blx@bbl@fielddef{keywords}{#1}} | |
\def\blx@addkeyword#1#2{% | |
\listcsxadd{blx@keyw@\the\c@refsection @\detokenize{#2}}{#1}} | |
\newcommand*{\blx@ifcatcode@other}[1]{% | |
\ifnumequal{\catcode\number`#1}{12}} | |
% {<options>} | |
\protected\long\def\blx@bbl@options#1{% | |
\ifblank{#1} | |
{} | |
{\begingroup | |
\blx@ifcatcode@other{,} | |
{\blx@ifcatcode@other{=}} | |
{\@secondoftwo} | |
{\blx@bbl@options@check{#1}} | |
{\ifundef\blx@bbl@options@warncatcode | |
{\blx@warning@noline{% | |
Irregular catcode regime detected.\MessageBreak | |
Attempting to work around this with \string\scantokens}% | |
\global\let\blx@bbl@options@warncatcode\@empty} | |
{}% | |
\makeatletter | |
\@makeother\= | |
\@makeother\' | |
\endlinechar\m@ne | |
\scantokens\expandafter{\blx@bbl@options@check{#1}}}}} | |
\long\def\blx@bbl@options@check#1{% | |
\let\blx@tempa\@empty | |
\forcsvlist\blx@bbl@options@checkopt{#1}% | |
\edef\blx@tempa{% | |
\endgroup % this group was opened in \blx@bbl@options | |
\ifx\blx@tempa\@empty | |
\else | |
\def\noexpand\abx@field@options{\expandonce\blx@tempa}% | |
\fi}% | |
\blx@tempa} | |
\long\def\blx@bbl@options@checkopt#1{\blx@bbl@options@checkopt@i#1==&} | |
\long\def\blx@bbl@options@checkopt@i#1=#2=#3&{% | |
\blx@kv@ifkeyundef{blx@opt@ent}{#1} | |
{\blx@warning@noline{% | |
Ignoring undefined option '#1'\MessageBreak | |
at entry '\abx@field@entrykey'}} | |
{\eappto\blx@tempa{% | |
\ifx\blx@tempa\@empty\else,\fi | |
\unexpanded{#1}\ifblank{#2}{}{=\unexpanded{#2}}}}} | |
\def\blx@ifdata#1{% | |
\ifcsdef{blx@data@\the\c@refsection @\blx@refcontext@context @#1}} | |
\let\blx@imc@ifentryinbib\blx@ifdata | |
\def\blx@getdata#1{% | |
\csuse{blx@data@\the\c@refsection @\blx@refcontext@context @#1}% | |
\blx@adjustyears | |
\blx@getlabeldata | |
\blx@aliasfields | |
\blx@setcitecounter} | |
\def\blx@adjustyears{% | |
% All dates by default are output from biber in astronomical era with a year 0 | |
% So, if we are ouputting BCE/BC era, we need to adjust the years by +1 | |
\def\do##1{% | |
\ifdefstring\blx@dateera{astronomical} | |
{} | |
{\ifcsdef{abx@field@##1year} | |
{\csuse{if##1dateera}{bce} | |
{\csedef{abx@field@##1year}{\number\numexpr\csuse{abx@field@##1year}+1}} | |
{}} | |
{}% | |
\ifcsdef{abx@field@##1endyear} | |
{\csuse{if##1enddateera}{bce} | |
{\csedef{abx@field@##1endyear}{\number\numexpr\csuse{abx@field@##1endyear}+1}} | |
{}} | |
{}}% | |
{}}% | |
\abx@dodatetypes} | |
\def\blx@getlabeldata{% | |
% Here we resolve label* bib fields to their real fields. In fact, currently biber resolves | |
% the label* fields too, as it needs to do this to generate various internal | |
% counters for tracking things like singletitle etc. internally. However, it does not output | |
% the resolved values to the .bbl. It is conceptually neater to have just the calculated label* | |
% source field in the .bbl and let biblatex resolve the label* field using the label*source | |
% fields. However, currently there is no way/need to vary the label* resolution to pick up a | |
% different target field in biblatex and so practically, this resolution is being done twice, | |
% once by biber, once by biblatex. It is possible in the future that it would be useful to | |
% to change the resolution of the label* fields dynamically in a style/document and so this | |
% biblatex-side resolution remains. | |
% | |
% An unanswered question is whether such dynamic resolution causes problems due to the fact | |
% that biber uses the label* field to generate counters internally and changing the | |
% label* field resolution in biblatex would occur after such counters have been used to | |
% generate the .bbl | |
% This could all be removed from biblatex if necessary and biber could output all resolved | |
% label* fields to the .bbl but then it potentially removes control of such things from | |
% macros | |
% | |
% fields | |
\def\do##1{% | |
\ifcsundef{abx@field@##1source} | |
{}% | |
{\csletcs{abx@field@##1}{abx@field@\csuse{abx@field@##1source}}}}% | |
\dolistloop\abx@rfields% | |
% names | |
\def\do##1{% | |
\ifcsundef{abx@field@##1source} | |
{} | |
{\csname c@##1\expandafter\endcsname\expandafter | |
\the\csname c@\csuse{abx@field@##1source}\endcsname | |
\csletcs{abx@name@##1}{abx@name@\csuse{abx@field@##1source}}% | |
\csletcs{etb@tgl@abx@bool@more##1}{% | |
etb@tgl@abx@bool@more\csuse{abx@field@##1source}}}}% | |
\dolistloop\abx@rnames% | |
% Resolve labeldate | |
% Note that here we can't refer to labelyear as this is where we create it, hence the | |
% complications in constructing test names etc. | |
% This also shows why biber shouldn't resolve labeldate fields as we have to add | |
% circa/uncertain/era etc. information to them and that has to be done here. | |
\ifundef\abx@field@labeldatesource | |
{} | |
{\ifcsundef{abx@field@\abx@field@labeldatesource year} | |
% \DeclareLabeldate resolved to a literal/localisation string or a non-date field | |
% in which case we only set labelyear. | |
{\ifcsundef{abx@field@\abx@field@labeldatesource} | |
% \DeclareLabeldate resolved to a literal/localisation string | |
{\let\abx@field@labelyear\abx@field@labeldatesource} | |
% \DeclareLabeldate resolved to a non-date field. Not safe to \edef because | |
% such contents could contain arbitrary macros, unlike EDTF sourced labeldatesource values | |
{\letcs\abx@field@labelyear{abx@field@\abx@field@labeldatesource}}} | |
% \DeclareLabeldate resolved to a date field name prefix like '', 'event', 'url' | |
% or 'orig' | |
{% labeldateera/labelenddateera | |
\letcs\abx@field@labeldateera{abx@field@\abx@field@labeldatesource dateera}% | |
\letcs\abx@field@labelenddateera{abx@field@\abx@field@labeldatesource enddateera}% | |
\letcs\abx@field@labelyear{abx@field@\abx@field@labeldatesource year}% | |
\letcs\abx@field@labelendyear{abx@field@\abx@field@labeldatesource endyear}% | |
\letcs\abx@field@labelmonth{abx@field@\abx@field@labeldatesource month}% | |
\letcs\abx@field@labelendmonth{abx@field@\abx@field@labeldatesource endmonth}% | |
\letcs\abx@field@labelday{abx@field@\abx@field@labeldatesource day}% | |
\letcs\abx@field@labelendday{abx@field@\abx@field@labeldatesource endday}% | |
\letcs\abx@field@labelhour{abx@field@\abx@field@labeldatesource hour}% | |
\letcs\abx@field@labelendhour{abx@field@\abx@field@labeldatesource endhour}% | |
\letcs\abx@field@labelminute{abx@field@\abx@field@labeldatesource minute}% | |
\letcs\abx@field@labelendminute{abx@field@\abx@field@labeldatesource endminute}% | |
\letcs\abx@field@labelsecond{abx@field@\abx@field@labeldatesource second}% | |
\letcs\abx@field@labelendsecond{abx@field@\abx@field@labeldatesource endsecond}% | |
\letcs\abx@field@labeltimezone{abx@field@\abx@field@labeldatesource timezone}% | |
\letcs\abx@field@labelendtimezone{abx@field@\abx@field@labeldatesource endtimezone}% | |
\letcs\abx@field@labelseason{abx@field@\abx@field@labeldatesource season}% | |
\letcs\abx@field@labelendseason{abx@field@\abx@field@labeldatesource endseason}% | |
\letcs\abx@field@labeldateunspecified{abx@field@\abx@field@labeldatesource dateunspecified}% | |
\letcs\etb@tgl@abx@bool@labeldatecirca{etb@tgl@abx@bool@\abx@field@labeldatesource datecirca}% | |
\letcs\etb@tgl@abx@bool@labelenddatecirca{etb@tgl@abx@bool@\abx@field@labeldatesource enddatecirca}% | |
\letcs\etb@tgl@abx@bool@labeldatejulian{etb@tgl@abx@bool@\abx@field@labeldatesource datejulian}% | |
\letcs\etb@tgl@abx@bool@labelenddatejulian{etb@tgl@abx@bool@\abx@field@labeldatesource enddatejulian}% | |
\letcs\etb@tgl@abx@bool@labeldateuncertain{etb@tgl@abx@bool@\abx@field@labeldatesource dateuncertain}% | |
\letcs\etb@tgl@abx@bool@labelenddateuncertain{etb@tgl@abx@bool@\abx@field@labeldatesource enddateuncertain}% | |
\letcs\etb@tgl@abx@bool@labeldateunknown{etb@tgl@abx@bool@\abx@field@labeldatesource dateunknown}% | |
\letcs\etb@tgl@abx@bool@labelenddateunknown{etb@tgl@abx@bool@\abx@field@labeldatesource enddateunknown}% | |
}% | |
}% | |
} | |
% This gets the entry data for a citation | |
\def\blx@getdata@cite#1{% | |
\blx@getdata{#1}% | |
% Inject the relevant set parent fields like labelnumber/labelprefix into child | |
\ifcsdef{blx@setc@\the\c@refsection @#1} | |
{\blx@ifdata{#1} | |
{\def\abx@field@childentrykey{#1}%LEGACY(<3.8) | |
\let\abx@field@childentrytype\abx@field@entrytype %LEGACY(<3.8) | |
\begingroup | |
\expandafter\expandafter\expandafter\blx@getdata | |
\expandafter\expandafter\expandafter{% | |
\csname blx@setc@\the\c@refsection @#1\endcsname}% | |
\let\blx@tempa\@empty | |
% Inject labelnumber if it exists | |
\ifdef\abx@field@labelnumber | |
{\appto\blx@tempa{% | |
\def\noexpand\abx@field@labelnumber{% | |
\expandonce\abx@field@labelnumber}}} | |
{}% | |
% Inject labelprefix if it exists | |
\ifdef\abx@field@labelprefix | |
{\appto\blx@tempa{% | |
\def\noexpand\abx@field@labelprefix{% | |
\expandonce\abx@field@labelprefix}}} | |
{}% | |
% Inject labelalpha if it exists | |
\ifdef\abx@field@labelalpha | |
{\appto\blx@tempa{% | |
\def\noexpand\abx@field@labelalpha{% | |
\expandonce\abx@field@labelalpha}}} | |
{}% | |
% Inject extraalpha if it exists | |
\ifdef\abx@field@extraalpha | |
{\appto\blx@tempa{% | |
\def\noexpand\abx@field@extraalpha{% | |
\expandonce\abx@field@extraalpha}}} | |
{}% | |
% Perform the injection | |
\edef\blx@tempb{\endgroup\blx@tempa}% | |
\blx@tempb} | |
{}} | |
{}% | |
\ifcsdef{blx@seti@\the\c@refsection @#1} | |
{\letcs\abx@field@entrysetcount{blx@seti@\the\c@refsection @#1}} | |
{}} | |
\def\blx@execute{% | |
\blx@imc@thefield{execute}} | |
\def\blx@setoptions@entry{% | |
\blx@imc@iffieldundef{options} | |
{} | |
{\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@kv@setkeys{blx@opt@ent}{\abx@field@options}}% | |
\blx@tempa | |
\blx@checkoptions@entry}} | |
\def\blx@setoptions@type#1{% | |
\ifcsdef{blx@opts@type@#1} | |
{\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@kv@setkeys{blx@opt@typ}{\csuse{blx@opts@type@#1}}}% | |
\blx@tempa} | |
{}} | |
\def\blx@checkoptions@global{} | |
\def\blx@checkoptions@type{} | |
\def\blx@checkoptions@entry{} | |
\def\blx@entrysetcount{% | |
\ifdef\abx@field@entrykey | |
{\ifcsdef{blx@seti@\the\c@refsection @\abx@field@entrykey} | |
{\letcs\abx@field@entrysetcount{% | |
blx@seti@\the\c@refsection @\abx@field@entrykey}} | |
{}} | |
{}} | |
% {<section>} | |
\def\blx@bbl@refsection#1{% | |
\begingroup | |
\c@refsection#1\relax} | |
\def\blx@bbl@endrefsection{% | |
\iftoggle{blx@addset} | |
{\blx@addset | |
\global\togglefalse{blx@addset}} | |
{}% | |
\endgroup} | |
% {<entrykey>} | |
\protected\def\blx@bbl@missing#1{% | |
\listcsxadd{blx@miss@\the\c@refsection}{\detokenize{#1}}% | |
\blx@warning@noline{% | |
The following entry could not be found\MessageBreak | |
in the database% | |
\ifnumgreater\c@refsection\z@ | |
{ (refsection \the\c@refsection)} | |
{}:\MessageBreak | |
\detokenize{#1}\MessageBreak | |
Please verify the spelling and rerun\MessageBreak | |
LaTeX afterwards}} | |
% We create an alias resolving macro and also a list of aliases | |
% which we need to add to the .bcf. We need to resolve the aliases | |
% for internal use but we always want the aliases themselves in the .bcf | |
% so that biber can correctly use and resolve them too. | |
\protected\def\blx@bbl@keyalias#1#2{% | |
\csxdef{blx@keyalias@\the\c@refsection @#1}{\detokenize{#2}}% | |
\listcsgadd{blx@keyaliases@\the\c@refsection}{#1}} | |
% blx@dlist@list@<section>@<refcontext> - a list of list items in a refcontext in a | |
% section (for tracking bibliography lists, | |
% obeys skipbiblist) | |
% blx@dlist@entry@<section>@<list> - a list of normal entries in a list in a | |
% section (for tracking bibliographies, | |
% obeys skipbib) | |
% blx@dlist@centry@<section>@<list> - a list of normal entries in a list in a | |
% section (for tracking citations, | |
% obeys skipbib). Same as @entry@ but | |
% with added set children | |
% {<entrykey>}{<entrytype>}{<options>} | |
\protected\def\blx@bbl@entry#1#2#3{% | |
\begingroup | |
\edef\abx@field@entrykey{\detokenize{#1}}% | |
\blx@setoptions@type{#2}% | |
\blx@bbl@options{#3}% | |
\blx@setoptions@entry | |
\edef\blx@bbl@data{blx@data@\the\c@refsection @\blx@dlist@name @\abx@field@entrykey}% | |
\blx@bbl@addfield{entrykey}{\abx@field@entrykey}% | |
\listxadd\blx@entries{\abx@field@entrykey}% | |
\blx@bbl@addfield{entrytype}{#2}% | |
\csuse\blx@bbl@data | |
\blx@imc@iffieldundef{options} | |
{} | |
{\blx@bbl@fieldedef{options}{\expandonce\abx@field@options}}} | |
\protected\def\blx@bbl@endentry{% | |
\csuse\blx@bbl@data | |
\ifcsundef{blx@pref@\the\c@refsection @\abx@field@entrykey} | |
{} | |
{\blx@addpageref{\abx@field@entrykey}}% | |
\nottoggle{blx@setonly} | |
{} | |
{\global\toggletrue{blx@addset}% | |
\toggletrue{blx@skipbib}% | |
\toggletrue{blx@skipbiblist}% | |
\toggletrue{blx@skiplab}}% | |
\nottoggle{blx@skipbib} | |
{\expandafter\ifstrequal\expandafter{\blx@dlist@type}{entry} | |
{\listcsxadd{blx@dlist@entry@\the\c@refsection @\blx@dlist@name}{\abx@field@entrykey}% | |
\listcsxadd{blx@dlist@centry@\the\c@refsection @\blx@dlist@name}{\abx@field@entrykey}% | |
\listcsxadd{blx@type@\the\c@refsection @\abx@field@entrytype}{\abx@field@entrykey}% | |
\ifdef\abx@field@entrysubtype | |
{\listcsxadd{blx@subt@\the\c@refsection @\abx@field@entrysubtype}{\abx@field@entrykey}} | |
{}} | |
{}}% | |
{}% | |
\nottoggle{blx@skipbiblist} | |
{\expandafter\ifstrequal\expandafter{\blx@dlist@type}{list} | |
{\blx@bbl@labelfields | |
\listcsxadd{blx@dlist@\blx@dlist@type @\the\c@refsection @\blx@dlist@name}{\abx@field@entrykey}} | |
{}}% | |
{}% | |
\nottoggle{blx@skiplab} | |
{\iftoggle{blx@labelnumber} | |
{\blx@bbl@labelnumber} | |
{}% | |
\iftoggle{blx@labelalpha} | |
{\blx@bbl@labelalpha} | |
{}% | |
\iftoggle{blx@labeltitle} | |
{\blx@bbl@labeltitle} | |
{}% | |
\iftoggle{blx@labeltitleyear} | |
{\blx@bbl@labeltitleyear} | |
{}% | |
\iftoggle{blx@labeldateparts} | |
{\blx@bbl@labeldate} | |
{}% | |
\blx@bbl@labelname} | |
{}% | |
\blx@bbl@titles | |
\blx@bbl@hooks | |
\endgroup} | |
% This, at the end of the .bbl, puts any set parent children into the | |
% current context sort list of citations (a separate list *@centry@* to the | |
% bibliography *@entry@* which doesn't want the children adding if they weren't | |
% cited) as this is needed for the subentry citing | |
% when sortcites is enabled as for sortcites, the current context sorting list | |
% is used and the parent set of a subentry is not necessarily | |
% available in the current context sortlist. | |
\def\blx@addset{% | |
\begingroup | |
\ifcsdef{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context} | |
{\letcs\blx@tempa{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}% | |
\global\cslet{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}\@empty | |
\forlistloop\blx@addset@i\blx@tempa} | |
{\blx@warning@noline{Sorting template has changed}}% | |
\endgroup} | |
\def\blx@addset@i#1{% | |
\listcsgadd{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}{#1}% | |
\ifcsdef{blx@setp@\the\c@refsection @#1} | |
{\expandafter\expandafter\expandafter\forcsvlist | |
\expandafter\expandafter\expandafter\blx@addset@ii | |
\expandafter\expandafter\expandafter{% | |
\csname blx@setp@\the\c@refsection @#1\endcsname}} | |
{}} | |
\def\blx@addset@ii#1{% | |
\listcsgadd{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}{#1}} | |
% {<csname>}{<field>/<format>}{<field>} | |
\def\abx@flfw@getfieldformat#1#2#3{% | |
\blx@getformat\abx@tmp@theformat{ffd}{#2}{#3}% | |
\csletcs{#1}{abx@tmp@theformat}} | |
% {<instance (int)>}{<field>}{<length>} | |
\def\abx@aux@locallabelwidth#1#2#3{% | |
\csgdef{blx@locallabelwidth@#1@#2}{#3}} | |
\def\blx@locallabelwidth@write@length#1{% | |
\ifdimequal{\csname local#1width\endcsname}{0pt} | |
{} | |
{\blx@auxwrite\@mainaux{} | |
{\string\abx@aux@locallabelwidth | |
{\the\blx@biblioinstance}% | |
{#1}% | |
{\the\csname local#1width\endcsname}}}} | |
\def\blx@locallabelwidth@write{% | |
\let\do\blx@locallabelwidth@write@length | |
\abx@dolabelwidths} | |
\let\blx@locallabelwidth@finish\relax | |
\def\blx@labelwidth@resetlocal{% | |
\def\do##1{% | |
\csname local##1width\endcsname\z@}% | |
\abx@dolabelwidths} | |
\def\blx@labelwidth@settolocal@length#1{% | |
\ifcsundef{blx@locallabelwidth@\the\blx@biblioinstance @#1} | |
{} | |
{\csname #1width\endcsname | |
\csname blx@locallabelwidth@\the\blx@biblioinstance @#1\endcsname | |
\space}} | |
\def\blx@labelwidth@settolocal{% | |
\let\do\blx@labelwidth@settolocal@length | |
\abx@dolabelwidths} | |
\def\blx@locallabelwidth@setlengths{% | |
\global\advance\blx@biblioinstance\@ne | |
\blx@labelwidth@resetlocal | |
\blx@labelwidth@settolocal} | |
\let\blx@locallabelwidth@init\relax | |
% {<prefix for labelwidth fields>} | |
\def\blx@bbl@labelnumberwidth@numeric#1{% | |
\abx@flfw@getfieldformat{abx@flfw@labelnumberwidth}{labelnumberwidth}{}% | |
\abx@flfw@getfieldformat{abx@flfw@labelprefix}{labelprefix}{}% | |
\abx@flfw@getfieldformat{abx@flfw@labelnumber}{labelnumber}{}% | |
\iftoggle{blx@defernumbers} | |
{\ifundef\abx@field@localnumber | |
{\numdef\abx@field@localnumber{0}}% | |
{}} | |
{\ifundef\abx@field@localnumber | |
{\edef\abx@field@localnumber{% | |
\csuse{blx@labelnumber@\the\c@refsection}}} | |
{}}% | |
\blx@setlabwidth{\csname #1labelnumberwidth\endcsname}{% | |
\csuse{abx@flfw@labelnumberwidth}{% | |
\ifdef\abx@field@labelprefix | |
{\csuse{abx@flfw@labelprefix}{\abx@field@labelprefix}} | |
{}% | |
\csuse{abx@flfw@labelnumber}{\abx@field@localnumber}}}} | |
\def\blx@bbl@labelnumberwidth@shorthand#1{% | |
\abx@flfw@getfieldformat{abx@flfw@labelnumberwidth}{labelnumberwidth}{}% | |
\abx@flfw@getfieldformat{abx@flfw@labelnumber}{labelnumber}{}% | |
\blx@setlabwidth{\csname #1labelnumberwidth\endcsname}{% | |
\csuse{abx@flfw@labelnumberwidth}{% | |
\csuse{abx@flfw@labelnumber}{\abx@field@shorthand}}}} | |
\def\blx@bbl@locallabelnumberwidth{% | |
\ifdefempty\abx@field@localnumber | |
{} | |
{\ifundef\abx@field@shorthand | |
{\blx@bbl@labelnumberwidth@numeric{local}} | |
{\blx@bbl@labelnumberwidth@shorthand{local}}}} | |
% {<prefix for labelwidth fields>} | |
\def\blx@bbl@labelalphawidth#1{% | |
\abx@flfw@getfieldformat{abx@flfw@labelalphawidth}{labelalphawidth}{}% | |
\abx@flfw@getfieldformat{abx@flfw@labelprefix}{labelprefix}{}% | |
\abx@flfw@getfieldformat{abx@flfw@labelalpha}{labelalpha}{}% | |
\abx@flfw@getfieldformat{abx@flfw@extraalpha}{extraalpha}{}% | |
\blx@setlabwidth{\csname #1labelalphawidth\endcsname}{% | |
\csuse{abx@flfw@labelalphawidth}{% | |
\ifdef\abx@field@labelprefix | |
{\csuse{abx@flfw@labelprefix}{\abx@field@labelprefix}} | |
{}% | |
\csuse{abx@flfw@labelalpha}{\abx@field@labelalpha}% | |
\ifundef\abx@field@extraalpha | |
{} | |
{\csuse{abx@flfw@extraalpha}{\abx@field@extraalpha}}}}} | |
\def\blx@bbl@locallabelalphawidth{% | |
\ifundef\abx@field@labelalpha | |
{} | |
{\blx@bbl@labelalphawidth{local}}} | |
\def\blx@bbl@locallabelfields{\blx@bbl@labelfields@i{local}} | |
\def\blx@bbl@labelfields{\blx@bbl@labelfields@i{}} | |
% {<prefix for labelwidth fields>} | |
\def\blx@bbl@labelfields@i#1{% | |
\def\do##1{% | |
\ifcsundef{abx@field@##1} | |
{} | |
{\abx@flfw@getfieldformat{abx@flfw@##1width}{##1width}{##1}% | |
\blx@setlabwidth{\csname #1##1width\endcsname}{% | |
\csuse{abx@flfw@##1width}{\csname abx@field@##1\endcsname}}}}% | |
\abx@dolabelfields} | |
\def\blx@bbl@labelnumber{% | |
% Used at endentry, when reading .bbl | |
% only do this for the global sorting list otherwise we increment | |
% the labelnumbers for each sortlist | |
\ifdefempty\abx@field@localnumber | |
{}% only if omitnumbers=true | |
{\ifundef\abx@field@shorthand | |
{\iftoggle{blx@defernumbers} | |
% only if defernumbers=true, we have to define localnumber to | |
% something to stop labelnumberwidth def complaining on first | |
% post-backend run since there will be nothing in the .aux yet | |
% for defernums localnumbers. On the second post-backend run, | |
% it will have a value correct for generating labelnumberwidth | |
% We also have to define a dummy value for labelnumber here for | |
% first post-backend runs otherwise references to labelnumber | |
% in cite styles like numeric-comp will die. | |
{\ifundef\abx@field@localnumber | |
{\numdef\abx@field@localnumber{0}% | |
\blx@bbl@fielddef{labelnumber}{0}}% | |
{}} | |
{\csnumgdef{blx@labelnumber@\the\c@refsection}{% | |
\csuse{blx@labelnumber@\the\c@refsection}+1}% | |
\edef\abx@field@localnumber{% | |
\csuse{blx@labelnumber@\the\c@refsection}}% | |
\blx@bbl@fieldedef{labelnumber}{\abx@field@localnumber}}% | |
\iftoggle{blx@skipbib} | |
{} | |
{\blx@bbl@labelnumberwidth@numeric{}}} | |
{\csgappto\blx@bbl@data{\let\abx@field@labelnumber\abx@field@shorthand}% | |
\iftoggle{blx@skipbib} | |
{} | |
{\blx@bbl@labelnumberwidth@shorthand{}}}}} | |
\def\blx@bbl@labelalpha{% | |
\ifundef\abx@field@labelalpha | |
{} | |
{\ifundef\abx@field@extraalpha | |
{} | |
{\ifnum\abx@field@extraalpha>\c@maxextraalpha | |
\global\c@maxextraalpha\abx@field@extraalpha\relax | |
\fi}% | |
\iftoggle{blx@skipbib} | |
{} | |
{\blx@bbl@labelalphawidth{}}}} | |
\def\blx@bbl@labeltitle{% | |
\ifundef\abx@field@extratitle | |
{} | |
{\ifnum\abx@field@extratitle>\c@maxextratitle | |
\global\c@maxextratitle\abx@field@extratitle\relax | |
\fi}} | |
\def\blx@bbl@labeltitleyear{% | |
\ifundef\abx@field@extratitleyear | |
{} | |
{\ifnum\abx@field@extratitleyear>\c@maxextratitleyear | |
\global\c@maxextratitleyear\abx@field@extratitleyear\relax | |
\fi}} | |
\def\blx@bbl@labelname{% | |
\ifundef\abx@field@extraname | |
{} | |
{\ifnum\abx@field@extraname>\c@maxextraname | |
\global\c@maxextraname\abx@field@extraname\relax | |
\fi}} | |
\def\blx@bbl@labeldate{% | |
\ifundef\abx@field@extradate | |
{} | |
{\ifnum\abx@field@extradate>\c@maxextradate | |
\global\c@maxextradate\abx@field@extradate\relax | |
\fi}} | |
\def\blx@bbl@titles{% | |
\ifundef\abx@field@indextitle | |
{\csgappto\blx@bbl@data{% | |
\let\abx@field@indextitle\abx@field@title}} | |
{}% | |
\ifundef\abx@field@indexsorttitle | |
{\csgappto\blx@bbl@data{% | |
\let\abx@field@indexsorttitle\abx@field@indextitle}} | |
{}} | |
\def\blx@bbl@hooks{% | |
\ifcsundef{blx@hook@bblitem@*} | |
{\ifcsundef{blx@hook@bblitem@\abx@field@entrytype} | |
{} | |
{\csuse\blx@bbl@data | |
\csuse{blx@hook@bblitem@\abx@field@entrytype}}} | |
{\csuse\blx@bbl@data | |
\csuse{blx@hook@bblitem@*}% | |
\csuse{blx@hook@bblitem@\abx@field@entrytype}}} | |
\newrobustcmd*{\AtDataInput}[1][*]{\csgappto{blx@hook@bblitem@#1}} | |
\@onlypreamble\AtDataInput | |
\def\blx@setlabwidth#1#2{% | |
\begingroup | |
\settowidth{\@tempdima}{\bibfont#2}% | |
\ifnum\@tempdima>#1% | |
\global#1\@tempdima | |
\fi | |
\endgroup} | |
\def\blx@bblstart{% | |
\let\preamble\blx@bbl@preamble | |
\let\warn\blx@bbl@thewarn | |
\let\refsection\blx@bbl@refsection | |
\let\endrefsection\blx@bbl@endrefsection | |
\let\entry\blx@bbl@entry | |
\let\endentry\blx@bbl@endentry | |
\let\missing\blx@bbl@missing | |
\let\keyalias\blx@bbl@keyalias | |
\let\datalist\blx@bbl@dlist | |
\let\enddatalist\blx@bbl@enddlist | |
\let\set\blx@bbl@set | |
\let\inset\blx@bbl@inset | |
\let\fakeset\blx@bbl@fakeset % A No-op for Biber | |
\let\xref\blx@bbl@xref % A No-op for Biber | |
\let\keyw\blx@bbl@keyw | |
\let\name\blx@bbl@namedef | |
\let\list\blx@bbl@listdef | |
\let\field\blx@bbl@fielddef | |
\let\range\blx@bbl@rangedef | |
\let\strng\blx@bbl@stringdef | |
\let\cnt\blx@bbl@cntdef | |
\let\true\blx@bbl@booltrue | |
\let\false\blx@bbl@boolfalse | |
\let\verb\blx@bbl@verbdef | |
\let\endverb\blx@bbl@verbend | |
\let\lverb\blx@bbl@verbldef | |
\let\endlverb\blx@bbl@verblend | |
\let\annotation\blx@bbl@annotationdef} | |
\def\blx@bblend{% | |
% Special warning for defernumbers when a citation cannot be found | |
\iftoggle{blx@defernumbers} | |
{\def\do##1{\ifinlist{##1}\blx@entries | |
{} | |
{\blx@warning@noline{% | |
citation '##1' was not found at all in the .bbl, bibliography labels cannot be generated, please correct the citation}}}% | |
\dolistloop\blx@lastcites} | |
{}} | |
% {<entrykey>} | |
% Get the saved information on which citations were mentioned last run | |
\protected\def\abx@aux@cite#1{% | |
\xifinlist{\detokenize{#1}}\blx@lastcites | |
{} | |
{\listxadd\blx@lastcites{\detokenize{#1}}}} | |
% {<refcontext>} | |
% Get the saved information on which refcontexts were mentioned last run | |
\protected\def\abx@aux@refcontext#1{% | |
\xifinlist{\detokenize{#1}}\blx@lastrefcontexts | |
{} | |
{\listxadd\blx@lastrefcontexts{\detokenize{#1}}}} | |
% {<sortingtemplatename>} | |
% Get the saved information on which shorthand sorting templates were mentioned last run | |
\protected\def\abx@aux@biblist#1{% | |
\ifinlist{#1}\blx@lastbiblists | |
{} | |
{\listgadd\blx@lastbiblists{#1}}} | |
% Here we mustn't change the checksum if we used localnumbers from the | |
% .aux file as this means that deferred numbering is | |
% complete. Otherwise we get in an endless rerun loop because the | |
% checksum due to number changes is always different. | |
\AtEndDocument{% | |
\def\abx@aux@number#1#2#3#4#5{% | |
\ifblank{#5} | |
{} | |
{\nottoggle{blx@localnumber} | |
{\blx@addchecksum{#1}{#5}} | |
{}}}} | |
\AtEndDocument{% | |
% Here we run some tests to decide if we need to issue re-run | |
% messages in certain circumstances. In general, if we add/remove | |
% any citations or add/remove any sorting templates, we need to re-run | |
% biber. Also, if we have to re-run biber, we need to defer writing | |
% the defernumbers .aux information because it will not yet be correct. | |
% Test to see if we *removed* any citations since last run | |
% (adding citations is dealt with naturally in \blx@citation@entry) | |
% If so, give a rerun biber message. This also sets the | |
% rerun biber toggle so defernums doesn't consume the localnumbers | |
% in the .aux but instead, re-writes them, which is what we need. | |
\begingroup | |
\def\do#1{\ifinlist{#1}\blx@cites{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@lastcites | |
% Special case - if we are using sortingtemplate with \citeorder anywhere, | |
% then changes in citation order matter and we need to re-run biber. | |
% So a special test to see if the cites from last run are identical in order. | |
% We have already tested for more or less cites between runs by now, we are | |
% testing here for exactly the same cites by treating the cite and | |
% lastcite lists as strings and comparing them. This doesn't apply | |
% to biblist sortingtemplates as nobody wants to sort biblists with | |
% "none", since it makes no sense | |
\togglefalse{blx@tempa}% | |
\def\do#1{% | |
\ifcsundef{blx@sortingtemplate@citeorder@relevant@#1} | |
{} | |
{\toggletrue{blx@tempa}% | |
\listbreak}}% | |
\dolistloop\blx@sortingtemplatenames | |
\iftoggle{blx@tempa} | |
{\ifdefstrequal{\blx@cites}{\blx@lastcites} | |
{} | |
{\blx@logreq@active{}}} | |
{}% | |
% Test if we removed any mention of a reference context since last run | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@refcontexts{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@lastrefcontexts | |
% Test if we added any mention of a reference context since last run | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@lastrefcontexts{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@refcontexts | |
% Test if we removed any mention of a biblist since last run. | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@biblists{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@lastbiblists | |
% Test to see if we added any mention of a biblist since last run. | |
% If we did, we need to re-run biber | |
\def\do#1{\ifinlist{#1}\blx@lastbiblists{}{\blx@logreq@active{}}\relax}% | |
\dolistloop\blx@biblists | |
% If we have to run biber or latex again and we are using defernumbers, | |
% don't write the localnumber information to the .aux file yet as we will | |
% potentially have to regenerate sorting order first in biber | |
\iftoggle{blx@defernumbers} | |
{\iftoggle{blx@runbiber} | |
{} | |
{\def\do#1{\blx@auxwrite\@mainaux{}{#1}} | |
\dolistloop\blx@localnumaux}} | |
{}% | |
% Write out missing languages we still need to load | |
\forlistloop{\blx@lbx@writeloaderequest}{\blx@lbx@loadlist}% | |
% Issue rerun warning if we need to load a language babel/polyglossia | |
% hasn't told us about and that we are not loading it already from previous | |
% runs. | |
\def\do#1{\xifinlist{#1}{\blx@lbx@auxloadlist}{}{\blx@rerun@latex\listbreak}}% | |
\dolistloop\blx@lbx@loadlist | |
% Write md5 hash of .bbl to .aux if we need a Biber rerun. | |
% This needs to happen here and not in \blx@check@rerun together with | |
% the other rerun stuff, because \AfterEndDocument would be too | |
% late for .aux file writing. | |
\blx@aux@write@bbl@mdfivesum | |
\endgroup} | |
% {<instcount>}{<entrykey>}{<refsection>}{<refcontext>}{<labelnumber>} | |
\protected\def\blx@aux@number#1#2#3#4#5{% | |
\blx@bbl@addentryfield{\detokenize{#2}}{#3}{localnumber}{#4}{#5}% | |
\blx@bbl@addentryfield{\detokenize{#2}}{#3}{labelnumber}{#4}{#5}% | |
\global\toggletrue{blx@localnumber}% | |
\ifblank{#5} | |
{} | |
{\csgdef{blx@labelnumber@#3}{#5}}} | |
% Called as part of bib output for an entry | |
% Only used when defernumbers=true | |
\def\blx@addlabelnumber{% | |
\begingroup | |
\nottoggle{blx@skiplab} | |
{\iftoggle{blx@labelnumber} | |
{\ifundef\abx@field@shorthand | |
% Need to know if we set any localnumber from .aux file, not | |
% just current item. Otherwise, we may just write new | |
% localnumbers but not existing ones | |
% Also, don't want to regenerate localnumber for any key in a | |
% refsection which we've already seen because this has the nasty | |
% side-effect of incrementing the localnum counter | |
{\ifboolexpr { not togl {blx@localnumber} | |
and | |
not test {\ifcsdef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}} } | |
{\iftoggle{blx@omitnumbers} | |
{\let\abx@field@localnumber\@empty} | |
{\csnumgdef{blx@labelnumber@\the\c@refsection}{% | |
\csuse{blx@labelnumber@\the\c@refsection}+1}% | |
\edef\abx@field@localnumber{% | |
\csuse{blx@labelnumber@\the\c@refsection}}% | |
\blx@bbl@addentryfield{\abx@field@entrykey}{\the\c@refsection}% | |
{localnumber}{\blx@refcontext@context}{\abx@field@localnumber}}} | |
{}% | |
% If localnumbers were already in the .aux, add them | |
% again from the .aux. This prevents some cycling | |
% problems where pagebreaks change after localnumber | |
% settles down and then we need another run which then | |
% regenerates localnumber requiring another run but then | |
% the pagebreaks change back again ... etc. | |
\ifcsundef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey} | |
{\ifundef\abx@field@localnumber | |
{} | |
{\listxadd\blx@localnumaux{% | |
\string\abx@aux@number% | |
{\the\c@instcount}% | |
{\abx@field@entrykey}% | |
{\the\c@refsection}% | |
{\blx@refcontext@context}% | |
{\abx@field@localnumber}}% | |
% record that we have already generated and output localnum | |
% for this key in this refsection/refcontext | |
\global\cslet{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}\@empty}} | |
{}} | |
{}}% | |
{}} | |
{}% | |
\endgroup} | |
% {<datalistname>} | |
\def\blx@bbl@dlist[#1]#2{% | |
\begingroup | |
\def\blx@dlist@type{#1}% | |
\def\blx@dlist@name{#2}} | |
\def\blx@bbl@enddlist{% | |
\csnumgdef{blx@labelnumber@\the\c@refsection}{0}% | |
\endgroup} | |
\def\blx@addpageref#1{% | |
\begingroup | |
\blx@tempcnta\z@ | |
\let\blx@tempa\@empty | |
\def\do##1{% | |
\appto\blx@tempa{{##1}}% | |
\advance\blx@tempcnta\@ne}% | |
\dolistcsloop{blx@pref@\the\c@refsection @#1}% | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@bbl@listdef{pageref}{\the\blx@tempcnta}{\expandonce{\blx@tempa}}}% | |
\blx@tempa} | |
%% Data input | |
\def\blx@bblinput{% | |
\begingroup | |
\blx@info@noline{Trying to load bibliographic data..}% | |
\blx@blxinit | |
\blx@bblfile | |
\endgroup} | |
\def\blx@bblfile{% | |
\blx@secinit | |
\begingroup | |
\blx@bblstart | |
\blx@ifsigned{\jobname}{bbl} | |
{\InputIfFileExists{\jobname.bbl} | |
{\blx@info@noline{... file '\jobname.bbl' found}% | |
\global\toggletrue{blx@bbldone}% | |
\blx@generate@bbl@mdfivesum@found} | |
{\blx@info@noline{... file '\jobname.bbl' not found}% | |
\typeout{No file \jobname.bbl.}% | |
% 'nobblfile' can never be equal to any mdfivehash | |
\blx@generate@bbl@mdfivesum@notfound}} | |
{\blx@generate@bbl@mdfivesum@notfound}% | |
\blx@bblend | |
\endgroup | |
% Check if Biber rerun was not carried out. | |
% If so, ask for it again. | |
\blx@check@bbl@rerun@mdfivesum | |
% global sorting as this is called at BeginDocument | |
\csnumgdef{blx@labelnumber@\the\c@refsection}{0}} | |
%% Bibliography | |
% {<name>}{<start code>}[<end code>]{<item code>} | |
\newrobustcmd*{\defbibenvironment}[4]{% | |
\long\csdef{blx@env@#1}{#2}% | |
\long\csdef{blx@endenv@#1}{#3}% | |
\long\csdef{blx@item@#1}{#4}} | |
\defbibenvironment{bibliography} | |
{\list{}{% | |
\leftmargin\bibhang | |
\itemindent-\leftmargin | |
\itemsep\bibitemsep | |
\parsep\bibparsep}} | |
{\endlist} | |
{\item} | |
\def\do#1{% | |
\defbibenvironment{#1} | |
{\list{\thefield{#1}}{% | |
\labelwidth\csname #1width\endcsname | |
\labelsep\biblabelsep | |
\leftmargin\labelwidth | |
\advance\leftmargin\labelsep | |
\itemsep\bibitemsep | |
\parsep\bibparsep | |
\def\makelabel####1{####1\hss}}} | |
{\endlist} | |
{\item}} | |
\abx@dolabelfields | |
% {<name>}[<default>]{<code>} | |
\newrobustcmd*{\defbibheading}[1]{% | |
\@ifnextchar[%] | |
{\blx@defbibheading{blx@head@#1}} | |
{\blx@defbibheading{blx@head@#1}[\bibname]}} | |
\def\blx@defbibheading#1[#2]{% | |
\csundef{#1}% | |
\expandafter\newcommand\csname#1\endcsname[1][{#2}]} | |
% {<name>}{<text>} | |
\newrobustcmd*{\defbibnote}[1]{% | |
\long\csdef{blx@note@#1}} | |
% {<name>}{<code>} | |
\newrobustcmd*{\defbibfilter}[2]{% | |
\begingroup | |
\def\blx@flt@error{\csname blx@flt@errortrue\endcsname}% | |
\let\not\blx@flt@not \let\NOT\not | |
\let\and\blx@flt@and \let\AND\and | |
\let\or\blx@flt@or \let\OR\or | |
\letcs\({blx@flt@(} \letcs\){blx@flt@)}% | |
\def\section##1{\blx@flt@error}% | |
\def\segment##1{segment=##1}% | |
\def\type##1{type=##1}% | |
\def\subtype##1{subtype=##1}% | |
\def\keyword##1{keyword={##1}}% | |
\def\category##1{category={##1}}% | |
\edef\blx@tempa{\noexpand\blx@defbibfilter{#2}}% | |
\ifdef\blx@flt@errortrue | |
{\blx@err@filter} | |
{\let\the\relax | |
\let\blx@flt@item\relax | |
\edef\blx@tempa{\blx@tempa}% | |
\ifdef\blx@flt@errortrue | |
{\blx@err@filter} | |
{\csxdef{blx@filter@#1}{\blx@tempa}}}% | |
\endgroup} | |
\def\blx@defbibfilter#1{% | |
\blx@defbibfilter@i#1 &} | |
\def\blx@defbibfilter@i#1 #2&{% | |
\blx@defbibfilter@ii#1==&% | |
\ifblank{#2}{}{\blx@defbibfilter@i#2 &}} | |
\def\blx@defbibfilter@ii#1=#2=#3&{% | |
\ifblank{#2} | |
{\ifblank{#1} | |
{} | |
{\ifcsdef{blx@flt@#1} | |
{\csname blx@flt@#1\endcsname} | |
{\blx@flt@error}}} | |
{\ifcsdef{blx@flt@#1} | |
{\csname blx@flt@#1\endcsname{\detokenize{#2}}} | |
{\blx@flt@error}}} | |
\def\blx@flt@and{ and } | |
\def\blx@flt@or{ or } | |
\def\blx@flt@not{ not } | |
\csdef{blx@flt@(}{ ( } | |
\csdef{blx@flt@)}{ ) } | |
\def\blx@flt@segment#1{% | |
test {\xifinlistcs\blx@flt@item{blx@segm@\the\c@refsection @#1}}} | |
\def\blx@flt@type#1{% | |
test {\xifinlistcs\blx@flt@item{blx@type@\the\c@refsection @#1}}} | |
\def\blx@flt@subtype#1{% | |
test {\xifinlistcs\blx@flt@item{blx@subt@\the\c@refsection @#1}}} | |
\def\blx@flt@keyword#1{% | |
test {\xifinlistcs\blx@flt@item{blx@keyw@\the\c@refsection @#1}}} | |
\def\blx@flt@category#1{% | |
test {\xifinlistcs\blx@flt@item{blx@catg@#1}}} | |
% {<name>}{<code>} | |
\newrobustcmd*{\defbibcheck}[2]{% | |
\csdef{blx@bibcheck@#1}{% | |
\togglefalse{blx@skipentry}% | |
\def\skipentry{\toggletrue{blx@skipentry}}% | |
#2\undef\skipentry}} | |
% options | |
% We need a 2-pass structure for options in \printbibliography and | |
% \printbiblist because the section has to be set before any | |
% other options and this partly determines which list to use for later filtering | |
\blx@kv@defkey{blx@bib1}{segment}{} | |
\blx@kv@defkey{blx@bib1}{type}{} | |
\blx@kv@defkey{blx@bib1}{nottype}{} | |
\blx@kv@defkey{blx@bib1}{subtype}{} | |
\blx@kv@defkey{blx@bib1}{notsubtype}{} | |
\blx@kv@defkey{blx@bib1}{keyword}{} | |
\blx@kv@defkey{blx@bib1}{notkeyword}{} | |
\blx@kv@defkey{blx@bib1}{category}{} | |
\blx@kv@defkey{blx@bib1}{notcategory}{} | |
\blx@kv@defkey{blx@bib1}{filter}{} | |
\blx@kv@defkey{blx@bib1}{check}{} | |
\blx@kv@defkey{blx@bib1}{heading}{} | |
\blx@kv@defkey{blx@bib1}{env}{} | |
\blx@kv@defkey{blx@bib1}{title}{} | |
\blx@kv@defkey{blx@bib1}{prenote}{} | |
\blx@kv@defkey{blx@bib1}{postnote}{} | |
\blx@kv@defkey{blx@bib1}{omitnumbers}[]{} | |
% Here we are using the first pass to see if there is an explicit setting for resetnumbers | |
% If there isn't we will use the default behaviour where if there is a labelprefix, | |
% resetnumbers will default to "true" | |
\blx@kv@defkey{blx@bib1}{resetnumbers}[true]{% | |
\toggletrue{blx@resetnumsexplicit}} | |
\blx@kv@defkey{blx@bib2}{section}{} | |
\blx@kv@defkey{blx@bib2}{sorting}{} | |
\blx@kv@defkey{blx@biblist1}{segment}{} | |
\blx@kv@defkey{blx@biblist1}{type}{} | |
\blx@kv@defkey{blx@biblist1}{nottype}{} | |
\blx@kv@defkey{blx@biblist1}{subtype}{} | |
\blx@kv@defkey{blx@biblist1}{notsubtype}{} | |
\blx@kv@defkey{blx@biblist1}{keyword}{} | |
\blx@kv@defkey{blx@biblist1}{notkeyword}{} | |
\blx@kv@defkey{blx@biblist1}{category}{} | |
\blx@kv@defkey{blx@biblist1}{notcategory}{} | |
\blx@kv@defkey{blx@biblist1}{filter}{} | |
\blx@kv@defkey{blx@biblist1}{check}{} | |
\blx@kv@defkey{blx@biblist1}{heading}{} | |
\blx@kv@defkey{blx@biblist1}{env}{} | |
\blx@kv@defkey{blx@biblist1}{title}{} | |
\blx@kv@defkey{blx@biblist1}{prenote}{} | |
\blx@kv@defkey{blx@biblist1}{postnote}{} | |
\blx@kv@defkey{blx@biblist2}{section}{} | |
\blx@kv@defkey{blx@biblist2}{sorting}{} | |
\blx@kv@defkey{blx@bib1}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax | |
\def\blx@tempe{#1}}} | |
\blx@kv@defkey{blx@biblist1}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax | |
\def\blx@tempe{#1}}} | |
\blx@kv@defkey{blx@bbg}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax}} | |
\blx@kv@defkey{blx@bbc}{section}{% | |
\ifcsundef{blx@sections@#1} | |
{\blx@err@nosec{#1}} | |
{\c@refsection#1\relax}} | |
\blx@kv@defkey{blx@bib2}{segment}{\blx@key@segment{#1}} | |
\blx@kv@defkey{blx@biblist2}{segment}{\blx@key@segment{#1}} | |
\def\blx@key@segment#1{% | |
\ifcsundef{blx@segm@\the\c@refsection @#1} | |
{\blx@warning{Segment '#1' not found in section '\the\c@refsection'}} | |
{\c@refsegment#1\relax | |
\blx@printbibchecks | |
\blx@filter\blx@tempa{blx@segm@\the\c@refsection @#1}}} | |
\blx@kv@defkey{blx@bib2}{type}{\blx@key@type{#1}} | |
\blx@kv@defkey{blx@biblist2}{type}{\blx@key@type{#1}} | |
\def\blx@key@type#1{% | |
\ifcsundef{blx@type@\the\c@refsection @#1} | |
{\blx@warning{Type '#1' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\iftoggle{blx@tempb} | |
{\togglefalse{blx@tempb}% | |
\blx@filter\blx@tempa{blx@type@\the\c@refsection @#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{'type' used multiple times} | |
{When passing multiple filter options, each entry\MessageBreak | |
must satisfy all conditions (AND conjunction),\MessageBreak | |
hence some options may not be used twice.\MessageBreak | |
Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}} | |
\blx@kv@defkey{blx@bib2}{nottype}{\blx@key@nottype{#1}} | |
\blx@kv@defkey{blx@biblist2}{nottype}{\blx@key@nottype{#1}} | |
\def\blx@key@nottype#1{% | |
\ifcsundef{blx@type@\the\c@refsection @#1} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@type@\the\c@refsection @#1}}} | |
\blx@kv@defkey{blx@bib2}{subtype}{\blx@key@subtype{#1}} | |
\blx@kv@defkey{blx@biblist2}{subtype}{\blx@key@subtype{#1}} | |
\def\blx@key@subtype#1{% | |
\ifcsundef{blx@subt@\the\c@refsection @#1} | |
{\blx@warning{Subtype '#1' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\iftoggle{blx@tempb} | |
{\togglefalse{blx@tempb}% | |
\blx@filter\blx@tempa{blx@subt@\the\c@refsection @#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{'subtype' used multiple times} | |
{When passing multiple filter options, each entry\MessageBreak | |
must satisfy all conditions (AND conjunction),\MessageBreak | |
hence some options may not be used twice.\MessageBreak | |
Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}} | |
\blx@kv@defkey{blx@bib2}{notsubtype}{\blx@key@notsubtype{#1}} | |
\blx@kv@defkey{blx@biblist2}{notsubtype}{\blx@key@notsubtype{#1}} | |
\def\blx@key@notsubtype#1{% | |
\ifcsundef{blx@subt@\the\c@refsection @#1} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@subt@\the\c@refsection @#1}}} | |
\blx@kv@defkey{blx@bib2}{keyword}{\blx@key@keyword{#1}} | |
\blx@kv@defkey{blx@biblist2}{keyword}{\blx@key@keyword{#1}} | |
\def\blx@key@keyword#1{% | |
\ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}} | |
{\blx@warning{Keyword '\detokenize{#1}' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\blx@filter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}} | |
\blx@kv@defkey{blx@bib2}{notkeyword}{\blx@key@notkeyword{#1}} | |
\blx@kv@defkey{blx@biblist2}{notkeyword}{\blx@key@notkeyword{#1}} | |
\def\blx@key@notkeyword#1{% | |
\ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}} | |
\blx@kv@defkey{blx@bib2}{category}{\blx@key@category{#1}} | |
\blx@kv@defkey{blx@biblist2}{category}{\blx@key@category{#1}} | |
\def\blx@key@category#1{% | |
\ifcsundef{blx@catg@\detokenize{#1}} | |
{\blx@warning{Category '\detokenize{#1}' not found}% | |
\let\blx@tempa\@empty} | |
{\blx@printbibchecks | |
\blx@filter\blx@tempa{blx@catg@\detokenize{#1}}}} | |
\blx@kv@defkey{blx@bib2}{notcategory}{\blx@key@notcategory{#1}} | |
\blx@kv@defkey{blx@biblist2}{notcategory}{\blx@key@notcategory{#1}} | |
\def\blx@key@notcategory#1{% | |
\ifcsundef{blx@catg@#1} | |
{} | |
{\blx@printbibchecks | |
\blx@notfilter\blx@tempa{blx@catg@#1}}} | |
\blx@kv@defkey{blx@bib2}{filter}{\blx@key@filter{#1}} | |
\blx@kv@defkey{blx@biblist2}{filter}{\blx@key@filter{#1}} | |
\def\blx@key@filter#1{% | |
\ifcsdef{blx@filter@#1} | |
{\blx@printbibchecks | |
\blx@bibfilter\blx@tempa{blx@filter@#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{Filter '#1' not found} | |
{The filter '#1' could not be found.\MessageBreak | |
Use \string\defbibfilter\space to define it}}} | |
\blx@kv@defkey{blx@bib2}{check}{\blx@key@bibcheck{#1}} | |
\blx@kv@defkey{blx@biblist2}{check}{\blx@key@bibcheck{#1}} | |
% empty bibcheck does nothing | |
\cslet{blx@bibcheck@}\relax | |
\def\blx@key@bibcheck#1{% | |
\ifcsdef{blx@bibcheck@#1} | |
{\letcs\blx@bibcheck{blx@bibcheck@#1}} | |
{\let\blx@tempa\@empty | |
\blx@error | |
{Check '#1' not found} | |
{The check '#1' could not be found.\MessageBreak | |
Use \string\defbibcheck\space to define it}}} | |
\def\blx@default@theheading{bibliography} | |
\blx@kv@defkey{blx@bibdefaults}{heading}{% | |
\blx@key@heading{\blx@default@theheading}{#1}} | |
\blx@kv@defkey{blx@bhd}{heading}{% | |
\blx@key@heading{\blx@theheading}{#1}} | |
\blx@kv@defkey{blx@bib2}{heading}{% | |
\blx@key@heading{\blx@theheading}{#1}} | |
\blx@kv@defkey{blx@biblist2}{heading}{% | |
\blx@key@heading{\blx@theheading}{#1}} | |
\blx@kv@defkey{blx@bbs}{heading}{% | |
\blx@key@heading{\blx@theheading}{#1}} | |
\blx@kv@defkey{blx@bbg}{heading}{% | |
\blx@key@heading{\blx@theheading}{#1}} | |
\def\blx@key@heading#1#2{% | |
\ifcsundef{blx@head@#2} | |
{\blx@error | |
{Heading '#2' not found} | |
{The heading '#2' could not be found.\MessageBreak | |
Use \string\defbibheading\space to define it}} | |
{\def#1{#2}}} | |
\def\blx@default@theenv{bibliography} | |
\blx@kv@defkey{blx@bibdefaults}{env}{% | |
\blx@key@env{\blx@default@theenv}{#1}} | |
\blx@kv@defkey{blx@bib2}{env}{\blx@key@env{\blx@theenv}{#1}} | |
\blx@kv@defkey{blx@biblist2}{env}{\blx@key@env{\blx@theenv}{#1}} | |
\blx@kv@defkey{blx@bbs}{env}{\blx@key@env{\blx@theenv}{#1}} | |
\blx@kv@defkey{blx@bbg}{env}{\blx@key@env{\blx@theenv}{#1}} | |
\blx@kv@defkey{blx@bbc}{env}{\blx@key@env{\blx@theenv}{#1}} | |
\def\blx@key@env#1#2{% | |
\ifcsundef{blx@env@#2} | |
{\blx@error | |
{Environment '#2' not found} | |
{The environment '#2' could not be found.\MessageBreak | |
Use \string\defbibenvironment\space to define it}} | |
{\def#1{#2}}} | |
\let\blx@default@thetitle\@empty | |
\blx@kv@defkey{blx@bibdefaults}{title}{% | |
\def\blx@default@thetitle{#1}} | |
\blx@kv@defkey{blx@bhd}{title}{\def\blx@thetitle{#1}} | |
\blx@kv@defkey{blx@bib2}{title}{\def\blx@thetitle{#1}} | |
\blx@kv@defkey{blx@biblist2}{title}{\def\blx@thetitle{#1}} | |
\cslet{blx@note@}\@empty | |
\def\blx@key@bibnote#1#2{% | |
\ifcsundef{blx@note@#2} | |
{\blx@error | |
{Note '#2' not found} | |
{The note '#2' could not be found.\MessageBreak | |
Use \string\defbibnote\space to define it}} | |
{\def#1{#2}}} | |
\let\blx@default@theprenote\@empty | |
\blx@kv@defkey{blx@bibdefaults}{prenote}{% | |
\blx@key@bibnote{\blx@default@theprenote}{#1}} | |
\blx@kv@defkey{blx@bib2}{prenote}{% | |
\blx@key@bibnote{\blx@theprenote}{#1}} | |
\blx@kv@defkey{blx@biblist2}{prenote}{% | |
\blx@key@bibnote{\blx@theprenote}{#1}} | |
\blx@kv@defkey{blx@bbs}{prenote}{% | |
\blx@key@bibnote{\blx@theprenote}{#1}} | |
\blx@kv@defkey{blx@bbg}{prenote}{% | |
\blx@key@bibnote{\blx@theprenote}{#1}} | |
\blx@kv@defkey{blx@bbc}{prenote}{% | |
\blx@key@bibnote{\blx@theprenote}{#1}} | |
\let\blx@default@thepostnote\@empty | |
\blx@kv@defkey{blx@bibdefaults}{postnote}{% | |
\blx@key@bibnote{\blx@default@thepostnote}{#1}} | |
\blx@kv@defkey{blx@bib2}{postnote}{% | |
\blx@key@bibnote{\blx@thepostnote}{#1}} | |
\blx@kv@defkey{blx@biblist2}{postnote}{% | |
\blx@key@bibnote{\blx@thepostnote}{#1}} | |
\blx@kv@defkey{blx@bbs}{postnote}{% | |
\blx@key@bibnote{\blx@thepostnote}{#1}} | |
\blx@kv@defkey{blx@bbg}{postnote}{% | |
\blx@key@bibnote{\blx@thepostnote}{#1}} | |
\blx@kv@defkey{blx@bbc}{postnote}{% | |
\blx@key@bibnote{\blx@thepostnote}{#1}} | |
\blx@kv@defkey{blx@bibdefaults}{locallabelwidth}{% | |
\blx@key@locallabelwidth{#1}} | |
\blx@kv@defkey{blx@bib1}{locallabelwidth}[]{} | |
\blx@kv@defkey{blx@biblist1}{locallabelwidth}[]{} | |
\blx@kv@defkey{blx@bib2}{locallabelwidth}[true]{% | |
\blx@key@locallabelwidth{#1}} | |
\blx@kv@defkey{blx@biblist2}{locallabelwidth}[true]{% | |
\blx@key@locallabelwidth{#1}} | |
\def\blx@key@locallabelwidth#1{% | |
\ifstrequal{#1}{true} | |
{\let\blx@locallabelwidth@init\blx@locallabelwidth@setlengths | |
\let\blx@locallabelwidth@finish\blx@locallabelwidth@write} | |
{\let\blx@locallabelwidth@init\relax | |
\let\blx@locallabelwidth@finish\relax}} | |
\blx@kv@defkey{blx@bib2}{resetnumbers}[true]{% | |
\iftoggle{blx@defernumbers} | |
{\ifstrequal{#1}{true} | |
{\csnumdef{blx@labelnumber@\the\c@refsection}{0}} | |
{\ifstrequal{#1}{false} | |
{} | |
{\csnumdef{blx@labelnumber@\the\c@refsection}{#1-1}}}} | |
{\blx@warning{% | |
Option 'resetnumbers' requires 'defernumbers=true'.\MessageBreak | |
Ignoring 'resetnumbers=true'}}} | |
\blx@kv@defkey{blx@bib2}{omitnumbers}[true]{% | |
\ifstrequal{#1}{true} | |
{\iftoggle{blx@defernumbers} | |
{\toggletrue{blx@omitnumbers}} | |
{\blx@warning{% | |
Option 'omitnumbers' requires 'defernumbers=true'.\MessageBreak | |
Ignoring 'omitnumbers=true'}}} | |
{}} | |
\newrobustcmd*{\DeclarePrintbibliographyDefaults}{% | |
\blx@kv@setkeys{blx@bibdefaults}} | |
% [<options>] | |
\newrobustcmd*{\printbibheading}{% | |
\begingroup | |
\edef\on@line{\on@line}% | |
\@ifnextchar[%] | |
{\blx@printbibheading} | |
{\blx@printbibheading[]}} | |
\def\blx@printbibheading[#1]{% | |
\let\blx@theheading\blx@default@theheading | |
\let\blx@thetitle\blx@default@thetitle | |
\blx@safe@actives | |
\blx@kv@setkeys{blx@bhd}{#1}% | |
\blx@rest@actives | |
\blx@bibheading\blx@theheading\blx@thetitle | |
\endgroup} | |
% We use this to determine whether an explicit value for resetnumbers is passed to | |
% \printbibliography, if not, then we use the default behaviour where a labelprefix forces | |
% a reset. It is useful that we have a 2-pass structure for \printbibliography keys anyway. | |
\newtoggle{blx@resetnumsexplicit} | |
% [<options>] | |
\newrobustcmd*{\printbibliography}{% | |
\begingroup | |
\delimcontext{bib}% | |
\edef\on@line{\on@line}% | |
\@ifnextchar[%] | |
{\blx@printbibliography} | |
{\blx@printbibliography[]}} | |
\def\blx@printbibliography[#1]{% | |
\toggletrue{blx@tempa}% | |
\toggletrue{blx@tempb}% | |
\let\blx@theheading\blx@default@theheading | |
\let\blx@theenv\blx@default@theenv | |
\let\blx@theprenote\blx@default@theprenote | |
\let\blx@thepostnote\blx@default@thepostnote | |
\let\blx@thetitle\blx@default@thetitle | |
% defaults | |
\let\blx@tempa\@empty% before there is a .bbl, this must not be undef | |
\edef\blx@tempe{\the\c@refsection}% default refsection is current | |
\blx@safe@actives | |
\togglefalse{blx@resetnumsexplicit}% | |
\blx@kv@setkeys{blx@bib1}{#1}% First pass options keys - section and resetnumbers | |
% Is there a user-specified option for resetnumbers? If so, this overrides the default | |
% "labelprefix implies resetnumbers" behaviour | |
\iftoggle{blx@resetnumsexplicit} | |
{} | |
{\ifdefempty\blx@refcontext@labelprefix | |
{\ifdefempty\blx@refcontext@labelprefix@real} | |
{\@secondoftwo} | |
{} | |
{\blx@kv@setkeys{blx@bib2}{resetnumbers}}}% | |
\blx@rest@actives | |
\ifcsvoid{blx@dlist@entry@\blx@tempe @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@dlist@entry@\blx@tempe @\blx@refcontext@context}}% | |
\blx@safe@actives | |
% Must reset omitnumbers as it's a global macro and if we don't, any | |
% \printbibliography following one with this set will inherit any | |
% previous "true" value | |
\togglefalse{blx@omitnumbers}% | |
\blx@kv@setkeys{blx@bib2}{#1}% ... now we have correct \blx@tempa, set rest of options | |
\blx@rest@actives | |
% Add datalist to list of seen datalists to prevent duplicates | |
\xifinlist{\blx@refcontext@context @\blx@tempe @entry}\blx@dlistnames | |
{} | |
{\listxadd\blx@dlistnames{\blx@refcontext@context @\blx@tempe @entry}% | |
\csxappto{blx@dlists}{% | |
\blx@xml@dlist{\blx@refcontext@context}{entry}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@refcontext@sortingtemplatename}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix@real}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{}}}% | |
\ifdefvoid\blx@tempa | |
{\blx@warn@bibempty\endgroup} | |
{\blx@bibliography\blx@tempa}} | |
% [<options>] | |
\newrobustcmd*{\bibbysection}{% | |
\begingroup | |
\delimcontext{bib}% | |
\ifnum\blx@maxsection=\z@ | |
\blx@warning{No reference sections found}% | |
\fi | |
\edef\on@line{\on@line}% | |
\@ifnextchar[%] | |
{\blx@bibbysection} | |
{\blx@bibbysection[]}} | |
\def\blx@bibbysection[#1]{% | |
\let\blx@theheading\blx@default@theheading | |
\let\blx@theenv\blx@default@theenv | |
\let\blx@theprenote\blx@default@theprenote | |
\let\blx@thepostnote\blx@default@thepostnote | |
\let\blx@thetitle\blx@default@thetitle | |
\c@refsection\z@ | |
\blx@safe@actives | |
\blx@kv@setkeys{blx@bbs}{#1}% | |
\blx@rest@actives | |
\togglefalse{blx@tempa}% | |
\blx@refsections} | |
\def\blx@refsections{% | |
\ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context} | |
{} | |
{\toggletrue{blx@tempa}% | |
\begingroup | |
\expandafter\blx@bibliography\csname blx@dlist@entry@\the\c@refsection @\blx@refcontext@context\endcsname}% | |
\ifnum\c@refsection<\blx@maxsection | |
\advance\c@refsection\@ne | |
\expandafter\blx@refsections | |
\else | |
\iftoggle{blx@tempa}{}{\blx@warn@bibempty}% | |
\endgroup | |
\fi} | |
% [<options>] | |
\newrobustcmd*{\bibbysegment}{% | |
\begingroup | |
\delimcontext{bib}% | |
\edef\on@line{\on@line}% | |
\ifnum\csname blx@maxsegment@\the\c@refsection\endcsname=\z@ | |
\blx@warning{No reference segments found}% | |
\fi | |
\@ifnextchar[%] | |
{\blx@bibbysegment} | |
{\blx@bibbysegment[]}} | |
\def\blx@bibbysegment[#1]{% | |
\let\blx@theheading\blx@default@theheading | |
\let\blx@theenv\blx@default@theenv | |
\let\blx@theprenote\blx@default@theprenote | |
\let\blx@thepostnote\blx@default@thepostnote | |
\let\blx@thetitle\blx@default@thetitle | |
\c@refsegment\@ne | |
\blx@safe@actives | |
\blx@kv@setkeys{blx@bbg}{#1}% | |
\blx@rest@actives | |
\togglefalse{blx@tempa}% | |
\blx@refsegments} | |
\def\blx@refsegments{% | |
\ifcsvoid{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{} | |
{\toggletrue{blx@tempa}% | |
\begingroup | |
\let\blx@tempa\@empty | |
\ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}}% | |
\blx@filter\blx@tempa{blx@segm@\the\c@refsection @\the\c@refsegment}% | |
\blx@bibliography\blx@tempa}% | |
\ifnum\c@refsegment<\csname blx@maxsegment@\the\c@refsection\endcsname | |
\advance\c@refsegment\@ne | |
\expandafter\blx@refsegments | |
\else | |
\iftoggle{blx@tempa}{}{\blx@warn@bibempty}% | |
\endgroup | |
\fi} | |
% [<options>] | |
\newrobustcmd*{\bibbycategory}{% | |
\begingroup | |
\delimcontext{bib}% | |
\edef\on@line{\on@line}% | |
\ifx\blx@categories\@empty | |
\blx@warning{No categories found}% | |
\fi | |
\@ifnextchar[%] | |
{\blx@bibbycategory} | |
{\blx@bibbycategory[]}} | |
\def\blx@bibbycategory[#1]{% | |
\let\blx@theheading\blx@default@theheading | |
\let\blx@theenv\blx@default@theenv | |
\let\blx@theprenote\blx@default@theprenote | |
\let\blx@thepostnote\blx@default@thepostnote | |
\let\blx@thetitle\blx@default@thetitle | |
\c@refsection\z@ | |
\blx@safe@actives | |
\blx@kv@setkeys{blx@bbc}{#1}% | |
\blx@rest@actives | |
\togglefalse{blx@tempa}% | |
\forlistloop\blx@bibcategory\blx@categories | |
\blx@endbibcategory} | |
\def\blx@bibcategory#1{% | |
\ifcsvoid{blx@catg@#1} | |
{} | |
{\toggletrue{blx@tempa}% | |
\begingroup | |
\blx@key@heading{\blx@theheading}{#1}% | |
\let\blx@tempa\@empty | |
\ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}}% | |
\blx@filter\blx@tempa{blx@catg@#1}% | |
\blx@bibliography\blx@tempa}}% | |
\def\blx@endbibcategory{% | |
\iftoggle{blx@tempa}{}{\blx@warn@bibempty}% | |
\endgroup} | |
% {<entrykey>,...} | |
\def\blx@bibliography{% | |
\blx@bibheading\blx@theheading\blx@thetitle | |
\blx@bibnote\blx@theprenote | |
\begingroup | |
\blx@bibinit | |
\let\@noitemerr\@empty | |
\let\blx@noitem\blx@warn@bibempty | |
\ifnum\bibinitsep=\z@ | |
\let\blx@initsep\relax | |
\fi | |
\ifnum\bibnamesep=\z@ | |
\let\blx@namesep\relax | |
\fi | |
\blx@locallabelwidth@init | |
\csuse{blx@env@\blx@theenv}% | |
\csuse{blx@hook@bibinit}% | |
\csuse{blx@hook@bibinit@next}% | |
\let\blx@do\blx@bibitem | |
\let\blx@done\blx@endbibliography | |
\blx@listloop} | |
\def\blx@endbibliography{% | |
\csuse{blx@endenv@\blx@theenv}% | |
\blx@noitem | |
\blx@locallabelwidth@finish | |
\endgroup | |
\blx@bibnote\blx@thepostnote | |
\endgroup} | |
\def\blx@bibheading#1#2{% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@bibheading@i{\expandonce#1}{\expandonce#2}}% | |
\blx@tempa} | |
\def\blx@bibheading@i#1#2{% | |
\let\newrefsection\relax | |
\let\newrefsegment\relax | |
\ifblank{#2} | |
{\csuse{blx@head@#1}} | |
{\csuse{blx@head@#1}[{#2}]}% | |
\let\newrefsection\blx@newrefsection | |
\let\newrefsegment\blx@newrefsegment} | |
\def\blx@bibnote#1{% | |
\ifdefempty#1 | |
{} | |
{\begingroup | |
\let\newrefsection\relax | |
\let\newrefsegment\relax | |
\noindent | |
\csuse{blx@note@#1}\par\nobreak | |
\endgroup}} | |
\def\blx@bibinit{% | |
\iftoggle{blx@citation} | |
{} | |
{\toggletrue{blx@bibliography}}% | |
\blx@blxinit | |
\blx@resetdata | |
\csuse{blx@hook@bbxinit}% | |
\bibsetup\bibfont | |
\blx@setsfcodes | |
\csuse{blx@bibsetup}} | |
% {<entrykey>} | |
% output a bib item, this is why \blx@thelabelnumber is here so that | |
% labelnumber is deferred if defernumbers=true | |
\def\blx@bibitem#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@getdata{#1}% | |
\blx@bibcheck | |
\iftoggle{blx@skipentry}{}{% | |
\blx@setdefaultrefcontext{#1}% | |
\global\let\blx@noitem\@empty | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\blx@thelabelnumber | |
\addtocounter{instcount}\@ne | |
\iftoggle{blx@labelnumber} | |
{\blx@bbl@locallabelnumberwidth} | |
{}% | |
\iftoggle{blx@labelalpha} | |
{\blx@bbl@locallabelalphawidth} | |
{}% | |
\nottoggle{blx@skipbiblist} | |
{\blx@bbl@locallabelfields} | |
{}% | |
\csuse{blx@item@\blx@theenv}\relax | |
\blx@initsep | |
\blx@namesep | |
\csuse{blx@hook@bibitem}% | |
\blx@execute | |
\blx@initunit | |
\blx@anchor | |
\blx@beglangbib | |
\bibsentence | |
\blx@pagetracker | |
\blx@driver\abx@field@entrytype | |
\blx@postpunct | |
\blx@endlangbib}% | |
\endgroup} | |
{}} | |
\let\blx@bibcheck\relax | |
\def\blx@edef@refcontext#1{% | |
\edef\blx@refcontext@context{#1}% | |
\expandafter\edef\expandafter\blx@refcontext@context\expandafter{% | |
\expandafter\detokenize\expandafter{\blx@refcontext@context}}} | |
\def\blx@xdef@refcontext#1{% | |
\edef\blx@refcontext@context{#1}% | |
\expandafter\xdef\expandafter\blx@refcontext@context\expandafter{% | |
\expandafter\detokenize\expandafter{\blx@refcontext@context}}} | |
% This sets and saves to the .aux the default refcontext for an entry. The | |
% default refcontext for an entry is the refcontext of the last | |
% bibliography in the refsection in which it is actually printed. This | |
% allows citations to default to selecting data from the correct | |
% bibliography list in standard cases where entries are not listed in | |
% multiple bibliographies | |
\def\blx@setdefaultrefcontext#1{% | |
\ifbool{refcontextdefaults} | |
{\blx@rerun@latex}% | |
{}% | |
\ifinlistcs{#1}{blx@defaultrefcontexts@\the\c@refsection} | |
{} | |
{\listcsgadd{blx@defaultrefcontexts@\the\c@refsection}{#1}}% | |
\csxdef{blx@assignedrefcontextbib@\the\c@refsection @#1}{\blx@refcontext@context}} | |
% <refsection><key><refcontext> | |
\def\abx@aux@defaultrefcontext#1#2#3{% | |
\global\boolfalse{refcontextdefaults}% | |
\csxdef{blx@assignedrefcontextbib@#1@#2}{\detokenize{#3}}} | |
\def\abx@aux@refcontextdefaultsdone{% | |
\global\boolfalse{refcontextdefaults}} | |
% \abx@aux@defaultlabelprefix is a dummy only used by BibTeX to implement a | |
% simple labelprefix not based on full refcontexts, which BibTeX does not | |
% support. | |
\let\abx@aux@defaultlabelprefix\@gobblethree | |
\AtEndDocument{% | |
% write the .aux to say we don't need to re-run to consume refcontext defaults | |
\ifbool{refcontextdefaults} | |
{} | |
{\blx@auxwrite\@mainaux{}{\string\abx@aux@refcontextdefaultsdone}}% | |
% always add default refcontext declarations to .aux after biber run | |
\iftoggle{blx@bbldone} | |
{\def\do#1{% | |
\begingroup | |
\def\do##1{% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@defaultrefcontext{#1}{##1}{\csuse{blx@assignedrefcontextbib@#1@##1}}}}% | |
\dolistcsloop{blx@defaultrefcontexts@#1}% | |
\endgroup} | |
\dolistloop\blx@allrefsections} | |
{}} | |
\def\blx@initsep{% | |
\blx@imc@iffieldundef{sortinithash} | |
{} | |
{\ifnum\c@instcount>\@ne | |
\blx@imc@iffieldequals{sortinithash}\blx@previnithash | |
{} | |
{\addvspace{\bibinitsep}}% | |
\fi | |
\global\let\blx@previnithash\abx@field@sortinithash}} | |
\def\blx@namesep{% | |
\ifnum\c@instcount>\@ne | |
\blx@imc@iffieldequals{fullhash}\blx@prevhash | |
{} | |
{\addvspace{\bibnamesep}}% | |
\fi | |
\global\let\blx@prevhash\abx@field@fullhash} | |
\newrobustcmd*{\AtBeginBibliography}{\gappto\blx@hook@bibinit} | |
\newrobustcmd*{\AtEveryBibitem}{\gappto\blx@hook@bibitem} | |
\@onlypreamble\AtBeginBibliography | |
\@onlypreamble\AtEveryBibitem | |
\def\blx@imc@UseBibitemHook{\csuse{blx@hook@bibitem}} | |
\blx@regimcs{\UseBibitemHook} | |
\newrobustcmd*{\AtNextBibliography}{% | |
\ifundef\blx@hook@bibinit@next | |
{\gdef\blx@hook@bibinit@next{\global\undef\blx@hook@bibinit@next}} | |
{}% | |
\gappto\blx@hook@bibinit@next} | |
% page tracker | |
\def\blx@pagetracker@context{% | |
\blx@leavevmode | |
\ifbool{@filesw} | |
{\ifbool{pagetracker} | |
{\protected@write\@mainaux{}{% | |
\iftoggle{blx@footnote} | |
{\string\abx@aux@fnpage} | |
{\string\abx@aux@page}% | |
{\the\c@instcount}{\noexpand\the\c@page}}} | |
{}} | |
{}} | |
% {<instcount>}{<page>} | |
\protected\def\blx@aux@page#1#2{% | |
\csgdef{blx@page@#1}{#2}% | |
\blx@addpagesum{#1}{#2}} | |
\protected\def\blx@aux@spread#1#2{% | |
\ifodd#2\relax | |
\csxdef{blx@page@#1}{\number\numexpr#2-1}% | |
\else | |
\csgdef{blx@page@#1}{#2}% | |
\fi | |
\blx@addpagesum{#1}{#2}} | |
\protected\def\blx@aux@fnpage#1#2{% | |
\csgdef{blx@fnpage@#1}{#2}% | |
\blx@addpagesum{#1}{#2}} | |
\protected\def\blx@aux@fnspread#1#2{% | |
\ifodd#2\relax | |
\csxdef{blx@fnpage@#1}{\number\numexpr#2-1}% | |
\else | |
\csgdef{blx@fnpage@#1}{#2}% | |
\fi | |
\blx@addpagesum{#1}{#2}} | |
\AtEndDocument{% | |
\def\abx@aux@page#1#2{\blx@addpagesum{#1}{#2}}% | |
\def\abx@aux@fnpage#1#2{\blx@addpagesum{#1}{#2}}} | |
% hyperref interface | |
\appto\blx@mkhyperref{% | |
\let\blx@anchors\@empty | |
\ifundef\hyper@natanchorstart | |
{\protected\def\blx@anchor{% | |
\xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors} | |
{} | |
{\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}% | |
\hypertarget{cite.\the\c@refsection @\abx@field@entrykey}{}}}} | |
{\protected\def\blx@anchor{% | |
\xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors} | |
{} | |
{\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}% | |
\hyper@natanchorstart{\the\c@refsection @\abx@field@entrykey}% | |
\hyper@natanchorend}}}} | |
\appto\blx@mknohyperref{\let\blx@anchor\relax} | |
\blx@kv@defkey{blx@biblist2}{driver}{\blx@key@driver{#1}} | |
\blx@kv@defkey{blx@biblist1}{driver}{} | |
\def\blx@key@driver#1{% | |
\def\blx@thebiblistdriver{#1}} | |
% Custom bibliography list | |
% [<options>]{biblistname} | |
\newrobustcmd*{\printbiblist}[2][]{% | |
\begingroup | |
\delimcontext{biblist}% | |
\edef\on@line{\on@line}% | |
\toggletrue{blx@tempa}% | |
\toggletrue{blx@tempb}% | |
\def\blx@theheading{biblist}% default to biblist heading | |
\def\blx@theenv{#2}% default to list name | |
\def\blx@thebiblist{#2}% | |
\def\blx@thebiblistdriver{#2}% | |
\def\blx@thebiblistfilter{#2}% | |
\let\blx@theprenote\@empty | |
\let\blx@thepostnote\@empty | |
\let\blx@thetitle\@empty | |
% defaults | |
\let\blx@tempa\@empty% before there is a .bbl, this must not be undef | |
% default sorting template and template name for list is same name as list | |
% name, then current context if not found | |
\edef\blx@tempc{% | |
\ifcsdef{blx@sortingtemplate@#2} | |
{#2} | |
{\blx@refcontext@sortingtemplatename}}% | |
% locally define this since we want to fetch data from the datalist | |
% name after the list we are printing rather than the data in | |
% refcontext list. | |
% Note that the name must be unique so we prepend any filter name | |
% because the combination of options might not generate a unique name | |
% since sortschemename has a fallback to the refcontext scheme if there | |
% is no sortscheme named after the list | |
\blx@kv@setkeys{blx@biblist1}{#1}% Set section and biblistfilter only, if present ... | |
\blx@edef@refcontext{\blx@thebiblistfilter :\blx@tempc/% | |
\blx@refcontext@sortingnamekeytemplatename/% | |
\blx@refcontext@labelprefix/% | |
\blx@refcontext@uniquenametemplatename/% | |
\blx@refcontext@labelalphanametemplatename}% | |
\xifinlist\blx@tempc\blx@sortingtemplatenames | |
{} | |
{\listxadd\blx@sortingtemplatenames\blx@tempc}% | |
\let\blx@printbibchecks\relax | |
\edef\blx@tempe{\the\c@refsection}% default refsection is current | |
\blx@safe@actives | |
\blx@printbibchecks | |
% Add the sortingtemplate to the list of sortingtemplates for this biblist | |
% so we can compare on next run | |
\xifinlist\blx@tempc\blx@biblists | |
{} | |
{\listxadd\blx@biblists\blx@tempc}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@biblist{\blx@tempc}}% | |
\blx@rest@actives | |
\ifcsvoid{blx@dlist@list@\blx@tempe @\blx@refcontext@context} | |
{} | |
{\letcs\blx@tempa{blx@dlist@list@\blx@tempe @\blx@refcontext@context}}% | |
\blx@safe@actives | |
\blx@kv@setkeys{blx@biblist2}{#1}% ... now we have correct \blx@tempa, set rest of options | |
\ifundef\blx@bibcheck | |
{\ifcsdef{blx@bibcheck@#2} | |
{\letcs\blx@bibcheck{blx@bibcheck@#2}} | |
{}} | |
{}% | |
\blx@rest@actives | |
% Add datalist to list of seen datalists to prevent duplicates | |
\xifinlist{\blx@refcontext@context @\blx@tempe @list}\blx@dlistnames | |
{} | |
{\listxadd\blx@dlistnames{\blx@refcontext@context @\blx@tempe @list}% | |
\xappto\blx@dlists{% | |
\blx@xml@dlist{\blx@refcontext@context}{list}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@tempc}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix@real}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{\csuse{blx@biblistfilters@\blx@thebiblistfilter}}}}% | |
\ifdefvoid\blx@tempa | |
{\blx@warn@biblistempty{#2}\endgroup} | |
{\blx@biblist\blx@tempa}} | |
\def\blx@printbibchecks{% | |
\togglefalse{blx@tempa}% | |
\iftoggle{blx@defernumbers} | |
{\global\let\blx@printbibchecks\relax} | |
{\iftoggle{blx@labelnumber} | |
{\ifundef\blx@printbibchecks@suppresswarn | |
{\blx@warning@noline{% | |
Split bibliography detected.\MessageBreak | |
Many simple split bibliography setups with\MessageBreak | |
non-overlapping bibliographies benefit from% | |
\MessageBreak | |
setting 'defernumbers=true'.\MessageBreak | |
See the documentation for details.\MessageBreak | |
This warning can be suppressed with\MessageBreak | |
'\string\BiblatexSplitbibDefernumbersWarningOff'}} | |
{}} | |
{\global\let\blx@printbibchecks\relax}}} | |
% {<entrykey>,...} | |
\def\blx@biblist{% | |
\if@twocolumn | |
\@restonecoltrue\onecolumn | |
\else | |
\@restonecolfalse | |
\fi | |
\blx@bibheading\blx@theheading\blx@thetitle | |
\blx@bibnote\blx@theprenote | |
\begingroup | |
\blx@bibinit | |
\let\@noitemerr\@empty | |
\def\blx@noitem{\blx@warn@biblistempty{\blx@thebiblist}}% | |
\blx@locallabelwidth@init | |
\csuse{blx@env@\blx@theenv}% | |
\csuse{blx@hook@biblistinit@\blx@thebiblist}% | |
\let\blx@do\blx@biblistitem | |
\let\blx@done\blx@endbiblist | |
\blx@listloop} | |
\def\blx@endbiblist{% | |
\csuse{blx@endenv@\blx@theenv}% | |
\blx@noitem | |
\blx@locallabelwidth@finish | |
\endgroup | |
\blx@bibnote\blx@thepostnote | |
\endgroup | |
\if@restonecol\twocolumn\fi} | |
% {<biblistname>} | |
\newrobustcmd*{\AtBeginBiblist}[1]{\csgappto{blx@hook@biblistinit@#1}} | |
\newrobustcmd*{\AtEveryBiblistitem}[1]{\csgappto{blx@hook@biblistitem@#1}} | |
\@onlypreamble\AtBeginBiblist | |
\@onlypreamble\AtEveryBiblistitem | |
% {<entrykey>} | |
\def\blx@biblistitem#1{% | |
\blx@ifdata{#1} | |
{\begingroup | |
\blx@getdata{#1}% | |
\blx@bibcheck | |
\iftoggle{blx@skipentry}{}{% | |
\blx@setdefaultrefcontext{#1}% | |
\global\let\blx@noitem\@empty | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\addtocounter{instcount}\@ne | |
\iftoggle{blx@labelnumber} | |
{\blx@bbl@locallabelnumberwidth} | |
{}% | |
\iftoggle{blx@labelalpha} | |
{\blx@bbl@locallabelalphawidth} | |
{}% | |
\nottoggle{blx@skipbiblist} | |
{\blx@bbl@locallabelfields} | |
{}% | |
\csuse{blx@item@\blx@theenv}\relax | |
\csuse{blx@hook@biblistitem@\blx@thebiblist}% | |
\blx@execute | |
\blx@initunit | |
\blx@beglangbib | |
\bibsentence | |
\blx@pagetracker | |
\blx@driver{\blx@thebiblistdriver}% | |
\blx@postpunct | |
\blx@endlangbib}% | |
\endgroup} | |
{}} | |
% Just a default in case .bbx doesn't define it. standard.bbx defines | |
% it to print a complete entry, like the bibliography. | |
\DeclareBibliographyDriver{shorthand}{% | |
\iffieldundef{shorttitle} | |
{\printfield{title}} | |
{\printfield{shorttitle}}} | |
% Reference contexts | |
\newcommand*{\DeclareRefcontext}[2]{% | |
\csgdef{blx@refcontext@name@#1}{#2}} | |
\@onlypreamble\DeclareRefcontext | |
\def\newrefcontext{% | |
\endrefcontext | |
\refcontext} | |
% Backwards compat for older \refcontext[] format | |
\def\refcontext{% | |
\@ifnextchar[%] | |
{\refcontext@i} | |
{\refcontext@i[]}} | |
\def\refcontext@i[#1]{% | |
\@ifnextchar\bgroup | |
{\refcontext@ii[{#1}]} | |
{\refcontext@ii[{#1}]{}}} | |
\newcommand*{\refcontext@ii}[2][]{% | |
\iftoggle{blx@refcontext} | |
{\blx@err@nestenv{refcontext}% | |
\endrefcontext} | |
{\toggletrue{blx@refcontext}% | |
% Set refcontext from named refcontext, if given | |
\ifblank{#2} | |
{} | |
{\begingroup | |
\edef\blx@tempa{\endgroup% | |
\noexpand\blx@kv@setkeys{blx@refcontext}{\csuse{blx@refcontext@name@#2}}}% | |
\blx@tempa}% | |
% Override with explicit refcontext keyvals, if given | |
\blx@kv@setkeys{blx@refcontext}{#1}% | |
% Add the sortingtemplate to the list of sortingtemplates so we can track | |
% special cases like sorting=none which need cite order change detection | |
\xifinlist\blx@refcontext@sortingtemplatename\blx@sortingtemplatenames | |
{} | |
{\listxadd\blx@sortingtemplatenames\blx@refcontext@sortingtemplatename}% | |
\blx@xdef@refcontext{% | |
\blx@refcontext@sortingtemplatename/% | |
\blx@refcontext@sortingnamekeytemplatename/% | |
\blx@refcontext@labelprefix/% | |
\blx@refcontext@uniquenametemplatename/% | |
\blx@refcontext@labelalphanametemplatename}% | |
% Add the refcontext to the list of refcontexts so we can compare on next run | |
\xifinlist\blx@refcontext@context\blx@refcontexts | |
{} | |
{\listxadd\blx@refcontexts\blx@refcontext@context}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}}% | |
\ifcsundef{blx@sortingtemplate@\blx@refcontext@sortingtemplatename} | |
{\blx@err@invopt{sorting=\blx@refcontext@sortingtemplatename}{}} | |
{}% | |
\ifcsundef{blx@sortingnamekeytemplate@\blx@refcontext@sortingnamekeytemplatename} | |
{\blx@err@invopt{sortingnamekeytemplate=\blx@refcontext@sortingnamekeytemplatename}{}} | |
{}% | |
\ifcsundef{blx@uniquenametemplate@\blx@refcontext@uniquenametemplatename} | |
{\blx@err@invopt{uniquenametemplate=\blx@refcontext@uniquenametemplatename}{}} | |
{}% | |
\ifcsundef{blx@labelalphanametemplate@\blx@refcontext@labelalphanametemplatename} | |
{\blx@err@invopt{labelalphanametemplate=\blx@refcontext@labelalphanametemplatename}{}} | |
{}}} | |
% Reset to global sorting etc. when we leave a ref context (since they can't be nested) | |
\protected\def\endrefcontext{% | |
\togglefalse{blx@refcontext}% | |
\global\let\blx@refcontext@labelprefix\@empty | |
\global\let\blx@refcontext@labelprefix@real\@empty | |
\xdef\blx@refcontext@sortingtemplatename{\blx@sorting}% | |
\gdef\blx@refcontext@sortingnamekeytemplatename{global}% | |
\gdef\blx@refcontext@uniquenametemplatename{global}% | |
\gdef\blx@refcontext@labelalphanametemplatename{global}% | |
\blx@xdef@refcontext{% | |
\blx@refcontext@sortingtemplatename/% | |
\blx@refcontext@sortingnamekeytemplatename/% | |
/% | |
\blx@refcontext@uniquenametemplatename/% | |
\blx@refcontext@labelalphanametemplatename}} | |
% Meta option to set all name template options | |
\blx@kv@defkey{blx@refcontext}{nametemplates}{% | |
\gdef\blx@refcontext@sortingnamekeytemplatename{#1}% | |
\gdef\blx@refcontext@uniquenametemplatename{#1}% | |
\gdef\blx@refcontext@labelalphanametemplatename{#1}} | |
\blx@kv@defkey{blx@refcontext}{sorting}{\gdef\blx@refcontext@sortingtemplatename{#1}} | |
\blx@kv@defkey{blx@refcontext}{sortingnamekeytemplatename}{\gdef\blx@refcontext@sortingnamekeytemplatename{#1}} | |
\blx@kv@defkey{blx@refcontext}{uniquenametemplatename}{\gdef\blx@refcontext@uniquenametemplatename{#1}} | |
\blx@kv@defkey{blx@refcontext}{labelalphanametemplatename}{\gdef\blx@refcontext@labelalphanametemplatename{#1}} | |
% labelprefix cannot be used as is because it is used to construct the internal | |
% refcontext name which is referenced/expanded a lot all over the place. So, | |
% we hash the given input and use the safe hash as internal name. | |
% But that is not enough since the MD5 hash function expands the argument all | |
% the way and so unexpandable content like \dag breaks. | |
% Unexpandable content should be protected with \detokenize. | |
\blx@kv@defkey{blx@refcontext}{labelprefix}{% | |
\xdef\blx@refcontext@labelprefix{\blx@mdfivesum{#1}}% | |
\gdef\blx@refcontext@labelprefix@real{#1}% | |
\iftoggle{blx@defernumbers} | |
{}% | |
{\iftoggle{blx@labelnumber} | |
{\blx@warning{% | |
Option 'labelprefix' requires global\MessageBreak | |
'defernumbers=true'}} | |
{}}} | |
% [refcontext keys]{<keyword1>,<keyword2>,...} | |
\newcommand*{\assignrefcontextkeyws}{% | |
\@ifstar | |
{\blx@assignrefcontextkeyws[*]} | |
{\blx@assignrefcontextkeyws[]}} | |
\def\blx@assignrefcontextkeyws[#1][#2]#3{% | |
\edef\blx@tempa{\blx@sorting}% | |
\def\blx@tempb{global}% | |
\let\blx@tempc\@empty% | |
\def\blx@tempd{global}% | |
\def\blx@tempe{global}% | |
\blx@kv@setkeys{blx@assignrefcontext}{#2}% | |
\def\do##1{% | |
\listxadd\blx@assignedrefcontextkeywlist{##1}% | |
\csxdef{blx@assignedrefcontextkeyws#1@\the\c@refsection @##1}% | |
{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}% | |
\docsvlist{#3}} | |
% [refcontext keys]{<category1>,<category2>,...} | |
\newcommand*{\assignrefcontextcats}{% | |
\@ifstar | |
{\blx@assignrefcontextcats[*]} | |
{\blx@assignrefcontextcats[]}} | |
\def\blx@assignrefcontextcats[#1][#2]#3{% | |
\edef\blx@tempa{\blx@sorting}% | |
\def\blx@tempb{global}% | |
\let\blx@tempc\@empty% | |
\def\blx@tempd{global}% | |
\def\blx@tempe{global}% | |
\blx@kv@setkeys{blx@assignrefcontext}{#2}% | |
\def\do##1{% | |
\listxadd\blx@assignedrefcontextcatlist{##1}% | |
\csxdef{blx@assignedrefcontextcats#1@\the\c@refsection @##1}% | |
{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}% | |
\docsvlist{#3}} | |
% [refcontext keys]{<entrykey1>,<entrykey2>,...} | |
\newcommand*{\assignrefcontextentries}{% | |
\@ifstar | |
{\blx@assignrefcontextentries[*]} | |
{\blx@assignrefcontextentries[]}} | |
\def\blx@assignrefcontextentries[#1][#2]#3{% | |
\edef\blx@tempa{\blx@sorting}% | |
\def\blx@tempb{global}% | |
\let\blx@tempc\@empty% | |
\def\blx@tempd{global}% | |
\def\blx@tempe{global}% | |
\blx@kv@setkeys{blx@assignrefcontext}{#2}% | |
\def\do##1{% | |
\csxdef{blx@assignedrefcontextkeys#1@\the\c@refsection @##1}% | |
{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}% | |
\docsvlist{#3}} | |
% Meta option to set all name template options | |
\blx@kv@defkey{blx@assignrefcontext}{nametemplates}{% | |
\def\blx@tempb{#1}% | |
\def\blx@tempd{#1}% | |
\def\blx@tempe{#1}} | |
\blx@kv@defkey{blx@assignrefcontext}{sorting}{\def\blx@tempa{#1}} | |
\blx@kv@defkey{blx@assignrefcontext}{sortingnamekeytemplatename}{\def\blx@tempb{#1}} | |
\blx@kv@defkey{blx@assignrefcontext}{labelprefix}{% | |
\edef\blx@tempc{\blx@mdfivesum{#1}}} | |
\blx@kv@defkey{blx@assignrefcontext}{uniquenametemplatename}{\def\blx@tempd{#1}} | |
\blx@kv@defkey{blx@assignrefcontext}{labelalphanametemplatename}{\def\blx@tempe{#1}} | |
% Reference sections | |
\newrobustcmd*{\newrefsection}{% | |
\endrefcontext | |
\ifnum\c@refsection>\z@ | |
\endrefsection | |
\fi | |
\refsection} | |
\let\blx@newrefsection\newrefsection | |
\newrobustcmd*{\refsection}{% | |
\begingroup | |
\edef\on@line{\on@line}% | |
\ifnum\c@refsection>\z@ | |
\blx@err@nestenv{refsection}% | |
\blx@endrefsection | |
\fi | |
\ifnum\c@refsegment>\z@ | |
\blx@err@nestenv{refsection}% | |
\blx@endrefsegment | |
\fi | |
\@ifnextchar[%] | |
{\blx@refsection} | |
{\blx@refsection[]}} | |
\def\blx@refsection{% | |
\begingroup | |
\blx@hook@fileverb | |
\blx@refsection@i} | |
\def\blx@refsection@i[#1]{% | |
\endgroup | |
\global\advance\blx@maxsection\@ne | |
\global\c@refsection\blx@maxsection | |
\xifinlist{\the\c@refsection}\blx@allrefsections | |
{} | |
{\listxadd\blx@allrefsections{\the\c@refsection}}% | |
\ifcsdef{blx@defaultrefcontexts@\the\c@refsection} | |
{} | |
{\global\cslet{blx@defaultrefcontexts@\the\c@refsection}\@empty}% | |
\expandafter\newcount\csname blx@maxsegment@\the\c@refsection\endcsname | |
\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname | |
\blx@inf@refsec | |
\blx@secinit | |
\if@filesw | |
\blx@auxwrite\@mainaux{}{% | |
\string\abx@aux@refsection{\the\c@refsection}{\the\c@page}}% | |
\ifblank{#1} | |
{} | |
{\let\blx@bibfiles\@empty | |
% globals should be first as it might contain macros needed for others | |
\forlistloop{\listadd\blx@bibfiles}\blx@bibfiles@global}% | |
\blx@xsanitizeafter{\forcsvlist\blx@refsection@addfile}{#1}% | |
\blx@refsection@ii | |
\fi | |
\blx@info{Setting label 'refsection:\the\c@refsection'}% | |
\label{refsection:\the\c@refsection}% | |
\endgroup} | |
\def\blx@refsection@addfile#1{% | |
\ifcsdef{blx@res@labl@#1} | |
{\blx@refsection@addfile@i{\csuse{blx@res@labl@#1}}} | |
{\blx@refsection@addfile@i{#1}}} | |
\def\blx@refsection@addfile@i#1{% | |
\ifcsdef{blx@res@loca@#1} | |
{\listeadd\blx@bibfiles{#1}} | |
{\listeadd\blx@bibfiles{\blx@stripbib{#1}\detokenize{.bib}}}} | |
\def\blx@refsection@ii{% | |
\blx@regbibfiles\jobname\blx@bibfiles | |
\begingroup | |
\let\blx@tempa\@empty | |
\blx@bibdata\blx@tempa\blx@bibfiles | |
\blx@auxwrite\blx@bcfout | |
{\let\do\blx@datasource} | |
{\blx@xml@endsection\blx@nl | |
\blx@xml@comment{SECTION \the\c@refsection}% | |
\blx@xml@bibdata{\the\c@refsection}{\blx@tempa}% | |
\blx@xml@section{\the\c@refsection}}% | |
\endgroup} | |
\protected\def\endrefsection{% | |
\endrefcontext | |
\blx@endrefsection | |
\blx@inf@refsec} | |
\def\blx@endrefsection{% | |
\blx@endrefsegment | |
% make sure we always output aliases to the .bcf otherwise after their | |
% first resolution by biber, they will be invisible to subsequent biber | |
% runs since biblatex will resolve the \keyalias{} macro to the main | |
% entry key, biber won't put \keyalias{}in the .bbl on subsequent runs | |
% and biblatex will report a missing citekey | |
\def\do##1{% | |
% Make sure this counter exists. Sometimes it might not when using, e.g: | |
% refsection=chapter and \includeonly to put in the chapters or when | |
% inserting citations into table of contents | |
\ifcscounter{blx@sectionciteorder@\the\c@refsection} | |
{} | |
{\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname}% | |
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne | |
\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{##1}{}{\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}}}% | |
\dolistcsloop{blx@keyaliases@\the\c@refsection}% | |
\ifnum\c@refsection>\z@ | |
\blx@auxwrite\blx@bcfout{}{% | |
\blx@xml@endsection\blx@nl | |
\blx@xml@comment{SECTION 0 (cont.)}% | |
\blx@xml@section{0}}% | |
\fi | |
\global\c@refsection\z@} | |
\AtEndDocument{% | |
\endrefcontext | |
% close non-0 refsection if active | |
\ifnum\c@refsection>\z@ | |
\blx@endrefsection | |
\fi | |
% close refsection 0 | |
\blx@endrefsection | |
\def\abx@aux@refsection#1#2{\blx@addchecksum{#1}{#2}}} | |
\protected\def\abx@aux@refsection#1#2{% | |
\ifnum#1>\blx@maxsection | |
\global\blx@maxsection#1\relax | |
\fi | |
\blx@addchecksum{#1}{#2}} | |
% Reference segments | |
\newrobustcmd*{\newrefsegment}{% | |
\ifnum\c@refsegment>\z@ | |
\blx@endrefsegment | |
\fi | |
\refsegment} | |
\let\blx@newrefsegment\newrefsegment | |
\newrobustcmd*{\refsegment}{% | |
\ifnum\c@refsegment>\z@ | |
\blx@err@nestenv{refsegment}% | |
\blx@endrefsegment | |
\fi | |
\global\advance\csname blx@maxsegment@\the\c@refsection\endcsname\@ne | |
\global\c@refsegment\csname blx@maxsegment@\the\c@refsection\endcsname | |
\blx@inf@refseg | |
\blx@info{Setting label 'refsegment:\the\c@refsection\the\c@refsegment'}% | |
\label{refsegment:\the\c@refsection\the\c@refsegment}% | |
\ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty} | |
{}} | |
\protected\def\endrefsegment{% | |
\blx@endrefsegment | |
\blx@inf@refseg} | |
\def\blx@endrefsegment{% | |
\global\c@refsegment\z@} | |
% Reference section/segment auto-reset | |
% we are prepending to the commands so that the resets happen before | |
% the part title is typeset otherwise \cites in there could be "ibid" | |
% which makes no sense | |
% option switch | |
%{<option level counter>}{<patch>}{<pre>}{<post>} | |
\def\blx@patchsection@switch#1#2#3#4{% | |
\AtEndPreamble{% | |
#3% | |
\ifcase#1 | |
\or % 1: part | |
\blx@refpatch@part{#2}% | |
\or % 2: chapter | |
\blx@refpatch@chapter{#2}% | |
\or % 3: section | |
\blx@refpatch@sect{section}{#2}{1}% | |
\or % 4: subsection | |
\blx@refpatch@sect{subsection}{#2}{2}% | |
\or % 5: chapter+ = part, chapter | |
\blx@refpatch@part{#2}% | |
\blx@refpatch@chapter{#2}% | |
\or % 6: section+ = part, chapter, section | |
\blx@refpatch@part{#2}% | |
\ifundef\chapter | |
{} | |
{\blx@refpatch@chapter{#2}}% | |
\blx@refpatch@sect{section}{#2}{1}% | |
\or % 7: subsection+ = part, chapter, section, subsection | |
\blx@refpatch@part{#2}% | |
\ifundef\chapter | |
{} | |
{\blx@refpatch@chapter{#2}}% | |
\blx@refpatch@sect{section}{#2}{1}% | |
\blx@refpatch@sect{subsection}{#2}{2}% | |
\fi | |
#4% | |
}% | |
} | |
%% Patching all the different document classes and their sectioning | |
%% commands is ... messy at best | |
%% For now we do the big three: (1) Standard classes, (2) KOMA-Script | |
%% and (3) memoir. | |
%% | |
%% Timing of the patch can be tricky. | |
%% Ideally we want the code to be executed when all counters have | |
%% been increased so the labels attach to the right thing, but | |
%% at the same time we want the code to be executed before the heading | |
%% is typeset so it already applies to the text in the heading. | |
%% Bonus points for actually executing the code on the correct page. | |
%% memoir has hooks for section headings that we can use here | |
%% see 18.25 'Heading Hooks' of the manual (v3.7h, 2018/12/12) | |
%% they are in a good position, when the counters have been | |
%% increased but heading text not yet typeset. | |
%% The manual suggests this hooks have been around since 2005 or so, | |
%% so we take them for granted. | |
%% Newer versions of KOMA-Script (>=3.27) (will) have a hook system | |
%% that we can use for that purpose as well. | |
%% This is fairly new, so we need to have a fallback for older versions. | |
%% The standard classes are tricky. | |
%% We insert something in \@startsection to get the level number | |
%% and then patch \@sect and \@ssect so the label attaches to the | |
%% right thing. | |
%% Test for correct KOMA patch method | |
% KOMA 3.27 has \AddtoDoHook | |
\newcommand*{\blx@ifkoma@AddtoDoHook}{% | |
\ifcsundef{KOMAClassName} | |
{\@secondoftwo} | |
{\ifcsundef{AddtoDoHook} | |
{\@secondoftwo} | |
{\@firstoftwo}}} | |
% KOMA 3.26 has \startsection@secnumdepth for some testing | |
\newcommand*{\blx@ifkoma@startsection}{% | |
\ifcsundef{KOMAClassName} | |
{\@secondoftwo} | |
{\ifcsundef{startsection@secnumdepth} | |
{\@secondoftwo} | |
{\@firstoftwo}}} | |
\newcommand*{\blx@ifmemoir}{\@ifclassloaded{memoir}} | |
% Note that \ExecuteDoHook always feeds an argument to the code, here that is | |
% going to be an empty group, which we explicitly gobble to avoid trouble. | |
\def\blx@refpatch@koma@AddtoDoHook#1#2{% | |
\AddtoDoHook{heading/begingroup/#1}{#2\@gobble}} | |
% \part | |
\def\blx@refpatch@part@memoir#1{% | |
\apptocmd\mempartinfo{#1} | |
{}{\blx@err@patch{\string\mempartinfo}}% | |
\apptocmd\mempartstarinfo{#1} | |
{}{\blx@err@patch{\string\mempartstarinfo}}} | |
\def\blx@refpatch@part@std#1{% | |
\toggletrue{blx@tempa}% | |
\def\do##1{% | |
\pretocmd##1{#1} | |
{\togglefalse{blx@tempa}\listbreak} | |
{}}% | |
\docsvlist{% | |
\H@old@part,% hyperref | |
\NR@part,% nameref | |
\@part}% latex/koma-script/memoir | |
\iftoggle{blx@tempa} | |
{\blx@err@patch{\string\@part}} | |
{}% | |
\let\do\noexpand} | |
\def\blx@refpatch@part#1{% | |
\ifundef\part | |
{\blx@err@nodocdiv{part}} | |
{\blx@ifkoma@AddtoDoHook | |
{\blx@refpatch@koma@AddtoDoHook{part}{#1}} | |
{\blx@ifmemoir | |
{\blx@refpatch@part@memoir{#1}} | |
{\blx@refpatch@part@std{#1}}}}} | |
% \chapter | |
\def\blx@refpatch@chapter@memoir#1{% | |
\apptocmd\memchapinfo{#1} | |
{}{\blx@err@patch{\string\memchapinfo}}% | |
\apptocmd\memchapstarinfo{#1} | |
{}{\blx@err@patch{\string\memchapstarinfo}}% | |
\apptocmd\memappchapinfo{#1} | |
{}{\blx@err@patch{\string\memappchapinfo}}% | |
\apptocmd\memappchapstarinfo{#1} | |
{}{\blx@err@patch{\string\memappchapstarinfo}}% | |
} | |
\def\blx@refpatch@chapter@std#1{% | |
\pretocmd\@makechapterhead{#1} | |
{} | |
{\blx@err@patch{\string\@makechapterhead}} | |
\pretocmd\@makeschapterhead{#1} | |
{} | |
{\blx@err@patch{\string\@makeschapterhead}}} | |
\def\blx@refpatch@chapter#1{% | |
\ifundef\chapter | |
{\blx@err@nodocdiv{chapter}} | |
{\blx@ifkoma@AddtoDoHook | |
{\blx@refpatch@koma@AddtoDoHook{chapter}{#1}} | |
{\blx@ifmemoir | |
{\blx@refpatch@chapter@memoir{#1}} | |
{\blx@refpatch@chapter@std{#1}}}}} | |
% \section, \subsection | |
% {<section csname>}{<patch code>}{<section level number>} | |
\def\blx@refpatch@sect#1#2#3{% | |
\ifcsundef{#1} | |
{\blx@err@nodocdiv{#1}\@gobbletwo} | |
{\blx@ifkoma@AddtoDoHook | |
{\blx@refpatch@koma@AddtoDoHook{#1}{#2}} | |
{\blx@ifkoma@startsection | |
{\blx@refpatch@sect@koma@startsection{#2}{#3}} | |
{\blx@ifmemoir | |
{\blx@refpatch@sect@memoir{#1}{#2}} | |
{\blx@refpatch@sect@std{#2}{#3}}}}}} | |
% KOMA >= 3.26 defines \startsection@secnumdepth to check the sectioning level, | |
% so we can now use \At@startsection. | |
% Starting from 3.27 we use AddtoDoHook, so this is a short-lived | |
% intermezzo. | |
\def\blx@refpatch@sect@koma@startsection#1#2{% | |
\At@startsection{\ifnumequal{\startsection@secnumdepth}{#2}{#1}{}}} | |
% The memoir classes have a nice hook we can use | |
% {<section csname>}{<patch code>} | |
\edef\blx@refpatch@sect@memoir#1#2{% | |
\apptocmd\noexpand\memsecinfo | |
{\noexpand\blx@refpatch@sect@memoir@i{\string#1}{#1}{#2}} | |
{}{\noexpand\blx@err@patch{\string\memsecinfo}}% | |
\apptocmd\noexpand\memsecstarinfo | |
{\noexpand\blx@refpatch@sect@memoir@i{\string#1}{#1}{#2}} | |
{}{\noexpand\blx@err@patch{\string\memsecstarinfo}}} | |
\def\blx@refpatch@sect@memoir@i#1#2#3{% | |
\ifstrequal{#1}{#2}{#3}{}} | |
% The standard classes have \@startsection, \@sect and \@ssect. | |
% \@startsection is used by unstarred and starred sections alike | |
% but it comes in too early if we set labels. | |
% The counter is only stepped in \@sect, so we need to patch | |
% that if we want \labels to attach to the right thing. | |
% But then we also need to patch \@ssect for starred/un-numbered | |
% sections. Unfortunately, \@ssect doesn't know the level number | |
% so we patch \@startsection to remember the level number | |
% in blx@refpatch@current@sectlevel | |
% and then patch \@sect and \@ssect with the actual code | |
% testing against blx@refpatch@current@sectlevel. | |
% {<do initialization>}{<csv list to do>}{<error>} | |
\def\blx@refpatch@docsvlist#1#2#3{% | |
\toggletrue{blx@tempa}% | |
#1% | |
\docsvlist{#2}% | |
\iftoggle{blx@tempa} | |
{#3} | |
{}% | |
\let\do\noexpand} | |
\newtoggle{blx@refpatch@sect@std@pre@done} | |
\def\blx@refpatch@sect@std@pre{% | |
\iftoggle{blx@refpatch@sect@std@pre@done} | |
{} | |
{\blx@refpatch@docsvlist | |
{\blx@refpatch@sect@std@pre@defdo} | |
{\scr@startsection, | |
\@startsection} | |
{\blx@err@patch{\string\@startsection}} | |
\global\toggletrue{blx@refpatch@sect@std@pre@done}}} | |
\edef\blx@refpatch@sect@std@pre@defdo{% | |
\def\noexpand\do##1{% | |
\pretocmd##1 | |
{\csnumdef{blx@refpatch@current@sectlevel}{\string#2}} | |
{\togglefalse{blx@tempa}\noexpand\listbreak} | |
{}}} | |
\edef\blx@refpatch@sect@std@defdo@sect#1#2{% | |
\def\noexpand\do##1{% | |
\patchcmd##1% | |
{\noexpand\@tempskipa \string#5\noexpand\relax} | |
{\noexpand\blx@refpatch@sect@std@testandruncode{#1}{#2}% | |
\noexpand\@tempskipa \string#5\noexpand\relax} | |
{\togglefalse{blx@tempa}\noexpand\listbreak} | |
{}}} | |
\edef\blx@refpatch@sect@std@defdo@ssect#1#2{% | |
\def\noexpand\do##1{% | |
\patchcmd##1% | |
{\noexpand\@tempskipa \string#3\noexpand\relax} | |
{\noexpand\blx@refpatch@sect@std@testandruncode{#1}{#2}% | |
\noexpand\@tempskipa \string#3\noexpand\relax} | |
{\togglefalse{blx@tempa}\noexpand\listbreak} | |
{}}} | |
% {<patch code>}{<section level number>} | |
\def\blx@refpatch@sect@std#1#2{% | |
\blx@refpatch@sect@std@pre | |
% \@sect for numbered (unstarred) sections | |
\blx@refpatch@docsvlist | |
{\blx@refpatch@sect@std@defdo@sect{#1}{#2}} | |
{\H@old@sectm@m,% memoir+hyperref (what a mess...) | |
\M@sect,% memoir | |
\H@old@sect,% hyperref | |
\NR@sect,% nameref | |
\scr@sect,% koma-script 3.x | |
\scr@startsection,% bad hack for koma 3.15 <= v <= 3.25 | |
\@sect} | |
{\blx@err@patch{\string\@sect}} | |
% \@ssect for un-numbered (starred) sections | |
\blx@refpatch@docsvlist | |
{\blx@refpatch@sect@std@defdo@ssect{#1}{#2}} | |
{\H@old@ssectm@m,% memoir+hyperref (what a mess...) | |
\M@ssect,% memoir | |
\H@old@ssect,% hyperref | |
\NR@ssect,% nameref | |
\scr@ssect,% koma-script 3.x | |
\@ssect} | |
{\blx@err@patch{\string\@ssect}}} | |
\def\blx@refpatch@sect@std@testandruncode#1#2{% | |
\ifnumequal{#2}{0\csuse{blx@refpatch@current@sectlevel}} | |
{#1} | |
{}} | |
% Bibliography categories | |
\let\blx@categories\@empty | |
% {<category>} | |
\newrobustcmd*{\DeclareBibliographyCategory}[1]{% | |
\ifcsundef{blx@catg@#1} | |
{\global\cslet{blx@catg@#1}\@empty | |
\listgadd\blx@categories{#1}} | |
{\blx@error | |
{Category '#1' already declared} | |
{The bibliography category '#1'\MessageBreak | |
has already been declared}}} | |
\@onlypreamble\DeclareBibliographyCategory | |
% {<category>}{<entrykey>,...} | |
\newrobustcmd*{\addtocategory}[2]{% | |
\ifcsundef{blx@catg@#1} | |
{\blx@error | |
{Category '#1' not declared} | |
{Use \string\DeclareBibliographyCategory\space to declare}} | |
{\AfterPreamble{% | |
\blx@xsanitizeafter{\forcsvlist{\blx@addtocategory{#1}}}{#2}}}} | |
% {<category>}{<entrykey>,...} | |
\def\blx@addtocategory#1#2{% | |
% If we are adding a set member to a category, make sure we also add the | |
% set parent if it is cited. If it is cited, we should be using the set | |
% parent in the category, not the set child member. blx@setc@... will | |
% only exist if the set parent is also cited as it is only defined when a | |
% member contains \inset which only happens when the set parent is cited. | |
\ifcsdef{blx@setc@\the\c@refsection @#2} | |
{\blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}}% | |
\abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}} | |
{}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{#2}}% | |
\abx@aux@category{#1}{#2}} | |
% {<category>}{<entrykey>,...} | |
\protected\def\abx@aux@category#1#2{% | |
\xifinlistcs{\detokenize{#2}}{blx@catg@#1} | |
{} | |
{\listcsxadd{blx@catg@#1}{\detokenize{#2}}}} | |
\AtEndDocument{\let\abx@aux@category\@gobbletwo} | |
% [<options>]{<resource>,...} | |
\renewrobustcmd*{\bibliography}[1]{% | |
\begingroup | |
\def\blx@tempa{file}% | |
\def\blx@tempb{bibtex}% | |
\def\blx@tempc{local}% | |
\undef\blx@tempd | |
\let\blx@tempe\@empty | |
\blx@xsanitizeafter{\forcsvlist\blx@addbib@legacy}{#1}% | |
\endgroup} | |
\@onlypreamble\bibliography | |
\def\blx@addbib@legacy#1{% | |
\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@addbib@resource{\blx@stripbib{#1}\detokenize{.bib}}}% | |
\blx@tempa} | |
\def\blx@stripbib#1{% | |
\expandafter\blx@stripbib@i\detokenize{#1.bib}&} | |
\edef\blx@stripbib@i{% | |
\def\noexpand\blx@stripbib@i##1\detokenize{.bib}##2&} | |
\blx@stripbib@i{#1} | |
% [<options>]{<resource>,...} | |
\newrobustcmd*{\addbibresource}{% | |
\blx@addbib\blx@addbib@resource} | |
\@onlypreamble\addbibresource | |
\newrobustcmd*{\addglobalbib}{% | |
\blx@addbib\blx@addbib@global} | |
\@onlypreamble\addglobalbib | |
\newrobustcmd*{\addsectionbib}{% | |
\blx@addbib\blx@addbib@register} | |
\@onlypreamble\addsectionbib | |
\def\blx@addbib#1{% | |
\@ifnextchar[%] | |
{\blx@addbib@i{#1}} | |
{\blx@addbib@i{#1}[]}} | |
% kill all spaces and % | |
% see https://github.com/plk/biblatex/issues/1026 | |
\def\blx@addbib@i#1[#2]{% | |
\begingroup | |
\@ifnextchar\bgroup | |
{\blx@hook@fileverb\blx@addbib@ii{#1}{#2}}% | |
{\blx@hook@fileverb\blx@addbib@ii{#1}{#2}}} | |
\def\blx@addbib@ii#1#2#3{% | |
\endgroup | |
\begingroup | |
\def\blx@tempa{file}% | |
\def\blx@tempb{bibtex}% | |
\def\blx@tempc{local}% | |
\undef\blx@tempd | |
\let\blx@tempe\@empty | |
\def\blx@tempf{false}% | |
\blx@kv@setkeys{blx@addbib}{#2}% | |
\blx@xsanitizeafter{#1}{#3}% | |
\endgroup} | |
\def\blx@hook@fileverb{% | |
\let\do\@makeother | |
\dospecials | |
\catcode`\\=\z@ | |
\catcode`\{=\@ne | |
\catcode`\}=\tw@} | |
\blx@kv@defkey{blx@addbib}{type}{\def\blx@tempa{#1}} | |
\blx@kv@defkey{blx@addbib}{datatype}{\def\blx@tempb{#1}} | |
\blx@kv@defkey{blx@addbib}{location}{\def\blx@tempc{#1}} | |
\blx@kv@defkey{blx@addbib}{label}{\edef\blx@tempd{\detokenize{#1}}} | |
\blx@kv@defkey{blx@addbib}{bibencoding}{\def\blx@tempe{#1}} | |
\blx@kv@defkey{blx@addbib}{glob}[true]{\def\blx@tempf{#1}} | |
% \blx@res@type@<resource> resource -> type | |
% \blx@res@data@<resource> resource -> datatype | |
% \blx@res@loca@<resource> resource -> datatype | |
% \blx@res@labl@<resource> label -> resource | |
% \blx@res@glob@<resource> glob -> true|false | |
\def\blx@addbib@register#1{% | |
\csxdef{blx@res@type@#1}{\blx@tempa}% | |
\csxdef{blx@res@data@#1}{\blx@tempb}% | |
\csxdef{blx@res@loca@#1}{\blx@tempc}% | |
\csxdef{blx@res@bibencoding@#1}{\blx@tempe}% | |
\ifdef\blx@tempf | |
{\csxdef{blx@res@glob@#1}{\blx@tempf}} | |
{}% | |
\ifdef\blx@tempd | |
{\csxdef{blx@res@labl@\blx@tempd}{#1}} | |
{}} | |
\def\blx@addbib@resource#1{% | |
\blx@addbib@register{#1}% | |
\listgadd\blx@bibfiles{#1}% | |
\blx@regbibfile\jobname{#1}} | |
\def\blx@addbib@global#1{% | |
\blx@addbib@resource{#1}% | |
\listgadd\blx@bibfiles@global{#1}} | |
\let\blx@bibfiles\@empty | |
\let\blx@bibfiles@global\@empty | |
\def\blx@bibdata#1#2{% | |
\forlistloop{\blx@bibdata@i{#1}}#2} | |
\def\blx@bibdata@i#1#2{% | |
\blx@xmlsanitizeafter{\blx@bibdata@ii{#1}{#2}}{#2}} | |
\def\blx@bibdata@ii#1#2#3{% | |
\eappto#1{% | |
\blx@xml@datasource | |
{\ifcsdef{blx@res@type@#2} | |
{\csuse{blx@res@type@#2}} | |
{file}} | |
{\ifcsdef{blx@res@data@#2} | |
{\csuse{blx@res@data@#2}} | |
{bibtex}} | |
{\ifcsvoid{blx@res@bibencoding@#2} | |
{} | |
{ encoding="\csuse{blx@res@bibencoding@#2}"}} | |
{\ifcsvoid{blx@res@glob@#2} | |
{} | |
{ glob="\csuse{blx@res@glob@#2}"}} | |
{#3}}} | |
%% Citations | |
\newrobustcmd*{\AtEveryCite}{\gappto\blx@hook@cite} | |
\newrobustcmd*{\AtEveryCitekey}{\gappto\blx@hook@citekey} | |
\newrobustcmd*{\AtEveryMultiCite}{\gappto\blx@hook@mcite} | |
\@onlypreamble\AtEveryCite | |
\@onlypreamble\AtEveryCitekey | |
\@onlypreamble\AtEveryMultiCite | |
\newrobustcmd*{\AtEachCitekey}{% | |
\iftoggle{blx@citation}{\appto\blx@hook@citekey}{\@gobble}} | |
\let\blx@hook@entrykey\@gobble | |
\newrobustcmd*{\AtEveryEntrykey}{% | |
\apptocmd{\blx@hook@entrykey}} | |
\@onlypreamble\AtEveryEntrykey | |
\def\blx@imc@UseEveryCiteHook{\csuse{blx@hook@cite}} | |
\def\blx@imc@UseEveryCitekeyHook{\csuse{blx@hook@citekey}} | |
\def\blx@imc@UseEveryMultiCiteHook{\csuse{blx@hook@mcite}} | |
\newrobustcmd*{\AtNextCite}{% | |
\ifundef\blx@hook@cite@next | |
{\gdef\blx@hook@cite@next{\global\undef\blx@hook@cite@next}} | |
{}% | |
\gappto\blx@hook@cite@next} | |
\newrobustcmd*{\AtNextCitekey}{% | |
\ifundef\blx@hook@citekey@next | |
{\gdef\blx@hook@citekey@next{\global\undef\blx@hook@citekey@next}} | |
{}% | |
\gappto\blx@hook@citekey@next} | |
\newrobustcmd*{\AtNextMultiCite}{% | |
\ifundef\blx@hook@mcite@next | |
{\gdef\blx@hook@mcite@next{\global\undef\blx@hook@mcite@next}} | |
{}% | |
\gappto\blx@hook@mcite@next} | |
\def\blx@imc@UseNextCiteHook{\csuse{blx@hook@cite@next}} | |
\def\blx@imc@UseNextCitekeyHook{\csuse{blx@hook@citekey@next}} | |
\def\blx@imc@UseNextMultiCiteHook{\csuse{blx@hook@mcite@next}} | |
\def\blx@imc@DeferNextCitekeyHook{\undef\blx@hook@citekey@next} | |
\blx@regimcs{% | |
\UseEveryCiteHook \UseEveryCitekeyHook \UseEveryMultiCiteHook | |
\UseNextCiteHook \UseNextCitekeyHook \UseNextMultiCiteHook | |
\DeferNextCitekeyHook} | |
% {<style>} | |
\newrobustcmd*{\RequireCitationStyle}[1]{% | |
\blx@inputonce{#1.cbx}{citation style '#1'}{}{}{} | |
{\blx@error | |
{Style '#1' not found} | |
{The citation style '#1' could not be found}}} | |
\@onlypreamble\RequireCitationStyle | |
% {<code>} | |
\newrobustcmd*{\InitializeCitationStyle}{\appto\blx@hook@cbxinit} | |
\@onlypreamble\InitializeCitationStyle | |
% {<code>} | |
\newrobustcmd*{\OnManualCitation}{\appto\blx@hook@mancite} | |
\@onlypreamble\OnManualCitation | |
\newrobustcmd*{\mancite}{% | |
\csuse{blx@hook@mancite}% | |
\blx@ibidreset | |
\blx@idemreset | |
\blx@opcitreset | |
\blx@loccitreset} | |
% {<entrykey>}{<message>} | |
% Wrapper to track cite keys which are \nocited | |
\def\blx@nocitation#1#2{% | |
\ifinlist{#1}\blx@nocites | |
{} | |
{\listgadd\blx@nocites{#1}}% | |
\blx@citation@i{#1}{#2}} | |
% {<entrykey>}{<message>} | |
% Just a wrapper to suppress citation tracking in toc/lof etc. | |
\def\blx@citation#1#2{% | |
\ifinlist{#1}\blx@directcites | |
{} | |
{\listgadd\blx@directcites{#1}}% | |
\blx@citation@i{#1}{#2}} | |
\def\blx@citation@i#1#2{% | |
\ifbool{citerequest} | |
{\blx@citation@entry{#1}{#2}} | |
{}} | |
\def\blx@citation@entry#1#2{% | |
\blx@bibreq{#1}% | |
\ifinlist{#1}\blx@cites | |
{} | |
{\listgadd{\blx@cites}{#1}}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@cite{#1}}% | |
\ifinlistcs{#1}{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{} | |
{\listcsgadd{blx@segm@\the\c@refsection @\the\c@refsegment}{#1}}% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@segm{\the\c@refsection}% | |
{\the\c@refsegment}% | |
{\detokenize{#1}}}% | |
\blx@ifdata{#1} | |
{} | |
{\ifcsdef{blx@miss@\the\c@refsection} | |
{\ifinlistcs{#1}{blx@miss@\the\c@refsection} | |
{} | |
{\blx@logreq@active{#2{#1}}}} | |
{\blx@logreq@active{#2{#1}}}}% | |
\blx@hook@entrykey{#1}} | |
\protected\def\abx@aux@segm#1#2#3{% | |
\xifinlistcs{\detokenize{#3}}{blx@segm@#1@#2} | |
{} | |
{\listcsxadd{blx@segm@#1@#2}{\detokenize{#3}}}} | |
\def\blx@nocitation@all{% | |
\ifinlist{*}\blx@nocites | |
{} | |
{\listgadd\blx@nocites{*}}% | |
\blx@citation@all} | |
\def\blx@citation@all{% | |
\ifbool{citerequest} | |
{\blx@bibreq{*}% | |
\global\csletcs | |
{blx@segm@\the\c@refsection @\the\c@refsegment} | |
{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}% | |
\ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context} | |
{\blx@logreq@active{}} | |
{}} | |
{}} | |
\protected\def\blx@bibreq#1{% | |
\begingroup | |
\blx@xmlsanitizeafter{\def\blx@tempa}{#1}% | |
\let\blx@tempb\@empty | |
% Only output as \nocited if a key wasn't also directly \cite'd | |
% Since citekey output is sequential as cites are read, the .bcf might contain | |
% duplicate keys with differring nocite attributes if \nocite{X} and \cite{X} both occur | |
% but biber deals with this and priorities \cites | |
\ifboolexpr{test {\ifinlist{#1}\blx@nocites} | |
and | |
not test {\ifinlist{#1}\blx@directcites}} | |
{\def\blx@tempb{ nocite="1"}} | |
{}% | |
% citeall is always order "0" - this makes no real difference as biber | |
% ignores all other citekeys in the section if citeall is present | |
\ifstrequal{*}{#1} | |
{\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}{0}}} | |
{\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\blx@tempb}{\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}}}% | |
\endgroup} | |
% {<set>}{<key1,key2,key3>} | |
\newrobustcmd*{\defbibentryset}[2]{% | |
\@bsphack | |
\begingroup | |
\blx@xsanitizeafter{\def\blx@tempa}{#1}% | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\blx@xsanitizeafter{\forcsvlist\blx@defentryset@add}{#2}% | |
\ifcsdef{blx@set@\the\c@refsection @\blx@tempa} | |
{\expandafter\ifdefequal | |
\csname blx@set@\the\c@refsection @\blx@tempa\endcsname | |
\blx@tempb | |
{} | |
{\blx@error | |
{Conflicting definitions of '\blx@tempa'} | |
{The entry set '\blx@tempa' has been defined before.% | |
\MessageBreak | |
old: \blx@tempa\space = % | |
\csuse{blx@set@\the\c@refsection @\blx@tempa}\MessageBreak | |
new: \blx@tempa\space = \blx@tempb\MessageBreak | |
I'm ignoring the new definition}}} | |
{\global\cslet{blx@set@\the\c@refsection @\blx@tempa}\blx@tempb | |
\edef\blx@tempa{% | |
\AfterPreamble{\blx@setreq{\blx@tempa}{\blx@tempb}}}% | |
\blx@tempa}% | |
\endgroup | |
\@esphack} | |
\def\blx@defentryset@add#1{% | |
\edef\blx@tempb{\blx@tempb\blx@tempc#1}% | |
\def\blx@tempc{,}} | |
\protected\def\blx@setreq#1#2{% | |
\begingroup | |
\blx@xmlsanitizeafter{\def\blx@tempa}{#1}% | |
\blx@xmlsanitizeafter{\def\blx@tempb}{#2}% | |
\blx@auxwrite\blx@bcfout{}{\blx@xml@citeset{\blx@tempa}{\blx@tempb}}% | |
\endgroup} | |
% {<entrykey>,...} | |
\protected\def\blx@citeloop#1{% | |
\expandafter\blx@citeloop@i\expandafter{\detokenize{#1}}} | |
\protected\def\blx@citeloop@i#1{% | |
\begingroup | |
% This must be here and not after \blx@citeadd as this changes the refcontext | |
\letcs\blx@tempb{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}% | |
\ifundef\blx@tempb | |
{\let\blx@tempb\@empty} | |
{}% | |
% Make sure this counter exists. Sometimes it might not when using, e.g: | |
% refsection=chapter and \includeonly to put in the chapters or when | |
% inserting citations into table of contents | |
\ifcscounter{blx@sectionciteorder@\the\c@refsection} | |
{} | |
{\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname}% | |
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne | |
\blx@tempcnta\z@ | |
\blx@tempcntb\z@ | |
\let\blx@tempa\@empty | |
\forcsvlist\blx@citeadd{#1}% adds to \blx@tempa | |
\blx@thenotecheck | |
\ifnum\blx@tempcnta>\z@ | |
\ifnum\blx@tempcntb>\z@ | |
\multicitedelim | |
\fi | |
\else | |
\blx@postpunct@saved | |
\fi | |
% \blx@tempb is a sorted list of all cites, \blx@tempa is the list of cites to | |
% sort using this list | |
\blx@thecitesort | |
\edef\blx@tempa{\endgroup | |
\c@citecount\z@ | |
\c@citetotal\the\blx@tempcnta\relax | |
\unexpanded{\forlistloop\blx@citeprint}{\blx@tempb}}% | |
\blx@tempa} | |
\def\blx@notecheck{% | |
\ifnum\blx@tempcnta>\@ne | |
\blx@warning{% | |
Package option 'sortcites' enabled.\MessageBreak | |
Verify postnote placement}% | |
\fi} | |
\def\blx@citesort{% | |
\ifnum\blx@tempcnta>\@ne | |
\blx@filtercitesort\blx@tempb{blx@tempa}% | |
\else | |
\blx@citenosort | |
\fi} | |
\def\blx@citenosort{% | |
\let\blx@tempb\blx@tempa} | |
\def\abx@missing@entry#1{% | |
\abx@missing{#1}} | |
% {<entrykey>} | |
\def\blx@citeadd#1{% | |
\ifcsdef{blx@keyalias@\the\c@refsection @#1} | |
{\letcs\blx@realkey{blx@keyalias@\the\c@refsection @#1}} | |
{\def\blx@realkey{#1}}% | |
\expandafter\blx@getrefcontext\expandafter{\blx@realkey}% needed for \ifdata | |
\expandafter\blx@citation\expandafter{\blx@realkey}\blx@msg@cundefon | |
\expandafter\blx@ifdata\expandafter{\blx@realkey} | |
{\advance\blx@tempcnta\@ne | |
\listeadd\blx@tempa{\blx@realkey}} | |
{\ifnum\blx@tempcntb>\z@\multicitedelim\fi | |
\expandafter\abx@missing@entry\expandafter{\blx@realkey}% | |
\advance\blx@tempcntb\@ne}} | |
% set default refcontext for one citation key | |
% and then override with data from auto-assign \assignrefcontext* macros, if any | |
% <entrykey> | |
\def\blx@getrefcontext#1{% | |
% Save refcontext for restoration at end of \citeprint | |
\let\blx@refcontext@context@saved\blx@refcontext@context | |
% Get the default refcontext | |
% If there was one due to appearance in a bib/biblist, use it | |
% otherwise fall back on global refcontext. This can happen for cites | |
% made (a bit strangely but some styles do this) inside a biblist | |
% which never appear in any printed bib/biblist and therefore have no default | |
% refcontext defined | |
\ifcsdef{blx@assignedrefcontextbib@\the\c@refsection @#1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextbib@\the\c@refsection @#1}} | |
{\blx@edef@refcontext{\blx@sorting/global//global/global}}% | |
% assignment via keyword list | |
\ifdef\blx@assignedrefcontextkeywlist | |
{\def\do##1{% | |
\blx@imc@ifentrykeyword{#1}{##1} | |
{% weak version | |
\ifboolexpr{test {\ifcsdef{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}} | |
and | |
not togl {blx@refcontext}}% inside explicit non-global refcontext | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}} | |
{}% | |
% strong version | |
\ifcsdef{blx@assignedrefcontextkeyws@\the\c@refsection @##1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws@\the\c@refsection @##1}} | |
{}} | |
{}}% | |
\dolistloop\blx@assignedrefcontextkeywlist} | |
{}% | |
% assignment via category | |
\ifdef\blx@assignedrefcontextcatlist | |
{\def\do##1{% | |
\blx@imc@ifentrycategory{#1}{##1} | |
{% weak version | |
\ifboolexpr{test {\ifcsdef{blx@assignedrefcontextcats*@\the\c@refsection @##1}} | |
and | |
not togl {blx@refcontext}}% inside explicit non-global refcontext | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextcats*@\the\c@refsection @##1}} | |
{}% | |
% strong version | |
\ifcsdef{blx@assignedrefcontextcats@\the\c@refsection @##1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextcats@\the\c@refsection @##1}} | |
{}} | |
{}}% | |
\dolistloop\blx@assignedrefcontextcatlist} | |
{}% | |
% assignment via entrykeys | |
% weak version | |
\nottoggle{blx@refcontext} | |
{\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @*} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @*}} | |
{\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @#1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @#1}} | |
{}}} | |
{}% | |
% strong version | |
\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @*} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @*}} | |
{\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @#1} | |
{\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @#1}} | |
{}}} | |
% {<entrykey>} | |
\protected\def\blx@citeprint#1{% | |
\blx@getrefcontext{#1}% | |
\advance\c@citecount\@ne | |
\addtocounter{instcount}\@ne | |
\ifnum\c@citecount=\@ne | |
\blx@getdata@cite{#1}% | |
\blx@precode | |
\ifnum\c@citetotal>\@ne | |
\blx@resetdata | |
\fi | |
\else | |
\blx@dlimcode | |
\fi | |
\begingroup | |
\ifnum\c@citetotal>\@ne | |
\blx@getdata@cite{#1}% | |
\fi | |
\blx@entrysetcount | |
\blx@setoptions@type\abx@field@entrytype | |
\blx@setoptions@entry | |
\blx@backref{#1}% | |
\blx@pagetracker | |
\csuse{blx@hook@citekey}% | |
\csuse{blx@hook@citekey@next}% | |
\blx@beglangcite | |
\blx@execute | |
\blx@loopcode | |
\blx@citecounter | |
\blx@citetracker | |
\blx@ibidtracker | |
\blx@idemtracker | |
\blx@opcittracker | |
\blx@loccittracker | |
\ifnum\c@citecount=\c@citetotal | |
\def\blx@thecheckpunct{\blx@err@nestcite\@gobble}% | |
\blx@postcode | |
\blx@postpunct@saved | |
\fi | |
\blx@endlangcite | |
\endgroup | |
\let\blx@refcontext@context\blx@refcontext@context@saved} | |
% cite counter | |
\def\blx@citecounter@global{% | |
\ifbool{@filesw} | |
{\ifbool{citetracker} | |
{\immediate\write\@mainaux{% | |
\string\abx@aux@count | |
{\the\c@refsection}{\abx@field@entrykey}}} | |
{}} | |
{}} | |
\def\blx@citecounter@context{% | |
\ifbool{@filesw} | |
{\ifbool{citetracker} | |
{\immediate\write\@mainaux{% | |
\iftoggle{blx@footnote} | |
{\string\abx@aux@fncount} | |
{\string\abx@aux@count}% | |
{\the\c@refsection}{\abx@field@entrykey}}} | |
{}} | |
{}} | |
% {<refsection>}{<entrykey>} | |
% set maxcitecounter as well, note that we also define a maxcitecounter across | |
% all refsections, but that does not have a high-level interface | |
\protected\def\blx@aux@count#1#2{% | |
\csnumgdef{blx@count@#1@\detokenize{#2}}{% | |
\csuse{blx@count@#1@\detokenize{#2}}+1}% | |
\ifnumgreater{\csuse{blx@count@#1@\detokenize{#2}}}{% | |
0\csuse{blx@maxcitecounter@#1}} | |
{\csnumgdef{blx@maxcitecounter@#1}{% | |
\csuse{blx@count@#1@\detokenize{#2}}}} | |
{}% | |
\ifnumgreater{\csuse{blx@count@#1@\detokenize{#2}}}{% | |
0\csuse{blx@maxcitecounter}} | |
{\csnumgdef{blx@maxcitecounter}{% | |
\csuse{blx@count@#1@\detokenize{#2}}}} | |
{}} | |
\protected\def\blx@aux@fncount#1#2{% | |
\csnumgdef{blx@fncount@#1@\detokenize{#2}}{% | |
\csuse{blx@fncount@#1@\detokenize{#2}}+1}% | |
\ifnumgreater{\csuse{blx@fncount@#1@\detokenize{#2}}}{% | |
0\csuse{blx@maxfncitecounter@#1}} | |
{\csnumgdef{blx@maxfncitecounter@#1}{% | |
\csuse{blx@fncount@#1@\detokenize{#2}}}} | |
{}% | |
\ifnumgreater{\csuse{blx@fncount@#1@\detokenize{#2}}}{% | |
0\csuse{blx@maxfncitecounter}} | |
{\csnumgdef{blx@maxfncitecounter}{% | |
\csuse{blx@fncount@#1@\detokenize{#2}}}} | |
{}} | |
\let\abx@aux@count\@gobbletwo | |
\let\abx@aux@fncount\@gobbletwo | |
\AtEndDocument{% | |
\let\abx@aux@count\@gobbletwo | |
\let\abx@aux@fncount\@gobbletwo} | |
\protected\def\blx@setcitecounter@global{% | |
\c@citecounter0% | |
\csuse{blx@count@\the\c@refsection @\abx@field@entrykey}% | |
\relax | |
\c@maxcitecounter0% | |
\csuse{blx@maxcitecounter@\the\c@refsection}% | |
\relax} | |
\protected\def\blx@setcitecounter@context{% | |
\c@citecounter0% | |
\iftoggle{blx@footnote} | |
{\csuse{blx@fncount@\the\c@refsection @\abx@field@entrykey}} | |
{\csuse{blx@count@\the\c@refsection @\abx@field@entrykey}}% | |
\relax | |
\c@maxcitecounter0% | |
\iftoggle{blx@footnote} | |
{\csuse{blx@maxfncitecounter@\the\c@refsection}} | |
{\csuse{blx@maxcitecounter@\the\c@refsection}}% | |
\relax} | |
% cite tracker | |
\def\blx@citetracker@global{% | |
\ifbool{citetracker} | |
{\xifinlistcs\abx@field@entrykey{blx@bsee@\the\c@refsection} | |
{} | |
{\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}} | |
{}} | |
\def\blx@citetracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\xifinlistcs\abx@field@entrykey{blx@fsee@\the\c@refsection} | |
{} | |
{\listcsxadd{blx@fsee@\the\c@refsection}\abx@field@entrykey}} | |
{\xifinlistcs\abx@field@entrykey{blx@bsee@\the\c@refsection} | |
{} | |
{\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}}} | |
{}} | |
\protected\appto\abx@savetrackers{% | |
\global\csletcs{blx@saved@bsee@\the\c@refsection}{blx@bsee@\the\c@refsection}% | |
\global\csletcs{blx@saved@fsee@\the\c@refsection}{blx@fsee@\the\c@refsection}} | |
\protected\appto\abx@resttrackers{% | |
\global\csletcs{blx@bsee@\the\c@refsection}{blx@saved@bsee@\the\c@refsection}% | |
\global\csletcs{blx@fsee@\the\c@refsection}{blx@saved@fsee@\the\c@refsection}} | |
\protected\appto\abx@cleartrackers{% | |
\global\cslet{blx@saved@bsee@\the\c@refsection}\@empty | |
\global\cslet{blx@saved@fsee@\the\c@refsection}\@empty} | |
% ibidem tracker | |
\def\blx@ibidtracker@global{% | |
\ifbool{citetracker} | |
{\global\let\blx@lastkey@text\abx@field@entrykey} | |
{}} | |
\def\blx@ibidtracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\global\let\blx@lastkey@foot\abx@field@entrykey} | |
{\global\let\blx@lastkey@text\abx@field@entrykey}} | |
{}} | |
\def\blx@ibidtracker@strict{% | |
\blx@ifcitesingle | |
{\blx@ibidtracker@global} | |
{\blx@ibidreset@global}}% | |
\def\blx@ibidtracker@constrict{% | |
\blx@ifcitesingle | |
{\blx@mpfnsave | |
\blx@ibidtracker@context} | |
{\blx@ibidreset@context}}% | |
\def\blx@ibidreset@force{% | |
\global\undef\blx@lastkey@text | |
\global\undef\blx@lastkey@foot | |
\blx@mpfnreset} | |
\def\blx@ibidreset@global{% | |
\global\undef\blx@lastkey@text} | |
\def\blx@ibidreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@mpfnreset | |
\global\undef\blx@lastkey@foot} | |
{\global\undef\blx@lastkey@text}} | |
\protected\appto\abx@savetrackers{% | |
\global\let\blx@saved@lastkey@text\blx@lastkey@text | |
\global\let\blx@saved@lastkey@foot\blx@lastkey@foot} | |
\protected\appto\abx@resttrackers{% | |
\global\let\blx@lastkey@text\blx@saved@lastkey@text | |
\global\let\blx@lastkey@foot\blx@saved@lastkey@foot} | |
\protected\appto\abx@cleartrackers{% | |
\global\undef\blx@saved@lastkey@text | |
\global\undef\blx@saved@lastkey@foot} | |
% idem tracker | |
\def\blx@idemtracker@global{% | |
\ifbool{citetracker} | |
{\global\let\blx@lasthash@text\abx@field@fullhash} | |
{}} | |
\def\blx@idemtracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\global\let\blx@lasthash@foot\abx@field@fullhash} | |
{\global\let\blx@lasthash@text\abx@field@fullhash}} | |
{}} | |
\let\blx@idemtracker@strict\blx@idemtracker@global | |
\def\blx@idemtracker@constrict{% | |
\blx@mpfnsave | |
\blx@idemtracker@context} | |
\def\blx@idemreset@force{% | |
\global\undef\blx@lasthash@text | |
\global\undef\blx@lasthash@foot | |
\blx@mpfnreset} | |
\def\blx@idemreset@global{% | |
\global\undef\blx@lasthash@text} | |
\def\blx@idemreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@mpfnreset | |
\global\undef\blx@lasthash@foot} | |
{\global\undef\blx@lasthash@text}} | |
\protected\appto\abx@savetrackers{% | |
\global\let\blx@saved@lasthash@text\blx@lasthash@text | |
\global\let\blx@saved@lasthash@text\blx@lasthash@text} | |
\protected\appto\abx@resttrackers{% | |
\global\let\blx@lasthash@text\blx@saved@lasthash@text | |
\global\let\blx@lasthash@text\blx@saved@lasthash@text} | |
\protected\appto\abx@cleartrackers{% | |
\global\undef\blx@saved@lasthash@text | |
\global\undef\blx@saved@lasthash@foot} | |
% opcit tracker | |
\def\blx@opcittracker@global{% | |
\ifbool{citetracker} | |
{\blx@opcit@tracker{text}} | |
{}} | |
\def\blx@opcittracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@opcit@tracker{foot}} | |
{\blx@opcit@tracker{text}}} | |
{}} | |
\def\blx@opcittracker@strict{% | |
\blx@ifcitesingle | |
{\blx@opcittracker@global} | |
{\blx@opcitreset@global}}% | |
\def\blx@opcittracker@constrict{% | |
\blx@ifcitesingle | |
{\blx@mpfnsave | |
\blx@opcittracker@context} | |
{\blx@opcitreset@context}}% | |
\def\blx@opcit@tracker#1{% | |
\blx@imc@iffieldundef{namehash} | |
{} | |
{\global\cslet{blx@lastkey@#1@\abx@field@namehash}\abx@field@entrykey | |
\xifinlistcs\abx@field@namehash{blx@trackhash@#1} | |
{} | |
{\listcsxadd{blx@trackhash@#1}\abx@field@namehash}}} | |
\def\blx@opcit@reset#1{% | |
\begingroup | |
\def\do##1{\global\csundef{blx@lastkey@#1@##1}}% | |
\dolistcsloop{blx@trackhash@#1}% | |
\global\cslet{blx@trackhash@#1}\@empty | |
\endgroup} | |
\def\blx@opcitreset@force{% | |
\blx@opcit@reset{text}% | |
\blx@opcit@reset{foot}% | |
\blx@mpfnreset} | |
\def\blx@opcitreset@global{% | |
\blx@opcit@reset{text}} | |
\def\blx@opcitreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@opcit@reset{foot}% | |
\blx@mpfnreset} | |
{\blx@opcit@reset{text}}} | |
\let\blx@trackhash@text\@empty | |
\let\blx@trackhash@foot\@empty | |
\protected\appto\abx@savetrackers{% | |
\begingroup | |
\def\do#1{\global\csletcs{blx@saved@lastkey@text@#1}{blx@lastkey@text@#1}}% | |
\dolistloop\blx@trackhash@text | |
\global\let\blx@saved@trackhash@text\blx@trackhash@text | |
\def\do#1{\global\csletcs{blx@saved@lastkey@foot@#1}{blx@lastkey@foot@#1}}% | |
\dolistloop\blx@trackhash@foot | |
\global\let\blx@saved@trackhash@foot\blx@trackhash@foot | |
\endgroup} | |
\protected\appto\abx@resttrackers{% | |
\begingroup | |
\blx@opcit@reset{text}% | |
\global\let\blx@trackhash@text\blx@saved@trackhash@text | |
\def\do#1{\global\csletcs{blx@lastkey@text@#1}{blx@saved@lastkey@text@#1}}% | |
\dolistloop\blx@trackhash@text | |
\blx@opcit@reset{foot}% | |
\global\let\blx@trackhash@foot\blx@saved@trackhash@foot | |
\def\do#1{\global\csletcs{blx@lastkey@foot@#1}{blx@saved@lastkey@foot@#1}}% | |
\dolistloop\blx@trackhash@foot | |
\endgroup} | |
\protected\appto\abx@cleartrackers{% | |
\begingroup | |
\def\do#1{\global\csundef{blx@saved@lastkey@text@#1}}% | |
\dolistloop\blx@saved@trackhash@text | |
\global\undef\blx@saved@trackhash@text | |
\def\do#1{\global\csundef{blx@saved@lastkey@foot@#1}}% | |
\dolistloop\blx@saved@trackhash@foot | |
\global\undef\blx@saved@trackhash@foot | |
\endgroup} | |
% loccit tracker | |
\def\blx@loccittracker@global{% | |
\ifbool{citetracker} | |
{\blx@loccit@tracker{text}} | |
{}} | |
\def\blx@loccittracker@context{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@loccit@tracker{foot}} | |
{\blx@loccit@tracker{text}}} | |
{}} | |
\def\blx@loccittracker@strict{% | |
\ifbool{citetracker} | |
{\blx@loccit@stricttracker{text}} | |
{}} | |
\def\blx@loccittracker@constrict{% | |
\ifbool{citetracker} | |
{\iftoggle{blx@footnote} | |
{\blx@mpfnsave | |
\blx@loccit@stricttracker{foot}} | |
{\blx@loccit@stricttracker{text}}} | |
{}} | |
\def\blx@loccit@tracker#1{% | |
\global\csundef{blx@lastnote@#1@\abx@field@entrykey}% | |
\blx@imc@iffieldundef{postnote} | |
{} | |
{\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote | |
\xifinlistcs\abx@field@entrykey{blx@trackkeys@#1} | |
{} | |
{\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}} | |
\def\blx@loccit@stricttracker#1{% | |
\global\csundef{blx@lastnote@#1@\abx@field@entrykey}% | |
\blx@imc@iffieldundef{postnote} | |
{} | |
{\blx@ifcitesingle | |
{\expandafter\blx@imc@ifpages | |
\expandafter{\abx@field@postnote} | |
{\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote | |
\xifinlistcs\abx@field@entrykey{blx@trackkeys@#1} | |
{} | |
{\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}} | |
{}} | |
{}}} | |
\def\blx@loccit@reset#1{% | |
\begingroup | |
\def\do##1{\global\csundef{blx@lastnote@#1@##1}}% | |
\dolistcsloop{blx@trackkeys@#1}% | |
\global\cslet{blx@trackkeys@#1}\@empty | |
\endgroup} | |
\def\blx@loccitreset@force{% | |
\blx@loccit@reset{text}% | |
\blx@loccit@reset{foot}% | |
\blx@mpfnreset} | |
\def\blx@loccitreset@global{% | |
\blx@loccit@reset{text}} | |
\def\blx@loccitreset@context{% | |
\iftoggle{blx@footnote} | |
{\blx@loccit@reset{foot}% | |
\blx@mpfnreset} | |
{\blx@loccit@reset{text}}} | |
\let\blx@trackkeys@text\@empty | |
\let\blx@trackkeys@foot\@empty | |
\protected\appto\abx@savetrackers{% | |
\begingroup | |
\def\do#1{\global\csletcs{blx@saved@lastnote@text@#1}{blx@lastnote@text@#1}}% | |
\dolistloop\blx@trackkeys@text | |
\global\let\blx@saved@trackkeys@text\blx@trackkeys@text | |
\def\do#1{\global\csletcs{blx@saved@lastnote@foot@#1}{blx@lastnote@foot@#1}}% | |
\dolistloop\blx@trackkeys@foot | |
\global\let\blx@saved@trackkeys@foot\blx@trackkeys@foot | |
\endgroup} | |
\protected\appto\abx@resttrackers{% | |
\begingroup | |
\blx@loccit@reset{text}% | |
\global\let\blx@trackkeys@text\blx@saved@trackkeys@text | |
\def\do#1{\global\csletcs{blx@lastnote@text@#1}{blx@saved@lastnote@text@#1}}% | |
\dolistloop\blx@trackkeys@text | |
\blx@loccit@reset{foot}% | |
\global\let\blx@trackkeys@foot\blx@saved@trackkeys@foot | |
\def\do#1{\global\csletcs{blx@lastnote@foot@#1}{blx@saved@lastnote@foot@#1}}% | |
\dolistloop\blx@trackkeys@foot | |
\endgroup} | |
\protected\appto\abx@cleartrackers{% | |
\begingroup | |
\def\do#1{\global\csundef{blx@saved@lastnote@text@#1}}% | |
\dolistloop\blx@saved@trackkeys@text | |
\global\undef\blx@saved@trackkeys@text | |
\def\do#1{\global\csundef{blx@saved@lastnote@foot@#1}}% | |
\dolistloop\blx@saved@trackkeys@foot | |
\global\undef\blx@saved@trackkeys@foot | |
\endgroup} | |
\def\blx@addbackref#1{% | |
\ifcsdef{blx@setp@\the\c@refsection @#1} | |
{\ifcase\blx@backrefsetstyle | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@ii{setp}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setp}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setp}{#1}% | |
\fi} | |
{\ifcsdef{blx@setc@\the\c@refsection @#1} | |
{\ifcase\blx@backrefsetstyle | |
\blx@addbackref@ii{setc}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setc}{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\or | |
\blx@addbackref@i{#1}% | |
\blx@addbackref@ii{setc}{#1}% | |
\fi} | |
{\blx@addbackref@i{#1}}}} | |
\def\blx@addbackref@i#1{% | |
\ifbacktracker | |
\blx@leavevmode | |
\if@filesw | |
\protected@write\@mainaux{}{\string\abx@aux@backref | |
{\the\c@instcount}{#1}{\the\c@refsection}% | |
{\thepage}{\noexpand\the\c@page}}% | |
\fi | |
\fi} | |
\def\blx@addbackref@ii#1#2{% | |
\expandafter\expandafter\expandafter\forcsvlist | |
\expandafter\expandafter\expandafter\blx@addbackref@i | |
\expandafter\expandafter\expandafter{% | |
\csname blx@#1@\the\c@refsection @#2\endcsname}} | |
% {<instcount>}{<entrykey>}{<refsection>}{<page>}{<page int>} | |
\protected\def\blx@aux@backref#1#2#3#4#5{% | |
\ifcsundef{blx@pref@#3@\detokenize{#2}} | |
{\global\cslet{blx@pref@#3@\detokenize{#2}}\@empty | |
\expandafter\blx@onlypreamble\csname blx@pref@#3@\detokenize{#2}\endcsname} | |
{}% | |
\blx@ifprintableinlistcs{#4}{blx@pref@#3@\detokenize{#2}} | |
{} | |
{\listcsgadd{blx@pref@#3@\detokenize{#2}}{#4}}% | |
\blx@addpagesum{#1}{#5}} | |
\AtEndDocument{% | |
\def\abx@aux@backref#1#2#3#4#5{\blx@addpagesum{#1}{#5}}} | |
% {<true>}{<false>} | |
\def\blx@ifcitesingle{% | |
\ifnum\c@citetotal=\@ne | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi} | |
% hyperref interface | |
\appto\blx@mkhyperref{% | |
\protected\def\blx@imc@bibhyperref{% | |
\@ifnextchar[%] | |
{\blx@bibhyperref} | |
{\blx@bibhyperref[\abx@field@entrykey]}}% | |
\ifundef\hyper@natanchorstart | |
{\long\def\blx@bibhyperref[#1]#2{% | |
\blx@sfsave\hyperlink{cite.\the\c@refsection @#1}{\blx@sfrest | |
#2% | |
\blx@sfsave}\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhyperlink#1#2{% | |
\blx@sfsave\hyperlink{cite.\the\c@refsection:#1}{\blx@sfrest | |
#2% | |
\blx@sfsave}\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhypertarget#1#2{% | |
\blx@sfsave\hypertarget{cite.\the\c@refsection:#1}{\blx@sfrest | |
#2% | |
\blx@sfsave}\blx@sfrest}}% | |
{\long\def\blx@bibhyperref[#1]#2{% | |
\blx@sfsave\hyper@natlinkstart{\the\c@refsection @#1}\blx@sfrest | |
#2% | |
\blx@sfsave\hyper@natlinkend\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhyperlink#1#2{% | |
\blx@sfsave\hyper@natlinkstart{\the\c@refsection:#1}\blx@sfrest | |
#2% | |
\blx@sfsave\hyper@natlinkend\blx@sfrest}% | |
\protected\long\def\blx@imc@bibhypertarget#1#2{% | |
\blx@sfsave\hyper@natanchorstart{\the\c@refsection:#1}\blx@sfrest | |
#2% | |
\blx@sfsave\hyper@natanchorend\blx@sfrest}} | |
\let\blx@imc@ifhyperref\@firstoftwo | |
\def\blx@sf{\spacefactor}% | |
\def\blx@sfsave{% | |
\blx@leavevmode | |
\numgdef\blx@sf{\spacefactor}}% | |
\def\blx@sfrest{% | |
\ifhmode\spacefactor\blx@sf\relax\fi | |
\gdef\blx@sf{\spacefactor}}} | |
\appto\blx@mknohyperref{% | |
\protected\def\blx@imc@bibhyperref{\@ifnextchar[\blx@nohyperref\@firstofone}% | |
\def\blx@nohyperref[#1]#2{#2}% | |
\let\blx@imc@bibhyperlink\@secondoftwo | |
\let\blx@imc@bibhypertarget\@secondoftwo | |
\let\blx@imc@ifhyperref\@secondoftwo} | |
\blx@regimcs{% | |
\bibhyperref \bibhyperlink \bibhypertarget \ifhyperref} | |
% {<entrykey>,...} | |
\protected\def\nocite#{\blx@nocite} | |
\def\blx@nocite#1{% | |
\@bsphack | |
\AfterPreamble{% | |
\ifstrequal{*}{#1} | |
{\blx@nocitation@all} | |
{\blx@xsanitizeafter{\forcsvlist\blx@nocite@do}{#1}}}% | |
\@esphack} | |
\def\blx@nocite@do#1{% | |
% Make sure this counter exists. Sometimes it might not when using, e.g: | |
% refsection=chapter and \includeonly to put in the chapters or when | |
% inserting citations into table of contents | |
\ifcscounter{blx@sectionciteorder@\the\c@refsection} | |
{} | |
{\expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname}% | |
\global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne | |
\blx@nocitation{#1}\blx@msg@cundef} | |
% {<macro>}[<arg1>][<arg2>]{<arg3>} | |
% => <macro>{<arg1>}{<arg2>}{<arg3>} | |
\protected\def\blx@citeargs#1{% | |
\@ifnextchar[%] | |
{\blx@citeargs@i{#1}} | |
{\blx@citeargs@iii{#1{}{}}}} | |
\long\def\blx@citeargs@i#1[#2]{% | |
\@ifnextchar[%] | |
{\blx@citeargs@ii{#1{#2}}} | |
{\blx@citeargs@iii{#1{}{#2}}}} | |
\long\def\blx@citeargs@ii#1[#2]{% | |
\blx@citeargs@iii{#1{#2}}} | |
\long\def\blx@citeargs@iii#1#2{% | |
\blx@xsanitizeafter{#1}{#2}} | |
% {<macro>}(<arg1>)(<arg2>) | |
% => <macro>{<arg1>}{<arg2>} | |
\protected\def\blx@multiargs#1{% | |
\@ifnextchar(%) | |
{\blx@multiargs@i{#1}} | |
{#1{}{}}} | |
\long\def\blx@multiargs@i#1(#2){% | |
\@ifnextchar(%) | |
{\blx@multiargs@ii{#1{#2}}} | |
{#1{}{#2}}} | |
\long\def\blx@multiargs@ii#1(#2){#1{#2}} | |
% {<macro>}[<arg1>][<arg2>]{<arg3>}<punct> | |
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<punctcmd>} | |
\protected\def\blx@citepunct#1{% | |
\blx@citeargs{\blx@citepunct@i{#1}}} | |
\long\def\blx@citepunct@i#1#2#3#4{% | |
\blx@thecheckpunct{#1{#2}{#3}{#4}}} | |
% {<csname>}[<arg1>][<arg2>]{arg3}[arg4]{arg5}<punct> | |
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<arg4>}{arg5}{<punctcmd>} | |
\protected\def\blx@citexpunct#1{% | |
\blx@citeargs{\blx@citexpunct@i{#1}}} | |
\long\def\blx@citexpunct@i#1#2#3#4{% | |
\@ifnextchar[%] | |
{\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}} | |
{\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}[{#1}]}} | |
\long\def\blx@citexpunct@ii#1#2[#3]#4{% | |
\blx@thecheckpunct{\blxcitecmd{#1}#2{#3}{#4}}} | |
% {<code>}<punct> => <code>{<punctcmd>} | |
\long\def\blx@checkpunct#1{% | |
\begingroup | |
\def\blx@tempa{\endgroup#1}% | |
\futurelet\blx@tempb\blx@checkpunct@i} | |
\def\blx@checkpunct@i{% | |
\expandafter\blx@checkpunct@ii\blx@autopunct&} | |
\def\blx@checkpunct@ii#1{% | |
\ifx#1&% | |
\expandafter\blx@checkpunct@iii | |
\fi | |
\ifx#1\blx@tempb | |
\expandafter\blx@checkpunct@iv | |
\fi | |
\blx@checkpunct@ii} | |
\def\blx@checkpunct@iii#1\blx@checkpunct@ii{% | |
\global\undef\abx@field@postpunct | |
\blx@tempa{\blx@postpunct}} | |
\def\blx@checkpunct@iv#1\blx@checkpunct@ii#2{% | |
\gdef\abx@field@postpunct{#3}% | |
\edef\blx@tempa{% | |
\expandonce\blx@tempa{% | |
\ifcsdef{blx@pm@\detokenize{#3}} | |
{\csname blx@imc@add\csname blx@pm@\detokenize{#3}\endcsname | |
\endcsname} | |
{\noexpand#3}}}% | |
\blx@tempa} | |
\long\def\blx@nocheckpunct#1{#1{}} | |
\protected\def\blx@citeinit{% | |
\iftoggle{blx@bibliography} | |
{} | |
{\toggletrue{blx@citation}}% | |
\blx@blxinit | |
\citesetup | |
\blx@setsfcodes | |
\blx@postpunct@agroup | |
\blx@resetdata | |
\blx@leavevmode | |
\csuse{blx@hook@cite}% | |
\csuse{blx@hook@cite@next}% | |
\let\blx@citeinit\blx@resetdata} | |
\protected\def\blx@citecmdinit{% | |
\blx@leavevmode@cite | |
\iftoggle{blx@bibliography} | |
{} | |
{\blx@initunit}} | |
% *{<command>}[<wrapper>]{<precode>}{<loopcode>}{<delimcode>}{<postcode>} | |
\newrobustcmd*{\DeclareCiteCommand}{% | |
\@ifstar{\blx@defcitecmd*}{\blx@defcitecmd{}}} | |
\def\blx@defcitecmd#1#2{% | |
\begingroup | |
\escapechar\m@ne | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@defcitecmd@i{#1}{\string#2}}% | |
\blx@tempa} | |
\def\blx@defcitecmd@i#1#2{% | |
\blx@checkcitecmd{#2}{#1}% | |
\protected\csdef{#2}{% | |
\blx@citecmdinit | |
\@ifstar | |
{\blx@citepunct{\blxcitecmd{#2*}}} | |
{\blx@citepunct{\blxcitecmd{#2}}}}% | |
\@ifnextchar[%] | |
{\blx@defcitecmd@iii{#2#1}} | |
{\blx@defcitecmd@ii{#2#1}}} | |
\long\def\blx@defcitecmd@ii#1{% | |
\csundef{blx@defcite@wrapper@#1}% | |
\blx@defcitecmd@iv{#1}% | |
\blx@defcitecmd@v{#1}} | |
\long\def\blx@defcitecmd@iii#1[#2]{% | |
\csdef{blx@defcite@wrapper@#1}{#2}% | |
\blx@defcitecmd@iv{#1}% | |
\blx@defcitecmd@v{#1}} | |
\long\def\blx@defcitecmd@iv#1{% | |
\protected\long\csedef{blx@cite@#1}##1##2##3##4{% | |
\ifboolexpe{test {\ifcsundef{blx@defcite@wrapper@#1}} | |
and | |
(test {\ifcsundef{blx@citepunct@#1}} | |
or | |
test {\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}})} | |
{} | |
{\begingroup | |
\blx@citeinit}% | |
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@l} | |
{\noexpand\unspace##4} | |
{}% | |
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@f} | |
{\noexpand\iftoggle{blx@footnote}{}{\unspace##4}} | |
{}% | |
\ifcsundef{blx@defcite@wrapper@#1} | |
{\blxciteicmd{#1}{##1}{##2}{##3}{% | |
\ifcsundef{blx@citepunct@#1}{##4}{}% | |
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}{##4}{}}} | |
{\csexpandonce{blx@defcite@wrapper@#1}{% | |
\blxciteicmd{#1}{##1}{##2}{##3}{% | |
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}{##4}{}}}% | |
\ifcsundef{blx@citepunct@#1}{##4}{}}% | |
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@r}{##4}{}% | |
\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@f} | |
{\noexpand\iftoggle{blx@footnote}{##4}{}} | |
{}% | |
\ifboolexpe{test {\ifcsundef{blx@defcite@wrapper@#1}} | |
and | |
(test {\ifcsundef{blx@citepunct@#1}} | |
or | |
test {\ifcsequal{blx@citepunct@#1}{blx@citepunctid@pos@c}})} | |
{} | |
{\endgroup}}} | |
\long\def\blx@defcitecmd@v#1#2#3#4#5{% | |
\protected\long\csdef{blx@citei@#1}##1##2##3##4{% | |
\ifblank{##1} | |
{} | |
{\def\abx@field@prenote{##1}}% | |
\ifblank{##2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{##2}% | |
\iftoggle{blx@volcite} | |
{\blx@defvolcitepostnote##2} | |
{}}% | |
\def\blx@precode{\delimcontext{#1}#2}% | |
\def\blx@loopcode{#3}% | |
\def\blx@dlimcode{#4}% | |
\def\blx@postcode{#5}% | |
\def\blx@postpunct@saved{##4}% | |
\blx@citeloop{##3}% | |
\endgroup}} | |
% {<type>}{<name>}{*} | |
\def\blx@checkcitecmd#1#2{% | |
\ifblank{#2} | |
{\ifcsdef{blx@cite@#1} | |
{\blx@info{Redefining '\@backslashchar#1'}} | |
{\ifcsundef{#1} | |
{} | |
{\blx@warning@noline{Redefining '\@backslashchar#1'}}}% | |
\ifcsdef{blx@cite@#1*} | |
{} | |
{\csedef{blx@cite@#1*}{% | |
\expandafter\noexpand\csname blx@cite@#1\endcsname}% | |
\csedef{blx@citei@#1*}{% | |
\expandafter\noexpand\csname blx@citei@#1\endcsname}}} | |
{\ifcsdef{blx@cite@#1} | |
{} | |
{\csdef{blx@cite@#1}{\blx@err@citecmd{#1}}% | |
\csdef{blx@citei@#1}{\blx@err@citecmd{#1}}}}} | |
% {<name>}{prenote}{postnote}{citekey}{punct} | |
\newrobustcmd*{\blxcitecmd}[1]{% | |
\ifcsundef{blx@cite@#1} | |
{\blx@err@citecmd{#1}} | |
{\csuse{blx@cite@#1}}} | |
\newrobustcmd*{\blxciteicmd}[1]{% | |
\begingroup | |
\blx@citeinit | |
\ifcsundef{blx@citei@#1} | |
{\blx@err@citecmd{#1}} | |
{\csuse{blx@citei@#1}}} | |
% {<multicitecount>}{<name>}{prenote}{postnote}{citekey}{punct} | |
\protected\def\blxmciteicmd#1{% | |
\c@multicitecount#1\relax | |
\blxciteicmd} | |
% {<multicitetotal>}{<multiprenote>}{<multipostnote>} | |
\protected\def\blxmcites#1#2#3{% | |
\begingroup | |
\blx@citeinit | |
\c@multicitecount\z@ | |
\c@multicitetotal#1\relax | |
\ifnum\c@multicitetotal>\@ne | |
\let\blx@ifcitesingle\@secondoftwo | |
\fi | |
\csuse{blx@hook@mcite}% | |
\csuse{blx@hook@mcite@next}% | |
\ifblank{#2}% | |
{} | |
{\def\abx@field@multiprenote{#2}}% | |
\ifblank{#3}% | |
{} | |
{\def\abx@field@multipostnote{#3}}% | |
\usebibmacro{multiprenote}} | |
\protected\def\blxendmcites{% | |
\usebibmacro{multipostnote}% | |
\endgroup} | |
% {<command>}[<wrapper>]{<cite>}{<delimiter>} | |
\newrobustcmd{\DeclareMultiCiteCommand}[1]{% | |
\ifundef#1% | |
{} | |
{\blx@info{Redefining '\string#1'}}% | |
\@ifnextchar[%] | |
{\blx@defmcitecmd{#1}} | |
{\blx@defmcitecmd{#1}[\@firstofone]}} | |
\def\blx@defmcitecmd#1[#2]#3#4{% | |
\begingroup | |
\escapechar\m@ne | |
\edef\blx@tempa{\endgroup | |
\protected\def\noexpand#1{% | |
\blx@citecmdinit | |
\noexpand\@ifstar | |
{\expandafter\noexpand | |
\csname blx@mcite@\string#1\endcsname*% | |
\expandafter\noexpand | |
\csname blx@mcitei@\string#1\endcsname} | |
{\expandafter\noexpand | |
\csname blx@mcite@\string#1\endcsname{}% | |
\expandafter\noexpand | |
\csname blx@mcitei@\string#1\endcsname}}% | |
\protected\csdef{blx@mcite@\string#1}####1####2{% | |
\begingroup | |
\blx@citeinit | |
\noexpand\blx@multicite | |
####2% | |
{\unexpanded{#2}}% | |
{\string#3####1}% | |
{\unexpanded{#4}}}% | |
\protected\long\csdef{blx@mcitei@\string#1}}% | |
\blx@tempa##1##2##3{##1{##2}##3\endgroup}} | |
% {<command>}{<wrapper>}{<citecmd>}{<delimiter>} => | |
% <init><command>{<wrapper>}{<cites>}{<punct>} | |
\def\blx@multicite#1#2#3#4{% | |
\begingroup | |
\csuse{blx@hook@mcite@before}% | |
\def\blx@tempa{#1}% | |
\def\blx@tempb{#2}% | |
\def\blx@tempc{#3}% | |
\def\blx@tempd{#4}% | |
\c@multicitetotal\z@ | |
\blx@multiargs\blx@multicite@i} | |
\def\blx@multicite@i#1#2{% | |
\ifblank{#1}% | |
{\let\abx@field@multiprenote\@empty}% | |
{\def\abx@field@multiprenote{#1}}% | |
\ifblank{#2}% | |
{\let\abx@field@multipostnote\@empty}% | |
{\def\abx@field@multipostnote{#2}}% | |
\let\blx@tempe\@empty | |
\let\blx@tempf\@empty | |
\togglefalse{blx@tempa}% | |
\blx@multiparse} | |
\def\blx@multicite@add#1#2#3{% | |
\togglefalse{blx@tempa}% | |
\advance\c@multicitetotal\@ne | |
\eappto\blx@tempe{% | |
\expandonce\blx@tempf | |
\blxmciteicmd{\the\c@multicitetotal}% | |
{\expandonce\blx@tempc}\unexpanded{{#1}{#2}{#3}}{}}% | |
\let\blx@tempf\blx@tempd | |
\blx@multiparse} | |
\def\blx@multicite@end#1{% | |
\edef\blx@tempa{\endgroup | |
\expandonce\blx@tempa | |
{\expandonce\blx@tempb}% | |
{\blxmcites | |
{\the\c@multicitetotal}% | |
{\expandonce\abx@field@multiprenote}% | |
{\expandonce\abx@field@multipostnote}% | |
\expandonce\blx@tempe | |
\blxendmcites}% | |
{#1}% | |
\iftoggle{blx@tempa}{\relax\space}{}}% | |
\blx@tempa} | |
\def\blx@multiparse{% | |
\futurelet\@let@token\blx@multiparse@i} | |
\def\blx@multiparse@i{% | |
\ifx\@let@token\relax | |
\blx@multiparse@ii{\blx@multicite@end{}}% | |
\fi | |
\ifx\@let@token[%] | |
\blx@multiparse@ii{\blx@citeargs\blx@multicite@add}% | |
\fi | |
\ifx\@let@token\bgroup | |
\blx@multiparse@ii{\blx@citeargs\blx@multicite@add}% | |
\fi | |
\ifx\@let@token\@sptoken | |
\blx@multiparse@ii\blx@multiparse@iii | |
\fi | |
\iftrue | |
\iftoggle{blx@tempa} | |
{\blx@multiparse@ii{\blx@multicite@end{}}} | |
{\blx@multiparse@ii{\blx@thecheckpunct\blx@multicite@end}}% | |
\fi | |
&} | |
\def\blx@multiparse@ii#1#2&{\fi#1} | |
\csdef{blx@multiparse@iii} {\toggletrue{blx@tempa}\blx@multiparse} | |
% {<name>}[l|i|r]{<cite>}{<multicite>} | |
\newrobustcmd*{\DeclareAutoCiteCommand}[1]{% | |
\ifcsundef{blx@acite@#1} | |
{} | |
{\blx@info{Redefining autocite command '#1'}}% | |
\@ifnextchar[%] | |
{\blx@defautocmd@i{#1}} | |
{\blx@defautocmd@i{#1}[r]}} | |
\def\blx@defautocmd@i#1[#2]#3#4{% | |
\begingroup | |
\escapechar\m@ne | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@defautocmd@ii{#1}{#2}% | |
{\string#3}{\string#4}}% | |
\blx@tempa} | |
\def\blx@defautocmd@ii#1#2#3#4{% | |
\protected\csedef{blx@acite@#1}{% | |
\blx@citecmdinit | |
\noexpand\@ifstar | |
{\blx@citepunct{\expandafter\noexpand | |
\csname blx@acitei@#1\endcsname*}} | |
{\blx@citepunct{\expandafter\noexpand | |
\csname blx@acitei@#1\endcsname{}}}}% | |
\protected\csedef{blx@acitei@#1}##1##2##3##4##5{% | |
\begingroup | |
\blx@citeinit | |
\if l#2\noexpand\unspace##5\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##5}\fi | |
\blxcitecmd{#3##1}{##2}{##3}{##4}{}% | |
\if r#2##5\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{##5}{}\fi | |
\endgroup}% | |
\protected\csedef{blx@macite@#1}{% | |
\blx@citecmdinit | |
\noexpand\@ifstar | |
{\expandafter\noexpand | |
\csname blx@macitei@#1\endcsname*% | |
\expandafter\noexpand | |
\csname blx@maciteii@#1\endcsname} | |
{\expandafter\noexpand | |
\csname blx@macitei@#1\endcsname{}% | |
\expandafter\noexpand | |
\csname blx@maciteii@#1\endcsname}}% | |
\csedef{blx@macitei@#1}{\csname blx@mcite@#4\endcsname}% | |
\protected\csedef{blx@maciteii@#1}##1##2##3{% | |
\if l#2\noexpand\unspace##3\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##3}\fi | |
##1{##2}% | |
\if r#2##3\fi | |
\if f#2\noexpand\iftoggle{blx@footnote}{##3}{}\fi | |
\endgroup}} | |
% {<characters>} | |
\newrobustcmd*{\DeclareAutoPunctuation}[1]{% | |
\ifblank{#1} | |
{\let\blx@thecheckpunct\blx@nocheckpunct} | |
{\let\blx@thecheckpunct\blx@checkpunct | |
\def\blx@autopunct{#1}}} | |
% {<command>}{<pos marker>} | |
% pos markers are: | |
% l: move punctuation before the command (i.e. left of it) | |
% r: leave punctuation after the command (i.e. to the right) | |
% f: like l in normal text, like r in footnotes | |
% c: pass on to the cite command, | |
% the punctuation will eventually end up as field 'postpunct' | |
% d: discard the punctuation | |
% o (or any other value): restores the old standard behaviour | |
% r for wrapped citation commands, | |
% c for unwrapped ones | |
\newrobustcmd*{\DeclareCitePunctuationPosition}[2]{% | |
\begingroup | |
\escapechar\m@ne | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@defcitepunctpos@i{\string#1}{#2}}% | |
\blx@tempa} | |
\def\blx@citepunctid@pos@l{l} | |
\def\blx@citepunctid@pos@r{r} | |
\def\blx@citepunctid@pos@f{f} | |
\def\blx@citepunctid@pos@c{c} | |
\def\blx@citepunctid@pos@d{d} | |
\def\blx@defcitepunctpos@i#1#2{% | |
\ifcsundef{blx@citepunctid@pos@#2} | |
{\csundef{blx@citepunct@#1}} | |
{\csletcs{blx@citepunct@#1}{blx@citepunctid@pos@#2}}% | |
\blx@defcitecmd@iv{#1}} | |
\AfterEndPreamble{% babel | |
\begingroup | |
\makeatletter | |
\endlinechar\m@ne | |
\scantokens\expandafter{% | |
\expandafter\gdef | |
\expandafter\blx@autopunct | |
\expandafter{\blx@autopunct}}% | |
\endgroup} | |
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<namelist>}<punct> | |
\newrobustcmd*{\citename}{\blx@citexpunct{citename}} | |
\long\csdef{blx@cite@citename}#1#2#3#4#5#6{% | |
\begingroup | |
\blx@citecmdinit | |
\blx@citeinit | |
\ifblank{#1} | |
{} | |
{\def\abx@field@prenote{#1}}% | |
\ifblank{#2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{#2}}% | |
\def\blx@precode{\usebibmacro{prenote}}% | |
\def\blx@loopcode{% | |
\ifnameundef{#5} | |
{\blx@warning@entry{'#5' undefined or not a name list}% | |
\abx@missing{#5}} | |
{\printnames[{#4}]{#5}}}% | |
\def\blx@dlimcode{\multicitedelim}% | |
\def\blx@postpunct@saved{#6}% | |
\ifblank{#2} | |
{\let\blx@postcode\@empty} | |
{\def\blx@postcode{\usebibmacro{postnote}}}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\blx@citeloop{#3}% | |
\endgroup} | |
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<list>}<punct> | |
\newrobustcmd*{\citelist}{\blx@citexpunct{citelist}} | |
\long\csdef{blx@cite@citelist}#1#2#3#4#5#6{% | |
\begingroup | |
\blx@citecmdinit | |
\blx@citeinit | |
\ifblank{#1} | |
{} | |
{\def\abx@field@prenote{#1}}% | |
\ifblank{#2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{#2}}% | |
\def\blx@precode{\usebibmacro{prenote}}% | |
\def\blx@loopcode{% | |
\iflistundef{#5} | |
{\blx@warning@entry{'#5' undefined or not a literal list}% | |
\abx@missing{#5}} | |
{\printlist[{#4}]{#5}}}% | |
\def\blx@dlimcode{\multicitedelim}% | |
\def\blx@postpunct@saved{#6}% | |
\ifblank{#2} | |
{\let\blx@postcode\@empty} | |
{\def\blx@postcode{\usebibmacro{postnote}}}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\blx@citeloop{#3}% | |
\endgroup} | |
% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<field>}<punct> | |
\newrobustcmd*{\citefield}{\blx@citexpunct{citefield}} | |
\long\csdef{blx@cite@citefield}#1#2#3#4#5#6{% | |
\begingroup | |
\blx@citecmdinit | |
\blx@citeinit | |
\ifblank{#1} | |
{} | |
{\def\abx@field@prenote{#1}}% | |
\ifblank{#2} | |
{\let\blx@thenotecheck\relax} | |
{\def\abx@field@postnote{#2}}% | |
\def\blx@precode{\usebibmacro{prenote}}% | |
\def\blx@loopcode{% | |
\iffieldundef{#5} | |
{\blx@warning@entry{'#5' undefined or not a field}% | |
\abx@missing{#5}} | |
{\printfield[{#4}]{#5}}}% | |
\def\blx@dlimcode{\multicitedelim}% | |
\def\blx@postpunct@saved{#6}% | |
\ifblank{#2} | |
{\let\blx@postcode\@empty} | |
{\def\blx@postcode{\usebibmacro{postnote}}}% | |
\boolfalse{citetracker}% | |
\boolfalse{pagetracker}% | |
\blx@citeloop{#3}% | |
\endgroup} | |
\renewrobustcmd*{\cite}{\blx@err@citecmd\cite} | |
\let\blx@cite@cite\relax | |
\newrobustcmd*{\parencite}{\blx@warn@citecmd\parencite\cite} | |
\let\blx@cite@parencite\relax | |
\newrobustcmd*{\footcite}{\blx@warn@citecmd\footcite\cite} | |
\let\blx@cite@footcite\relax | |
\newrobustcmd*{\footcitetext}{\blx@warn@citecmd\footcitetext\cite} | |
\let\blx@cite@footcitetext\relax | |
\newrobustcmd*{\smartcite}{\blx@warn@citecmd\smartcite\cite} | |
\let\blx@cite@smartcite\relax | |
\newrobustcmd*{\textcite}{\blx@warn@citecmd\textcite\cite} | |
\let\blx@cite@textcite\relax | |
\newrobustcmd*{\supercite}{\blx@warn@citecmd\supercite\cite} | |
\let\blx@cite@supercite\relax | |
%% ifthen interface | |
\def\blx@TE#1#2{% | |
\TE@throw | |
\unexpanded{% | |
\iftrue\@nameuse{fi}% | |
#1{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2} | |
\def\blx@xTE#1#2{% | |
\TE@throw | |
\unexpanded{\iftrue\@nameuse{fi}}% | |
#1\unexpanded{{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2} | |
\let\blx@TE@hook\@empty | |
\appto\blx@blxinit{% | |
\appto\blx@TE@hook{% | |
\def\ifhyperref{\blx@TE\blx@imc@ifhyperref}% | |
\def\ifmorenames{\blx@TE\blx@imc@ifmorenames}% | |
\def\ifmoreitems{\blx@TE\blx@imc@ifmoreitems}% | |
\def\iffirstcitekey{\blx@TE\blx@imc@iffirstcitekey}% | |
\def\iflastcitekey{\blx@TE\blx@imc@iflastcitekey}% | |
\def\ifciteseen{\blx@TE\blx@imc@ifciteseen}% | |
\def\ifentryseen{\blx@TE\blx@imc@ifentryseen}% | |
\def\ifentryinbib{\blx@TE\blx@imc@ifentryinbib}% | |
\def\ifciteibid{\blx@TE\blx@imc@ifciteibid}% | |
\def\ifciteidem{\blx@TE\blx@imc@ifciteidem}% | |
\def\ifopcit{\blx@TE\blx@imc@ifopcit}% | |
\def\ifloccit{\blx@TE\blx@imc@ifloccit}% | |
\def\ifsamepage{\blx@TE\blx@imc@ifsamepage}% | |
\def\iffirstonpage{\blx@TE\blx@imc@iffirstonpage}% | |
\def\ifcurrentfield#1{\blx@TE{\blx@imc@ifcurrentfield{#1}}}% | |
\def\ifcurrentlist#1{\blx@TE{\blx@imc@ifcurrentlist{#1}}}% | |
\def\ifcurrentname#1{\blx@TE{\blx@imc@ifcurrentname{#1}}}% | |
\def\ifentrytype#1{\blx@TE{\blx@imc@ifentrytype{#1}}}% | |
\def\iffieldequalcs#1#2{\blx@TE{\blx@imc@iffieldequalcs{#1}{#2}}}% | |
\def\iffieldequals#1#2{\blx@TE{\blx@imc@iffieldequals{#1}{#2}}}% | |
\def\iffieldequalstr#1#2{\blx@TE{\blx@imc@iffieldequalstr{#1}{#2}}}% | |
\def\iffieldsequal#1#2{\blx@TE{\blx@imc@iffieldsequal{#1}{#2}}}% | |
\def\iflistequalcs#1#2{\blx@TE{\blx@imc@iflistequalcs{#1}{#2}}}% | |
\def\iflistequals#1#2{\blx@TE{\blx@imc@iflistequals{#1}{#2}}}% | |
\def\iflistsequal#1#2{\blx@TE{\blx@imc@iflistsequal{#1}{#2}}}% | |
\def\ifbibmacroundef#1{\blx@TE{\blx@imc@ifbibmacroundef{#1}}}% | |
\def\iffieldundef#1{\blx@TE{\blx@imc@iffieldundef{#1}}}% | |
\def\ifnameequalcs#1#2{\blx@TE{\blx@imc@ifnameequalcs{#1}{#2}}}% | |
\def\ifnameequals#1#2{\blx@TE{\blx@imc@ifnameequals{#1}{#2}}}% | |
\def\ifnamesequal#1#2{\blx@TE{\blx@imc@ifnamesequal{#1}{#2}}}% | |
\def\ifnameundef#1{\blx@TE{\blx@imc@ifnameundef{#1}}}% | |
\def\ifcategory#1{\blx@TE{\blx@imc@ifcategory{#1}}}% | |
\def\ifkeyword#1{\blx@TE{\blx@imc@ifkeyword{#1}}}% | |
\def\ifentrycategory#1#2{\blx@TE{\blx@imc@ifentrycategory{#1}{#2}}}% | |
\def\ifentrykeyword#1#2{\blx@TE{\blx@imc@ifentrykeyword{#1}{#2}}}% | |
\def\ifcapital{\blx@TE\blx@imc@ifcapital}% | |
\def\ifinteger#1{\blx@TE{\blx@imc@ifinteger{#1}}}% | |
\def\iffieldint#1{\blx@TE{\blx@imc@iffieldint{#1}}}% | |
\def\ifnumeral#1{\blx@TE{\blx@imc@ifnumeral{#1}}}% | |
\def\ifnumerals#1{\blx@TE{\blx@imc@ifnumerals{#1}}}% | |
\def\ifpages#1{\blx@TE{\blx@imc@ifpages{#1}}}% | |
\def\iffieldnum#1{\blx@TE{\blx@imc@iffieldnum{#1}}}% | |
\def\iffieldnums#1{\blx@TE{\blx@imc@iffieldnums{#1}}}% | |
\def\iffieldpages#1{\blx@TE{\blx@imc@iffieldpages{#1}}}% | |
\def\ifbibstring#1{\blx@TE{\blx@imc@ifbibstring{#1}}}% | |
\def\iffieldbibstring#1{\blx@TE{\blx@imc@iffieldbibstring{#1}}}% | |
\def\ifnatbibmode{\blx@TE{\iftoggle{blx@natbib}}}% | |
\def\ifcitation{\blx@TE{\iftoggle{blx@citation}}}% | |
\def\ifvolcite{\blx@TE{\iftoggle{blx@volcite}}}% | |
\def\ifbibliography{\blx@TE{\iftoggle{blx@bibliography}}}% | |
\def\ifciteindex{\blx@TE{\iftoggle{blx@citeindex}}}% | |
\def\ifbibindex{\blx@TE{\iftoggle{blx@bibindex}}}% | |
\def\iffootnote{\blx@TE{\iftoggle{blx@footnote}}}% | |
\def\ifuseprefix{\blx@TE{\iftoggle{blx@useprefix}}}% | |
\def\ifterseinits{\blx@TE{\iftoggle{blx@terseinits}}}% | |
\def\ifsingletitle{\blx@TE{\iftoggle{abx@bool@singletitle}}}% | |
\def\ifnocite{\blx@TE{\iftoggle{abx@bool@nocite}}}% | |
\def\ifuniquetitle{\blx@TE{\iftoggle{abx@bool@uniquetitle}}}% | |
\def\ifuniquebaretitle{\blx@TE{\iftoggle{abx@bool@uniquebaretitle}}}% | |
\def\ifuniquework{\blx@TE{\iftoggle{abx@bool@uniquework}}}% | |
\def\ifuniqueprimaryauthor{\blx@TE{\iftoggle{abx@bool@uniqueprimaryauthor}}}% | |
\def\ifandothers#1{\blx@TE{\iftoggle{abx@bool@more#1}}}% | |
\def\iflabeldateisdate{\blx@TE\blx@imc@iflabeldateisdate}% | |
\def\ifdatehasyearonlyprecision#1{% | |
\blx@TE{\blx@imc@ifdatehasyearonlyprecision{#1}}}% | |
\def\ifdatehastime#1{\blx@TE{\blx@imc@ifdatehastime{#1}}}% | |
\def\ifdateshavedifferentprecision#1#2{% | |
\blx@TE{\blx@imc@ifdateshavedifferentprecision{#1}{#2}}}% | |
\def\ifdateyearsequal#1#2{% | |
\blx@TE{\blx@imc@ifdateyearsequal{#1}{#2}}}}} | |
% {<listmacro>}{<filtercsname>} => matches in <listmacro> | |
\protected\def\blx@bibfilter#1#2{% | |
\begingroup | |
\edef\blx@do##1{% | |
\def\noexpand\blx@flt@item{##1}% | |
\ifboolexpr{\csexpandonce{#2}}% | |
{\listadd\noexpand\blx@tempa{##1}}% | |
{}}% | |
\let\blx@done\relax | |
\edef\blx@tempa{% | |
\let\noexpand\blx@tempa\noexpand\@empty | |
\blx@listloop{#1}}% | |
\blx@tempa | |
\edef\blx@tempa{\endgroup | |
\def\noexpand#1{\blx@tempa}}% | |
\blx@tempa} | |
%% Auxiliary macros | |
\newrobustcmd*{\mkbibquote}{\blx@enquote} | |
\protected\def\blx@imc@mkbibquote{% | |
\blx@ifuspunct\blx@usquote\blx@enquote} | |
\def\blx@usquote{% | |
\ifnum\@quotelevel>\z@ | |
\expandafter\blx@usiquote | |
\else | |
\expandafter\blx@usoquote | |
\fi} | |
\long\def\blx@usoquote#1{% | |
\begingroup | |
\blx@initoquote | |
\blx@textooquote#1% | |
\futurelet\@let@token\blx@usoquote@i} | |
\def\blx@usoquote@i{% | |
\blx@usqcheck | |
{\ifx\blx@postpunct\@empty\else\blx@dopostpunct\fi | |
\blx@textcoquote\endgroup} | |
{\blx@setpostpunct\blx@textcoquote\endgroup}} | |
\long\def\blx@usiquote#1{% | |
\begingroup | |
\blx@initiquote | |
\blx@textoiquote#1% | |
\futurelet\@let@token\blx@usiquote@i} | |
\def\blx@usiquote@i{% | |
\blx@usqcheck | |
{\blx@textciquote\endgroup} | |
{\blx@setpostpunct\blx@textciquote\endgroup}} | |
\long\def\blx@usqcheck#1#2{% | |
\def\blx@tempa{#1}% | |
\def\blx@tempb{#2}% | |
\ifx\@let@token\space | |
\blx@usqcheck@i\blx@tempa | |
\fi | |
\ifx\@let@token\@sptoken | |
\blx@usqcheck@i\blx@tempa | |
\fi | |
\if\noexpand\@let@token\relax | |
\expandafter\blx@usqcheck@iv | |
\fi | |
\expandafter\blx@usqcheck@ii\blx@quotepunct\relax&} | |
\long\def\blx@usqcheck@i#1#2&{\fi#1} | |
\long\def\blx@usqcheck@ii#1{% | |
\if\noexpand#1\relax | |
\blx@usqcheck@i\blx@tempa | |
\fi | |
\if\noexpand#1\noexpand\@let@token | |
\blx@usqcheck@i{\blx@usqcheck@iii\blx@tempa}% | |
\fi | |
\blx@usqcheck@ii | |
} | |
\long\def\blx@usqcheck@iii#1#2{#2#1} | |
\long\def\blx@usqcheck@iv#1{% | |
\begingroup | |
\escapechar=-1 % | |
\edef\blx@tempa{\expandafter\@gobble\string#2}% | |
\expandafter\endgroup | |
\ifx\blx@tempa\@empty | |
\else | |
\blx@usqcheck@i\blx@tempb | |
\fi | |
#1% | |
} | |
\newrobustcmd*{\mkbibemph}{\emph} | |
\protected\long\def\blx@imc@mkbibemph#1{% | |
\emph{#1}\blx@imc@setpunctfont\emph} | |
\newrobustcmd*{\mkbibbold}{\textbf} | |
\protected\long\def\blx@imc@mkbibbold#1{% | |
\textbf{#1}\blx@imc@setpunctfont\textbf} | |
\newrobustcmd*{\mkbibitalic}{\textit} | |
\protected\long\def\blx@imc@mkbibitalic#1{% | |
\textit{#1}\blx@imc@setpunctfont\textit} | |
\blx@regimcs{\mkbibquote \mkbibemph \mkbibbold \mkbibitalic} | |
\newcommand*{\bibleftparen}{\blx@postpunct(} | |
\newcommand*{\bibrightparen}{\blx@postpunct)\midsentence} | |
\newcommand*{\bibleftbracket}{\blx@postpunct[} | |
\newcommand*{\bibrightbracket}{\blx@postpunct]\midsentence} | |
\def\blx@parenlevel{% | |
\iftoggle{blx@footnote} | |
{\blx@parenlevel@foot} | |
{\blx@parenlevel@text}} | |
\newrobustcmd*{\blx@bibopenparen}{% | |
\blx@opencheck\bibopenparen | |
\blx@postpunct | |
\ifnum\blx@parenlevel=\z@ | |
\global\blx@parenlevel\@ne | |
\global\c@parenlevel\@ne | |
\expandafter\bibleftparen | |
\else | |
\expandafter\blx@openparen | |
\fi} | |
\newrobustcmd*{\blx@bibopenbracket}{% | |
\blx@opencheck\bibopenbracket | |
\blx@postpunct | |
\ifnum\blx@parenlevel=\z@ | |
\global\blx@parenlevel1002 | |
\global\c@parenlevel\@ne | |
\expandafter\bibleftbracket | |
\else | |
\expandafter\blx@openparen | |
\fi} | |
\newrobustcmd*{\blx@bibcloseparen}{% | |
\blx@closecheck\bibcloseparen | |
\blx@postpunct\blx@closeparen} | |
\newrobustcmd*{\blx@bibclosebracket}{% | |
\blx@closecheck\bibclosebracket | |
\blx@postpunct\blx@closeparen} | |
\def\blx@openparen{% | |
\ifodd\blx@parenlevel | |
\global\advance\blx@parenlevel\@ne | |
\global\advance\c@parenlevel\@ne | |
\expandafter\bibleftbracket | |
\else | |
\global\advance\blx@parenlevel\@ne | |
\global\advance\c@parenlevel\@ne | |
\expandafter\bibleftparen | |
\fi} | |
\def\blx@closeparen{% | |
\ifodd\blx@parenlevel | |
\blx@closeparen@i | |
\expandafter\bibrightparen | |
\else | |
\blx@closeparen@i | |
\expandafter\bibrightbracket | |
\fi} | |
\def\blx@closeparen@i{% | |
\ifnum\blx@parenlevel=1002 | |
\global\blx@parenlevel\z@ | |
\global\c@parenlevel\z@ | |
\else | |
\global\advance\blx@parenlevel\m@ne | |
\global\advance\c@parenlevel\m@ne | |
\fi} | |
\def\blx@opencheck#1{% | |
\ifnum\numexpr\blx@parenlevel+\@ne | |
\ifnum\blx@parenlevel>\@m -1001\fi | |
>\c@maxparens | |
\blx@err@nestparen{\string#1}% | |
\blx@errormark | |
\fi} | |
\def\blx@closecheck#1{% | |
\ifnum\numexpr\blx@parenlevel | |
\ifnum\blx@parenlevel>\@m -1001\fi | |
>\c@maxparens | |
\blx@err@nestparen{\string#1}% | |
\blx@errormark | |
\fi | |
\ifnum\blx@parenlevel<\@ne | |
\blx@err@matchparen{Unmatched \string#1}% | |
\blx@errormark | |
\fi} | |
\protected\def\blx@errormark{% | |
\rule[0.25ex]{1.25ex}{1.25ex}} | |
\AtEndDocument{% | |
\unless\ifnum\blx@parenlevel@text=\z@ | |
\blx@err@matchparen{% | |
Unbalanced parentheses or brackets in the document body}% | |
\fi | |
\unless\ifnum\blx@parenlevel@foot=\z@ | |
\blx@err@matchparen{% | |
Unbalanced parentheses or brackets in a foot or endnote}% | |
\fi} | |
\newrobustcmd{\mkbibparens}[1]{% | |
\begingroup | |
\blx@blxinit | |
\blx@setsfcodes | |
\bibopenparen#1\bibcloseparen | |
\endgroup} | |
\newrobustcmd{\mkbibbrackets}[1]{% | |
\begingroup | |
\blx@blxinit | |
\blx@setsfcodes | |
\bibopenbracket#1\bibclosebracket | |
\endgroup} | |
\newrobustcmd*{\parentext}{\mkbibparens} | |
\newrobustcmd*{\brackettext}{\mkbibbrackets} | |
\newrobustcmd{\mkbibsuperscript}[1]{% | |
\unspace\allowhyphens\textsuperscript{% | |
\begingroup | |
\protected\long\def\mkbibsuperscript##1{% | |
\blx@warning{Nested superscript}% | |
\mkbibbrackets{##1}}% | |
#1\endgroup}} | |
\newrobustcmd{\mkbibfootnote}{\blx@mkbibfootnote{}} | |
\newrobustcmd{\mkbibfootnotetext}{\blx@mkbibfootnote{text}} | |
\newrobustcmd{\blx@mkbibfootnote}[2]{% | |
\iftoggle{blx@footnote} | |
{\blx@warning{Nested notes}% | |
\addspace\mkbibparens{#2}} | |
{\unspace | |
\ifnum\blx@notetype=\tw@ | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}} | |
{\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}}}} | |
\newrobustcmd{\mkbibendnote}{\blx@mkbibendnote{}} | |
\newrobustcmd{\mkbibendnotetext}{\blx@mkbibendnote{text}} | |
\newrobustcmd{\blx@mkbibendnote}[2]{% | |
\iftoggle{blx@footnote} | |
{\blx@warning{Nested notes}% | |
\addspace\mkbibparens{#2}} | |
{\unspace | |
\ifnum\blx@notetype=\@ne | |
\expandafter\@firstoftwo | |
\else | |
\expandafter\@secondoftwo | |
\fi | |
{\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}} | |
{\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}}}} | |
\newrobustcmd{\blxmkbibnote}[2]{% | |
\begingroup | |
\blx@blxinit | |
\blx@setsfcodes | |
\blx@postpunct@agroup | |
\toggletrue{blx@footnote}% | |
\csuse{bib#1notewrapper}{#2}% | |
\endgroup} | |
\newcommand{\bibfootnotewrapper}[1]{% | |
\bibsentence#1\addperiod} | |
\newcommand{\bibendnotewrapper}[1]{% | |
\bibsentence#1\addperiod} | |
\AtEndPreamble{% | |
\def\blx@theendnote{\blx@err@endnote\footnote}% | |
\def\blx@theendnotetext{\blx@err@endnote\footnotetext}% | |
\ifdef\endnote | |
{\def\blx@theendnote{\endnote}% | |
\ifdef\endnotetext | |
{\def\blx@theendnotetext{\endnotetext}} | |
{}} | |
{\ifdef\pagenote | |
{\def\blx@theendnote{\pagenote}% | |
\ifdef\pagenotetext | |
{\def\blx@theendnotetext{\pagenotetext}} | |
{}} | |
{}}} | |
\newrobustcmd*{\mknumalph}[1]{% | |
\begingroup | |
\blx@tempcnta=#1\relax | |
\ifnum\blx@tempcnta>702 % | |
\else | |
\ifnum\blx@tempcnta>26 % | |
\advance\blx@tempcnta\m@ne | |
\divide\blx@tempcnta26\relax | |
\blx@numalph\blx@tempcnta | |
\multiply\blx@tempcnta26\relax | |
\blx@tempcnta=\numexpr#1-\blx@tempcnta\relax | |
\fi | |
\fi | |
\blx@numalph\blx@tempcnta | |
\endgroup} | |
\def\blx@numalph#1{% | |
\ifcase#1\relax\blx@warning@entry{Value out of range}\number#1\or | |
a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or | |
n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else | |
\blx@warning@entry{Value out of range}\number#1\fi} | |
% {<macro>}[<pre>]{<vol>}[<post>] => <macro>{<pre>}{{<vol>}{<post>}} | |
\newrobustcmd*{\volcitecmd}{% | |
\AtNextCite{% | |
\toggletrue{blx@volcite}% | |
\csuse{blx@hook@volcite}}% | |
\begingroup\let\blx@citeargs\blx@volciteargs} | |
\protected\def\blx@volciteargs#1{% | |
\endgroup | |
\@ifnextchar[%] | |
{\blx@volciteargs@i{#1}} | |
{\blx@volciteargs@i{#1}[]}} | |
\long\def\blx@volciteargs@i#1[#2]#3{% | |
\@ifnextchar[%] | |
{\blx@volciteargs@ii{#1}{#2}{#3}} | |
{\blx@citeargs@iii{#1{#2}{{#3}{}}}}} | |
\long\def\blx@volciteargs@ii#1#2#3[#4]{% | |
\blx@citeargs@iii{#1{#2}{{#3}{#4}}}} | |
\newrobustcmd*{\multivolcitecmd}{% | |
\AtNextCite{% | |
\toggletrue{blx@volcite}% | |
\csuse{blx@hook@volcite}}% | |
\def\blx@hook@mcite@before{% | |
\global\undef\blx@hook@mcite@before | |
\let\blx@citeargs\blx@volmciteargs}} | |
\protected\def\blx@volmciteargs#1{% | |
\@ifnextchar[%] | |
{\blx@volciteargs@i{#1}} | |
{\blx@volciteargs@i{#1}[]}} | |
\long\def\blx@defvolcitepostnote#1#2{% | |
\def\abx@field@volcitevolume{#1}% | |
\ifblank{#2} | |
{} | |
{\def\abx@field@volcitepages{#2}}} | |
\newrobustcmd*{\AtVolcite}{% | |
\@ifstar | |
{\global\undef\blx@hook@volcite | |
\gappto\blx@hook@volcite} | |
{\gappto\blx@hook@volcite}} | |
\@onlypreamble\AtVolcite | |
\def\blx@imc@UseVolciteHook{\csuse{blx@hook@volcite}} | |
\blx@regimcs{\UseVolciteHook} | |
\AtVolcite{% | |
\DeclareFieldAlias{postnote}{volcitenote}} | |
%% Control file | |
\begingroup | |
\let~\space | |
\@makeother\< | |
\@makeother\> | |
\@makeother\. | |
\@makeother\: | |
\@makeother\? | |
\@makeother\" | |
\@makeother\- | |
\@makeother\= | |
\@makeother\/ | |
\xdef\blx@xml@file{% | |
\blx@sig@bcf\blx@nl | |
\blx@ver@bcf\blx@nl} | |
\xdef\blx@xml@endfile{% | |
</bcf:controlfile>} | |
\xdef\blx@xml@comment#1{% | |
~~<!-- #1 -->\blx@nl} | |
\xdef\blx@xml@options#1#2#3{% | |
~~<bcf:options% | |
\noexpand\ifblank{#1}{}{ component="#1"}% | |
\noexpand\ifblank{#2}{}{ type="#2"}% | |
>\blx@nl | |
#3% | |
~~</bcf:options>\blx@nl} | |
\xdef\blx@xml@option#1#2{% | |
~~~~<bcf:option type="#1">\blx@nl | |
#2% | |
~~~~</bcf:option>\blx@nl} | |
\xdef\blx@xml@ordered#1#2#3{% | |
~~~~~~<bcf:value order="#1"#2% | |
>#3</bcf:value>\blx@nl} | |
\xdef\blx@xml@datafieldset#1#2{% | |
~~<bcf:datafieldset name="#1">\blx@nl | |
#2% | |
~~</bcf:datafieldset>\blx@nl} | |
\xdef\blx@xml@datafieldsets@member#1{% | |
~~~~<bcf:member#1/>\blx@nl} | |
\xdef\blx@xml@transliteration#1#2{% | |
~~<bcf:transliteration entrytype="#1">\blx@nl | |
#2% | |
~~</bcf:transliteration>\blx@nl} | |
\xdef\blx@xml@translit#1#2#3#4{% | |
~~~~<bcf:translit #1target="#2" from="#3" to="#4"/>\blx@nl} | |
\xdef\blx@xml@sourcemap#1{% | |
~~<bcf:sourcemap>\blx@nl | |
#1% | |
~~</bcf:sourcemap>\blx@nl} | |
\xdef\blx@xml@sourcemap@maps#1#2{% | |
~~~~<bcf:maps#1>\blx@nl | |
#2% | |
~~~~</bcf:maps>\blx@nl} | |
\xdef\blx@xml@sourcemap@map#1#2{% | |
~~~~~~<bcf:map#1>\blx@nl | |
#2% | |
~~~~~~</bcf:map>\blx@nl} | |
\xdef\blx@xml@sourcemap@perdatasource#1{% | |
~~~~~~~~<bcf:per\string_datasource>#1</bcf:per\string_datasource>\blx@nl} | |
\xdef\blx@xml@sourcemap@pertype#1{% | |
~~~~~~~~<bcf:per\string_type>#1</bcf:per\string_type>\blx@nl} | |
\xdef\blx@xml@sourcemap@pernottype#1{% | |
~~~~~~~~<bcf:per\string_nottype>#1</bcf:per\string_nottype>\blx@nl} | |
\xdef\blx@xml@sourcemap@step#1{% | |
~~~~~~~~<bcf:map\string_step#1/>\blx@nl} | |
\xdef\blx@xml@labelalphanametemplate#1#2{% | |
~~<bcf:labelalphanametemplate name="#1">\blx@nl | |
#2% | |
~~</bcf:labelalphanametemplate>\blx@nl} | |
\xdef\blx@xml@labelalphanametemplatenamepart#1#2#3{% | |
~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl} | |
\xdef\blx@xml@labelalphatemplate#1#2{% | |
~~<bcf:labelalphatemplate type="#1">\blx@nl | |
#2% | |
~~</bcf:labelalphatemplate>\blx@nl} | |
\xdef\blx@xml@labelalpha@element#1#2{% | |
~~~~<bcf:labelelement order="#1">\blx@nl | |
#2% | |
~~~~</bcf:labelelement>\blx@nl} | |
\xdef\blx@xml@labelalpha@part#1#2{% | |
~~~~~~<bcf:labelpart#1>#2</bcf:labelpart>\blx@nl} | |
\xdef\blx@xml@extradate#1{% | |
~~<bcf:extradatespec>\blx@nl | |
#1% | |
~~</bcf:extradatespec>\blx@nl} | |
\xdef\blx@xml@extradatescope#1{% | |
~~~~<bcf:scope>\blx@nl | |
#1% | |
~~~~</bcf:scope>\blx@nl} | |
\xdef\blx@xml@edordered#1#2{% | |
~~~~~~<bcf:field order="#1">#2</bcf:field>\blx@nl} | |
\xdef\blx@xml@inheritance#1{% | |
~~<bcf:inheritance>\blx@nl | |
#1% | |
~~</bcf:inheritance>\blx@nl} | |
\xdef\blx@xml@inherit@defaults#1#2{% | |
~~~~<bcf:defaults#1>\blx@nl | |
#2% | |
~~~~</bcf:defaults>\blx@nl} | |
\xdef\blx@xml@inherit@data#1#2{% | |
~~~~<bcf:inherit#1>\blx@nl | |
#2% | |
~~~~</bcf:inherit>\blx@nl} | |
\xdef\blx@xml@inherit@type#1#2#3{% | |
~~~~~~<bcf:type\string_pair source="#1" target="#2"#3/>\blx@nl} | |
\xdef\blx@xml@inherit@field#1#2#3{% | |
~~~~~~<bcf:field source="#1" target="#2"#3/>\blx@nl} | |
\xdef\blx@xml@inherit@block#1{% | |
~~~~~~<bcf:field source="#1" skip="true"/>\blx@nl} | |
\xdef\blx@xml@nosorts#1{% | |
~~<bcf:nosorts>\blx@nl | |
#1% | |
~~</bcf:nosorts>\blx@nl} | |
\xdef\blx@xml@nosort#1#2{% | |
~~~~<bcf:nosort field="#1" value="#2"/>\blx@nl} | |
\xdef\blx@xml@noinits#1{% | |
~~<bcf:noinits>\blx@nl | |
#1% | |
~~</bcf:noinits>\blx@nl} | |
\xdef\blx@xml@noinit#1{% | |
~~~~<bcf:noinit value="#1"/>\blx@nl} | |
\xdef\blx@xml@nolabels#1{% | |
~~<bcf:nolabels>\blx@nl | |
#1% | |
~~</bcf:nolabels>\blx@nl} | |
\xdef\blx@xml@nolabel#1{% | |
~~~~<bcf:nolabel value="#1"/>\blx@nl} | |
\xdef\blx@xml@nolabelwidthcounts#1{% | |
~~<bcf:nolabelwidthcounts>\blx@nl | |
#1% | |
~~</bcf:nolabelwidthcounts>\blx@nl} | |
\xdef\blx@xml@nolabelwidthcount#1{% | |
~~~~<bcf:nolabelwidthcount value="#1"/>\blx@nl} | |
\xdef\blx@xml@uniquenametemplate#1#2{% | |
~~<bcf:uniquenametemplate name="#1">\blx@nl% | |
#2% | |
~~</bcf:uniquenametemplate>\blx@nl} | |
\xdef\blx@xml@uniquenametemplatenamepart#1#2#3{% | |
~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl} | |
\xdef\blx@xml@sortingnamekeytemplate#1#2{% | |
~~<bcf:sortingnamekeytemplate name="#1">\blx@nl% | |
#2% | |
~~</bcf:sortingnamekeytemplate>\blx@nl} | |
\xdef\blx@xml@sortingnamekeykeypart#1#2{% | |
~~~~<bcf:keypart#1>\blx@nl | |
#2% | |
~~~~</bcf:keypart>\blx@nl} | |
\xdef\blx@xml@sortingnamekeynamepart#1#2#3{% | |
~~~~~~<bcf:part type="namepart"#1#2>#3</bcf:part>\blx@nl} | |
\xdef\blx@xml@sortingnamekeyliteral#1#2{% | |
~~~~~~<bcf:part type="literal"#1>#2</bcf:part>\blx@nl} | |
\xdef\blx@xml@sortingtemplate#1#2#3{% | |
~~<bcf:sortingtemplate name="#1"#2>\blx@nl% | |
#3% | |
~~</bcf:sortingtemplate>\blx@nl} | |
\xdef\blx@xml@presort#1#2{% | |
~~<bcf:presort\noexpand\ifblank{#1}{}{ type="#1"}>% | |
#2</bcf:presort>\blx@nl} | |
\xdef\blx@xml@sortexclude#1#2{% | |
~~<bcf:sortexclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl | |
#2% | |
~~</bcf:sortexclusion>\blx@nl} | |
\xdef\blx@xml@exclude#1{% | |
~~~~<bcf:exclusion>#1</bcf:exclusion>\blx@nl} | |
\xdef\blx@xml@sortinclude#1#2{% | |
~~<bcf:sortinclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl | |
#2% | |
~~</bcf:sortinclusion>\blx@nl} | |
\xdef\blx@xml@include#1{% | |
~~~~<bcf:inclusion>#1</bcf:inclusion>\blx@nl} | |
\xdef\blx@xml@sort#1#2{% | |
~~~~<bcf:sort #1>\blx@nl | |
#2% | |
~~~~</bcf:sort>\blx@nl} | |
\xdef\blx@xml@sortitem#1#2{% | |
~~~~~~<bcf:sortitem #1>#2</bcf:sortitem>\blx@nl} | |
\xdef\blx@xml@section#1{% | |
~~<bcf:section number="#1">} | |
\xdef\blx@xml@endsection{% | |
~~</bcf:section>} | |
\xdef\blx@xml@dlist@refcontext#1#2#3#4#5{% | |
~~~~~~~~~~~~~~~~sortingtemplatename="#1"\blx@nl | |
~~~~~~~~~~~~~~~~sortingnamekeytemplatename="#2"\blx@nl | |
~~~~~~~~~~~~~~~~labelprefix="#3"\blx@nl | |
~~~~~~~~~~~~~~~~uniquenametemplatename="#4"\blx@nl | |
~~~~~~~~~~~~~~~~labelalphanametemplatename="#5"} | |
\xdef\blx@xml@dlist#1#2#3#4#5{% | |
~~<bcf:datalist section="#3"\blx@nl | |
~~~~~~~~~~~~~~~~name="#1"\blx@nl | |
~~~~~~~~~~~~~~~~type="#2"\blx@nl | |
#4>\blx@nl | |
#5% | |
~~</bcf:datalist>\blx@nl} | |
\xdef\blx@xml@dlistfilterorbegin{% | |
~~~~<bcf:filteror>\blx@nl} | |
\xdef\blx@xml@dlistfilterorend{% | |
~~~~</bcf:filteror>\blx@nl} | |
\xdef\blx@xml@dlistfilter#1#2{% | |
~~~~<bcf:filter type="#1">#2</bcf:filter>\blx@nl} | |
\xdef\blx@xml@bibdata#1#2{% | |
~~<bcf:bibdata section="#1">\blx@nl | |
#2% | |
~~</bcf:bibdata>\blx@nl} | |
\xdef\blx@xml@datasource#1#2#3#4#5{% | |
~~~~<bcf:datasource type="#1" datatype="#2"#3#4>#5</bcf:datasource>\blx@nl} | |
\xdef\blx@xml@citekey#1#2#3{% | |
~~~~<bcf:citekey order="#3"#2>#1</bcf:citekey>} | |
\xdef\blx@xml@citeset#1#2{% | |
~~~~<bcf:citekey type="set" members="#2">#1</bcf:citekey>} | |
\xdef\blx@xml@svalue#1#2{% | |
\blx@xml@option{singlevalued}{% | |
~~~~~~<bcf:key>#1</bcf:key>\blx@nl | |
~~~~~~<bcf:value>#2</bcf:value>\blx@nl}} | |
\xdef\blx@xml@mvalue#1#2{% | |
\blx@xml@option{multivalued}{% | |
~~~~~~<bcf:key>#1</bcf:key>\blx@nl | |
#2}} | |
\xdef\blx@xml@toggle#1{% | |
\blx@xml@svalue{#1}{\noexpand\iftoggle{blx@#1}{1}{0}}} | |
\xdef\blx@xml@options@scope#1#2{% | |
~~<bcf:optionscope type="#1">\blx@nl | |
#2% | |
~~</bcf:optionscope>\blx@nl} | |
\xdef\blx@xml@option@scope#1#2{% GLOBAL/TYPE scope | |
~~~~<bcf:option datatype="#1">#2</bcf:option>\blx@nl} | |
\xdef\blx@xml@option@entryscope#1#2{% ENTRY scope | |
~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@entry@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@entry@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@entry@#2}"}{}>#2</bcf:option>\blx@nl} | |
\xdef\blx@xml@option@namelistscope#1#2{% NAMELIST scope | |
~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@namelist@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@namelist@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@namelist@#2}"}{}>#2</bcf:option>\blx@nl} | |
\xdef\blx@xml@option@namescope#1#2{% NAME scope | |
~~~~<bcf:option datatype="#1"\noexpand\ifcsdef{blx@bcf@backendout@name@#2}{ backendout="1"}{}\noexpand\ifcsdef{blx@bcf@backendin@name@#2}{ backendin="\noexpand\csuse{blx@bcf@backendin@name@#2}"}{}>#2</bcf:option>\blx@nl} | |
\endgroup | |
\def\blx@bcf@options@global{% | |
\blx@xml@comment{GLOBAL}% | |
\blx@xml@options{biblatex}{global}{% | |
\blx@xml@svalue{alphaothers}{\labelalphaothers}% | |
\blx@xml@toggle{labelalpha}% | |
\blx@xml@mvalue{labelnamespec}{\blx@bcf@labelnamespec}% | |
\blx@xml@toggle{labeltitle}% | |
\blx@xml@mvalue{labeltitlespec}{\blx@bcf@labeltitlespec}% | |
\blx@xml@toggle{labeltitleyear}% | |
\blx@xml@toggle{labeldateparts}% | |
\blx@xml@mvalue{labeldatespec}{\blx@bcf@labeldatespec}% | |
\blx@xml@toggle{julian}% | |
\blx@xml@svalue{gregorianstart}{\blx@gregorianstart}% | |
\blx@xml@svalue{maxalphanames}{\blx@maxalphanames}% | |
\blx@xml@svalue{maxbibnames}{\blx@maxbibnames}% | |
\blx@xml@svalue{maxcitenames}{\blx@maxcitenames}% | |
\blx@xml@svalue{maxsortnames}{\blx@maxsortnames}% | |
\blx@xml@svalue{maxitems}{\blx@maxitems}% | |
\blx@xml@svalue{minalphanames}{\blx@minalphanames}% | |
\blx@xml@svalue{minbibnames}{\blx@minbibnames}% | |
\blx@xml@svalue{mincitenames}{\blx@mincitenames}% | |
\blx@xml@svalue{minsortnames}{\blx@minsortnames}% | |
\blx@xml@svalue{minitems}{\blx@minitems}% | |
\blx@xml@toggle{nohashothers}% | |
\blx@xml@toggle{noroman}% | |
\blx@xml@toggle{nosortothers}% | |
\blx@xml@toggle{singletitle}% | |
\blx@xml@toggle{skipbib}% | |
\blx@xml@toggle{skipbiblist}% | |
\blx@xml@toggle{skiplab}% | |
\blx@xml@svalue{sortalphaothers}{\sortalphaothers}% | |
\blx@xml@svalue{sortlocale}{\blx@sortlocale}% | |
\blx@xml@svalue{sortingtemplatename}{\blx@sorting}% | |
\blx@xml@toggle{sortsets}% | |
\blx@xml@svalue{uniquelist}{\blx@uniquelist}% | |
\blx@xml@svalue{uniquename}{\blx@uniquename}% | |
\blx@xml@toggle{uniqueprimaryauthor}% | |
\blx@xml@toggle{uniquetitle}% | |
\blx@xml@toggle{uniquebaretitle}% | |
\blx@xml@toggle{uniquework}% | |
\blx@xml@toggle{useprefix}% | |
\blx@xml@nametoggles | |
}% | |
} | |
\def\blx@bcf@options@type#1{% | |
\blx@xml@comment{#1}% | |
\blx@xml@options{biblatex}{#1}{% | |
\blx@xml@toggle{labelalpha}% | |
\blx@xml@mvalue{labelnamespec}{% | |
\ifcsdef{blx@bcf@labelnamespec@#1} | |
{\csuse{blx@bcf@labelnamespec@#1}} | |
{\blx@bcf@labelnamespec}}% | |
\blx@xml@toggle{labeltitle}% | |
\blx@xml@mvalue{labeltitlespec}{% | |
\ifcsdef{blx@bcf@labeltitlespec@#1} | |
{\csuse{blx@bcf@labeltitlespec@#1}} | |
{\blx@bcf@labeltitlespec}}% | |
\blx@xml@toggle{labeltitleyear}% | |
\blx@xml@toggle{labeldateparts}% | |
\blx@xml@mvalue{labeldatespec}{% | |
\ifcsdef{blx@bcf@labeldatespec@#1} | |
{\csuse{blx@bcf@labeldatespec@#1}} | |
{\blx@bcf@labeldatespec}}% | |
\blx@xml@svalue{maxalphanames}{\blx@maxalphanames}% | |
\blx@xml@svalue{maxbibnames}{\blx@maxbibnames}% | |
\blx@xml@svalue{maxcitenames}{\blx@maxcitenames}% | |
\blx@xml@svalue{maxsortnames}{\blx@maxsortnames}% | |
\blx@xml@svalue{maxitems}{\blx@maxitems}% | |
\blx@xml@svalue{minalphanames}{\blx@minalphanames}% | |
\blx@xml@svalue{minbibnames}{\blx@minbibnames}% | |
\blx@xml@svalue{mincitenames}{\blx@mincitenames}% | |
\blx@xml@svalue{minsortnames}{\blx@minsortnames}% | |
\blx@xml@svalue{minitems}{\blx@minitems}% | |
\blx@xml@toggle{nohashothers}% | |
\blx@xml@toggle{noroman}% | |
\blx@xml@toggle{nosortothers}% | |
\blx@xml@toggle{singletitle}% | |
\blx@xml@toggle{skipbib}% | |
\blx@xml@toggle{skiplab}% | |
\blx@xml@toggle{skipbiblist}% | |
\blx@xml@svalue{uniquelist}{\blx@uniquelist}% | |
\blx@xml@svalue{uniquename}{\blx@uniquename}% | |
\blx@xml@toggle{uniqueprimaryauthor}% | |
\blx@xml@toggle{uniquetitle}% | |
\blx@xml@toggle{uniquebaretitle}% | |
\blx@xml@toggle{uniquework}% | |
\blx@xml@toggle{useprefix}% | |
\blx@xml@nametoggles | |
}% | |
} | |
\def\blx@ctrlwrite{% | |
\begingroup | |
\blx@safe@actives | |
\let\protect\string | |
% options | |
\protected@edef\labelalphaothers{\labelalphaothers}% | |
\protected@edef\sortalphaothers{\sortalphaothers}% | |
\blx@xmlsanitizeafter{\def\labelalphaothers}{\labelalphaothers}% | |
\blx@xmlsanitizeafter{\def\sortalphaothers}{\sortalphaothers}% | |
% Expand the global use* name toggles | |
\let\blx@xml@nametoggles\@empty | |
\def\do##1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use##1}}}% | |
\abx@donames | |
\edef\blx@tempa{% | |
\blx@xml@file | |
\blx@xml@comment{BIBER OPTIONS}% | |
\blx@xml@options{biber}{global}{% | |
\blx@xml@svalue{output_encoding}{\blx@texencoding}% | |
\blx@xml@svalue{input_encoding}{\blx@bibencoding}% | |
\blx@xml@toggle{debug}% | |
\blx@xml@svalue{mincrossrefs}{\blx@mincrossrefs}% | |
\blx@xml@svalue{minxrefs}{\blx@minxrefs}% | |
\blx@xml@toggle{sortcase}% | |
\blx@xml@toggle{sortupper}% | |
}% | |
\blx@xml@comment{BIBLATEX OPTIONS}% | |
\blx@bcf@options@global | |
}% | |
\ifdef\blx@opts@type | |
{\def\do##1{% | |
\begingroup | |
\let\protect\relax | |
\blx@setoptions@type{##1}% | |
% Expand the type use* name toggles | |
\let\blx@xml@nametoggles\@empty | |
\def\do####1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use####1}}}% | |
\abx@donames | |
\blx@checkoptions@type | |
\xappto\blx@tempa{\blx@bcf@options@type{##1}}% | |
\endgroup}% | |
\dolistloop\blx@opts@type} | |
{}% | |
% options scope | |
% GLOBAL | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@global{\blx@xml@option@scope{##1}{####1}}}% | |
\dolistcsloop{blx@globalopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@globalopts@datatypes | |
% ENTRYTYPE | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@type{\blx@xml@option@scope{##1}{####1}}}% | |
\dolistcsloop{blx@typeopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@typeopts@datatypes | |
% ENTRY | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@entry{\blx@xml@option@entryscope{##1}{####1}}}% | |
\dolistcsloop{blx@entryopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@entryopts@datatypes | |
% NAMELIST | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@namelist{\blx@xml@option@namelistscope{##1}{####1}}}% | |
\dolistcsloop{blx@namelistopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@entryopts@datatypes | |
% NAME | |
\def\do##1{% | |
\begingroup | |
\def\do####1{\xappto\blx@bcf@options@scope@name{\blx@xml@option@namescope{##1}{####1}}}% | |
\dolistcsloop{blx@nameopts@##1}% | |
\endgroup}% | |
\dolistloop\blx@entryopts@datatypes | |
\eappto\blx@tempa{% | |
\blx@xml@comment{BIBLATEX OPTION SCOPE}% | |
\blx@xml@options@scope{GLOBAL}{\blx@bcf@options@scope@global}% | |
\blx@xml@options@scope{ENTRYTYPE}{\blx@bcf@options@scope@type}% | |
\blx@xml@options@scope{ENTRY}{\blx@bcf@options@scope@entry}% | |
\blx@xml@options@scope{NAMELIST}{\blx@bcf@options@scope@namelist}% | |
\blx@xml@options@scope{NAME}{\blx@bcf@options@scope@name}} | |
% datafieldsets | |
\def\do##1{% | |
\xappto\blx@bcf@datafieldsets{\blx@xml@datafieldset{##1}{\csuse{blx@datafieldsetmembers@##1}}}} | |
\dolistloop\blx@datafieldsets | |
\eappto\blx@tempa{% | |
\blx@xml@comment{DATAFIELDSETS}% | |
\blx@bcf@datafieldsets}% | |
% sourcemap | |
\ifbool{sourcemap} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{SOURCEMAP}% | |
\blx@xml@sourcemap{% | |
\ifdef\blx@sourcemap@user | |
{\blx@sourcemap@user} | |
{}% | |
\ifdef\blx@sourcemap@style | |
{\blx@sourcemap@style} | |
{}% | |
\ifdef\blx@sourcemap@defaults@bibtex | |
{\blx@sourcemap@defaults@bibtex} | |
{}% | |
\ifdef\blx@sourcemap@defaults@biblatexml | |
{\blx@sourcemap@defaults@biblatexml} | |
{}}}} | |
{}% | |
% labelalpha name template | |
\eappto\blx@tempa{\blx@xml@comment{LABELALPHA NAME TEMPLATE}}% | |
\def\do##1{% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalphanametemplate{##1}{\csuse{blx@labelalphanametemplate@##1}}}}% | |
\dolistloop\blx@lantemplatespecs | |
% labelalpha template | |
\eappto\blx@tempa{% | |
\blx@xml@comment{LABELALPHA TEMPLATE}}% | |
\def\do##1{% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalphatemplate{##1}{% | |
\csuse{blx@labelalphatemplate@##1}}}}% | |
\dolistloop\blx@latem@type | |
% extradate specification | |
\eappto\blx@tempa{% | |
\blx@xml@comment{EXTRADATE}% | |
\blx@xml@extradate{\csuse{blx@bcf@extradatespec}}}% | |
% data inheritance | |
\eappto\blx@tempa{% | |
\blx@xml@comment{INHERITANCE}% | |
\blx@xml@inheritance{% | |
\csuse{blx@inherit@default}% | |
\csuse{blx@inherit@data}}}% | |
% noinit | |
\ifcsdef{blx@noinit} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOINIT}% | |
\blx@xml@noinits{% | |
\csuse{blx@noinit}}}}% | |
{}% | |
% nolabel | |
\ifcsdef{blx@nolabel} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOLABEL}% | |
\blx@xml@nolabels{% | |
\csuse{blx@nolabel}}}}% | |
{}% | |
% nolabel | |
\ifcsdef{blx@nolabelwidthcount} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOLABELWIDTHCOUNT}% | |
\blx@xml@nolabelwidthcounts{% | |
\csuse{blx@nolabelwidthcount}}}}% | |
{}% | |
% nosort | |
\ifcsdef{blx@nosort} | |
{\eappto\blx@tempa{% | |
\blx@xml@comment{NOSORT}% | |
\blx@xml@nosorts{% | |
\csuse{blx@nosort}}}}% | |
{}% | |
% transliteration | |
\ifdefempty\blx@translits | |
{} | |
{\eappto\blx@tempa{\blx@xml@comment{TRANSLITERATION}}% | |
\def\do##1{% | |
\eappto\blx@tempa{\blx@xml@transliteration{##1}{\csuse{blx@translit@##1}}}}% | |
\dolistloop\blx@translits}% | |
% uniquenametemplate | |
\eappto\blx@tempa{\blx@xml@comment{UNIQUENAME TEMPLATES}}% | |
\def\do##1{% | |
\eappto\blx@tempa{% | |
\blx@xml@uniquenametemplate{##1}{\csuse{blx@uniquenametemplate@##1}}}}% | |
\dolistloop\blx@untemplatespecs | |
% sortingnamekeytemplate | |
\eappto\blx@tempa{\blx@xml@comment{SORTING NAME KEY TEMPLATES}}% | |
\def\do##1{% | |
\eappto\blx@tempa{% | |
\blx@xml@sortingnamekeytemplate{##1}{\csuse{blx@sortingnamekeytemplate@##1}}}}% | |
\dolistloop\blx@sortingnamekeytemplates | |
% presort/sorting excludes/sorting includes | |
\def\do##1{% | |
\eappto\blx@bcf@presort{\csuse{blx@bcf@presort@##1}}% | |
\eappto\blx@bcf@exclude{\csuse{blx@bcf@exclude@##1}}% | |
\eappto\blx@bcf@include{\csuse{blx@bcf@include@##1}}}% | |
\abx@doentrytypes | |
\do{*}% entrytype wildcard | |
\eappto\blx@tempa{% | |
\blx@bcf@presort | |
\blx@bcf@exclude | |
\blx@bcf@include}% | |
% datamodel | |
\eappto\blx@tempa{% | |
\blx@xml@comment{DATA MODEL}% | |
\blx@xml@datamodel{% | |
\blx@xml@datamodel@constants{% | |
\blx@bcf@datamodel@constants | |
}% | |
\blx@xml@datamodel@entrytypes{% | |
\blx@bcf@datamodel@entrytypes | |
}% | |
\blx@xml@datamodel@fields{% | |
\blx@bcf@datamodel@fields | |
}% | |
\blx@bcf@datamodel@entryfields | |
\blx@bcf@datamodel@multiscript@entryfields | |
\blx@bcf@datamodel@constraints | |
}% | |
}% | |
% files | |
\let\blx@tempb\@empty | |
\blx@bibdata\blx@tempb\blx@bibfiles | |
\eappto\blx@tempa{% | |
\blx@xml@comment{CITATION DATA}% | |
\blx@xml@comment{SECTION 0}% | |
\blx@xml@bibdata{0}{\blx@tempb}% | |
\blx@xml@section{0}% | |
}% | |
\immediate\openout\blx@bcfout\jobname.bcf\relax | |
\blx@auxwrite\blx@bcfout{}{\blx@tempa}% | |
\global\undef\blx@tempa | |
\endgroup | |
\AfterEndDocument{% | |
\def\do##1{% | |
\csxappto{blx@sortingtemplates}{% | |
\blx@xml@sortingtemplate{##1} | |
{\ifcsdef{blx@sortdef@locale@##1}{ locale="\csuse{blx@sortdef@locale@##1}"}{}} | |
{\csuse{blx@sortingtemplate@##1}}}}% | |
\dolistloop\blx@sortingtemplatenames | |
\blx@auxwrite\blx@bcfout{}{% | |
\blx@xml@endsection\blx@nl | |
\blx@xml@comment{SORTING TEMPLATES}% | |
\csuse{blx@sortingtemplates}% | |
\blx@xml@comment{DATALISTS}% | |
\csuse{blx@dlists}% | |
\blx@xml@endfile}% | |
\immediate\closeout\blx@bcfout}} | |
%% Customisation | |
% nolabel | |
\newrobustcmd*{\DeclareNolabel}[1]{% | |
\begingroup | |
\let\nolabel\blx@nolabel@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@nolabel\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNolabel | |
\newcommand*{\blx@nolabel@setup}[1]{% | |
\eappto\blx@tempa{% | |
\blx@xml@nolabel{#1}}} | |
% nolabelwidthcount | |
\newrobustcmd*{\DeclareNolabelwidthcount}[1]{% | |
\begingroup | |
\let\nolabel\blx@nolabelwidthcount@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@nolabelwidthcount\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNolabelwidthcount | |
\newcommand*{\blx@nolabelwidthcount@setup}[1]{% | |
\eappto\blx@tempa{% | |
\blx@xml@nolabelwidthcount{#1}}} | |
% nosort | |
\newrobustcmd*{\DeclareNosort}[1]{% | |
\begingroup | |
\let\nosort\blx@nosort@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@nosort\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNosort | |
\newcommand*{\blx@nosort@setup}[2]{% | |
\eappto\blx@tempa{% | |
\blx@xml@nosort{#1}{#2}}} | |
% noinit | |
\newrobustcmd*{\DeclareNoinit}[1]{% | |
\begingroup | |
\let\noinit\blx@noinit@setup | |
\let\blx@tempa\@empty | |
#1% | |
\global\let\blx@noinit\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareNoinit | |
\newcommand*{\blx@noinit@setup}[1]{% | |
\eappto\blx@tempa{% | |
\blx@xml@noinit{#1}}} | |
% datafieldsets | |
\newrobustcmd*{\DeclareDatafieldSet}[2]{% | |
\begingroup | |
\let\member\blx@datafieldset@member | |
\let\blx@tempa\@empty | |
\def\blx@setname{#1} | |
\cslet{blx@datafieldset@#1}\@empty | |
#2% | |
\csxdef{blx@datafieldsetmembers@#1}{\blx@tempa}% | |
\listgadd\blx@datafieldsets{#1}% | |
\global\csletcs{datafieldset#1}{blx@datafieldset@#1}% expose user-facing macro | |
\endgroup} | |
\@onlypreamble\DeclareDatafieldSet | |
\newcommand*{\blx@datafieldset@member}[1][2]{% | |
\let\blx@dm@fieldtype\@empty | |
\let\blx@dm@datatype\@empty | |
\let\blx@member@field\@empty | |
\let\blx@tempb\@empty | |
\blx@kv@setkeys{blx@datafieldsets@member}{#1}% | |
\eappto\blx@tempa{% | |
\blx@xml@datafieldsets@member{\blx@tempb}}% | |
\ifdefempty\blx@member@field | |
{} | |
{\listcsxadd{blx@datafieldset@\blx@setname}{\blx@member@field}}% | |
% Set some internal macros in case biblatex needs to use the set | |
\ifboolexpr{% | |
not test {\ifdefempty{\blx@dm@fieldtype}} | |
and | |
not test {\ifdefempty{\blx@dm@datatype}}} | |
{\def\do##1{% | |
\listcsxadd{blx@datafieldset@\blx@setname}{##1}} | |
\dolistcsloop{blx@datamodelfields@types@\blx@dm@fieldtype @\blx@dm@datatype}} | |
{\ifdefempty{\blx@dm@fieldtype} | |
{} | |
{\def\do##1{% | |
\listcsxadd{blx@datafieldset@\blx@setname}{##1}} | |
\dolistcsloop{blx@datamodelfields@fieldtypes@\blx@dm@fieldtype}}% | |
\ifdefempty{\blx@dm@datatype} | |
{} | |
{\def\do##1{% | |
\listcsxadd{blx@datafieldset@\blx@setname}{##1}} | |
\dolistcsloop{blx@datamodelfields@datatypes@\blx@dm@datatype}}}} | |
\blx@kv@defkey{blx@datafieldsets@member}{datatype}{% characters | |
\appto\blx@tempb{ datatype="#1"}% | |
\def\blx@dm@datatype{#1}} | |
\blx@kv@defkey{blx@datafieldsets@member}{fieldtype}{% characters | |
\appto\blx@tempb{ fieldtype="#1"}% | |
\def\blx@dm@fieldtype{#1}} | |
\blx@kv@defkey{blx@datafieldsets@member}{field}{% characters | |
\appto\blx@tempb{ field="#1"}% | |
\def\blx@member@field{#1}} | |
% sourcemap | |
\newrobustcmd*{\DeclareSourcemap}[1]{% | |
\booltrue{sourcemap}% | |
\begingroup | |
\let\maps\blx@usersourcemap@maps | |
\let\blx@tempa\@empty | |
#1% | |
\xappto\blx@sourcemap@user\blx@tempa% | |
\endgroup} | |
\@onlypreamble\DeclareSourcemap | |
\newrobustcmd*{\DeclareStyleSourcemap}[1]{% | |
\booltrue{sourcemap}% | |
\begingroup | |
\let\maps\blx@stylesourcemap@maps | |
\let\blx@tempa\@empty | |
#1% | |
\xappto\blx@sourcemap@style\blx@tempa% | |
\endgroup} | |
\@onlypreamble\DeclareStyleSourcemap | |
\newrobustcmd*{\DeclareDriverSourcemap}[2][]{% | |
\booltrue{sourcemap}% | |
\begingroup | |
\let\blx@tempa\@empty | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\let\blx@tempd\@empty | |
\let\map\blx@sourcemap@map | |
#2% | |
\ifblank{#1} | |
{\blx@kv@setkeys{blx@sourcemap@maps}{datatype=bibtex, level=driver}} | |
{\blx@kv@setkeys{blx@sourcemap@maps}{#1, level=driver}}% | |
\eappto\blx@tempa{% | |
\blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}% | |
\csxdef{blx@sourcemap@defaults@\blx@tempd}{\blx@tempa}% | |
\endgroup} | |
\@onlypreamble\DeclareDriverSourcemap | |
\newcommand*{\blx@usersourcemap@maps}[2][]{% | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\let\map\blx@sourcemap@map | |
\ifblank{#1} | |
{\blx@kv@setkeys{blx@sourcemap@maps}{datatype=bibtex, level=user}} | |
{\blx@kv@setkeys{blx@sourcemap@maps}{#1, level=user}}% | |
#2% | |
\eappto\blx@tempa{% | |
\blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}} | |
\newcommand*{\blx@stylesourcemap@maps}[2][]{% | |
\let\blx@tempb\@empty | |
\let\blx@tempc\@empty | |
\let\map\blx@sourcemap@map | |
\ifblank{#1} | |
{\blx@kv@setkeys{blx@sourcemap@maps}{datatype=bibtex, level=style}} | |
{\blx@kv@setkeys{blx@sourcemap@maps}{#1, level=style}}% | |
#2% | |
\eappto\blx@tempa{% | |
\blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}} | |
\blx@kv@defkey{blx@sourcemap@maps}{datatype}{% characters | |
\eappto\blx@tempb{ datatype="#1"}% | |
\eappto\blx@tempd{#1}} | |
\blx@kv@defkey{blx@sourcemap@maps}{overwrite}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempb{ map\string_overwrite="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@maps}{level}{% user|style|driver | |
\appto\blx@tempb{ level="#1"}} | |
\newcommand*{\blx@sourcemap@map}[2][]{% | |
\let\blx@tempm\@empty | |
\let\blx@tempe\@empty | |
\let\perdatasource\blx@sourcemap@perdatasource | |
\let\pertype\blx@sourcemap@pertype | |
\let\pernottype\blx@sourcemap@pernottype | |
\let\step\blx@sourcemap@step | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@sourcemap@map}{#1}}% | |
#2% | |
\eappto\blx@tempc{% | |
\blx@xml@sourcemap@map{\blx@tempm}{\blx@tempe}}} | |
\blx@kv@defkey{blx@sourcemap@map}{overwrite}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempm{ map\string_overwrite="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@map}{foreach}{% characters | |
\eappto\blx@tempm{ map\string_foreach="#1"}} | |
\blx@kv@defkey{blx@sourcemap@map}{refsection}{% integer | |
\eappto\blx@tempm{ refsection="#1"}} | |
\newcommand*{\blx@sourcemap@perdatasource}[1]{% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@perdatasource{#1}}} | |
\newcommand*{\blx@sourcemap@pertype}[1]{% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@pertype{#1}}} | |
\newcommand*{\blx@sourcemap@pernottype}[1]{% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@pernottype{#1}}} | |
\newcommand*{\blx@sourcemap@step}[1][2]{% | |
\let\blx@tempf\@empty | |
\blx@kv@setkeys{blx@sourcemap@step}{#1}% | |
\eappto\blx@tempe{% | |
\blx@xml@sourcemap@step{\blx@tempf}}} | |
\blx@kv@defkey{blx@sourcemap@step}{typesource}{% characters | |
\eappto\blx@tempf{ map\string_type\string_source="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{typetarget}{% characters | |
\eappto\blx@tempf{ map\string_type\string_target="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{final}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_final="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{cited}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entrykey\string_cited="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{nocited}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entrykey\string_nocited="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{citedornocited}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entrykey\string_citedornocited="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{allnocited}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entrykey\string_allnocited="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{starnocited}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entrykey\string_starnocited="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{fieldsource}{% characters | |
\eappto\blx@tempf{ map\string_field\string_source="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{notfield}{% characters | |
\eappto\blx@tempf{ map\string_notfield="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{fieldtarget}{% characters | |
\eappto\blx@tempf{ map\string_field\string_target="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{fieldset}{% characters | |
\eappto\blx@tempf{ map\string_field\string_set="#1"}} | |
% We are sanitising the XML here as it's the value of an attribute which | |
% might contain quotes or ampersands (URLs, for example) | |
\blx@kv@defkey{blx@sourcemap@step}{fieldvalue}{% characters | |
\blx@xmlsanitizeafter{\def\blx@temps}{#1}% | |
\eappto\blx@tempf{ map\string_field\string_value="\blx@temps"}} | |
\blx@kv@defkey{blx@sourcemap@step}{append}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_append="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{appendstrict}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_appendstrict="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{null}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_null="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{entrynull}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entry\string_null="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{entrynocite}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_entry\string_nocite="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{entrynew}{% characters | |
\appto\blx@tempf{ map\string_entry\string_new="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{entrynewtype}{% characters | |
\appto\blx@tempf{ map\string_entry\string_newtype="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{entrytarget}{% characters | |
\appto\blx@tempf{ map\string_entrytarget="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{entryclone}{% characters | |
\appto\blx@tempf{ map\string_entry\string_clone="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{origfield}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_origfield="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{origfieldval}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_origfieldval="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{origentrytype}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempf{ map\string_origentrytype="1"}} | |
{}} | |
\blx@kv@defkey{blx@sourcemap@step}{match}{% characters | |
\appto\blx@tempf{ map\string_match="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{matchi}{% characters | |
\appto\blx@tempf{ map\string_matchi="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{notmatch}{% characters | |
\appto\blx@tempf{ map\string_notmatch="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{notmatchi}{% characters | |
\appto\blx@tempf{ map\string_notmatchi="#1"}} | |
\blx@kv@defkey{blx@sourcemap@step}{replace}{% characters | |
\eappto\blx@tempf{ map\string_replace="#1"}} | |
% [<specname>]{<spec>} | |
\newrobustcmd*{\DeclareLabelalphaNameTemplate}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@lantname{global}}% default | |
{\def\blx@lantname{#1}}% | |
\let\namepart\blx@lantem@namepart | |
\let\blx@tempa\@empty | |
\blx@tempcnta\z@ | |
#2% | |
\global\cslet{blx@labelalphanametemplate@\blx@lantname}\blx@tempa | |
\xifinlist\blx@lantname\blx@lantemplatespecs | |
{} | |
{\listxadd\blx@lantemplatespecs\blx@lantname}% | |
\endgroup} | |
\@onlypreamble\DeclareLabelalphaNameTemplate | |
\blx@DeclareBackendOption{global}[xml]{labelalphanametemplate} | |
\DeclareBiblatexOption{entry,namelist,name}[string]{labelalphanametemplatename}{% | |
\def\blx@refcontext@labelalphanametemplatename{#1}} | |
\newcommand*{\blx@lantem@namepart}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@lantem@namepart}{#1}}% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalphanametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}} | |
\blx@kv@defkey{blx@lantem@namepart}{use}[true]{% use* option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ use="1"}} | |
{}} | |
\blx@kv@defkey{blx@lantem@namepart}{pre}[true]{% pre option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ pre="1"}} | |
{}} | |
\blx@kv@defkey{blx@lantem@namepart}{compound}[true]{% base option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_compound="1"}} | |
{}} | |
\blx@kv@defkey{blx@lantem@namepart}{strwidth}{% integer | |
\eappto\blx@tempc{ substring\string_width="#1"}} | |
\blx@kv@defkey{blx@lantem@field}{strside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempc{ substring\string_side="right"}} | |
{\eappto\blx@tempc{ substring\string_side="left"}}} | |
% [<entrytype>]{<spec>} | |
\newrobustcmd*{\DeclareLabelalphaTemplate}[2][]{% | |
\ifblank{#1} | |
{\blx@latem{#2}{global}} | |
{\forcsvlist{\blx@latem{#2}}{#1}}} | |
\@onlypreamble\DeclareLabelalphaTemplate | |
\blx@DeclareBackendOption{global,type}[xml]{labelalphatemplate} | |
\def\blx@latem#1#2{% | |
\begingroup | |
\let\labelelement\blx@latem@element | |
\let\field\blx@latem@field | |
\let\literal\blx@latem@literal | |
\blx@tempcnta\z@ | |
\let\blx@tempa\@empty | |
#1% | |
\ifdef\blx@latem@type | |
{\ifinlist{#2}\blx@latem@type | |
{\global\cslet{blx@labelalphatemplate@#2}\blx@tempa} | |
{\listgadd\blx@latem@type{#2}% | |
\global\cslet{blx@labelalphatemplate@#2}\blx@tempa}} | |
{\listgadd\blx@latem@type{#2}% | |
\global\cslet{blx@labelalphatemplate@#2}\blx@tempa}% | |
\endgroup} | |
\newcommand*{\blx@latem@element}[1]{% | |
\advance\blx@tempcnta\@ne | |
\let\blx@tempb\@empty | |
#1% | |
\eappto\blx@tempa{% | |
\blx@xml@labelalpha@element{\the\blx@tempcnta}{\blx@tempb}}} | |
\newcommand*{\blx@latem@literal}[1]{% | |
\blx@xmlsanitizeafter{\def\blx@temps}{#1}% | |
\eappto\blx@tempb{% | |
\blx@xml@labelalpha@part{}{\expandafter\regexp\expandafter{\blx@temps}}}} | |
\newcommand*{\blx@latem@field}[2][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@latem@field}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@labelalpha@part{\blx@tempc}{#2}}} | |
\blx@kv@defkey{blx@latem@field}{uppercase}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ uppercase="1"}} | |
{}} | |
\blx@kv@defkey{blx@latem@field}{lowercase}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ lowercase="1"}} | |
{}} | |
\blx@kv@defkey{blx@latem@field}{final}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ final="1"}} | |
{}} | |
\blx@kv@defkey{blx@latem@field}{strwidth}{% integer | |
\eappto\blx@tempc{ substring\string_width="#1"}} | |
\blx@kv@defkey{blx@latem@field}{varwidth}[true]{% "v" | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_width="v"}} | |
{}} | |
\blx@kv@defkey{blx@latem@field}{varwidthnorm}[true]{% "vf" | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_width="vf"}} | |
{}} | |
\blx@kv@defkey{blx@latem@field}{varwidthlist}[true]{% "l" | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ substring\string_width="l"}} | |
{}} | |
\blx@kv@defkey{blx@latem@field}{strfixedcount}{% | |
\eappto\blx@tempc{ substring\string_fixed\string_threshold="#1"}} | |
\blx@kv@defkey{blx@latem@field}{strwidthmax}{% | |
\eappto\blx@tempc{ substring\string_width\string_max="#1"}} | |
\blx@kv@defkey{blx@latem@field}{strside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempc{ substring\string_side="right"}} | |
{\eappto\blx@tempc{ substring\string_side="left"}}} | |
\blx@kv@defkey{blx@latem@field}{namessep}{% | |
\eappto\blx@tempc{ namessep="#1"}} | |
\blx@kv@defkey{blx@latem@field}{ifnames}{% | |
\eappto\blx@tempc{ ifnames="#1"}} | |
\blx@kv@defkey{blx@latem@field}{names}{% | |
\eappto\blx@tempc{ names="#1"}} | |
\blx@kv@defkey{blx@latem@field}{noalphaothers}[true]{% | |
\eappto\blx@tempc{ noalphaothers="1"}} | |
\blx@kv@defkey{blx@latem@field}{padchar}{% | |
\blx@xmlsanitizeafter{\def\blx@temps}{#1}% | |
\eappto\blx@tempc{ pad\string_char="\expandafter\regexp\expandafter{\blx@temps}"}} | |
\blx@kv@defkey{blx@latem@field}{padside}{% left|right | |
\ifstrequal{#1}{left} | |
{\eappto\blx@tempc{ pad\string_side="left"}} | |
{\eappto\blx@tempc{ pad\string_side="right"}}} | |
% [<exceptions>]{<options>} | |
\newrobustcmd*{\DefaultInheritance}[2][]{% | |
\begingroup | |
\let\blx@tempf\@empty | |
\ifblank{#2} | |
{} | |
{\blx@kv@setkeys{blx@inherit@default}{#2}}% | |
\edef\blx@tempa{\space | |
inherit\string_all="\iftoggle{blx@inherit@all}{true}{false}"\space | |
override\string_target="\iftoggle{blx@inherit@override}{true}{false}"% | |
\blx@tempf}% | |
\let\blx@tempb\@empty | |
\let\except\blx@inherit@except | |
#1% | |
\xdef\blx@inherit@default{% | |
\blx@xml@inherit@defaults{\blx@tempa}{\blx@tempb}}% | |
\endgroup} | |
\@onlypreamble\DefaultInheritance | |
\newtoggle{blx@inherit@all} | |
\newtoggle{blx@inherit@override} | |
\blx@kv@defkey{blx@inherit@default}{all}[true]{% true|false | |
\settoggle{blx@inherit@all}{#1}} | |
\blx@kv@defkey{blx@inherit@default}{override}[true]{% true|false | |
\settoggle{blx@inherit@override}{#1}} | |
\blx@kv@defkey{blx@inherit@default}{ignore}{% csv list | |
\edef\blx@tempf{ ignore="#1"}} | |
% {<source>}{<target>}{<options>} | |
\newcommand*{\blx@inherit@except}[3]{% | |
\let\blx@tempc\@empty | |
\ifblank{#3} | |
{} | |
{\blx@kv@setkeys{blx@inherit@except}{#3}}% | |
\eappto\blx@tempb{% | |
\blx@xml@inherit@type{#1}{#2}{\blx@tempc}}} | |
\blx@kv@defkey{blx@inherit@except}{all}[true]{% true|false | |
\eappto\blx@tempc{ inherit\string_all="#1"}} | |
\blx@kv@defkey{blx@inherit@except}{override}[true]{% true|false | |
\eappto\blx@tempc{ override\string_target="#1"}} | |
\blx@kv@defkey{blx@inherit@except}{ignore}{% csv list | |
\eappto\blx@tempc{ ignore="#1"}} | |
% {<type,type,...>}{<type,type,...>}{<spec>} | |
\newrobustcmd*{\DeclareDataInheritance}[4][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\let\blx@tempf\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@inherit}{#1}}% | |
\forcsvlist{\blx@inherit@i{#3}}{#2}% | |
\let\blx@tempb\@empty | |
\let\inherit\blx@inherit@field | |
\let\noinherit\blx@inherit@block | |
#4% | |
\xappto\blx@inherit@data{% | |
\blx@xml@inherit@data{\blx@tempf}{% | |
\blx@tempa | |
\blx@tempb}}% | |
\endgroup} | |
\@onlypreamble\DeclareDataInheritance | |
\def\blx@inherit@i#1#2{% | |
\forcsvlist{\blx@inherit@ii{#2}}{#1}} | |
\def\blx@inherit@ii#1#2{% | |
\eappto\blx@tempa{\blx@xml@inherit@type{#1}{#2}{}}} | |
\blx@DeclareBackendOption{global}[xml]{inheritance} | |
% [<options>]{<source>}{<target>} | |
\newcommand*{\blx@inherit@field}[3][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@inherit@field}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@inherit@field{#2}{#3}{\blx@tempc}}} | |
\newcommand*{\blx@inherit@block}[1]{% | |
\eappto\blx@tempb{\blx@xml@inherit@block{#1}}} | |
\blx@kv@defkey{blx@inherit}{ignore}{% csv list | |
\edef\blx@tempf{ ignore="#1"}} | |
\blx@kv@defkey{blx@inherit@field}{override}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\edef\blx@tempc{ override\string_target="true"}} | |
{\edef\blx@tempc{ override\string_target="false"}}} | |
\newrobustcmd*{\ResetDataInheritance}{% | |
\global\csundef{blx@inherit@data}} | |
\@onlypreamble\ResetDataInheritance | |
% {<name>}{<spec>} | |
\newrobustcmd*{\DeclareBiblistFilter}[2]{% | |
\begingroup | |
\let\filteror\blx@biblistfilteror | |
\let\filter\blx@biblistfilter | |
\let\blx@tempa\@empty | |
#2% | |
\global\cslet{blx@biblistfilters@#1}\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareBiblistFilter | |
\newcommand*{\blx@biblistfilteror}[1]{% | |
\eappto\blx@tempa{\blx@xml@dlistfilterorbegin}% | |
#1% | |
\eappto\blx@tempa{\blx@xml@dlistfilterorend}} | |
\newcommand*{\blx@biblistfilter}[1][2]{% | |
\let\blx@tempc\@empty | |
\let\blx@tempd\@empty | |
\blx@kv@setkeys{blx@biblistfilter@filter}{#1}% | |
\eappto\blx@tempa{% | |
\blx@xml@dlistfilter{\blx@tempc}{\blx@tempd}}} | |
\blx@kv@defkey{blx@biblistfilter@filter}{type}{% | |
\def\blx@tempc{#1}} | |
\blx@kv@defkey{blx@biblistfilter@filter}{filter}{% | |
\def\blx@tempd{#1}} | |
% Predefine filters for label fields | |
\def\do#1{\DeclareBiblistFilter{#1}{\filter[type=field,filter=#1]}} | |
\abx@dolabelfields | |
\blx@kv@defkey{blx@biblist1}{biblistfilter}{\blx@key@biblistfilter{#1}} | |
\blx@kv@defkey{blx@biblist2}{biblistfilter}{} | |
\def\blx@key@biblistfilter#1{% | |
\ifcsundef{blx@biblistfilters@#1} | |
{\blx@error | |
{BiblistFilter '#1' not found} | |
{The BiblistFilter '#1' could not be found.\MessageBreak | |
Use '\string\DeclareBiblistFilter' to define it}} | |
{\def\blx@thebiblistfilter{#1}}} | |
% [<langids>][<entrytype>]{translitsource}{translittarget} | |
\newrobustcmd*{\DeclareSortTranslit}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@tempa{*}} | |
{\def\blx@tempa{#1}}% | |
\let\translit\blx@translit@setup | |
\let\blx@tempb\@empty | |
#2% | |
\global\cslet{blx@translit@\blx@tempa}\blx@tempb | |
\xifinlist\blx@tempa\blx@translits | |
{} | |
{\listxadd\blx@translits\blx@tempa}% | |
\endgroup} | |
\@onlypreamble\DeclareSortTranslit | |
\blx@DeclareBackendOption{global,type}[xml]{translit} | |
\newcommand*{\blx@translit@setup}[4][]{% | |
\eappto\blx@tempb{% | |
\ifblank{#1} | |
{\blx@xml@translit{}{#2}{#3}{#4}} | |
{\blx@xml@translit{langids="#1" }{#2}{#3}{#4}}}} | |
% [<specname>]{<spec>} | |
\newrobustcmd*{\DeclareUniquenameTemplate}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@untname{global}}% default | |
{\def\blx@untname{#1}}% | |
\let\namepart\blx@untemp@namepart | |
\let\blx@tempa\@empty | |
\blx@tempcnta\z@ | |
#2% | |
\global\cslet{blx@uniquenametemplate@\blx@untname}\blx@tempa | |
\xifinlist\blx@untname\blx@untemplatespecs | |
{} | |
{\listxadd\blx@untemplatespecs\blx@untname}% | |
\endgroup} | |
\@onlypreamble\DeclareUniquenameTemplate | |
\blx@DeclareBackendOption{global}[xml]{uniquenametemplate} | |
\DeclareBiblatexOption{entry,namelist,name}[string]{uniquenametemplatename}{% | |
\def\blx@refcontext@uniquenametemplatename{#1}} | |
\newcommand*{\blx@untemp@namepart}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@untemp@namepart}{#1}}% | |
\eappto\blx@tempa{% | |
\blx@xml@uniquenametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}} | |
\blx@kv@defkey{blx@untemp@namepart}{use}[true]{% use* option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ use="1"}} | |
{}} | |
\blx@kv@defkey{blx@untemp@namepart}{base}[true]{% base option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ base="1"}} | |
{}} | |
\blx@kv@defkey{blx@untemp@namepart}{disambiguation}{% disambiguation option for namepart none|inits|full|fullonly | |
\appto\blx@tempc{ disambiguation="#1"}} | |
% [<templatename>]{<template>} | |
\newrobustcmd*{\DeclareSortingNamekeyTemplate}[2][]{% | |
\begingroup | |
\ifblank{#1} | |
{\def\blx@snkname{global}}% default | |
{\def\blx@snkname{#1}}% | |
\let\namepart\blx@sortnk@namepart | |
\let\keypart\blx@sortnk@keypart | |
\let\literal\blx@sortnk@literal | |
\let\blx@tempa\@empty | |
\blx@tempcnta\z@ | |
#2% | |
\global\cslet{blx@sortingnamekeytemplate@\blx@snkname}\blx@tempa | |
\xifinlist\blx@snkname\blx@sortingnamekeytemplates | |
{} | |
{\listxadd\blx@sortingnamekeytemplates\blx@snkname}% | |
\endgroup} | |
\@onlypreamble\DeclareSortingNamekeyTemplate | |
\blx@DeclareBackendOption{global}[xml]{sortingnamekeytemplate} | |
\DeclareBiblatexOption{entry,namelist,name}[string]{sortingnamekeytemplatename}{% | |
\def\blx@refcontext@sortingnamekeytemplatename{#1}} | |
% User-mode macro for checking sorting name template options | |
\def\ifuniquenametemplatename#1{% | |
\expandafter\ifstrequal\expandafter{\blx@refcontext@uniquenametemplatename}{#1}} | |
\def\iflabelalphanametemplatename#1{% | |
\expandafter\ifstrequal\expandafter{\blx@refcontext@labelalphanametemplatename}{#1}} | |
\def\ifsortingnamekeytemplatename#1{% | |
\expandafter\ifstrequal\expandafter{\blx@refcontext@sortingnamekeytemplatename}{#1}} | |
\newcommand*{\blx@sortnk@keypart}[1]{% | |
\advance\blx@tempcnta\@ne | |
\blx@tempcntb\z@ | |
\edef\blx@tempd{ order="\the\blx@tempcnta"}% | |
\let\blx@tempb\@empty | |
#1% | |
\eappto\blx@tempa{% | |
\blx@xml@sortingnamekeykeypart{\blx@tempd}{\blx@tempb}}} | |
\newcommand*{\blx@sortnk@literal}[1]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{ order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\eappto\blx@tempb{% | |
\blx@xml@sortingnamekeyliteral{\blx@tempe}{#1}}} | |
\newcommand*{\blx@sortnk@namepart}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempe{ order="\the\blx@tempcntb"}% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@sortnk@namepart}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@sortingnamekeynamepart{\blx@tempe}{\blx@tempc}{#2}}} | |
\blx@kv@defkey{blx@sortnk@namepart}{use}[true]{% use* option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ use="1"}} | |
{\appto\blx@tempc{ use="0"}}} | |
\blx@kv@defkey{blx@sortnk@namepart}{inits}[true]{% initials only option for namepart true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ inits="1"}} | |
{\appto\blx@tempc{ inits="0"}}} | |
% [options]{<templatename>}{<template>} | |
\newrobustcmd*{\DeclareSortingTemplate}[3][]{% | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@sortdef@sorting}{#1}% | |
\csxdef{blx@sortdef@locale@#2}{\blx@templ}}% | |
\begingroup | |
\def\name{%LEGACY(<2.0) | |
\blx@warning@noline{% | |
'\string\name' is deprecated in sorting specifications, please use '\string\field'}% | |
\blx@sortdef@field}% | |
\def\list{%LEGACY(<2.0) | |
\blx@warning@noline{% | |
'\string\list' is deprecated in sorting specifications, please use '\string\field'}% | |
\blx@sortdef@field}% | |
\let\sort\blx@sortdef@sort | |
\let\field\blx@sortdef@field | |
\let\literal\blx@sortdef@literal | |
\global\csundef{blx@sortingtemplate@citeorder@relevant@#2}% | |
\def\citeorder{% | |
\global\cslet{blx@sortingtemplate@citeorder@relevant@#2}\@empty | |
\blx@sortdef@field{citeorder}}% | |
\blx@tempcnta\z@ | |
\let\blx@tempa\@empty | |
#3% | |
\global\cslet{blx@sortingtemplate@#2}\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareSortingTemplate | |
\blx@DeclareBackendOption{global}[xml]{sortingtemplate} | |
\blx@kv@defkey{blx@sortdef@sorting}{locale}{% locale name | |
\def\blx@templ{#1}} | |
\newcommand*{\blx@sortdef@sort}[2][]{% | |
\advance\blx@tempcnta\@ne | |
\blx@tempcntb\z@ | |
\let\blx@tempb\@empty | |
\edef\blx@tempc{order="\the\blx@tempcnta"}% | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@sortdef@sort}{#1}}% | |
\let\do\@firstofone | |
#2% | |
\eappto\blx@tempa{% | |
\blx@xml@sort{\blx@tempc}{\blx@tempb}}} | |
\blx@kv@defkey{blx@sortdef@sort}{locale}{% locale name | |
\eappto\blx@tempc{ locale="#1"}} | |
\blx@kv@defkey{blx@sortdef@sort}{direction}{% ascending|descending | |
\ifstrequal{#1}{ascending} | |
{\eappto\blx@tempc{ sort\string_direction="ascending"}} | |
{\eappto\blx@tempc{ sort\string_direction="descending"}}} | |
\blx@kv@defkey{blx@sortdef@sort}{final}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ final="1"}} | |
{}} | |
\blx@kv@defkey{blx@sortdef@sort}{sortcase}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ sortcase="1"}} | |
{\appto\blx@tempc{ sortcase="0"}}} | |
\blx@kv@defkey{blx@sortdef@sort}{sortupper}[true]{% true|false | |
\ifstrequal{#1}{true} | |
{\appto\blx@tempc{ sortupper="1"}} | |
{\appto\blx@tempc{ sortupper="0"}}} | |
\newcommand*{\blx@sortdef@field}[2][]{% | |
\advance\blx@tempcntb\@ne | |
\edef\blx@tempd{order="\the\blx@tempcntb"}% | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@sortdef@field}{#1}}% | |
\eappto\blx@tempb{% | |
\blx@xml@sortitem{\blx@tempd}{#2}}} | |
\blx@kv@defkey{blx@sortdef@field}{padside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempd{ pad\string_side="right"}} | |
{\eappto\blx@tempd{ pad\string_side="left"}}} | |
\blx@kv@defkey{blx@sortdef@field}{padwidth}{% integer | |
\eappto\blx@tempd{ pad\string_width="#1"}} | |
\blx@kv@defkey{blx@sortdef@field}{padchar}{% character | |
\blx@xmlsanitizeafter{\def\blx@tempe}{#1}% | |
\eappto\blx@tempd{ pad\string_char="\blx@tempe"}} | |
\blx@kv@defkey{blx@sortdef@field}{strside}{% left|right | |
\ifstrequal{#1}{right} | |
{\eappto\blx@tempd{ substring\string_side="right"}} | |
{\eappto\blx@tempd{ substring\string_side="left"}}} | |
\blx@kv@defkey{blx@sortdef@field}{strwidth}{% integer | |
\eappto\blx@tempd{ substring\string_width="#1"}} | |
\def\blx@sortdef@literal#1{% | |
\advance\blx@tempcntb\@ne | |
\blx@xmlsanitizeafter{\def\blx@tempe}{#1}% | |
\eappto\blx@tempb{% | |
\blx@xml@sortitem{literal="1" order="\the\blx@tempcntb"}{\blx@tempe}}} | |
% [<type,type,...>]{<string>} | |
\newrobustcmd*{\DeclarePresort}[2][]{% | |
\begingroup | |
\blx@xmlsanitizeafter{\def\blx@tempa}{#2}% | |
\ifblank{#1} | |
{\xdef\blx@bcf@presort{\blx@xml@presort{}{\blx@tempa}}} | |
{\notblank{#2} | |
{\forcsvlist{\blx@defpresort\blx@tempa}{#1}} | |
{\forcsvlist\blx@undefpresort{#1}}}% | |
\endgroup} | |
\@onlypreamble\DeclarePresort | |
\blx@DeclareBackendOption{global,type,entry}[string]{presort} | |
\def\blx@defpresort#1#2{% | |
\csxdef{blx@bcf@presort@#2}{\blx@xml@presort{#2}{#1}}} | |
\def\blx@undefpresort#1{% | |
\global\csundef{blx@bcf@presort@#1}} | |
% {<entrytype,...>}{<field,...>} | |
\newrobustcmd*{\DeclareSortExclusion}[2]{% | |
\forcsvlist{\blx@sortexclude{#2}}{#1}} | |
\blx@DeclareBackendOption{type}[xml]{sortexclusion} | |
% {<field>}{<entrytype>} | |
\def\blx@sortexclude#1#2{% | |
\begingroup | |
\ifblank{#1} | |
{\global\csundef{blx@bcf@exclude@#2}} | |
{\let\blx@tempa\@empty | |
\forcsvlist\blx@sortexclude@i{#1}% | |
\csxdef{blx@bcf@exclude@#2}{% | |
\blx@xml@sortexclude{#2}{\blx@tempa}}} | |
\endgroup} | |
\def\blx@sortexclude@i#1{% | |
\appto\blx@tempa{\blx@xml@exclude{#1}}} | |
% {<entrytype,...>}{<field,...>} | |
\newrobustcmd*{\DeclareSortInclusion}[2]{% | |
\forcsvlist{\blx@sortinclude{#2}}{#1}} | |
\blx@DeclareBackendOption{type}[xml]{sortinclusion} | |
% {<field>}{<entrytype>} | |
\def\blx@sortinclude#1#2{% | |
\begingroup | |
\ifblank{#1} | |
{\global\csundef{blx@bcf@include@#2}} | |
{\let\blx@tempa\@empty | |
\forcsvlist\blx@sortinclude@i{#1}% | |
\csxdef{blx@bcf@include@#2}{% | |
\blx@xml@sortinclude{#2}{\blx@tempa}}} | |
\endgroup} | |
\def\blx@sortinclude@i#1{% | |
\appto\blx@tempa{\blx@xml@include{#1}}} | |
% {<field,field,...>} | |
\newrobustcmd*{\DeclareExtradate}[1]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\let\scope\blx@extradate@scope | |
#1% | |
\global\let\blx@bcf@extradatespec\blx@tempa | |
\endgroup} | |
\@onlypreamble\DeclareExtradate | |
\blx@DeclareBackendOption{global}[xml]{extradatespec} | |
\newrobustcmd*{\blx@extradate@scope}[1]{% | |
\let\blx@tempb\@empty | |
\let\field\blx@ordereded@field | |
#1% | |
\csxappto{blx@tempa}{% | |
\noexpand\blx@xml@extradatescope{\blx@tempb}}} | |
\newcommand*{\blx@ordereded@field}[1]{% | |
\advance\blx@tempcnta\@ne | |
\csxappto{blx@tempb}{% | |
\noexpand\blx@xml@edordered{\the\blx@tempcnta}{#1}}} | |
% [<type,type,...>]{<field,field,...>} | |
\newrobustcmd*{\DeclareLabelname}[2][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\def\blx@tempb{labelnamespec}% | |
\let\field\blx@ordered@field | |
\ifblank{#1} | |
{\global\cslet{blx@bcf@labelnamespec}\@empty} | |
{\def\blx@tempa{#1}% | |
\def\do##1{\global\cslet{blx@bcf@labelnamespec@##1}\@empty}% | |
\expandafter\docsvlist\expandafter{#1}}% | |
#2% | |
\endgroup} | |
\@onlypreamble\DeclareLabelname | |
\blx@DeclareBackendOption{global,type}[xml]{labelnamespec} | |
\newrobustcmd*{\DeclareLabeltitle}[2][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\def\blx@tempb{labeltitlespec}% | |
\let\field\blx@ordered@field | |
\ifblank{#1} | |
{\global\cslet{blx@bcf@labeltitlespec}\@empty} | |
{\def\blx@tempa{#1}% | |
\def\do##1{\global\cslet{blx@bcf@labeltitlespec@##1}\@empty}% | |
\expandafter\docsvlist\expandafter{#1}}% | |
#2% | |
\endgroup} | |
\@onlypreamble\DeclareLabeltitle | |
\blx@DeclareBackendOption{global,type}[xml]{labeltitlespec} | |
\newrobustcmd*{\DeclareLabeldate}[2][]{% | |
\begingroup | |
\let\blx@tempa\@empty | |
\def\blx@tempb{labeldatespec}% | |
\let\field\blx@orderedld@field | |
\let\literal\blx@orderedld@literal | |
\ifblank{#1} | |
{\global\cslet{blx@bcf@labeldatespec}\@empty} | |
{\def\blx@tempa{#1}% | |
\def\do##1{\global\cslet{blx@bcf@labeldatespec@##1}\@empty}% | |
\expandafter\docsvlist\expandafter{#1}}% | |
#2% | |
\endgroup} | |
\@onlypreamble\DeclareLabeldate | |
\blx@DeclareBackendOption{global,type}[xml]{labeldatespec} | |
\newcommand*{\blx@ordered@field}[2][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@ordered@field}{#1}}% | |
\advance\blx@tempcnta\@ne | |
\ifdefempty{\blx@tempa} | |
{\csxappto{blx@bcf@\blx@tempb}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}} | |
{\def\do##1{% | |
\blx@addtypeopt{##1}% | |
\csxappto{blx@bcf@\blx@tempb @##1}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}}% | |
\expandafter\docsvlist\expandafter{\blx@tempa}}} | |
\newcommand*{\blx@orderedld@field}[2][]{% | |
\let\blx@tempc\@empty | |
\ifblank{#1} | |
{} | |
{\blx@kv@setkeys{blx@ordered@field}{#1}}% | |
\advance\blx@tempcnta\@ne | |
\ifdefempty{\blx@tempa} | |
{\csxappto{blx@bcf@\blx@tempb}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}} | |
{\def\do##1{% | |
\blx@addtypeopt{##1}% | |
\csxappto{blx@bcf@\blx@tempb @##1}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}}% | |
\expandafter\docsvlist\expandafter{\blx@tempa}}} | |
\newcommand*{\blx@orderedld@literal}[1]{% | |
\advance\blx@tempcnta\@ne | |
\ifdefempty{\blx@tempa} | |
{\csxappto{blx@bcf@\blx@tempb}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}} | |
{\def\do##1{% | |
\blx@addtypeopt{##1}% | |
\csxappto{blx@bcf@\blx@tempb @##1}{% | |
\noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}}% | |
\expandafter\docsvlist\expandafter{\blx@tempa}}} | |
%% Package options | |
% [<entrytype,entrytype,...>]{<options>} | |
\newrobustcmd*{\ExecuteBibliographyOptions}[2][]{% | |
\ifblank{#1} | |
{\blx@kv@setkeys{blx@opt@pre}{#2}} | |
{\forcsvlist{\blx@typeoptions{#2}}{#1}}} | |
\@onlypreamble\ExecuteBibliographyOptions | |
\def\blx@typeoptions#1#2{% | |
\blx@addtypeopt{#2}% | |
\csappto{blx@opts@type@#2}{#1,}} | |
\def\blx@addtypeopt#1{% | |
\notblank{#1} | |
{\ifdef\blx@opts@type | |
{\ifinlist{#1}\blx@opts@type | |
{} | |
{\listgadd\blx@opts@type{#1}}} | |
{\listgadd\blx@opts@type{#1}}} | |
{}} | |
% load-time only | |
% Have to have a dummy for this as it's set much earlier but is passed | |
% through to here where we just ignore it | |
\blx@kv@defkey{blx@opt@ldt}{datamodel}{} | |
\blx@kv@defkey{blx@opt@ldt}{backend}{% | |
\ifstrequal{#1}{biber} | |
{} | |
{\ifboolexpr{ | |
test {\ifstrequal{#1}{bibtex}} | |
or | |
test {\ifstrequal{#1}{bibtex8}}} | |
{\settoggle{blx@bibtex}{true}% | |
\newtoggle{blx@bibtex8}% | |
\ifstrequal{#1}{bibtex8} | |
{\settoggle{blx@bibtex8}{true}} | |
{}}% | |
{\blx@err@invopt{backend=#1}{}}}} | |
\blx@kv@defkey{blx@opt@ldt}{style}{% | |
\def\blx@cbxfile{#1}% | |
\def\blx@bbxfile{#1}} | |
\blx@kv@defkey{blx@opt@ldt}{bibstyle}{% | |
\def\blx@bbxfile{#1}} | |
\blx@kv@defkey{blx@opt@ldt}{citestyle}{% | |
\def\blx@cbxfile{#1}} | |
\blx@kv@defkey{blx@opt@ldt}{natbib}[true]{% | |
\settoggle{blx@natbib}{#1}} | |
\blx@kv@defkey{blx@opt@ldt}{mcite}[true]{% | |
\settoggle{blx@mcite}{#1}} | |
\blx@kv@defkey{blx@opt@ldt}{noerroretextools}[true]{% | |
\blx@warning@noline{% | |
The option 'noerroretextools' is deprecated.\MessageBreak | |
Define the control sequence '\string\blx@noerroretextools'\MessageBreak | |
before loading biblatex instead}% | |
\ifstrequal{#1}{true} | |
{\global\cslet{blx@noerroretextools}\@empty} | |
{\global\csundef{blx@noerroretextools}}} | |
% load-time and preamble | |
\DeclareBibliographyOption[boolean]{debug}[true]{% | |
\settoggle{blx@debug}{#1}} | |
\DeclareBibliographyOption[boolean]{loadfiles}[true]{% | |
\settoggle{blx@loadfiles}{#1}} | |
\DeclareBibliographyOption[integer]{mincrossrefs}{% | |
\ifnum#1<\z@ | |
\def\blx@mincrossrefs{1}% | |
\else | |
\def\blx@mincrossrefs{#1}% | |
\fi} | |
\DeclareBibliographyOption[integer]{minxrefs}{% | |
\ifnum#1<\z@ | |
\def\blx@minxrefs{1}% | |
\else | |
\def\blx@minxrefs{#1}% | |
\fi} | |
\def\blx@minxrefs{2} | |
\DeclareBibliographyOption[string]{texencoding}{% | |
\ifstrequal{#1}{auto} | |
{\undef\blx@texencoding} | |
{\def\blx@texencoding{#1}}} | |
\DeclareBibliographyOption[string]{bibencoding}{% | |
\ifcsdef{blx@bibenc@#1} | |
{\letcs\blx@bibencoding{blx@bibenc@#1}} | |
{\def\blx@bibencoding{#1}}} | |
\def\abx@mapbibenc#1#2{\csdef{blx@bibenc@#1}{#2}} | |
\abx@mapbibenc{inputenc}{auto} | |
\abx@mapbibenc{x-ascii}{ascii} | |
\def\abx@mapinpenc#1#2{\csdef{blx@inpenc@#1}{#2}} | |
\abx@mapinpenc{utf8x}{utf8} | |
\abx@mapinpenc{lutf8}{utf8} | |
\abx@mapinpenc{x-ascii}{ascii} | |
\DeclareBibliographyOption[boolean]{safeinputenc}[true]{% | |
\settoggle{blx@safeinputenc}{#1}} | |
\newtoggle{blx@safeinputenc} | |
% global "sorting" option becomes "sortingtemplatename" in the .bcf and so | |
% don't use \DeclareBibliographyOption. This is a legacy naming issue | |
% unlikely to be corrected as "sorting" is an obvious name for biblatex users | |
% "sorting" is used in the .bcf for the actual sorting template definitions and is | |
% an XML format option | |
\blx@kv@defkey{blx@opt@pre}{sorting}{% | |
\def\blx@sorting{#1}% | |
\def\blx@refcontext@sortingtemplatename{#1}} | |
\blx@DeclareBackendOption{global}[string]{sortingtemplatename} | |
\AtEndPreamble{% | |
\ifcsdef{blx@sortingtemplate@\blx@sorting} | |
{} | |
{\blx@err@invopt{sorting=\blx@sorting}{}% | |
\def\blx@sorting{nty}% | |
\def\blx@refcontext@sortingtemplatename{nty}}% | |
\listxadd\blx@sortingtemplatenames\blx@sorting | |
\def\blx@refcontext@sortingnamekeytemplatename{global}% | |
\let\blx@refcontext@labelprefix\@empty | |
\let\blx@refcontext@labelprefix@real\@empty | |
\def\blx@refcontext@uniquenametemplatename{global}% | |
\def\blx@refcontext@labelalphanametemplatename{global}% | |
\blx@xdef@refcontext{% | |
\blx@refcontext@sortingtemplatename/% | |
\blx@refcontext@sortingnamekeytemplatename/% | |
\blx@refcontext@labelprefix/% | |
\blx@refcontext@uniquenametemplatename/% | |
\blx@refcontext@labelalphanametemplatename}% | |
\listxadd\blx@refcontexts\blx@refcontext@context} | |
\DeclareBibliographyOption[boolean]{sortcase}[true]{% | |
\settoggle{blx@sortcase}{#1}} | |
\DeclareBibliographyOption[boolean]{sortupper}[true]{% | |
\settoggle{blx@sortupper}{#1}} | |
\DeclareBiblatexOption{global,type}[integer]{maxnames}{% | |
\numdef\blx@maxcitenames{#1}% | |
\numdef\blx@maxbibnames{#1}% | |
\numdef\blx@maxsortnames{#1}% | |
\c@maxnames#1\relax} | |
\DeclareBiblatexOption{global,type}[integer]{minnames}{% | |
\numdef\blx@mincitenames{#1}% | |
\numdef\blx@minbibnames{#1}% | |
\numdef\blx@minsortnames{#1}% | |
\c@minnames#1\relax} | |
% the per-entry option is resolved by Biber directly | |
\blx@DeclareBackendOption{entry}[integer]{maxnames} | |
\blx@DeclareBackendOption{entry}[integer]{minnames} | |
\gdef\blx@bcf@backendin@entry@maxnames{maxcitenames,maxbibnames,maxsortnames}% | |
\gdef\blx@bcf@backendin@entry@minnames{mincitenames,minbibnames,minsortnames}% | |
\DeclareBiblatexOption{global,type,entry}[integer]{maxbibnames}{% | |
\numdef\blx@maxbibnames{#1}% | |
\numdef\blx@maxsortnames{#1}% | |
\iftoggle{blx@bibliography} | |
{\c@maxnames#1\relax} | |
{}} | |
\DeclareBiblatexOption{global,type,entry}[integer]{minbibnames}{% | |
\numdef\blx@minbibnames{#1}% | |
\numdef\blx@minsortnames{#1}% | |
\iftoggle{blx@bibliography} | |
{\c@minnames#1\relax} | |
{}} | |
\DeclareBiblatexOption{global,type,entry}[integer]{maxcitenames}{% | |
\numdef\blx@maxcitenames{#1}% | |
\iftoggle{blx@bibliography} | |
{} | |
{\c@maxnames#1\relax}} | |
\DeclareBiblatexOption{global,type,entry}[integer]{mincitenames}{% | |
\numdef\blx@mincitenames{#1}% | |
\iftoggle{blx@bibliography} | |
{} | |
{\c@minnames#1\relax}} | |
\DeclareBiblatexOption{global,type,entry}[integer]{maxsortnames}{% | |
\numdef\blx@maxsortnames{#1}} | |
\DeclareBiblatexOption{global,type,entry}[integer]{minsortnames}{% | |
\numdef\blx@minsortnames{#1}} | |
\appto\blx@checkoptions@global{% | |
\blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames | |
\blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames | |
\blx@maxmin@num{maxsortnames}{minsortnames}\blx@maxsortnames\blx@minsortnames} | |
\appto\blx@checkoptions@type{% | |
\blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames | |
\blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames | |
\blx@maxmin@num{maxsortnames}{minsortnames}\blx@maxsortnames\blx@minsortnames} | |
\appto\blx@checkoptions@entry{% | |
\blx@maxmin@cnt{maxnames}{minnames}\c@maxnames\c@minnames} | |
\DeclareBiblatexOption{global,type,entry}[integer]{maxitems}{% | |
\numdef\blx@maxitems{#1}% | |
\c@maxitems#1\relax} | |
\DeclareBiblatexOption{global,type,entry}[integer]{minitems}{% | |
\numdef\blx@minitems{#1}% | |
\c@minitems#1\relax} | |
\appto\blx@checkoptions@global{% | |
\blx@maxmin@num{maxitems}{minitems}\blx@maxitems\blx@minitems} | |
\appto\blx@checkoptions@type{% | |
\blx@maxmin@num{maxitems}{minitems}\blx@maxitems\blx@minitems} | |
\appto\blx@checkoptions@entry{% | |
\blx@maxmin@cnt{maxitems}{minitems}\c@maxitems\blx@minitems} | |
\DeclareBiblatexOption{global,type,entry}[integer]{maxalphanames}{% | |
\numdef\blx@maxalphanames{#1}} | |
\DeclareBiblatexOption{global,type,entry}[integer]{minalphanames}{% | |
\numdef\blx@minalphanames{#1}} | |
\appto\blx@checkoptions@global{% | |
\blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames} | |
\appto\blx@checkoptions@type{% | |
\blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames} | |
\def\blx@maxmin@num#1#2#3#4{% | |
\ifnumless#3\@ne | |
{\blx@err@invopt{#1=#3}{'#1' must be greater than zero}% | |
\let#3\@ne} | |
{}% | |
\ifnumless#4\@ne | |
{\blx@err@invopt{#2=#4}{'#2' must be greater than zero}% | |
\let#4\@ne} | |
{}% | |
\ifnumless#3#4 | |
{\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}% | |
\let#3#4} | |
{}} | |
\def\blx@maxmin@cnt#1#2#3#4{% | |
\ifnumless#3\@ne | |
{\blx@err@invopt{#1=\number#3}{'#1' must be greater than zero}% | |
#3\@ne} | |
{}% | |
\ifnumless#4\@ne | |
{\blx@err@invopt{#2=\number#4}{'#2' must be greater than zero}% | |
#4\@ne} | |
{}% | |
\ifnumless#3#4 | |
{\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}% | |
#3=#4} | |
{}} | |
\DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{terseinits}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@terseinits} | |
\renewrobustcmd*{\bibinitperiod}{} | |
\renewrobustcmd*{\bibinitdelim}{} | |
\renewrobustcmd*{\bibinithyphendelim}{}} | |
{\togglefalse{blx@terseinits} | |
\renewrobustcmd*{\bibinitperiod}{\adddot} | |
\renewrobustcmd*{\bibinitdelim}{\addnbspace} | |
\renewrobustcmd*{\bibinithyphendelim}{\adddot\mbox{-}}}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{abbreviate}[true]{% | |
\ifstrequal{#1}{true} | |
{\def\abx@str{abx@sstr}} | |
{\def\abx@str{abx@lstr}}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{dateabbrev}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\abx@bibmonth\blx@imc@bibsstring | |
\let\abx@bibseason\blx@imc@bibsstring} | |
{\let\abx@bibmonth\blx@imc@biblstring | |
\let\abx@bibseason\blx@imc@biblstring}} | |
\DeclareBibliographyOption[string]{sortlocale}{% | |
\edef\blx@sortlocale{\detokenize{#1}}} | |
\DeclareBibliographyOption[string]{language}{% | |
\togglefalse{blx@autolangbib}% | |
\togglefalse{blx@autolangcite}% | |
\undef\blx@languagename | |
\undef\blx@forcelanguagename | |
\ifboolexpr{ | |
test {\ifstrequal{#1}{auto}} | |
or | |
test {\ifstrequal{#1}{autobib}} | |
or | |
test {\ifstrequal{#1}{autocite}} | |
} | |
{\def\blx@languagename{english}% | |
\ifstrequal{#1}{auto} | |
{\toggletrue{blx@autolangbib}% | |
\toggletrue{blx@autolangcite}} | |
{}% | |
\ifstrequal{#1}{autobib} | |
{\toggletrue{blx@autolangbib}} | |
{}% | |
\ifstrequal{#1}{autocite} | |
{\toggletrue{blx@autolangcite}} | |
{}} | |
% If language is explicit, we do want to auto-switch but only to the | |
% selected language | |
{\IfFileExists{#1.lbx} | |
{\toggletrue{blx@autolangbib}% | |
\toggletrue{blx@autolangcite}% | |
\edef\blx@languagename{#1}% | |
\edef\blx@forcelanguagename{#1}} | |
{\blx@error | |
{Language '#1' not supported} | |
{Failed to find a matching '#1.lbx' file}}}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{clearlang}[true]{% | |
\settoggle{blx@clearlang}{#1}} | |
\DeclareBibliographyOption[string]{autolang}{% | |
\blx@autolang@i{#1}} | |
\def\blx@autolang@i#1{% | |
\ifcsdef{blx@opt@autolang@#1} | |
{\csuse{blx@opt@autolang@#1}} | |
{\blx@err@invopt{autolang=#1}{}}} | |
\def\blx@opt@autolang@none{% | |
\undef\blx@thelangenv | |
\let\blx@hook@initlang\@empty | |
\let\blx@hook@endlang\@empty} | |
\def\blx@opt@autolang@hyphen{% | |
\def\blx@thelangenv{hyphenrules}% | |
\let\blx@hook@initlang\@empty | |
\let\blx@hook@endlang\@empty} | |
\csdef{blx@opt@autolang@other*}{% | |
\def\blx@thelangenv{otherlanguage*}% | |
\def\blx@hook@initlang{\@quotereset\@ne}% | |
\def\blx@hook@endlang{\blx@postpunct}} | |
\def\blx@opt@autolang@other{% | |
\def\blx@thelangenv{otherlanguage}% | |
\def\blx@hook@initlang{\@quotereset\@ne}% | |
\def\blx@hook@endlang{\blx@postpunct}} | |
\def\blx@opt@autolang@langname{% | |
\@ifpackageloaded{polyglossia} | |
{\def\blx@thelangenv{langname}} | |
{\def\blx@thelangenv{otherlanguage}}% | |
\def\blx@hook@initlang{\@quotereset\@ne}% | |
\def\blx@hook@endlang{\blx@postpunct}} | |
\DeclareBibliographyOption[string]{langhook}{% | |
\ifstrequal{#1}{captions} | |
{\@firstoftwo} | |
{\ifstrequal{#1}{extras}} | |
{\def\blx@langhook{#1}} | |
{\blx@err@invopt{langhook=#1}{}}} | |
\DeclareBiblatexOption{global,type,entry}[string]{indexing}[true]{% | |
\blx@opt@index{#1}} | |
\def\blx@opt@index#1{% | |
\ifcsdef{blx@opt@index@#1} | |
{\csuse{blx@opt@index@#1}} | |
{\blx@err@invopt{indexing=#1}{}}} | |
\def\blx@opt@index@true{% | |
\toggletrue{blx@citeindex}% | |
\toggletrue{blx@bibindex}} | |
\def\blx@opt@index@false{% | |
\togglefalse{blx@citeindex}% | |
\togglefalse{blx@bibindex}} | |
\def\blx@opt@index@cite{% | |
\toggletrue{blx@citeindex}% | |
\togglefalse{blx@bibindex}} | |
\def\blx@opt@index@bib{% | |
\togglefalse{blx@citeindex}% | |
\toggletrue{blx@bibindex}} | |
\DeclareBibliographyOption[boolean]{sortcites}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\blx@thecitesort\blx@citesort | |
\let\blx@thenotecheck\blx@notecheck | |
\booltrue{sortcites}} | |
{\let\blx@thecitesort\blx@citenosort | |
\let\blx@thenotecheck\relax}} | |
\DeclareBibliographyOption[boolean]{sortsets}[true]{% | |
\settoggle{blx@sortsets}{#1}} | |
\DeclareBibliographyOption[string]{hyperref}[true]{% | |
\ifcsdef{blx@opt@hyperref@#1} | |
{\letcs\blx@hyperref{blx@opt@hyperref@#1}} | |
{\blx@err@invopt{hyperref=#1}{}}} | |
\def\blx@opt@hyperref@false{0} | |
\def\blx@opt@hyperref@true{1} | |
\def\blx@opt@hyperref@auto{2} | |
\def\blx@opt@hyperref@manual{3} | |
\def\blx@warn@usedmanualhyperrefs#1{% | |
\blx@warning@noline{The command '\string#1' can\MessageBreak | |
only be used with 'hyperref=manual'}} | |
\def\blx@warn@multiplemanualhyperrefs{% | |
\blx@warning@noline{You must call either '\string\BiblatexManualHyperrefOn'\MessageBreak | |
or '\string\BiblatexManualHyperrefOff' exactly once.\MessageBreak | |
Subsequent calls to either command will be ignored}} | |
\def\BiblatexManualHyperrefOn{% | |
\ifnum\blx@hyperref=\thr@@ | |
\blx@mkhyperref | |
\global\undef\blx@mkhyperref | |
\global\undef\blx@mknohyperref | |
\global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs | |
\global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs | |
\else | |
\blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOn}% | |
\fi} | |
\def\BiblatexManualHyperrefOff{% | |
\ifnum\blx@hyperref=\thr@@ | |
\blx@mknohyperref | |
\global\undef\blx@mkhyperref | |
\global\undef\blx@mknohyperref | |
\global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs | |
\global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs | |
\else | |
\blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOff}% | |
\fi} | |
\DeclareBibliographyOption[boolean]{backref}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\blx@backref\blx@addbackref | |
\let\abx@aux@backref\blx@aux@backref | |
\booltrue{backtracker}} | |
{\let\blx@backref\@gobble | |
\let\abx@aux@backref\@gobblefive | |
\boolfalse{backtracker}}} | |
\DeclareBibliographyOption[string]{backrefsetstyle}{% | |
\ifcsdef{blx@opt@backrefsetstyle@#1} | |
{\letcs\blx@backrefsetstyle{blx@opt@backrefsetstyle@#1}} | |
{\blx@err@invopt{backrefsetstyle=#1}{}}} | |
\def\blx@opt@backrefsetstyle@setonly{0} | |
\def\blx@opt@backrefsetstyle@memonly{1} | |
\def\blx@opt@backrefsetstyle@setormem{2} | |
\def\blx@opt@backrefsetstyle@setandmem{3} | |
\def\blx@opt@backrefsetstyle@memandset{4} | |
\def\blx@opt@backrefsetstyle@setplusmem{5} | |
\newtoggle{blx@backreffloats} | |
\DeclareBibliographyOption[boolean]{backreffloats}[true]{% | |
\settoggle{blx@backreffloats}{#1}} | |
\appto\blx@mkhyperref{% | |
\ifHy@plainpages | |
\blx@warning@noline{% | |
hyperref package option 'plainpages' enabled.\MessageBreak | |
This may cause problems with hyperlinked back\MessageBreak | |
references. 'plainpages=false' is recommended}% | |
\fi | |
\ifHy@pageanchor\else | |
\blx@warning@noline{% | |
hyperref package option 'pageanchor' disabled.\MessageBreak | |
This will cause problems with hyperlinked back\MessageBreak | |
references. 'pageanchor=true' is required}% | |
\fi} | |
\def\blx@optprocess@block#1{% | |
\ifcsdef{blx@opt@block@#1} | |
{\csuse{blx@opt@block@#1}} | |
{\blx@err@invopt{block=#1}{}}} | |
\DeclareBibliographyOption[string]{block}{% | |
\blx@optprocess@block{#1}} | |
\blx@kv@defkey{blx@bib1}{block}{} | |
\blx@kv@defkey{blx@bib2}{block}{\blx@optprocess@block{#1}} | |
\blx@kv@defkey{blx@biblist1}{block}{} | |
\blx@kv@defkey{blx@biblist2}{block}{\blx@optprocess@block{#1}} | |
\blx@kv@defkey{blx@bbs}{block}{\blx@optprocess@block{#1}} | |
\blx@kv@defkey{blx@bbg}{block}{\blx@optprocess@block{#1}} | |
\def\blx@opt@block@none{% | |
\let\blx@bibsetup\@empty | |
\let\newblockpunct\@empty} | |
\def\blx@opt@block@par{% | |
\let\blx@bibsetup\@empty | |
\def\newblockpunct{\par}} | |
\def\blx@opt@block@nbpar{% | |
\def\blx@bibsetup{\interlinepenalty\@M}% | |
\def\newblockpunct{\par\nobreak}} | |
\def\blx@opt@block@space{% | |
\let\blx@bibsetup\@empty | |
\def\newblockpunct{% | |
\unspace\space | |
\hskip 0.11em | |
\@plus 0.33em | |
\@minus 0.07em}} | |
\def\blx@opt@block@ragged{% | |
\let\blx@bibsetup\raggedright | |
\def\newblockpunct{% | |
\unspace\penalty-9\relax\space}} | |
\DeclareBibliographyOption[string]{pagetracker}[true]{% | |
\ifcsdef{blx@opt@pagetracker@#1} | |
{\csuse{blx@opt@pagetracker@#1}} | |
{\blx@err@invopt{pagetracker=#1}{}}} | |
\def\blx@opt@pagetracker@true{% | |
\if@twoside | |
\blx@opt@pagetracker@spread | |
\else | |
\blx@opt@pagetracker@page | |
\fi} | |
\def\blx@opt@pagetracker@false{% | |
\let\blx@pagetracker\relax | |
\let\abx@aux@page\@gobbletwo | |
\let\abx@aux@fnpage\@gobbletwo | |
\boolfalse{pagetracker}} | |
\def\blx@opt@pagetracker@page{% | |
\let\blx@pagetracker\blx@pagetracker@context | |
\let\abx@aux@page\blx@aux@page | |
\let\abx@aux@fnpage\blx@aux@fnpage | |
\booltrue{pagetracker}} | |
\def\blx@opt@pagetracker@spread{% | |
\if@twoside | |
\let\blx@pagetracker\blx@pagetracker@context | |
\let\abx@aux@page\blx@aux@spread | |
\let\abx@aux@fnpage\blx@aux@fnspread | |
\booltrue{pagetracker}% | |
\else | |
\blx@warning@noline{% | |
LaTeX not in twoside mode\MessageBreak | |
Falling back to 'pagetracker=page'}% | |
\blx@opt@pagetracker@page | |
\fi} | |
\DeclareBibliographyOption[string]{citecounter}[true]{% | |
\ifcsdef{blx@opt@citecounter@#1} | |
{\csuse{blx@opt@citecounter@#1}} | |
{\blx@err@invopt{citecounter=#1}{}}} | |
\def\blx@opt@citecounter@true{% | |
\let\blx@setcitecounter\blx@setcitecounter@global | |
\let\blx@citecounter\blx@citecounter@global | |
\let\abx@aux@count\blx@aux@count | |
\let\abx@aux@fncount\blx@aux@fncount | |
\booltrue{citetracker}} | |
\def\blx@opt@citecounter@context{% | |
\let\blx@setcitecounter\blx@setcitecounter@context | |
\let\blx@citecounter\blx@citecounter@context | |
\let\abx@aux@count\blx@aux@count | |
\let\abx@aux@fncount\blx@aux@fncount | |
\booltrue{citetracker}} | |
\def\blx@opt@citecounter@false{% | |
\let\blx@setcitecounter\relax | |
\let\blx@citecounter\relax | |
\let\abx@aux@count\@gobbletwo | |
\let\abx@aux@fncount\@gobbletwo} | |
\DeclareBiblatexOption{global,type,entry}[string]{citetracker}[true]{% | |
\ifcsdef{blx@opt@citetracker@#1} | |
{\csuse{blx@opt@citetracker@#1}} | |
{\blx@err@invopt{citetracker=#1}{}}} | |
\def\blx@opt@citetracker@true{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@global | |
\let\blx@imc@ifentryseen\blx@ifentryseen@global | |
\let\blx@citetracker\blx@citetracker@global | |
\booltrue{citetracker}} | |
\def\blx@opt@citetracker@false{% | |
\let\blx@imc@ifciteseen\@secondoftwo | |
\protected\long\def\blx@imc@ifentryseen##1##2##3{##3}% | |
\let\blx@citetracker\relax} | |
\def\blx@opt@citetracker@context{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@context | |
\let\blx@imc@ifentryseen\blx@ifentryseen@context | |
\let\blx@citetracker\blx@citetracker@context | |
\booltrue{citetracker}} | |
\def\blx@opt@citetracker@strict{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@global | |
\let\blx@imc@ifentryseen\blx@ifentryseen@global | |
\def\blx@citetracker{% | |
\blx@ifcitesingle{\blx@citetracker@global}{}}% | |
\booltrue{citetracker}} | |
\def\blx@opt@citetracker@constrict{% | |
\let\blx@imc@ifciteseen\blx@ifciteseen@context | |
\let\blx@imc@ifentryseen\blx@ifentryseen@context | |
\def\blx@citetracker{% | |
\blx@ifcitesingle{\blx@citetracker@context}{}}% | |
\booltrue{citetracker}} | |
\DeclareBiblatexOption{global,type,entry}[string]{ibidtracker}[true]{% | |
\ifcsdef{blx@opt@ibidtracker@#1} | |
{\csuse{blx@opt@ibidtracker@#1}} | |
{\blx@err@invopt{ibidtracker=#1}{}}} | |
\def\blx@opt@ibidtracker@true{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@global | |
\let\blx@ibidtracker\blx@ibidtracker@global | |
\let\blx@ibidreset\blx@ibidreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@ibidtracker@false{% | |
\let\blx@imc@ifciteibid\@secondoftwo | |
\let\blx@ibidtracker\relax | |
\let\blx@ibidreset\relax} | |
\def\blx@opt@ibidtracker@context{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@context | |
\let\blx@ibidtracker\blx@ibidtracker@context | |
\let\blx@ibidreset\blx@ibidreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@ibidtracker@strict{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@strict | |
\let\blx@ibidtracker\blx@ibidtracker@strict | |
\let\blx@ibidreset\blx@ibidreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@ibidtracker@constrict{% | |
\let\blx@imc@ifciteibid\blx@ifciteibid@constrict | |
\let\blx@ibidtracker\blx@ibidtracker@constrict | |
\let\blx@ibidreset\blx@ibidreset@context | |
\booltrue{citetracker}} | |
\DeclareBiblatexOption{global,type,entry}[string]{idemtracker}[true]{% | |
\ifcsdef{blx@opt@idemtracker@#1} | |
{\csuse{blx@opt@idemtracker@#1}} | |
{\blx@err@invopt{idemtracker=#1}{}}} | |
\def\blx@opt@idemtracker@true{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@global | |
\let\blx@idemtracker\blx@idemtracker@global | |
\let\blx@idemreset\blx@idemreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@idemtracker@false{% | |
\let\blx@imc@ifciteidem\@secondoftwo | |
\let\blx@idemtracker\relax | |
\let\blx@idemreset\relax} | |
\def\blx@opt@idemtracker@context{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@context | |
\let\blx@idemtracker\blx@idemtracker@context | |
\let\blx@idemreset\blx@idemreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@idemtracker@strict{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@strict | |
\let\blx@idemtracker\blx@idemtracker@strict | |
\let\blx@idemreset\blx@idemreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@idemtracker@constrict{% | |
\let\blx@imc@ifciteidem\blx@ifciteidem@constrict | |
\let\blx@idemtracker\blx@idemtracker@constrict | |
\let\blx@idemreset\blx@idemreset@context | |
\booltrue{citetracker}} | |
\DeclareBiblatexOption{global,type,entry}[string]{opcittracker}[true]{% | |
\ifcsdef{blx@opt@opcittracker@#1} | |
{\csuse{blx@opt@opcittracker@#1}} | |
{\blx@err@invopt{opcittracker=#1}{}}} | |
\def\blx@opt@opcittracker@true{% | |
\let\blx@imc@ifopcit\blx@ifopcit@global | |
\let\blx@opcittracker\blx@opcittracker@global | |
\let\blx@opcitreset\blx@opcitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@opcittracker@false{% | |
\let\blx@imc@ifopcit\@secondoftwo | |
\let\blx@opcittracker\relax | |
\let\blx@opcitreset\relax} | |
\def\blx@opt@opcittracker@context{% | |
\let\blx@imc@ifopcit\blx@ifopcit@context | |
\let\blx@opcittracker\blx@opcittracker@context | |
\let\blx@opcitreset\blx@opcitreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@opcittracker@strict{% | |
\let\blx@imc@ifopcit\blx@ifopcit@strict | |
\let\blx@opcittracker\blx@opcittracker@strict | |
\let\blx@opcitreset\blx@opcitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@opcittracker@constrict{% | |
\let\blx@imc@ifopcit\blx@ifopcit@constrict | |
\let\blx@opcittracker\blx@opcittracker@constrict | |
\let\blx@opcitreset\blx@opcitreset@context | |
\booltrue{citetracker}} | |
\DeclareBiblatexOption{global,type,entry}[string]{loccittracker}[true]{% | |
\ifcsdef{blx@opt@loccittracker@#1} | |
{\csuse{blx@opt@loccittracker@#1}} | |
{\blx@err@invopt{loccittracker=#1}{}}} | |
\def\blx@opt@loccittracker@true{% | |
\let\blx@imc@ifloccit\blx@ifloccit@global | |
\let\blx@loccittracker\blx@loccittracker@global | |
\let\blx@loccitreset\blx@loccitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@loccittracker@false{% | |
\let\blx@imc@ifloccit\@secondoftwo | |
\let\blx@loccittracker\relax | |
\let\blx@loccitreset\relax} | |
\def\blx@opt@loccittracker@context{% | |
\let\blx@imc@ifloccit\blx@ifloccit@context | |
\let\blx@loccittracker\blx@loccittracker@context | |
\let\blx@loccitreset\blx@loccitreset@context | |
\booltrue{citetracker}} | |
\def\blx@opt@loccittracker@strict{% | |
\let\blx@imc@ifloccit\blx@ifloccit@strict | |
\let\blx@loccittracker\blx@loccittracker@strict | |
\let\blx@loccitreset\blx@loccitreset@global | |
\booltrue{citetracker}} | |
\def\blx@opt@loccittracker@constrict{% | |
\let\blx@imc@ifloccit\blx@ifloccit@constrict | |
\let\blx@loccittracker\blx@loccittracker@constrict | |
\let\blx@loccitreset\blx@loccitreset@context | |
\booltrue{citetracker}} | |
\newtoggle{blx@trackfloats} | |
\DeclareBibliographyOption[boolean]{trackfloats}[true]{% | |
\settoggle{blx@trackfloats}{#1}} | |
\DeclareBibliographyOption[boolean]{parentracker}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\bibopenparen\blx@bibopenparen | |
\let\bibcloseparen\blx@bibcloseparen | |
\let\bibopenbracket\blx@bibopenbracket | |
\let\bibclosebracket\blx@bibclosebracket} | |
{\protected\def\bibopenparen{\bibleftparen}% | |
\protected\def\bibcloseparen{\bibrightparen}% | |
\protected\def\bibopenbracket{\bibleftbracket}% | |
\protected\def\bibclosebracket{\bibrightbracket}}} | |
\DeclareBibliographyOption[integer]{maxparens}{% | |
\ifnumless{#1}{1} | |
{\blx@err@invopt{maxparens=#1}{}} | |
{\setcounter{maxparens}{#1}}} | |
\newtoggle{blx@labeldateusetime} | |
\DeclareBibliographyOption[boolean]{labeldateusetime}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@labeldateusetime}} | |
{\togglefalse{blx@labeldateusetime}}} | |
\DeclareBibliographyOption[string]{labeldate}{% | |
% 'true' or 'false' means that the user thinks that this is the old 'labeldate' | |
% option which is now 'labeldateparts' (which is a boolean). | |
\ifboolexpr{% | |
test {\ifstrequal{#1}{true}} | |
or | |
test {\ifstrequal{#1}{false}}} | |
{\blx@warning@noline{% | |
'labeldate' option used to determine whether to provide label date fields and\MessageBreak | |
extradate field is renamed to 'labeldateparts', setting this instead. This option is | |
now used to set the format of the labeldate}% | |
\settoggle{blx@labeldateparts}{#1}} | |
{\ifstrequal{#1}{iso8601} | |
{\blx@warning@noline{% | |
'iso8601' date format specifier is deprecated.\MessageBreak | |
Use 'iso' instead}% | |
\def\blx@dateformat@labeldate{iso}% | |
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{\ifstrequal{#1}{edtf} | |
{\blx@warning@noline{% | |
'edtf' date format specifier is deprecated.\MessageBreak | |
Use 'iso' instead}% | |
\def\blx@dateformat@labeldate{iso}% | |
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{\def\blx@dateformat@labeldate{#1}}}% | |
\ifstrequal{#1}{ymd} | |
{\renewrobustcmd*{\bibdaterangesep}{\slash}% | |
\renewrobustcmd*{\bibtimerangesep}{\slash}% | |
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{}% | |
\ifstrequal{#1}{iso}% bibdaterangesep hard-coded to slash, no extra space before prefices | |
{\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{}% | |
\ifcsdef{mkdaterange#1} | |
{\protected\def\blx@imc@printlabeldate{\csuse{mkdaterange#1}{label}} | |
\protected\def\blx@imc@printlabeldateextra{\csuse{mkdaterange#1extra}{label}}} | |
{\ifcsdef{mkbibrange#1}%LEGACY(<3.5) | |
{\protected\def\blx@imc@printlabeldate{\csuse{mkbibrange#1}{label}} | |
\protected\def\blx@imc@printlabeldateextra{\csuse{mkbibrange#1extra}{label}}} | |
{\blx@err@invopt{labeldate=#1}{}}}}} | |
\DeclareBibliographyOption[string]{labeltime}{% | |
\ifcsdef{mktimerange#1} | |
{\def\blx@timeformat@labeltime{#1}% | |
\protected\def\blx@imc@printlabeltime{\csuse{mktimerange#1}{label}}} | |
{\blx@err@invopt{labeltime=#1}{}}} | |
% Date meta-information | |
\DeclareBibliographyOption[string]{dateera}{% | |
\ifboolexpr{% | |
test {\ifstrequal{#1}{astronomical}} | |
or | |
test {\ifstrequal{#1}{secular}} | |
or | |
test {\ifstrequal{#1}{christian}}} | |
{\def\blx@dateera{#1}% | |
\ifstrequal{#1}{secular} | |
{\def\blx@dateera@bce{beforecommonera}% | |
\def\blx@dateera@ce{commonera}} | |
{}% | |
\ifstrequal{#1}{christian} | |
{\def\blx@dateera@bce{beforechrist}% | |
\def\blx@dateera@ce{annodomini}} | |
{}} | |
{\blx@err@invopt{dateera=#1}{}}} | |
% Effectively turns off dateeraauto since it's only used on ce dates which | |
% are never less than zero (as that would be a bce date) | |
\numdef\blx@dateeraauto{0} | |
\DeclareBibliographyOption[integer]{dateeraauto}{% | |
\numdef\blx@dateeraauto{#1}} | |
\newtoggle{blx@datecirca} | |
\DeclareBibliographyOption[boolean]{datecirca}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@datecirca}% | |
\protected\def\datecircaprint{% | |
\ifdatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}% | |
\protected\def\enddatecircaprint{% | |
\ifenddatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}% | |
\protected\def\datecircaprintedtf{%LEGACY(<3.9) | |
\blx@warning@noline{% | |
'\string\datecircaprintedtf' is deprecated. | |
Please use '\string\datecircaprintiso'}% | |
\datecircaprintiso}% | |
\protected\def\enddatecircaprintedtf{%LEGACY(<3.9) | |
\blx@warning@noline{% | |
'\string\enddatecircaprintedtf' is deprecated. | |
Please use '\string\enddatecircaprintiso'}% | |
\enddatecircaprintiso}% | |
\protected\def\datecircaprintiso{% | |
\ifdatecirca{\textasciitilde}{}}% | |
\protected\def\enddatecircaprintiso{% | |
\ifenddatecirca{\textasciitilde}{}}} | |
{\togglefalse{blx@datecirca}}} | |
\newtoggle{blx@dateuncertain} | |
\DeclareBibliographyOption[boolean]{dateuncertain}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@dateuncertain}% | |
\protected\def\dateuncertainprint{% | |
\ifdateuncertain{\bibdateuncertain}{}}% | |
\protected\def\enddateuncertainprint{% | |
\ifenddateuncertain{\bibdateuncertain}{}}} | |
{\togglefalse{blx@dateuncertain}}} | |
% *time format options - auto-created for all datamodel date fields | |
% *date format options - auto-created for all datamodel date fields | |
% *dateusetime options - auto-created for all datamodel date fields | |
% Date metadata toggles are defined in one of the \abx@dobooleans calls | |
\def\do#1{% | |
\DeclareBibliographyOption[string]{#1date}{% | |
\ifstrequal{##1}{iso8601} | |
{\blx@warning@noline{'iso8601' date format specifier is deprecated.\MessageBreak | |
Use 'iso' instead}% | |
\csdef{blx@dateformat@#1date}{iso}} | |
{\ifstrequal{##1}{edtf} | |
{\blx@warning@noline{'edtf' date format specifier is deprecated.\MessageBreak | |
Use 'iso' instead}% | |
\csdef{blx@dateformat@#1date}{iso}} | |
{\csdef{blx@dateformat@#1date}{##1}}}% | |
\ifstrequal{##1}{ymd} | |
{\renewrobustcmd*{\bibdaterangesep}{\slash}% | |
\renewrobustcmd*{\bibtimerangesep}{\slash}% | |
\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}} | |
{}% | |
\ifcsdef{mkdaterange##1} | |
{\protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkdaterange##1}{#1}}% | |
\protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkdaterange##1extra}{#1}}} | |
{\ifcsdef{mkbibrange##1}%LEGACY(<3.5) | |
{\blx@warning@noline{% | |
'\string\mkbibrange##1(extra)' date range macro in style is deprecated,\MessageBreak | |
please define '\string\mkdaterange##1(extra)' instead}% | |
\protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkbibrange##1}{#1}}% | |
\protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkbibrange##1extra}{#1}}} | |
{\blx@err@invopt{#1date=##1}{}}}}% | |
% Default for new date fields is "comp" but this is overridden below by | |
% biblatex defaults | |
\blx@kv@setkeys{blx@opt@pre}{#1date=comp}% | |
% Time format options | |
\DeclareBibliographyOption[string]{#1time}{% | |
\csdef{blx@timeformat@#1time}{##1}% | |
\ifcsdef{mktimerange##1} | |
{\protected\csedef{blx@imc@print#1time}{\csuse{mktimerange##1}{#1}}} | |
{\blx@err@invopt{#1time=##1}{}}}% | |
% Default for new time fields is "24h" | |
\blx@kv@setkeys{blx@opt@pre}{#1time=24h}% | |
% Boolean to determine if times are printed with dates | |
\newtoggle{blx@#1dateusetime}% | |
\DeclareBibliographyOption[boolean]{#1dateusetime}{% | |
\ifstrequal{##1}{true} | |
{\toggletrue{blx@#1dateusetime}} | |
{\togglefalse{blx@#1dateusetime}}}} | |
\abx@dodatetypes | |
\DeclareBibliographyOption[string]{alldatesusetime}{% | |
\def\do##1{\ExecuteBibliographyOptions{##1usetime=#1}}% | |
\abx@dodates | |
\do{labeldate}} | |
\DeclareBibliographyOption[string]{alldates}{% | |
\def\do##1{\ExecuteBibliographyOptions{##1=#1}}% | |
\abx@dodates | |
\do{labeldate}} | |
\DeclareBibliographyOption[string]{alltimes}{% | |
\def\do##1{% | |
\ExecuteBibliographyOptions{##1time=#1}}% | |
\abx@dodatetypes | |
\do{label}} | |
\newtoggle{blx@julian} | |
\def\blx@gregorianstart{1582-10-15} | |
\DeclareBibliographyOption[boolean]{julian}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@julian}} | |
{\togglefalse{blx@julian}}} | |
\DeclareBibliographyOption[string]{gregorianstart}{% | |
\def\blx@gregorianstart{#1}} | |
\newtoggle{blx@datezeros}\toggletrue{blx@datezeros} | |
\DeclareBibliographyOption[boolean]{datezeros}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@datezeros}% | |
\let\blx@imc@mkyearzeros\blx@imc@forcezerosy | |
\let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt | |
\let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt} | |
{\togglefalse{blx@datezeros}% | |
\let\blx@imc@mkyearzeros\blx@imc@stripzeros | |
\let\blx@imc@mkmonthzeros\blx@imc@stripzeros | |
\let\blx@imc@mkdayzeros\blx@imc@stripzeros}} | |
\newtoggle{blx@timezeros}\toggletrue{blx@timezeros} | |
\DeclareBibliographyOption[boolean]{timezeros}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@timezeros}% | |
\let\blx@imc@mktimezeros\blx@imc@forcezerosmdt} | |
{\togglefalse{blx@timezeros}% | |
\let\blx@imc@mktimezeros\blx@imc@stripzeros}} | |
\newtoggle{blx@timezones} | |
\DeclareBibliographyOption[boolean]{timezones}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@timezones}} | |
{\togglefalse{blx@timezones}}} | |
\newtoggle{blx@seconds} | |
\DeclareBibliographyOption[boolean]{seconds}[true]{% | |
\ifstrequal{#1}{true} | |
{\toggletrue{blx@seconds}} | |
{\togglefalse{blx@seconds}}} | |
\DeclareBibliographyOption[string]{autocite}{% | |
\ifcsundef{blx@acite@#1} | |
{\blx@error | |
{Autocite command '#1' undefined} | |
{The autocite command '#1' has not been defined by | |
the\MessageBreak selected citation style}} | |
{\letcs\autocite{blx@acite@#1}% | |
\letcs\autocites{blx@macite@#1}}} | |
\DeclareBibliographyOption[string]{notetype}{% | |
\ifcsdef{blx@opt@notetype@#1} | |
{\blx@notetype\csuse{blx@opt@notetype@#1}} | |
{\blx@err@invopt{notetype=#1}{}}} | |
\cslet{blx@opt@notetype@foot+end}\z@ | |
\let\blx@opt@notetype@footonly\@ne | |
\let\blx@opt@notetype@endonly\tw@ | |
\DeclareBibliographyOption[boolean]{autopunct}[true]{% | |
\ifstrequal{#1}{true} | |
{\DeclareAutoPunctuation{.,;:!?}} | |
{\DeclareAutoPunctuation{}}} | |
\DeclareBibliographyOption[boolean]{punctfont}[true]{% | |
\ifstrequal{#1}{true} | |
{\let\blx@ifpuncthook\@firstoftwo} | |
{\let\blx@ifpuncthook\@secondoftwo}} | |
\DeclareBibliographyOption[boolean]{labelnumber}[true]{% | |
\settoggle{blx@labelnumber}{#1}% | |
\iftoggle{blx@labelnumber} | |
{} | |
{\blx@kv@setkeys{blx@opt@pre}{defernumbers=false}}} | |
\DeclareBiblatexOption{type,entry}[boolean]{labelnumber}[true]{% | |
\settoggle{blx@labelnumber}{#1}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{labelalpha}[true]{% | |
\settoggle{blx@labelalpha}{#1}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{labeltitle}[true]{% | |
\settoggle{blx@labeltitle}{#1}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{labeltitleyear}[true]{% | |
\settoggle{blx@labeltitleyear}{#1}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{labeldateparts}[true]{% | |
\settoggle{blx@labeldateparts}{#1}} | |
\DeclareBiblatexOption{global,type}[string]{uniquelist}[true]{% | |
\ifcsdef{blx@opt@uniquelist@#1} | |
{\letcs\blx@uniquelist{blx@opt@uniquelist@#1}} | |
{\blx@err@invopt{uniquelist=#1}{}}} | |
\def\blx@opt@uniquelist@false{false} | |
\def\blx@opt@uniquelist@true{true} | |
\def\blx@opt@uniquelist@minyear{minyear} | |
\blx@DeclareBackendOption{entry,namelist}[string]{uniquelist} | |
\DeclareBiblatexOption{global,type}[boolean]{nohashothers}[true]{% | |
\settoggle{blx@nohashothers}{#1}} | |
\blx@DeclareBackendOption{entry,namelist}[boolean]{nohashothers} | |
\DeclareBiblatexOption{global,type}[boolean]{nosortothers}[true]{% | |
\settoggle{blx@nosortothers}{#1}} | |
\blx@DeclareBackendOption{entry,namelist}[boolean]{nosortothers} | |
\DeclareBiblatexOption{global,type}[string]{uniquename}[true]{% | |
\ifcsdef{blx@opt@uniquename@#1} | |
{\letcs\blx@uniquename{blx@opt@uniquename@#1}} | |
{\blx@err@invopt{uniquename=#1}{}}} | |
\def\blx@opt@uniquename@false{false} | |
\def\blx@opt@uniquename@init{init} | |
\def\blx@opt@uniquename@true{full} | |
\def\blx@opt@uniquename@full{full} | |
\def\blx@opt@uniquename@allinit{allinit} | |
\def\blx@opt@uniquename@allfull{allfull} | |
\def\blx@opt@uniquename@mininit{mininit} | |
\def\blx@opt@uniquename@minfull{minfull} | |
\blx@DeclareBackendOption{entry,namelist,name}[string]{uniquename} | |
\DeclareBiblatexOption{global,type}[boolean]{noroman}[true]{% | |
\settoggle{blx@noroman}{#1}} | |
\blx@DeclareBackendOption{entry}[boolean]{noroman} | |
\DeclareBiblatexOption{global,type}[boolean]{singletitle}[true]{% | |
\settoggle{blx@singletitle}{#1}} | |
\blx@DeclareBackendOption{entry}[boolean]{singletitle} | |
\DeclareBiblatexOption{global,type}[boolean]{uniquetitle}[true]{% | |
\settoggle{blx@uniquetitle}{#1}} | |
\blx@DeclareBackendOption{entry}[boolean]{uniquetitle} | |
\DeclareBiblatexOption{global,type}[boolean]{uniquebaretitle}[true]{% | |
\settoggle{blx@uniquebaretitle}{#1}} | |
\blx@DeclareBackendOption{entry}[boolean]{uniquebaretitle} | |
\DeclareBiblatexOption{global,type}[boolean]{uniquework}[true]{% | |
\settoggle{blx@uniquework}{#1}} | |
\blx@DeclareBackendOption{entry}[boolean]{uniquework} | |
\DeclareBiblatexOption{global,type}[boolean]{uniqueprimaryauthor}[true]{% | |
\settoggle{blx@uniqueprimaryauthor}{#1}} | |
\blx@DeclareBackendOption{entry}[boolean]{uniqueprimaryauthor} | |
\DeclareBibliographyOption[boolean]{defernumbers}[true]{% | |
\settoggle{blx@defernumbers}{#1}% | |
\iftoggle{blx@defernumbers} | |
{\blx@kv@setkeys{blx@opt@pre}{labelnumber}% | |
\let\blx@thelabelnumber\blx@addlabelnumber | |
\let\abx@aux@number\blx@aux@number} | |
{\let\blx@thelabelnumber\relax | |
\let\abx@aux@number\@gobblefive}} | |
\DeclareBibliographyOption[boolean]{locallabelwidth}[true]{% | |
\blx@key@locallabelwidth{#1}} | |
\DeclareBibliographyOption[string]{refsection}{% | |
\ifcsdef{blx@opt@refsection@#1} | |
{\letcs\blx@refsecreset@level{blx@opt@refsection@#1}} | |
{\blx@err@invopt{refsection=#1}{}}} | |
\csdef{blx@opt@refsection@none}{0} | |
\csdef{blx@opt@refsection@part}{1} | |
\csdef{blx@opt@refsection@chapter}{2} | |
\csdef{blx@opt@refsection@section}{3} | |
\csdef{blx@opt@refsection@subsection}{4} | |
\csdef{blx@opt@refsection@chapter+}{5} | |
\csdef{blx@opt@refsection@section+}{6} | |
\csdef{blx@opt@refsection@subsection+}{7} | |
\blx@patchsection@switch{\blx@refsecreset@level}{\newrefsection}{}{} | |
\DeclareBibliographyOption[string]{refsegment}{% | |
\ifcsdef{blx@opt@refsegment@#1} | |
{\letcs\blx@refsegreset@level{blx@opt@refsegment@#1}} | |
{\blx@err@invopt{refsegment=#1}{}}} | |
\csdef{blx@opt@refsegment@none}{0} | |
\csdef{blx@opt@refsegment@part}{1} | |
\csdef{blx@opt@refsegment@chapter}{2} | |
\csdef{blx@opt@refsegment@section}{3} | |
\csdef{blx@opt@refsegment@subsection}{4} | |
\csdef{blx@opt@refsegment@chapter+}{5} | |
\csdef{blx@opt@refsegment@section+}{6} | |
\csdef{blx@opt@refsegment@subsection+}{7} | |
\blx@patchsection@switch{\blx@refsegreset@level} | |
{\newrefsegment} | |
{\ifnumgreater\blx@refsegreset@level\z@ | |
{\ifnumgreater\blx@refsegreset@level\blx@refsecreset@level | |
{} | |
{\blx@err@confopt | |
{refsegment/refsection} | |
{The 'refsegment' option must point to a | |
lower-level\MessageBreak document division | |
than 'refsection'}% | |
\def\blx@refsegreset@level{0}}} | |
{}} | |
{} | |
\DeclareBibliographyOption[string]{citereset}{% | |
\ifcsdef{blx@opt@citereset@#1} | |
{\letcs\blx@citereset@level{blx@opt@citereset@#1}} | |
{\blx@err@invopt{citereset=#1}{}}} | |
\csdef{blx@opt@citereset@none}{0} | |
\csdef{blx@opt@citereset@part}{1} | |
\csdef{blx@opt@citereset@chapter}{2} | |
\csdef{blx@opt@citereset@section}{3} | |
\csdef{blx@opt@citereset@subsection}{4} | |
\csdef{blx@opt@citereset@chapter+}{5} | |
\csdef{blx@opt@citereset@section+}{6} | |
\csdef{blx@opt@citereset@subsection+}{7} | |
\blx@patchsection@switch{\blx@citereset@level}{\citereset\blx@inf@creset}{}{} | |
\DeclareBibliographyOption[boolean]{bibwarn}[true]{% | |
\ifstrequal{#1}{true} | |
{\def\blx@bbl@thewarn{\blx@bbl@warn}} | |
{\let\blx@bbl@thewarn\@gobble}} | |
% Name field options | |
\def\do#1{% | |
\DeclareBiblatexOption{global,type,entry}[boolean]{use#1}[true]{% | |
\settoggle{blx@use#1}{##1}}} | |
\abx@donames | |
% Entry options | |
\DeclareBiblatexOption{global,type,entry,namelist,name}[boolean]{useprefix}[true]{% | |
\settoggle{blx@useprefix}{#1}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{skipbib}[true]{% | |
\settoggle{blx@skipbib}{#1}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{skipbiblist}[true]{% | |
\settoggle{blx@skipbiblist}{#1}} | |
\DeclareBiblatexOption{global,type,entry}[boolean]{skiplab}[true]{% | |
\settoggle{blx@skiplab}{#1}} | |
\DeclareBiblatexOption{global,type}[boolean]{dataonly}[true]{% | |
\settoggle{blx@skipbib}{#1}% | |
\settoggle{blx@skipbiblist}{#1}% | |
\settoggle{blx@skiplab}{#1}} | |
% the entry option is resolved by Biber | |
\blx@DeclareBackendOption{entry}[boolean]{dataonly} | |
% This is handled in a special way by by biber. It indicates what to set for various options | |
% if the dataonly option is "true". If biber finds dataonly=false | |
% in an entry, the booleans here will be reversed (skip*) and the unique* options (which are not | |
% booleans) will be ignored, defaulting to higher scope values. biber assumes | |
% that \blx@bcf@backendin@entry@* options are boolean options as otherwise, negating them | |
% per-entry makes little sense and it is not clear what to do with such lower-scope overrides. | |
\gdef\blx@bcf@backendin@entry@dataonly{uniquename=false,uniquelist=false,% | |
skipbib=true,skipbiblist=true,skiplab=true} | |
% Option processor/scheduler | |
\DeclareOption*{% | |
\begingroup | |
\def\blx@tempa#1=#2&{#1}% | |
\edef\blx@tempa{% | |
\expandafter\blx@tempa\CurrentOption=&}% | |
\blx@kv@ifkeyundef{blx@opt@ldt}{\blx@tempa} | |
{\endgroup | |
\eappto\blx@theoptions{\CurrentOption,}} | |
{\edef\blx@tempa{\endgroup | |
\noexpand\blx@kv@setkeys{blx@opt@ldt}{\CurrentOption}}% | |
\blx@tempa}} | |
\def\blx@processoptions{% | |
\ifundef\blx@theoptions | |
{} | |
{\begingroup | |
\edef\blx@tempa{\endgroup | |
\noexpand\blx@kv@setkeys{blx@opt@pre}{\blx@theoptions}}% | |
\blx@tempa}} | |
%% Initial setup | |
\define@key{blx@opt@ldt}{casechanger}[auto]{% | |
\ifcsundef{blx@opt@casechanger@#1} | |
{\blx@err@invopt | |
{casechanger=#1} | |
{Valid options for 'casechanger' are 'auto', 'expl3' and | |
'latex2e'}} | |
{\csletcs{blx@deferoption@casechanger}{blx@opt@casechanger@#1}}} | |
\csdef{blx@opt@casechanger@auto}{% | |
\RequirePackage{expl3}[2020/04/06]% | |
\@ifpackagelater{expl3}{2020/04/06} | |
{\blx@info{expl3\MessageBreak\csuse{ver@expl3.sty}\MessageBreak | |
is new enough (at least 2020/04/06),\MessageBreak | |
setting 'casechanger=expl3'}% | |
\csuse{blx@opt@casechanger@expl3}} | |
{\blx@info{expl3\MessageBreak\csuse{ver@expl3.sty}\MessageBreak | |
is too old (older than 2020/04/06),\MessageBreak | |
setting 'casechanger=latex2e'}% | |
\csuse{blx@opt@casechanger@latex2e}}} | |
\csdef{blx@opt@casechanger@latex2e}{% | |
\blx@inputonce{blx-case-latex2e.def} | |
{LaTeX2e (legacy) case changing code} | |
{}{}{}{}} | |
\csletcs{blx@opt@casechanger@2e}{blx@opt@casechanger@latex2e} | |
% Apparently neither \input nor \blx@inputonce ever pops the | |
% \ExplSyntaxOff from \ProvidesExplFile, so we do that ourselves. | |
\csdef{blx@opt@casechanger@expl3}{% | |
\blx@inputonce{blx-case-expl3.def} | |
{expl3 case changing code} | |
{}{\ExplSyntaxOff}{}{}} | |
\csletcs{blx@opt@casechanger@3}{blx@opt@casechanger@expl3} | |
% default to auto | |
\csletcs{blx@deferoption@casechanger}{blx@opt@casechanger@auto} | |
% Set defaults | |
\blx@kv@setkeys{blx@opt@ldt}{style=numeric} | |
\blx@kv@setkeys{blx@opt@pre}{% | |
sorting=nty,sortlocale=auto,sortcase,sortupper,sortcites=false, | |
maxnames=3,minnames=1,maxalphanames=3,minalphanames=1, | |
maxitems=3,minitems=1,mincrossrefs=2,minxrefs=2, | |
useauthor=true,useeditor=true,usetranslator=false, | |
indexing=false,abbreviate=true,dateabbrev=true,dateera=astronomical, | |
backref=false,backrefsetstyle=setonly,backreffloats=true, | |
pagetracker=false, | |
ibidtracker=false,idemtracker=false,opcittracker=false,loccittracker=false, | |
citetracker=false,trackfloats=false, | |
citecounter=false, | |
block=none, | |
language=autobib,clearlang=true,autolang=none,langhook=captions, | |
date=comp,labeldate=year,origdate=comp,eventdate=comp,urldate=short, | |
autopunct=true,punctfont=false,defernumbers=false,timezeros=true, | |
refsection=none,refsegment=none,citereset=none,hyperref=auto, | |
parentracker,maxparens=3,bibencoding=auto,bibwarn,timezones=false, | |
seconds=false,julian=false,labeltime=24h,locallabelwidth=false} | |
% Load Unicode enhancements (only for LuaTeX and XeTeX) | |
\ifboolexpr{ | |
not test {\ifundef\XeTeXrevision} | |
or | |
not test {\ifundef\luatexversion}} | |
{\blx@inputonce{blx-unicode.def}{enhanced support for Unicode engines}{}{}{}{}} | |
{} | |
% Load compatibility code | |
\blx@inputonce{blx-compat.def}{compatibility code}{}{}{}{} | |
% Restore catcodes | |
\blx@catcodes | |
\undef\blx@catcodes | |
% Process load-time options | |
\ProcessOptions* | |
% this ultimately loads either | |
% blx-case-expl3.def or blx-case-latex2e.def | |
\blx@deferoption@casechanger | |
% This is a bit unfortunate, but we need some more definitions here. | |
% Language fallback, in order: | |
% * explicit option language=<lang>, which overrides everything | |
% * langid field of entry | |
% * babel/polyglossia lang | |
% * main document lang (we should never reach this) | |
% * <empty> (we should *definitely* never reach this) | |
% Everything here is expandable so that | |
% \blx@mksc@lang expands to the language name. | |
\def\blx@mksc@lang{% | |
\ifundef\blx@forcelanguagename | |
{\ifundef\abx@field@langid | |
{\ifundef\blx@languagename | |
{\ifundef\blx@main@language | |
{} | |
{\blx@main@language}} | |
{\blx@languagename}} | |
{\abx@field@langid}} | |
{\blx@forcelanguagename}} | |
\DeclareCaseLangs{% | |
american,british,canadian, | |
english,USenglish,UKenglish, | |
australian,newzealand} | |
% Textcase defines \NoCaseChange as \let\NoCaseChange\@firstofone | |
\ifundef\NoCaseChange | |
{\let\NoCaseChange\@firstofone} | |
{} | |
% That's it for the case change code | |
% Switch to BibTeX support if requested | |
\iftoggle{blx@bibtex} | |
{\blx@inputonce{blx-bibtex.def}{BibTeX backend compatibility}{}{}{}{}} | |
{} | |
% Load citation and bibliography styles, configuration file | |
\blx@inputonce{biblatex.def}{generic definitions}{}{}{}{} | |
\iftoggle{blx@natbib} | |
{\blx@inputonce{blx-natbib.def}{natbib compatibility}{}{}{}{}} | |
{} | |
\iftoggle{blx@mcite} | |
{\blx@inputonce{blx-mcite.def}{mcite-like commands}{}{}{}{}} | |
{} | |
\RequireBibliographyStyle{\blx@bbxfile} | |
\RequireCitationStyle{\blx@cbxfile} | |
\blx@secinit | |
\citereset | |
\blx@inputonce{biblatex.cfg}{configuration file}{}{}{}{} | |
% Process preamble options | |
\blx@processoptions | |
% Deferred setup at end of preamble | |
\AtEndPreamble{% | |
\blx@checkoptions@global | |
\c@maxnames\blx@maxcitenames\relax | |
\c@minnames\blx@mincitenames\relax | |
\c@maxitems\blx@maxitems\relax | |
\c@minitems\blx@minitems\relax | |
\togglefalse{abx@bool@xinits} | |
\def\do#1{\iftoggle{abx@bool@#1inits}{\toggletrue{abx@bool@xinits}}{}} | |
\abx@donameparts | |
\iftoggle{abx@bool@xinits} | |
{\ifdefstrequal\blx@uniquename\blx@opt@uniquename@full | |
{\blx@warn@conflopt{% | |
'<namepart>inits' conflicts with 'uniquename=full'.\MessageBreak | |
Setting 'uniquename=init'}% | |
\blx@kv@setkeys{blx@opt@pre}{uniquename=init}} | |
{}% | |
\ifdefstrequal\blx@uniquename\blx@opt@uniquename@allfull | |
{\blx@warn@conflopt{% | |
'<namepart>inits' conflicts with 'uniquename=allfull'.\MessageBreak | |
Setting 'uniquename=allinit}% | |
\blx@kv@setkeys{blx@opt@pre}{uniquename=allinit}} | |
{}% | |
\ifdefstrequal\blx@uniquename\blx@opt@uniquename@minfull | |
{\blx@warn@conflopt{% | |
'<namepart>inits' conflicts with 'uniquename=minfull'.\MessageBreak | |
Setting 'uniquename=mininit}% | |
\blx@kv@setkeys{blx@opt@pre}{uniquename=mininit}} | |
{}} | |
{}% | |
\nottoggle{blx@labeldateparts} | |
{\ifdefstrequal\blx@uniquelist\blx@opt@uniquelist@minyear | |
{\blx@warn@conflopt{% | |
'uniquelist=minyear' requires 'labeldateparts'.\MessageBreak | |
Setting 'uniquelist=true'}% | |
\blx@kv@setkeys{blx@opt@pre}{uniquelist}} | |
{}} | |
{}% | |
\def\do#1{% | |
\ifcsstring{blx@dateformat@#1}{iso} | |
{\blx@stripfromendinto{#1}{date}\blx@datetype | |
\ifdefstring\blx@dateera{astronomical}{} | |
{\blx@warn@conflopt{% | |
'#1=iso' requires 'dateera=astronomical'.\MessageBreak | |
Setting 'dateera=astronomical'}% | |
\blx@kv@setkeys{blx@opt@pre}{dateera=astronomical}}% | |
\ifcsstring{blx@timeformat@\blx@datetype time}{24h}% | |
{} | |
{\blx@warn@conflopt{% | |
'#1=iso' requires '\blx@datetype time=24h'.\MessageBreak | |
Setting '\blx@datetype time=24h'}% | |
\blx@kv@setkeys{blx@opt@pre}{\blx@datetype time=24h}}% | |
\iftoggle{blx@julian} | |
{\blx@warn@conflopt{% | |
'#1=iso' requires 'julian=false'.\MessageBreak | |
Setting 'julian=false'}% | |
\blx@kv@setkeys{blx@opt@pre}{julian=false}} | |
{}% | |
\nottoggle{blx@datezeros} | |
{\blx@warn@conflopt{% | |
'#1=iso' requires 'datezeros=true'.\MessageBreak | |
Setting 'datezeros=true'}% | |
\blx@kv@setkeys{blx@opt@pre}{datezeros=true}} | |
{}% | |
\nottoggle{blx@timezeros} | |
{\blx@warn@conflopt{% | |
'#1=iso' requires 'timezeros=true'.\MessageBreak | |
Setting 'timezeros=true'}% | |
\blx@kv@setkeys{blx@opt@pre}{timezeros=true}} | |
{}% | |
\nottoggle{blx@seconds} | |
{\blx@warn@conflopt{% | |
'#1=iso' requires 'seconds=true'.\MessageBreak | |
Setting 'seconds=true'}% | |
\blx@kv@setkeys{blx@opt@pre}{seconds=true}} | |
{}} | |
{}}% | |
\abx@dodates | |
\do{labeldate}} | |
\def\blx@checkencoding{% | |
\ifdef\blx@texencoding | |
{\blx@info@noline{% | |
Input encoding '\blx@texencoding' specified}} | |
{\ifundef\inputencodingname | |
{\ifundef\XeTeXrevision | |
{\ifundef\luatexversion | |
{\def\blx@texencoding{ascii}% | |
\blx@info@noline{% | |
No input encoding detected.\MessageBreak | |
Assuming '\blx@texencoding'}} | |
{\def\blx@texencoding{utf8}% | |
\blx@info@noline{% | |
LuaTeX detected.\MessageBreak | |
Assuming input encoding '\blx@texencoding'}}} | |
{\def\blx@texencoding{utf8}% | |
\blx@info@noline{% | |
XeTeX detected.\MessageBreak | |
Assuming input encoding '\blx@texencoding'}}} | |
{\ifcsdef{blx@inpenc@\inputencodingname} | |
{\letcs\blx@texencoding{blx@inpenc@\inputencodingname}} | |
{\let\blx@texencoding\inputencodingname}% | |
\blx@info@noline{% | |
Input encoding '\blx@texencoding' detected}}}% | |
\ifdef\blx@bibencoding | |
{\ifdefstring\blx@bibencoding{ascii} | |
{\blx@info@noline{% | |
Data encoding '\blx@bibencoding' specified.\MessageBreak | |
No need to reencode data}} | |
{\ifdefstring\blx@bibencoding{auto} | |
{\let\blx@bibencoding\blx@texencoding | |
\blx@info@noline{% | |
Automatic encoding selection.\MessageBreak | |
Assuming data encoding '\blx@bibencoding'}} | |
{\ifdefstrequal\blx@bibencoding\blx@texencoding | |
{\blx@info@noline{% | |
Data encoding '\blx@bibencoding' specified.\MessageBreak | |
No need to reencode data}} | |
{\blx@info@noline{% | |
Data encoding '\blx@bibencoding' specified.\MessageBreak | |
Backend will reencode on the fly}}}}} | |
{\def\blx@bibencoding{ascii}% | |
\blx@info@noline{% | |
Data encoding not specified.\MessageBreak | |
Assuming '\blx@bibencoding'}}% | |
\ifboolexpr{% | |
togl {blx@safeinputenc} | |
and ( test {\@ifpackageloaded{inputenc}} | |
or | |
test {\@ifpackageloaded{inputenx}} ) | |
} | |
{\def\blx@texencoding{ascii}% | |
\blx@info@noline{% | |
Input encoding '\blx@texencoding' forced by\MessageBreak | |
'safeinputenc' option}} | |
{}% | |
} | |
% Deferred last minute setup | |
\AtBeginDocument{% | |
\blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}} | |
\blx@checkencoding | |
\if@filesw | |
\blx@ctrlwrite | |
\fi | |
\blx@bblinput | |
\blx@maxsection\z@ | |
\csuse{abx@preamble}% | |
\blx@inf@refsec | |
\blx@inf@refseg} | |
\AtEndOfPackage{% | |
% Data model macros are forbidden after package load is finished | |
\def\blx@warn@dm#1{\blx@warning@noline{Data model macro '#1' cannot be used in preamble}} | |
\def\ResetDatamodelEntrytypes{\blx@warn@dm{ResetDatamodelEntrytypes}} | |
\def\ResetDatamodelFields{\blx@warn@dm{ResetDatamodelFields}} | |
\def\ResetDatamodelEntryfields{\blx@warn@dm{ResetDatamodelEntryfields}} | |
\def\ResetDatamodelConstraints{\blx@warn@dm{ResetDatamodelConstraints}} | |
\renewcommand*{\DeclareDatamodelMultiscriptEntryfields}[1]{\blx@warn@dm{DeclareDatamodelMultiscriptEntryfields}} | |
\renewcommand*{\DeclareDatamodelEntrytypes}[2][]{\blx@warn@dm{DeclareDatamodelEntrytypes}} | |
\renewcommand*{\DeclareDatamodelFields}[2][]{\blx@warn@dm{DeclareDatamodelFields}} | |
\renewcommand*{\DeclareDatamodelEntryfields}[2][]{\blx@warn@dm{DeclareDatamodelEntryfields}} | |
\renewcommand*{\DeclareDatamodelConstraints}[2][]{\blx@warn@dm{DeclareDatamodelConstraints}} | |
\renewcommand*{\DeclareDatamodelConstant}[3][]{\blx@warn@dm{DeclareDatamodelConstant}} | |
\AtBeginDocument{% | |
\let\do\undef | |
\blx@dopreamblecmds | |
\let\do\noexpand}} | |
\def\BiblatexHungarianWarningOff{\global\let\lbx@hu@loadinfo\@empty} | |
\def\BiblatexLatvianWarningOff{\global\let\lbx@lv@loadinfo\@empty} | |
\def\BiblatexSplitbibDefernumbersWarningOff{% | |
\global\let\blx@printbibchecks@suppresswarn\@empty} | |
\endinput |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment