summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/biblatex-ms/latex/blx-bibtex-ms.def
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/biblatex-ms/latex/blx-bibtex-ms.def')
-rw-r--r--macros/latex/contrib/biblatex-ms/latex/blx-bibtex-ms.def835
1 files changed, 835 insertions, 0 deletions
diff --git a/macros/latex/contrib/biblatex-ms/latex/blx-bibtex-ms.def b/macros/latex/contrib/biblatex-ms/latex/blx-bibtex-ms.def
new file mode 100644
index 0000000000..1b8509a580
--- /dev/null
+++ b/macros/latex/contrib/biblatex-ms/latex/blx-bibtex-ms.def
@@ -0,0 +1,835 @@
+\ProvidesFile{blx-bibtex-ms.def}
+[\abx@cptid]
+
+\blx@warning@noline{%
+ Using fall-back bibtex backend:\MessageBreak
+ functionality may be reduced/unavailable%
+}
+
+% Initialisation of backend-related switches, variables, etc.
+\newtoggle{blx@runbtx}
+
+% No interface provided for this but can be set 'in emergency' by user
+\def\blx@maxline{79}
+
+% Rename write stream so use is clear
+\let\blx@write\blx@bcfout
+
+% Data file initialisation
+\edef\blx@auxfile{\jobname}
+\let\blx@aux\@mainaux
+\newcommand*{\blxauxsuffix}{-blx}
+
+\begingroup
+\def\blx@tempa#1"#2{%
+ #1\ifx#2\@empty\else
+ \expandafter\blx@tempa
+ \fi#2}
+\edef\blx@ctrlfile{%
+ \noexpand\blx@tempa
+ \expandafter\blx@tempa\jobname"\@empty
+ \space\noexpand\@empty}
+\def\blx@tempa#1 #2{%
+ #1\ifx#2\@empty\else
+ \string_\expandafter\blx@tempa
+ \fi#2}
+\xdef\blx@ctrlfile{\blx@ctrlfile}
+\endgroup
+
+\def\blx@auxinit#1{%
+ \blx@auxwrite\blx@aux
+ {\def\do##1{,\blx@stripbib{##1}}}
+ {\ifx\blx@aux\@mainaux
+ \else
+ \blx@msg@aux
+ \fi
+ \string\bibstyle{biblatex\abx@filespf}\blx@nl
+ \string\bibdata{%
+ \blx@ctrlfile\blxauxsuffix
+ \ifx#1\@empty
+ \else
+ \dolistloop#1%
+ \fi}\blx@nl
+ \string\citation{biblatex-control}}}
+
+\def\blx@sig@bib{@Comment{$ biblatex control file $}}
+\edef\blx@ver@bib{%
+ @Comment{$ biblatex bcf format version \blx@bcfversion\space $}}
+
+\let\blx@sig@aux\blx@sig@bbl
+\let\blx@ver@aux\blx@ver@bbl
+
+\edef\blx@msg@text{%
+ \@percentchar\space Do not modify this file!\blx@nl
+ \@percentchar\blx@nl
+ \@percentchar\space This is an auxiliary file
+ used by the 'biblatex' package.\blx@nl
+ \@percentchar\space This file may safely be deleted.
+ It will be recreated as\blx@nl
+ \@percentchar\space required.\blx@nl}
+
+\edef\blx@msg@aux{%
+ \blx@sig@aux\blx@nl
+ \blx@ver@aux\blx@nl
+ \blx@msg@text
+ \@percentchar\blx@nl\string\relax\blx@nl}
+\edef\blx@msg@bib{%
+ \blx@sig@bib\blx@nl
+ \blx@ver@bib\blx@nl
+ \blx@msg@text\blx@nl}
+
+% User feedback
+
+\renewrobustcmd*{\RequireBiber}[1][2]{%
+ \ifnumgreater{#1}\blx@reqbiber
+ {\numgdef\blx@reqbiber{#1}}
+ {}%
+ \blx@checkbackend{style}}
+\@onlypreamble\RequireBiber
+\let\blx@reqbiber\z@
+
+\def\blx@checkbackend#1{%
+ \ifnum\blx@reqbiber>2 %
+ \blx@error
+ {Biber backend is required by #1}
+ {The selected style or one of the .bib files
+ requires Biber.\MessageBreak It will
+ not work at all with BibTeX.}%
+ \fi}
+
+\def\blx@check@logreq{%
+ \begingroup
+ \ltxrequest{biblatex}{{\iftoggle{blx@runltx}{1}{0}}}{%
+ \provides[type=dynamic]{
+ \def\do##1{\file{##1.aux}}
+ \dolistloop\blx@list@inactive
+ \file{\blx@ctrlfile\blxauxsuffix.bib}
+ }
+ \requires[type=dynamic]{
+ \def\do##1{\file{##1.bbl}}
+ \dolistloop\blx@list@inactive
+ }
+ \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
+ }}
+ {}
+ }%
+ \def\do##1{%
+ \ifinlist{##1}{\blx@list@active}
+ {\blx@logreq@bibtex{1}{##1}}
+ {\blx@logreq@bibtex{0}{##1}}}%
+ \dolistloop\blx@list@inactive
+ \endgroup}
+
+\def\blx@logreq@bibtex#1#2{%
+ \logrequest[package=biblatex,priority=5,active=#1]{%
+ \generic{bibtex}
+ \cmdline{%
+ \iftoggle{blx@bibtex8}
+ {\binary{bibtex8}
+ \option{--wolfgang}
+ \option{--min\string_crossrefs \blx@mincrossrefs}}
+ {\binary{bibtex}
+ \option{-min-crossrefs \blx@mincrossrefs}}%
+ \infile{#2}
+ }
+ \input{
+ \file{#2.aux}
+ }
+ \output{
+ \file{#2.bbl}
+ }
+ \provides[type=dynamic]{
+ \file{#2.bbl}
+ }
+ \requires[type=dynamic]{
+ \file{#2.aux}
+ \file{\blx@ctrlfile\blxauxsuffix.bib}
+ }
+ \requires[type=editable]{
+ \ifcsdef{blx@list@bibfiles@#2}
+ {\def\do{\file}
+ \dolistcsloop{blx@list@bibfiles@#2}}
+ {}
+ }
+ \requires[type=static]{
+ \file{biblatex.bst}}
+ }%
+}
+
+\def\blx@logreq@active#1{%
+ \xifinlist{\blx@auxfile}{\blx@list@active}
+ {}
+ {\listxadd\blx@list@active{\blx@auxfile}}%
+ \ifblank{#1}
+ {}
+ {\@latex@warning{#1}}%
+ \blx@rerun@latex
+ \blx@rerun@bibtex}
+
+\def\blx@logreq@inactive{%
+ \xifinlist{\blx@auxfile}{\blx@list@inactive}
+ {}
+ {\listxadd\blx@list@inactive{\blx@auxfile}}}
+
+\def\blx@rerun@bibtex{%
+ \global\toggletrue{blx@runbtx}%
+ \global\let\blx@rerun@bibtex\relax}
+
+\def\blx@indextitle{%
+ \ifundef\abx@field@@@indextitle
+ {\letcs\abx@field@@@indextitle{abx@field@@@title}}
+ {}}
+
+% Only the toggle name changes here
+\patchcmd{\blx@check@rerun}{blx@runbiber}{blx@runbtx}{}{}
+
+\def\blx@warn@auxlist{%
+ \begingroup
+ \edef\blx@tempa{Please (re)run BibTeX on the file(s):}%
+ \def\do##1{\appto\blx@tempa{\MessageBreak##1}}%
+ \dolistloop\blx@list@active
+ \blx@warning@noline{%
+ \blx@tempa\MessageBreak
+ and rerun LaTeX afterwards}%
+ \endgroup}
+
+\protected\def\blx@bibreq#1{%
+ \blx@auxwrite\blx@aux{}{\string\citation{#1}}}
+
+% bibtex doesn't parse ISO8601 dates so these overrides do nothing
+\appto\blx@blxinit{%
+ \def\iflabeldateera#1{\@secondoftwo}%
+ \def\iflabelenddateera#1{\@secondoftwo}%
+ \let\iflabeldatecirca\@secondoftwo
+ \let\iflabelenddatecirca\@secondoftwo
+ \let\iflabeldateuncertain\@secondoftwo
+ \let\iflabelenddateuncertain\@secondoftwo}
+
+
+% Alter message text
+\patchcmd{\blx@bbl@warn}{Biber}{BibTeX}{}{}
+
+%% Data input
+
+\patchcmd{\blx@bblinput}{\blx@bblfile}{\blx@bblfile\blx@bblsecs}{}{}
+
+
+\def\blx@bblfile{%
+ \blx@secinit
+ \begingroup
+ \blx@bblstart
+ \ifnum\c@refsection>\z@
+ \edef\blx@auxfile{\jobname\the\c@refsection\blxauxsuffix}%
+ \else
+ \edef\blx@auxfile{\jobname}%
+ \fi
+ \blx@ifsigned{\blx@auxfile}{bbl}
+ {\InputIfFileExists{\blx@auxfile.bbl}
+ {\blx@info@noline{... file '\blx@auxfile.bbl' found}%
+ \global\toggletrue{blx@bbldone}%
+ \blx@generate@bbl@mdfivesum@found{\blx@auxfile.bbl}}
+ {\blx@info@noline{... file '\blx@auxfile.bbl' not found}%
+ \typeout{No file \blx@auxfile.bbl.}%
+ \global\togglefalse{blx@bbldone}%
+ \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
+ \csnumgdef{blx@labelnumber@\the\c@refsection}{0}}
+
+\def\blx@bblsecs{%
+ \advance\c@refsection\@ne
+ \ifnum\c@refsection>\c@blx@maxsection
+ \else
+ \blx@bblfile
+ \expandafter\blx@bblsecs
+ \fi}
+
+\def\blx@refsection@ii{%
+ \xdef\blx@auxfile{\jobname\the\c@refsection\blxauxsuffix}%
+ \blx@regbibfiles\blx@auxfile\blx@bibfiles
+ \blx@logreq@inactive
+ \blx@ifsigned{\blx@auxfile}{aux}
+ {\immediate\openout\blx@write\blx@auxfile.aux\relax
+ \global\let\blx@aux\blx@write
+ \blx@auxinit\blx@bibfiles}
+ {}}
+
+\def\blx@endrefsection{%
+ \blx@endrefsegment
+ \ifx\blx@aux\blx@write
+ \immediate\closeout\blx@write
+ \global\let\blx@aux\@mainaux
+ \xdef\blx@auxfile{\jobname}%
+ \fi
+ \global\c@refsection\z@}
+
+
+
+% xref support
+
+% {<entrykey>}
+\protected\def\blx@bbl@xref#1{%
+ \ifcsdef{blx@refp@\the\c@refsection @\detokenize{#1}}
+ {}
+ {\listcsxadd{blx@refs@\the\c@refsection}{\detokenize{#1}}}%
+ \listcsxadd{blx@refp@\the\c@refsection @\detokenize{#1}}{\abx@field@@@entrykey}%
+ \csxdef{blx@refc@\the\c@refsection @\abx@field@@@entrykey}{\detokenize{#1}}}
+
+\def\blx@addxref#1{%
+ \blx@ifdata{#1}
+ {\begingroup
+ \def\do##1{%
+ \csgappto{blx@data@\the\c@refsection @##1}{%
+ \def\abx@field@@@xref{#1}}}%
+ \dolistcsloop{blx@refp@\the\c@refsection @#1}%
+ \endgroup}
+ {}%
+ \global\csundef{blx@refp@\the\c@refsection @#1}}
+
+\def\blx@citation@xref#1{%
+ \begingroup
+ \edef\blx@tempa{blx@refp@\the\c@refsection @%
+ \csname blx@refc@\the\c@refsection @#1\endcsname}%
+ \ifcsdef\blx@tempa
+ {\ifinlistcs{#1}\blx@tempa
+ {}
+ {\listcsxadd\blx@tempa{#1}}%
+ \blx@tempcnta\z@
+ \def\do##1{\advance\blx@tempcnta\@ne}%
+ \dolistcsloop\blx@tempa}
+ {\listcsxadd\blx@tempa{#1}%
+ \blx@tempcnta\@ne}%
+ \expandafter\endgroup\ifnum\blx@tempcnta<\blx@minxrefs\relax
+ \else
+ \expandafter\expandafter\expandafter\blx@citation@entry
+ \expandafter\expandafter\expandafter{%
+ \csname blx@refc@\the\c@refsection @#1\endcsname}\blx@msg@cundef
+ \fi}
+
+\def\blx@bblend{%
+ \ifcsdef{blx@refs@\the\c@refsection}%
+ {\begingroup
+ \let\do\blx@addxref
+ \dolistcsloop{blx@refs@\the\c@refsection}%
+ \endgroup
+ \global\csundef{blx@refs@\the\c@refsection}}
+ {}%
+ \iftoggle{blx@addset}
+ {\blx@addset
+ \global\togglefalse{blx@addset}}
+ {}}
+
+
+% set support
+
+% We'll generate 'fake sets' for sorting.
+% A fake set will be the copy of a normal set but with a crossref
+% to the first set member, that way it inherits sorting info.
+
+\def\blx@grabfirstcsvitem#1,#2\blx@grabfirstcsvitem@end{#1}
+
+\def\blx@btx@fakesetentry#1#2#3#4{%
+ \blx@nl
+ @set{#1,\blx@nl
+ \space\space fakeset = {#2},\blx@nl
+ \space\space entryset = {#3},\blx@nl
+ \space\space crossref = {#4},\blx@nl
+ }%
+}
+
+\def\blx@fakeset@prefix{blx@fakeset-}
+
+\protected\def\blx@writefakeset@oo#1#2{%
+ \begingroup
+ \edef\blx@tempa{\endgroup
+ \noexpand\blx@writefakeset
+ {\expandonce{#1}}
+ {\expandonce{#2}}}%
+ \blx@tempa
+}
+
+\protected\def\blx@writefakeset#1#2{%
+ \blx@auxwrite\blx@bcfout{}{%
+ \blx@btx@fakesetentry
+ {\blx@fakeset@prefix#1}
+ {#1}
+ {#2}
+ {\blx@grabfirstcsvitem#2,\blx@grabfirstcsvitem@end}}}
+
+\protected\def\blx@bbl@fakeset#1{%
+ \csxdef{blx@isfakeset@\the\c@refsection @\abx@field@@@entrykey}{%
+ \detokenize{#1}}%
+ \global\cslet{blx@getfakeset@\the\c@refsection @#1}\abx@field@@@entrykey
+}
+
+% we can't rely on \inset in the .bbl (which should be in the child
+% entry), so we produce setc manually from the @set parent
+% but the bibliography may not be in a nice order to grab setc
+% properly, so we need to save setc data in the .aux file
+\appto\blx@secinit{%
+ \cslet{blx@setclist@\the\c@refsection}\@empty
+ \cslet{blx@fakesetplist@\the\c@refsection}\@empty}
+
+\apptocmd{\blx@bbl@set@i}
+ {\ifcsundef{blx@isfakeset@\the\c@refsection @\abx@field@@@entrykey}
+ {\csxdef{blx@setc@\the\c@refsection @#1}{\abx@field@@@entrykey}%
+ \listcsxadd{blx@setclist@\the\c@refsection}{\detokenize{#1}}}
+ {}}
+ {}
+ {\blx@error
+ {Failed to patch '\string\blx@bbl@set@i'}
+ {Patching '\string\blx@bbl@set@i' failed for some reason.
+ \MessageBreak
+ Please report this bug}}
+
+% {<section>}{<set child>}{<set parent>}
+\protected\def\blx@aux@set@setc#1#2#3{%
+ \csxdef{blx@setc@#1@#2}{#3}}
+
+\protected\def\blx@aux@write@setc#1#2#3{%
+ \blx@auxwrite\blx@aux{}{\string\blx@aux@set@setc{#1}{#2}{#3}}}
+
+\def\blx@write@setc#1{%
+ \ifcsundef{blx@setc@\the\c@refsection @#1}
+ {}
+ {\blx@aux@write@setc{\the\c@refsection}{#1}
+ {\csuse{blx@setc@\the\c@refsection @#1}}}}
+
+\appto\blx@bblend{%
+ \forlistcsloop{\blx@write@setc}{blx@setclist@\the\c@refsection}}
+
+% blx@setonly doesn't exist here, since it is defined in \inset,
+% rely on the existence of setc instead.
+% We also make sure to skip the actual @set entries and display
+% the fake ones.
+\patchcmd{\blx@bbl@endentry}
+ {\nottoggle{blx@setonly}}
+ {\ifentrytype{set}
+ {\ifcsundef{blx@isfakeset@\the\c@refsection @\abx@field@@@entrykey}
+ {\blx@writefakeset@oo{\abx@field@@@entrykey}{\abx@field@@@entryset}%
+ \settoggle{blx@skipbib}{true}%
+ \settoggle{blx@skipbiblist}{true}%
+ \settoggle{blx@skiplab}{true}}
+ {\listcsxadd{blx@fakesetplist@\the\c@refsection}{%
+ \abx@field@@@entrykey}}}
+ {}%
+ \ifcsundef{blx@setc@\the\c@refsection @\abx@field@@@entrykey}}
+ {}
+ {\blx@error
+ {Failed to patch '\string\blx@bbl@endentry'}
+ {Patching '\string\blx@bbl@endentry' failed for some reason.
+ \MessageBreak
+ Please report this bug}}
+
+% cite the fake set for our current set
+% the \expandafter party essentially does
+% \blx@citation@entry{\blx@fakeset@prefix#1}{\blx@msg@cundef}
+% (just correctly \detokenize'd and all)
+\def\blx@citation@set#1#2{%
+ \blx@citation@entry{#1}{#2}%
+ \ifcsundef{blx@isfakeset@\the\c@refsection @#1}
+ {\begingroup
+ \expandafter\def\expandafter\blx@tempa\expandafter{%
+ \expandafter\detokenize\expandafter{\blx@fakeset@prefix#1}}%
+ \expandafter\expandafter\expandafter\blx@citation@entry
+ \expandafter\expandafter\expandafter{\blx@tempa}{\blx@msg@cundef}%
+ \endgroup}
+ {}%
+ \begingroup
+ \def\do##1{\blx@citation@entry{##1}\blx@msg@cundef}%
+ \expandafter\expandafter\expandafter\docsvlist
+ \expandafter\expandafter\expandafter{%
+ \csname blx@setp@\the\c@refsection @#1\endcsname}%
+ \endgroup}
+
+\def\blx@citation@inset#1#2{%
+ \blx@citation@entry{#1}{#2}%
+ \expandafter\expandafter\expandafter\blx@citation@inset@i
+ \expandafter\expandafter\expandafter{%
+ \csname blx@setc@\the\c@refsection @#1\endcsname}\blx@msg@cundef}
+
+\def\blx@citation@inset@i#1{%
+ \ifcsdef{blx@setp@\the\c@refsection @#1}
+ {\blx@citation@set{#1}}
+ {\blx@citation@entry{#1}}}
+
+\def\blx@appentrydatato#1#2{%
+ \ifdef#2
+ {\appto#1{%
+ \def\noexpand#2{\expandonce#2}}}
+ {}}
+
+% if we have a fakeset, load the real @set to get the right entrykey
+% if we have a real @set, load the fakeset for all entry data
+% but make sure that the entrykey fits
+% in any case copy over some label data from its first child
+\def\blx@getdata#1{%
+ \csuse{blx@data@\the\c@refsection @\blx@refcontext@context @#1}%
+ \ifcsundef{blx@isfakeset@\the\c@refsection @#1}
+ {}
+ {\csuse{blx@data@\the\c@refsection @\blx@refcontext@context
+ @\csuse{blx@isfakeset@\the\c@refsection @#1}}}%
+ \ifcsundef{blx@getfakeset@\the\c@refsection @#1}
+ {}
+ {\let\blx@real@abx@field@@@entrykey\abx@field@@@entrykey
+ \csuse{blx@data@\the\c@refsection @\blx@refcontext@context
+ @\csuse{blx@getfakeset@\the\c@refsection @#1}}%
+ \let\abx@field@@@entrykey\blx@real@abx@field@@@entrykey}%
+ \ifcsundef{blx@setp@\the\c@refsection @\abx@field@@@entrykey}
+ {}
+ {\begingroup
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\blx@tempa
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter{%
+ \expandafter\expandafter\expandafter\blx@grabfirstcsvitem
+ \csname blx@setp@\the\c@refsection
+ @\abx@field@@@entrykey\endcsname,\blx@grabfirstcsvitem@end}%
+ \let\blx@tempb\@empty
+ \blx@ifdata{\blx@tempa}
+ {\blx@getdata{\blx@tempa}%
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelyear
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelendyear
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelmonth
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelendmonth
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelday
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelendday
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelprefix
+ \blx@appentrydatato\blx@tempb\abx@field@@@labelalpha
+ \blx@appentrydatato\blx@tempb\abx@field@@@extraalpha
+ \blx@appentrydatato\blx@tempb\abx@field@@@extradate}
+ {}%
+ \edef\blx@tempb{\endgroup\blx@tempb}%
+ \blx@tempb}%
+ \blx@adjustyears
+ \blx@getlabeldata
+ \blx@aliasfields
+ \blx@setcitecounter}
+
+
+\def\blx@bblend@redosetlabelwidth@i#1{%
+ \begingroup
+ \blx@ifdata{#1}
+ {\blx@getdata{#1}%
+ \nottoggle{blx@skiplab}
+ {\iftoggle{blx@labelnumber}
+ {\ifdefempty\abx@field@@@localnumber
+ {}
+ {\ifundef\abx@field@@@shorthand
+ {\blx@bbl@labelnumberwidth@numeric{}}
+ {\blx@bbl@labelnumberwidth@shorthand{}}}}
+ {}%
+ \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}
+ {}}
+ {}%
+ \endgroup
+}
+
+\def\blx@bblend@redosetlabelwidth{%
+ \forlistcsloop{\blx@bblend@redosetlabelwidth@i}
+ {blx@fakesetplist@\the\c@refsection}}
+
+\appto\blx@bblend{\blx@bblend@redosetlabelwidth}
+
+% categories need the correct entry key for fake sets
+\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}}}
+ {}%
+ \ifcsundef{blx@getfakeset@\the\c@refsection @#2}
+ {}
+ {\blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{\csuse{blx@getfakeset@\the\c@refsection @#2}}}%
+ \abx@aux@category{#1}{\csuse{blx@getfakeset@\the\c@refsection @#2}}}%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{#2}}%
+ \abx@aux@category{#1}{#2}}
+
+% dynamic entry sets
+
+\def\blx@btx@citeset#1#2{%
+ \blx@nl
+ @set{#1,\blx@nl
+ \space\space entryset = {#2},\blx@nl
+ }%
+}
+
+\protected\def\blx@setreq#1#2{%
+ \blx@auxwrite\blx@bcfout{}{\blx@btx@citeset{#1}{#2}}%
+ \blx@nocite@do{#1}}
+
+% xref and @set
+\def\blx@citation@i#1#2{%
+ \ifbool{citerequest}
+ {\ifcsdef{blx@setp@\the\c@refsection @#1}
+ {\blx@citation@set{#1}{#2}}
+ {\ifcsdef{blx@setc@\the\c@refsection @#1}
+ {\blx@citation@inset{#1}{#2}}
+ {\blx@citation@entry{#1}{#2}}}%
+ \ifcsdef{blx@refc@\the\c@refsection @#1}%
+ {\blx@citation@xref{#1}}
+ {}}
+ {}}
+
+% refcontexts are out, but we can try to save labelprefix
+
+% Luckily all refcontext names use \blx@refcontext@labelprefix, so if we
+% don't modify that macro, we don't actually change the refcontext.
+% Remember that \blx@refcontext@labelprefix contains a hash of the labelprefix
+% and that \blx@refcontext@labelprefix@real contains the value.
+% Effectively we always stay in \blx@sorting/global/global//global/global,
+% and additionally carry around the labelprefix value
+% in \blx@refcontext@labelprefix@real and pass it to the aux file.
+% There are differences to the result obtained with Biber,
+% but it should be good enough for very simple applications.
+\blx@kv@defkey{blx@refcontext}{labelprefix}{%
+ \xdef\blx@refcontext@labelprefix@real{#1}%
+ \iftoggle{blx@defernumbers}
+ {}%
+ {\iftoggle{blx@labelnumber}
+ {\blx@warning{%
+ Option 'labelprefix' requires global\MessageBreak
+ 'defernumbers=true'}}
+ {}}%
+ \ifundef{\blx@bibtexwarn@labelprefix@used}
+ {\blx@warning@noline{%
+ The option 'labelprefix' is limited\MessageBreak
+ when used with BibTeX.\MessageBreak
+ Consider using Biber instead}%
+ \global\let\blx@bibtexwarn@labelprefix@used\@empty}
+ {}}
+
+\def\blx@warn@bibtexrefcontext#1{%
+ \blx@warning{%
+ The refcontext option\MessageBreak
+ '#1'\MessageBreak
+ is not supported by the BibTeX backend.\MessageBreak
+ Consider switching to Biber instead.\MessageBreak
+ The option will be ignored}}
+
+\def\blx@bibtexrefcontext@disable#1{%
+ \blx@kv@defkey{blx@refcontext}{#1}{%
+ \blx@warn@bibtexrefcontext{#1}}}
+
+\forcsvlist{\blx@bibtexrefcontext@disable}{%
+ nametemplates,sorting,sortingnamekeytemplatename,uniquenametemplatename,
+ labelalphanametemplatename}
+
+\def\blx@assignrefcontext@disable#1{%
+ \blx@warning{%
+ BibTeX does not support refcontext assignments with\MessageBreak
+ '\string\assignrefcontext#1'.\MessageBreak
+ Consider using Biber instead.\MessageBreak
+ Ignoring the refconext assignment}}
+
+\def\blx@assignrefcontextkeyws[#1][#2]#3{%
+ \blx@assignrefcontext@disable{keyws}}
+\def\blx@assignrefcontextcats[#1][#2]#3{%
+ \blx@assignrefcontext@disable{cats}}
+\def\blx@assignrefcontextentries[#1][#2]#3{%
+ \blx@assignrefcontext@disable{entries}}
+
+\apptocmd{\blx@setdefaultrefcontext}
+ {\csxdef{blx@assignedlabelprefix@\the\c@refsection @#1}{%
+ \blx@refcontext@labelprefix@real}}
+ {}
+ {\blx@error
+ {Failed to patch '\string\blx@setdefaultrefcontext'}
+ {Patching '\string\blx@setdefaultrefcontext' failed for some reason.
+ \MessageBreak
+ Please report this bug}}
+
+\def\abx@aux@defaultlabelprefix#1#2#3{%
+ \csgdef{blx@assignedlabelprefix@#1@#2}{#3}}
+
+\apptocmd{\blx@bbl@entry}
+ {\ifcsundef{blx@assignedlabelprefix@\the\c@refsection @\thefield{entrykey}}
+ {}
+ {\blx@bbl@addfield{labelprefix}{%
+ \csuse{blx@assignedlabelprefix@\the\c@refsection
+ @\thefield{entrykey}}}{}{}}}
+ {}
+ {\blx@error
+ {Failed to patch '\string\blx@bbl@entry'}
+ {Patching '\string\blx@bbl@entry' failed for some reason.
+ \MessageBreak
+ Please report this bug}}
+
+\blx@AtEndDocument{%
+ % always add default labelprefix declarations to .aux
+ \iftoggle{blx@bbldone}
+ {\def\do#1{%
+ \begingroup
+ \def\do##1{%
+ \blx@auxwrite\@mainaux{}{\string\abx@aux@defaultlabelprefix{#1}{##1}{%
+ \csuse{blx@assignedlabelprefix@#1@##1}}}}%
+ \dolistcsloop{blx@defaultrefcontexts@#1}%
+ \endgroup}
+ \dolistloop\blx@allrefsections}
+ {}}
+
+% bibtex does not support multiscript
+\ResetDatamodelMultiscriptEntryfields
+
+\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}}
+ {}}
+
+% Translate sorting schemes to BibTeX form
+\def\blx@sorting@none{0}
+\def\blx@sorting@nty{1}
+\def\blx@sorting@nyt{2}
+\def\blx@sorting@nyvt{3}
+\def\blx@sorting@anyt{12}
+\def\blx@sorting@anyvt{13}
+\def\blx@sorting@ynt{21}
+\def\blx@sorting@ydnt{22}
+\def\blx@sorting@debug{99}
+
+% Control file
+
+\edef\blx@ctrl{%
+ \blx@msg@bib
+ @Control\string{biblatex-control,\blx@nl
+ \space\space options = \string{%
+ \blx@bcfversion:%
+ \noexpand\iftoggle{blx@debug}{1}{0}:%
+ \noexpand\iftoggle{blx@bibtex8}{1}{0}:%
+ \noexpand\iftoggle{blx@sortcase}{1}{0}:%
+ \noexpand\iftoggle{blx@useprefix}{1}{0}:%
+ \noexpand\iftoggle{blx@useauthor}{1}{0}:%
+ \noexpand\iftoggle{blx@useeditor}{1}{0}:%
+ \noexpand\iftoggle{blx@usetranslator}{1}{0}:%
+ \noexpand\iftoggle{blx@labelalpha}{1}{0}:%
+ \noexpand\iftoggle{blx@labeldateparts}{1}{0}:%
+ \noexpand\iftoggle{blx@singletitle}{1}{0}:%
+ \noexpand\csuse{blx@sorting@\noexpand\blx@sorting}:%
+ \noexpand\blx@maxcitenames:%
+ \noexpand\blx@mincitenames:%
+ \noexpand\blx@maxsortnames:%
+ \noexpand\blx@minsortnames:%
+ \noexpand\iftoggle{blx@nohashothers}{1}{0}:%
+ \noexpand\iftoggle{blx@nosortothers}{1}{0}:%
+ \noexpand\blx@maxalphanames:%
+ \noexpand\blx@minalphanames:%
+ \noexpand\blx@maxline:%
+ \noexpand\detokenize\noexpand\expandafter{\noexpand\labelalphaothers}:%
+ \noexpand\detokenize\noexpand\expandafter{\noexpand\blx@sortalphaothers}:%
+ \noexpand\detokenize\noexpand\expandafter{\noexpand\blx@sorting}%
+ \string},\blx@nl
+ \string}%
+}
+
+\def\blx@ctrlwrite{%
+ \ifcsundef{blx@sorting@\blx@sorting}
+ {\blx@warning@noline{Sorting template '\blx@sorting'\MessageBreak
+ not available with BibTeX backend.\MessageBreak
+ Switch to Biber or select one of the default templates}}
+ {}%
+ \begingroup
+ \blx@safe@actives
+ \let\protect\string
+ \edef\blx@sortalphaothers{\sortalphaothers}%
+ \immediate\openout\blx@write\blx@ctrlfile\blxauxsuffix.bib\relax
+ \blx@auxwrite\blx@write{}{\blx@ctrl}%
+ \endgroup
+ \AfterEndDocument{\immediate\closeout\blx@write}}
+
+
+% {<string>}
+% This mustn't be robust as it's likely to be used mainly in tests and so
+% needs to be expandable
+\renewcommand*\rangelen[1]{%
+ \ifblank{#1}
+ {0}%
+ {\expandafter\blx@rangelen@range\romannumeral-`\q%
+ #1\bibrangedash\bibrangedash&%
+ }}
+
+\def\blx@rangelen@range#1\bibrangedash#2\bibrangedash#3&{%
+ \ifblank{#3}
+ {\blx@rangelen@hyphen#1--&}
+ {\blx@rangelen@check{#1}{#2}}%
+}
+\def\blx@rangelen@hyphen#1-#2-#3&{%
+ \ifblank{#3}
+ {1}% No range at all: assume one page
+ {\blx@rangelen@check{#1}{#2}}%
+}
+\def\blx@rangelen@check#1#2{%
+ \expandafter\blx@rangelen@check@aux
+ \number\numexpr
+ \blx@rangelen@check@int{#2}
+ -
+ \blx@rangelen@check@int{#1}
+ + 1
+ \relax
+ &\stop
+}
+\def\blx@rangelen@check@aux#1&#2\stop{%
+ \ifblank{#2}
+ {#1}
+ {-1}%
+}
+\def\blx@rangelen@check@int#1{%
+ \ifblank{#1}
+ {0&}
+ {%
+ \if\number\numexpr0#1-0#1\relax0
+ #1
+ \else
+ 0&
+ \fi
+ }%
+}
+
+
+% Disable some interfaces
+
+\renewrobustcmd*{\DeclareSortingScheme}[3][]{}
+\renewrobustcmd*{\DeclareExtradate}[1]{}
+
+\def\blx@checkencoding{}
+
+\AtBeginDocument{%
+ \blx@checkencoding
+ \if@filesw
+ \blx@auxinit\blx@bibfiles
+ \fi}
+
+\endinput