\ProvidesFile{iso.bbx}
  [2022/03/20 v0.4.1 ISO 690 biblatex bibliography style]

% Currently available language mappings:
% Czech, English, German, Polish, Slovak, and more.
% You can list them directly with `$ ls *lbx`.
% Or you can check the translation matrix at the wiki page:
% https://github.com/michal-h21/biblatex-iso690/wiki/Translation-Guideline#translation-matrix
\DeclareLanguageMappingSuffix{-iso}
% Currently needed the following additional language strings:
\NewBibliographyString{at,bysupervisor,urlalso,
  director,bydirector,inventor,byinventor,online,film,application,publication}

% PACKAGE OPTIONS

% Define new package options
% These toggle names are internal
\newtoggle{bbx:spcolon}
\newtoggle{bbx:totalpages}
\newtoggle{bbx:shortnum}
\newtoggle{bbx:thesisinfoinnotes}
\newtoggle{bbx:url}
\newtoggle{bbx:isbn}
\newtoggle{bbx:doi}
\newtoggle{bbx:eprint}
\newtoggle{bbx:articlepubinfo}
\newtoggle{bbx:currentlang}
\newtoggle{bbx:noenddot}

% Print info about package options into .log file
\protected\def\isoblx@info@noline#1{%
  \PackageInfo{biblatex-iso690}{#1\@gobble}}
\let\isoblx@info\isoblx@info@noline
\AtEndOfPackage{%
  \protected\def\isoblx@info#1{%
    \PackageInfo{biblatex-iso690}{#1}}}

% Declare new package options
% Description of these options is in the doc file
% '\isoblx@info@noline' command prints to the .log file
\DeclareBibliographyOption{spacecolon}[true]{%
  \settoggle{bbx:spcolon}{#1}%
  \isoblx@info@noline{Space colon enabled: #1}}

\DeclareBibliographyOption{pagetotal}[true]{%
  \settoggle{bbx:totalpages}{#1}%
  \isoblx@info@noline{Total pages enabled: #1}}

\DeclareBibliographyOption{shortnumeration}[true]{%
  \settoggle{bbx:shortnum}{#1}%
  \isoblx@info@noline{Short numeration enabled: #1}}

\DeclareBibliographyOption{thesisinfoinnotes}[true]{%
  \settoggle{bbx:thesisinfoinnotes}{#1}%
  \isoblx@info@noline{Thesis info in the notes section enabled: #1}}

\DeclareBibliographyOption{url}[true]{%
  \settoggle{bbx:url}{#1}%
  \isoblx@info@noline{URL field enabled: #1}}

\DeclareBibliographyOption{isbn}[true]{%
  \settoggle{bbx:isbn}{#1}%
  \isoblx@info@noline{ISBN field enabled: #1}}

\DeclareBibliographyOption{doi}[true]{%
  \settoggle{bbx:doi}{#1}%
  \isoblx@info@noline{DOI field enabled: #1}}

\DeclareBibliographyOption{eprint}[true]{%
  \settoggle{bbx:eprint}{#1}%
  \isoblx@info@noline{eprint field enabled: #1}}

\DeclareBibliographyOption{articlepubinfo}[true]{%
  \settoggle{bbx:articlepubinfo}{#1}%
  \isoblx@info@noline{Article publication info enabled: #1}}

\DeclareBibliographyOption{currentlang}[true]{
  \settoggle{bbx:currentlang}{#1}%
  \isoblx@info@noline{Use current language for the bibliography: #1}}

\DeclareBibliographyOption{noenddot}[true]{
  \settoggle{bbx:noenddot}{#1}%
  \isoblx@info@noline{Use no end dot for the bibliography entries: #1}}


% Set default package options
\ExecuteBibliographyOptions{%
  spacecolon=false,
  pagetotal=false,
  shortnumeration=false,
  thesisinfoinnotes=true,
  url=true,
  isbn=true,
  doi=true,
  eprint=true,
  articlepubinfo=false, % Printing article publication info is unusual
  maxnames=99,% If possible, all creators should be given in the reference
  minnames=1,% If any names are omitted => first creator + and others (et al.)
  citetracker=true,% Citation tracker in global mode
  autolang=other,% Use the 'langid' language for the entry
  date=year,% Use only years
  urldate=iso,% Use ISO8601 Extended Format (yyyy-mm-dd) for URL 'seen' dates
  origdate=iso,% Use ISO8601 Extended Format (yyyy-mm-dd) for patent appl. dates
  seconds=true,% iso (ISO8601) format requires 'seconds=true'
  datecirca=true,% Use circa for approximate dates
  currentlang=false,% Use main document language for printing of bibliography strings
  noenddot=false,% Use an end dot for the bibliography entries
}

% Default definitions of beginning and closing macro
% in bibliography drivers
\newbibmacro*{begentry}{}
\newbibmacro*{finentry}{\finentry}

% COMMANDS

% The separator between 'titles' and 'subtitles'
\renewcommand*{\subtitlepunct}{\addspacecolon\space}

% The separator between more standard identifiers, like ISBNs or ISSNs.
% Default separator is comma and space. You can use something like
% \renewcommand{\stdidentifierspunct}{\addsemicolon\space}
% in the preamble to change the separator
\newcommand{\stdidentifierspunct}{\addcomma\space}

% The separator between date and dateaddon
\newcommand{\dateaddonpunct}{\addspace}

% The separator between 'dates' and the numeration section
\newcommand{\numerationpunct}{\addcomma\space}

% No seperator or a dot at the very end of an entry
\renewcommand{\finentrypunct}{%
  \iftoggle{bbx:noenddot}
    {}
    {\addperiod}%
}

% A colon preceded with or without space
\newcommand{\addspacecolon}{%
  \iftoggle{bbx:spcolon}
    {\addnbspace\addspcolon}
    {\unspace\addspcolon}%
}

% Context-sensitive delimiters

% The delimiter between mutliple names
% A semicolon: legacy of older versions of standard / Czech interpretations
\DeclareDelimFormat{multinamedelim}{\addsemicolon\space}

% The delimiter before the final name
% Use consistent name format for all creators
\DeclareDelimAlias{finalnamedelim}{multinamedelim}

% Thanks Moewew for sugesting this. Make uppercase names only in bibliography.
% Default name format is ALL-CAPS
% use something like
% \let\familynameformat=\textsc
% to change this
\newcommand{\familynameformat}[1]{\MakeUppercase{#1}}
\AtBeginBibliography{%
  \renewcommand{\mkbibnamefamily}{\familynameformat}%
}

% Default bibliography environment (layout)
\defbibenvironment{bibliography}
  {\list%
     {}%
     {\setlength{\leftmargin}{\bibhang}%
      \setlength{\itemindent}{-\leftmargin}%
      \setlength{\itemsep}{\bibitemsep}%
      \setlength{\parsep}{\bibparsep}}%
      \renewcommand*{\makelabel}[1]{\hss##1}}%
  {\endlist}%
  {\item}%


% FIELD FORMATS

% Format title and subtitle as is
\DeclareFieldFormat*{title}{#1}
\DeclareFieldFormat*{subtitle}{#1}

% Format volume field with localisation string
\DeclareFieldFormat{volume}{\bibstring{volume}\addnbspace#1}% volume of a book
% Differentiate volume in journal
\DeclareFieldFormat[article,periodical]{volume}{%
  \iftoggle{bbx:shortnum}
    {\mkbibbold{#1}}
    {\bibstring{jourvol}\addnbspace#1}% volume of a journal
}

% Edition field could be:
% a) numeral: use with localisation string
% b) literal: capitalize given string
\DeclareFieldFormat*{edition}{%
  \ifnumeral{#1}%
    {\mkbibordedition{#1}\addnbspace\bibstring{edition}}%
    {\MakeCapital{#1}}%
}%

% Format pagination for page range
% Always use main document language for this field
\DeclareFieldFormat*{pages}{\mkmlpageprefix[bookpagination]{#1}}
% Differentiate page range in journal
\DeclareFieldFormat[article,periodical]{pages}{%
  \iftoggle{bbx:shortnum}
    {#1}
    {\mkmlpageprefix[bookpagination]{#1}}%
}

% Format pagination for total number of pages
% Always use main document language for this field
\DeclareFieldFormat*{pagetotal}{\mkbibbrackets{\mkmlpagetotal[bookpagination]{#1}}}

% Format number field with localisation string
\DeclareFieldFormat*{number}{\bibstring{number}\addspace #1}
% Differentiate number in journal
\DeclareFieldFormat[article,periodical]{number}{%
  \iftoggle{bbx:shortnum}
    {\mkbibparens{#1}}
    {\bibstring{number}\addspace #1}%
}
% Differentiate number for patent and report: format as is
\DeclareFieldFormat[patent,report]{number}{#1}

% a) url AND no urldate: use localisation string 'available ALSO from',
%    meaning: the work is not primarily published electronically
% b) url AND urldate: use localisation string 'available from'
\DeclareFieldFormat*{url}{%
  \iffieldundef{urlyear}
    {\mainlangbibstring{urlalso}}
    {\mainlangbibstring{urlfrom}}%
  \addcolon\space\url{#1}%
}

% Format medium type in square brackets
% If available, use the localisation string for the key
\DeclareFieldFormat{howpublished}{%
  \ifbibstring{#1}
    {\mainlangbibstring[\mkbibbrackets]{#1}}
    {\mkbibbrackets{#1}}%
}

% Format type, e.g. type of thesis
% If available, use the localisation string for the key
\DeclareFieldFormat{type}{%
  \ifbibstring{#1}
    {\mainlangbibstring{#1}}
    {#1}%
}
\DeclareFieldFormat[patent]{type}{%
  \ifbibstring{#1}
    {\mainlangbiblstring{#1}}
    {#1}%
}

% Format supervisor of thesis (precedes the name with a localisation string)
\DeclareFieldFormat{supervisor}{%
  \mainlangbibstring{bysupervisor}\addspace#1}

% \mkbibacro typesets acronyms in small caps by default,
% if we want to override this, pass the value as is (uppercase)
% \renewcommand*{\mkbibacro}[1]{#1}
% Applies to DOI, ISBN, ISSN, ISAN, ISMN, ISRN, ISWC

% If we really must handle more than one ISBN and ISSN.
%
% Typically there could be different ISBN / ISSN for printed and electronic
% media versions, but the standard says that the specific copy or instance of
% the document should be cited, so the author should choose the appropriate
% number in the bib file. Otherwise include comma-separated list of numbers in
% the bib field 'isbn' or 'issn'.

% Separator value between more ISBNs / ISSNs is handled by '\stdidentifierspunct'.
% Default format is the name of identifier + space + number:
% e.g. 'ISBN 978-3-642-21665-7'
\DeclareFieldFormat{isbn}{%
  % Execute this rule for the first value of the csv field
  \def\do##1{\mkbibacro{ISBN}\space##1%
    % Execute this rule for the next value(s) of the csv field
    \def\do####1{\stdidentifierspunct\mkbibacro{ISBN}\space####1}}%
  % Process the csv field with \do command
  \docsvfield{isbn}%
}

% The same formatting rules as for ISBN above
\DeclareFieldFormat{issn}{%
  \def\do##1{\mkbibacro{ISSN}\space##1%
    \def\do####1{\stdidentifierspunct\mkbibacro{ISSN}\space####1}}%
  \docsvfield{issn}%
}

% Format other standard identifiers
% Default format is the name of identifier + space + number
\DeclareFieldFormat{isan}{\mkbibacro{ISAN}\addspace#1}
\DeclareFieldFormat{ismn}{\mkbibacro{ISMN}\addspace#1}
\DeclareFieldFormat{isrn}{\mkbibacro{ISRN}\addspace#1}
\DeclareFieldFormat{iswc}{\mkbibacro{ISWC}\addspace#1}

% Format url seen date with preceding localisation string in square brackets
\DeclareFieldFormat{urldate}{\mkbibbrackets{\mainlangbibstring{urlseen}\space#1}}

% Format additional date information as is (use bib file for modifications).
\DeclareFieldFormat{dateaddon}{#1}

% Format circa date with preceding localisation string in square brackets;
% default \datecircaprint is \bibstring{circa}\printdelim{datecircadelim},
% e.g. [ca. 1940].
\DeclareFieldFormat{date}{%
  \ifdatecirca
    {\mkbibbrackets{#1}}%
    {#1}%
}

% Format 'labeldate' the same as 'date' field.
% We use 'labeldate' in 'iso-authoryear' style.
% Format circa date and nodate. Dateaddon and date as is.
\DeclareFieldFormat{labeldate}{%
  \ifdatecirca
    {\mkbibbrackets{#1}}%
    {% Check if there is 'nodate' from 'labeldate'
      \iffieldequalstr{labeldatesource}{nodate}
        % This is a \literal{nodate}, meaning that it uses the 'nodate'
        % localisation string due to default \DeclareLabeldate setting
        {\mkbibbrackets{#1}}%
        {#1}}% This is the go-to format
}

% Define names to consider for 'labelname', based on
% the default definition, but adding holder as the
% very first choice for patents.
\DeclareLabelname[patent]{%
  \field{holder}
  \field{shortauthor}
  \field{author}
  \field{shorteditor}
  \field{editor}
  \field{translator}
}

% Define dates to consider for 'labeldate', based on
% the default definition, but without 'urldate' field,
% preventing printing url seen date in place of the year
% of a publication.
\DeclareLabeldate{%
  \field{origdate}% <----- used by patents
  \field{date}
  \field{year}
  \field{dateaddon}% <---- biblatex-iso690 data model extension
  \field{eventdate}
  \literal{nodate}
}

% Sorting based on the default definition, but adding
% holder and origyear to work with patent entry types.
\DeclareSortingTemplate{nyt}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkey}
  }
  \sort{
    \field{sortname}
    \field{holder}
    \field{author}
    \field{editor}
    \field{translator}
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{sortyear}
    \field{origyear}
    \field{year}
  }
  \sort{
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{volume}
    \literal{0}
  }
}

% Format chapter of book with preceding localisation string
\DeclareFieldFormat{chapter}{\bibstring{chapter}\addnbspace#1\isdot}

% Version field could be:
% a) numeral: use with localisation string
% b) literal: capitalize given string
\DeclareFieldFormat{version}{%
  \ifnumeral{#1}%
    {\bibstring{version}\addnbspace#1}%
    {\MakeCapital{#1}}%
}

% Format library field as is (location information)
\DeclareFieldFormat{library}{#1}

% Format (sub)titles as they are
\DeclareFieldFormat{journaltitle}{#1}
\DeclareFieldFormat{booktitle}{#1}
\DeclareFieldFormat{maintitle}{#1}
\DeclareFieldFormat{issuetitle}{#1}
\DeclareFieldFormat{journalsubtitle}{#1}
\DeclareFieldFormat{booksubtitle}{#1}
\DeclareFieldFormat{mainsubtitle}{#1}
\DeclareFieldFormat{issuesubtitle}{#1}

% Format other / alternative titles in square brackets
\DeclareFieldFormat{titleaddon}{\mkbibbrackets{#1}}
\DeclareFieldAlias{booktitleaddon}{titleaddon}
\DeclareFieldAlias{maintitleaddon}{titleaddon}

% Format additional name information in square brackets
\DeclareFieldFormat{nameaddon}{\mkbibbrackets{#1}}

% NAME ALIAS

% Default name list format is last (family) followed by given (first) name
\DeclareNameAlias{default}{family-given}
% For supervisor, use the reversed order format:
% given (first) name followed by last (family) name,
% so it may sound more naturally in this order
\DeclareNameAlias{supervisor}{given-family}
% For patents, the author field is supposed to be the inventor
% of the patent, which we want to have in reverse name order,
% since it may sound more naturally in this order
\DeclareNameAlias[patent]{author}{given-family}
% However, if there is no holder field for a patent,
% author field should be in the default order since it acts
% as a primary creator of the patent at the beginning
% of the bib reference (consistency rule)
\DeclareStyleSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \pertype{patent}
      \step[fieldsource=author]
      \step[fieldset=holder, origfieldval]
    }
  }
}




% BIBLIOGRAPHY MACROS

% NAMES MACROS

% Based on author/editor macro
% Adds nameaddon field to author names
\newbibmacro*{names:primary}{%
  \ifboolexpr{test \ifuseholder and test {\ifentrytype{patent}}
                                and not test {\ifnameundef{holder}}}
    {\usebibmacro{byholder}%
    \setunit{\addspace}%
    \printfield{nameaddon}}%
    {\ifboolexpr{test \ifuseauthor and not test {\ifnameundef{author}}}
      {\usebibmacro{author}%
      \setunit{\addspace}%
      \printfield{nameaddon}}%
      {\usebibmacro{editor}}}%
}

% Macro for secondary authors with their role
\newbibmacro*{names:subsidiary}{%
  \usebibmacro{byeditor}%
  \newunit
  \usebibmacro{bytranslator}%
}

% Don't owerwrite default macros to change only delimiters / punctuation,
% declare their format instead.
% https://github.com/michal-h21/biblatex-iso690/issues/68#issuecomment-435650072
\DeclareFieldFormat{editortype}{\mkbibparens{#1}}
\DeclareDelimFormat{editortypedelim}{\addspace}

\DeclareFieldFormat{authortype}{\mkbibparens{#1}}
\DeclareDelimFormat{authortypedelim}{\addspace}

% Macro for printing supervisor field
\newbibmacro*{thesissupervisor}{%
  \ifnameundef{supervisor}
    {}
    {\mainlangbibstring{bysupervisor}%
     \setunit{\addspace}%
     \printnames{supervisor}}%
}

% Macro for printing the inventor of a patent
\newbibmacro*{patentinventor}{%
  \ifnameundef{author}
    {}
    {\mainlangbibstring{inventor}%
     \setunit{\addcolon\space}%
     \usebibmacro{author}}%
}


% TITLES MACROS

% Macro for formatting <prefix>titles
% 1st argument: prefix / type of title (e.g. main, book, event),
%               if empty, 'title' field is handled
% 2nd argument: formatting directive (e.g. emph)
\newbibmacro{titles}[2]{%
  \ifboolexpr{
    test {\iffieldundef{#1title}}
    and
    test {\iffieldundef{#1subtitle}}}
    {}
    {\printtext[#2]{%
       \printfield{#1title}%
       \setunit{\subtitlepunct}%
       \printfield{#1subtitle}}%
     \setunit{\addspace}}%
  \printfield{#1titleaddon}%
  \newunit
}%

% Macro for printing volumes (part of volumes)
\newbibmacro{volume}{%
  \iffieldundef{volume}
    {}
    {\printfield{volume}%
     \printfield{part}%
     \setunit{\addcomma\space}}%
}

% Macro for formatting multiple titles
\newbibmacro{multi:titles}{%
  \iffieldundef{maintitle}
    {\iffieldundef{booktitle}
      {\usebibmacro{titles}{}{emph}%
       \usebibmacro{volume}}
      {\usebibmacro{titles}{book}{emph}%
       \usebibmacro{volume}%
       \usebibmacro{titles}{}{}}}%
    {\usebibmacro{titles}{main}{emph}%
     \usebibmacro{volume}%
     \usebibmacro{titles}{}{}}%
}

% Macro for formatting multiple hierarchical titles
% (e.g. for inbook, incollection)
\newbibmacro{host:titles}{%
 \iffieldundef{maintitle}
   {\iffieldundef{booktitle}
      {}
      {\usebibmacro{titles}{book}{emph}}}
   {\usebibmacro{titles}{main}{emph}}%
}%

% Macro for formatting multiple titles in periodicals
\newbibmacro{periodical:titles}{%
  \usebibmacro{titles}{}{emph}%
  \newunit
  \iffieldundef{issuetitle}
    {\iffieldundef{journaltitle}
       {}
       {\usebibmacro{titles}{journal}{}}}
    {\usebibmacro{titles}{issue}{}}%
}


% MEDIUM TYPE MACROS

\newbibmacro*{medium-type}{%
  \iffieldundef{howpublished}
    {% Automatic printing of '[online]' type of medium when
     % a) 'urldate' is present AND
     % b) url is enabled (pkg option url=true) OR
     %    entry type is '@online'
      \ifboolexpr{
        not test {\iffieldundef{urlyear}}
        and (   test {\iftoggle{bbx:url}}
             or test {\ifentrytype{online}})
      }
        % Use a localisation string 'online' in the main document language
        {\midsentence\mainlangbibstring[\mkbibbrackets]{online}}%
        {}}% Don't print anything
    {% The only situation when we don't want to print
     % 'howpublished' field is when
     % a) url is disabled (pkg option url=false) AND
     % b) entry type is other than '@online' AND
     % c) 'howpublished' field is 'online'.
     % Please note that this field is not checked against
     % any possible literal value (e.g. electronic, online article)
     % that should be probably also hidden when a) AND b) hold.
      \ifboolexpr{
        test {\iffieldequalstr{howpublished}{online}}
        and not test {\iftoggle{bbx:url}}
        and not test {\ifentrytype{online}}
      }
        {}% Don't print 'howpublished' field
        {\printfield{howpublished}}}%
}




% PUBLICATION INFO MACROS

% By default only year is used, but for some entries,
% we need full date (day or even time precision),
% (e.g. patents, TV shows, newspapers, online news)

% Macro for printing full date (full = YYYY-MM-DD)
\newbibmacro*{fulldate}{%
  \mkdaterangeiso{}%
}

% a)
% If there is no date field in the bib entry,
% we should state there is no date by printing
% a localisation string, e.g. [n.d.].
% b)
% Order: <date> <dateaddon>
\renewbibmacro*{date}{%
  \iffieldundef{year}
    {\iffieldundef{dateaddon}
      {\bibstring[\mkbibbrackets]{nodate}}%
      {\printfield{dateaddon}}}%
    {\printdate%
     \setunit{\dateaddonpunct}%
     \printfield{dateaddon}}%
}

% Based on publisher+location+date macro (defined in standard.bbx)
% Differs only in punctuation, and printing the organization field
%
% Wrapper for printing normal or full date. 1st argument:
% a) <empty>: \usebibmacro{date}
% b) 'full' : \usebibmacro{fulldate}
\newbibmacro*{location+publisher+dateform}[1]{%
  \printlist{location}%
  \ifboolexpr{
    test {\iflistundef{publisher}}
    and
    test {\iflistundef{organization}}}
    {\setunit*{\addcomma\space}}
    {\setunit*{\subtitlepunct}}% <---- different punctuation
  \printlist{publisher}%
  \setunit*{\addcomma\space}%
  \printlist{organization}%
  \setunit*{\addcomma\space}%
  \usebibmacro{#1date}%
  \newunit}

\newbibmacro*{location+publisher+date}{%
  \usebibmacro{location+publisher+dateform}{}}

\newbibmacro*{location+publisher+fulldate}{%
  \usebibmacro{location+publisher+dateform}{full}}



% ADDITIONAL DATE MACROS FOR PATENTS

% Application date
\newbibmacro{applicationdate}{%
  \iffieldundef{origyear}
    {}
    {\mainlangbibstring{application}\addcolon\space\printorigdate}
}

% Publication date
\newbibmacro{publicationdate}{%
  \iffieldundef{year}
    {}
    {\mainlangbibstring{publication}\addcolon\space\usebibmacro{fulldate}}
}


% NUMERATION MACROS

\newbibmacro*{serial:numeration}{%
  \printfield{volume}%
  \iftoggle{bbx:shortnum}
    {}
    {\setunit*{\addcomma\space}}%
  \printfield{number}%
}

\newbibmacro*{book:numeration}{%
  \printfield{volume}%
  \setunit*{\addcomma\space}%
  \printfield{chapter}%
}


% SERIES TITLE AND NUMBER MACROS

% Based on series+number macro (defined in standard.bbx)
% Differs only in punctuation
\newbibmacro*{series+number}{%
  \printfield{series}%
  \setunit*{\addcomma\space}%
  \printfield{number}%
}%


% STANDARD IDENTIFIERS MACROS

% Bunch of standard identifiers
\newbibmacro*{identifier}{%
  \iftoggle{bbx:isbn}
    {\printfield{isan}%
     \newunit
     \printfield{isbn}%
     \newunit
     \printfield{ismn}%
     \newunit
     \printfield{isrn}%
     \newunit
     \printfield{issn}%
     \newunit
     \printfield{iswc}%
     \newunit}
    {}%
}


% AVAILABILITY AND ACCESS MACROS

% Precedes DOI field with urlfrom localisation string
\newbibmacro*{from-doi}{%
  \mainlangbibstring{urlfrom}%
  \setunit{\addspace}%
  \printfield{doi}%
}

% Precedes eprint field with urlfrom localisation string
% Use default eprint formatting macro
\newbibmacro*{from-eprint}{%
  \mainlangbibstring{urlfrom}
  \setunit{\addspace}%
  \usebibmacro{eprint}%
}

% Macro for availability and access information
% with order of importance: doi, eprint, url
\newbibmacro*{availability+access}{%
  \ifboolexpr{
    test {\iftoggle{bbx:doi}}
    and not test {\iffieldundef{doi}}
  }
    {\usebibmacro{from-doi}}%
    {%
      \ifboolexpr{
        test {\iftoggle{bbx:eprint}}
        and not test {\iffieldundef{eprint}}
      }
        {\usebibmacro{from-eprint}}%
        {\usebibmacro{url}}}%
}

% The url field of @online entries is always printed
\renewbibmacro*{url}{%
  \ifboolexpr{
    test {\iftoggle{bbx:url}}
    or test {\ifentrytype{online}}
  }
    {\printfield{url}}%
    {}%
}

\newbibmacro*{urldate-space}{%
  % if there is no publisher specified in the bib file, set unit to dot,
  % so there is a separation between previous block
  \ifboolexpr{%
    test {\iflistundef{publisher}}%
    and test {\iflistundef{location}}%
    and test {\iffieldundef{date}}%
    and test {\iffieldundef{version}}%
  }{\setunit{\adddot\addspace}}%
  {\setunit{\addspace}}%
}

% The url seen date of @online entries is always printed
\renewbibmacro*{urldate}{%
  \ifboolexpr{
    test {\iftoggle{bbx:url}}
    or test {\ifentrytype{online}}
  }
    {\printurldate}%
    {}%
}


% LOCATION MACROS

% Additional location information (e.g. library, repository)
\newbibmacro*{location}{%
  \iffieldundef{library}
    {}
    {\usebibmacro{at:}%
     \printfield{library}}%
}


% OTHER MACROS

% Redeclare in: bibmacro to use the main document language.
% There was discussion whether literal "In:" should be used,
% but that would look weird in non-latin languages.
% Context: https://github.com/michal-h21/biblatex-iso690/pull/33

% Force to use the main document language for 'in' localisation string
\renewbibmacro*{in:}{%
  \mainlangbibstring{in}%
  \printunit{\intitlepunct}%
}

% Based on 'in:' macro for 'at' localisation string
\newbibmacro*{at:}{%
  \mainlangbibstring{at}%
  \printunit{\intitlepunct}%
}


% BIBLATEX CORE ADJUSTMENTS

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Localisation strings in the main document language
%
% \mainlangbibstring in place of \bibstring
% \mainlangbiblstring in place of \biblstring
% \mainlangbibsstring in place of \bibsstring

% [<wrapper>]{<string>}
\newrobustcmd*{\blx@imc@mainlangbibstring}[2][\@firstofone]{%
  \blx@mainlangbibstring{#1}{\abx@str}{#2}}

\newrobustcmd*{\blx@imc@mainlangbiblstring}[2][\@firstofone]{%
  \blx@mainlangbibstring{#1}{abx@lstr}{#2}}

\newrobustcmd*{\blx@imc@mainlangbibsstring}[2][\@firstofone]{%
  \blx@mainlangbibstring{#1}{abx@sstr}{#2}}

% We use Babel or Polyglossia main document language for some
% bibliography strings. With currentlang option, the currently
% selected language is used instead. It is useful in some classes
% that don't support selection of the main language.
% https://github.com/michal-h21/biblatex-iso690/issues/90
\newcommand\blx@selectlangmacro{%
  \ifboolexpr{%
        test {\iftoggle{bbx:currentlang}}%
        and test {\ifdef{\textouterlang}}%
      }%
      {\let\iso@mainlang\textouterlang}{\let\iso@mainlang\textmainlang}%
}

\protected\def\blx@mainlangbibstring#1#2#3{%
  \blx@begunit%
  \blx@hyphenreset%
  \blx@bibstringsimple%
  \blx@selectlangmacro%
  \lowercase{\edef\blx@tempa{#3}}%
  \ifcsundef{#2@\blx@tempa}%
    {\blx@warn@nostring\blx@tempa%
     \blx@endnounit}%
    {\blx@imc@ifcapital%
       {\iso@mainlang{#1{\MakeCapital{\csuse{#2@\blx@tempa}}}}}%
       {\iso@mainlang{#1{\csuse{#2@\blx@tempa}}}}%
     \blx@endunit}}

\blx@regimcs{%
  \mainlangbibstring \mainlangbiblstring \mainlangbibsstring
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Overriding bookpagination to use document main language
%
% Use new name 'mkpagetotal' over 'mkmlpagetotal'
% Use 'mainlangbibsstring' over 'bibstring'

\newrobustcmd*{\blx@imc@mkmlpagetotal}[1][bookpagination]{%
  \begingroup
  \def\blx@tempa{\blx@mkmlpagetotal{pagetotal}}%
  \iffieldundef{#1}
    {}
    {\iffieldequalstr{#1}{none}
       {\def\blx@tempa{\blx@mkmlpagetotal@i}}
       {\iffieldplusstringbibstring{#1}{total}
          {\edef\blx@tempa{\blx@mkmlpagetotal{\thefield{#1}total}}}
          {\blx@warning@entry{%
             Unknown pagination type '\strfield{#1}total'}}}}%
  \@ifnextchar[%]
    {\blx@tempa}
    {\blx@tempa[\@firstofone]}}

\protected\long\def\blx@mkmlpagetotal#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\mainlangbibsstring{#1}}
     {#2{#3}\ppspace\mainlangbibsstring{#1s}}}
    {\def\pno{\mainlangbibsstring{#1}}%
     \def\ppno{\mainlangbibsstring{#1s}}%
     #2{#3}}%
  \endgroup}

\long\def\blx@mkmlpagetotal@i[#1]#2{#1{#2}\endgroup}

\blx@regimcs{\mkmlpagetotal}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Overriding pagination to use document main language
%
% Use new name 'mkmlpageprefix' over 'mkpageprefix'
% Use 'mainlangbibsstring' over 'bibstring'

\newrobustcmd*{\blx@imc@mkmlpageprefix}[1][pagination]{%
  \begingroup
  \def\blx@tempa{\blx@mkmlpageprefix{page}}%
  \iffieldundef{#1}
    {}
    {\iffieldequalstr{#1}{none}
       {\def\blx@tempa{\blx@mkmlpageprefix@i}}
       {\iffieldbibstring{#1}
          {\edef\blx@tempa{\blx@mkmlpageprefix{\thefield{#1}}}}
          {\blx@warning@entry{%
             Unknown pagination type '\strfield{#1}'}}}}%
  \@ifnextchar[%]
    {\blx@tempa}
    {\blx@tempa[\@firstofone]}}

\protected\long\def\blx@mkmlpageprefix#1[#2]#3{%
  \ifnumeral{#3}
    {\mainlangbibsstring{#1}\ppspace}
    {\ifnumerals{#3}
       {\mainlangbibsstring{#1s}\ppspace}
       {\def\pno{\mainlangbibsstring{#1}}%
        \def\ppno{\mainlangbibsstring{#1s}}}}%
  \blx@mkmlpageprefix@i[#2]{#3}}

\long\def\blx@mkmlpageprefix@i[#1]#2{#1{#2}\endgroup}

\blx@regimcs{\mkmlpageprefix}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Use space punctuation, package option 'spacecolon',
% toggle 'bbx:spcolon', command '\addspcolon' / '\addspacecolon'

% See 'biblatex.sty' for these macros
%
% Let biblatex know the new macro
\blx@regimcs{\addspcolon}
% Define the new macro
\protected\def\blx@imc@addspcolon{\blx@addsppunct{colon}}
% Implement the new macro
\def\blx@addsppunct#1{% <---- new name for spaced punctuation
  %\unspace <----- commented out
  \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}}%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Adds non-breaking space after open date range, e.g. '1492-- '
%

\newcommand*{\mkopenendeddaterange}{\mbox{\bibdaterangesep\addnbspace}}

% Used by '\printdate'
%
% {<short|long>}{<datetype>}
\renewrobustcmd*{\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}{}
              {\mkopenendeddaterange}% <---- added \addnbspace
              {\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}

% Used by '\printlabeldateextra' in 'iso-authoryear.bbx'
%
% {<short|long>}{<datetype>}
\renewrobustcmd*{\mkdaterangefullextra}[2]{%
  \begingroup
    \blx@metadateinfo{#2}%
    \iffieldundef{#2year}
      {\blx@nounit}
      {\printtext[{#2date}]{%
         \datecircaprint
         % Such a season component can only come from an ISO8601 season which replaces
         % a normal month so if it exists, we know that a normal date print is ruled out
         \iffieldundef{#2season}
           {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
            % Optionally print the time after the date
            \blx@printtime{#2}{}}
           {\csuse{mkbibseasondate#1}{#2year}{#2season}}%
         \dateuncertainprint
         \dateeraprint{#2year}%
         \iffieldundef{#2endyear}
           {\printfield{extradate}}
           {\iffieldequalstr{#2endyear}{}
              {\printfield{extradate}%
               \printtext{\mkopenendeddaterange}}% <---- added \addnbspace
              {\printtext{%
                 \bibdaterangesep
                 \enddatecircaprint
                 \iffieldundef{#2endseason}
                   {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}%
                    % Optionally print the time after the date
                    \blx@printtime{#2}{end}}
                   {\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}%
                 \printfield{extradate}%
                 \enddateuncertainprint
                 \dateeraprint{#2endyear}}}}}%
  \endgroup}

% Other date formats for completeness

% Avoids error with older biblatex version
% WARNING: of course this means that in older versions the
% date printing macro will not be changed as expected
% this is not an issue for biblatex-iso690 since it only uses
% \mkdaterangefull and \mkdaterangefullextra anyway
\providecommand*{\mkdaterangetrunc@i}{}

\renewrobustcmd*{\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}{}
              {\mkopenendeddaterange}
              {\bibdaterangesep
               \enddatecircaprint
               \iffieldundef{#2endseason}
                 {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
                 {\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}%
               \enddateuncertainprint
               \dateeraprint{#2endyear}}}}}%
  \endgroup}

% Avoids error with older biblatex version
% WARNING: of course this means that in older versions the
% date printing macro will not be changed as expected
% this is not an issue for biblatex-iso690 since it only uses
% \mkdaterangefull and \mkdaterangefullextra anyway
\providecommand*{\mkdaterangetruncextra@i}{}

\renewrobustcmd*{\mkdaterangetruncextra@i}[2]{%
  \begingroup
    \blx@metadateinfo{#2}%
    \iffieldundef{#2year}
      {\blx@nounit}
      {\printtext[{#2date}]{%
         \datecircaprint
         % Such a season component can only come from an ISO8601 season which replaces
         % a normal month so if it exists, we know that a normal date print is ruled out
         \iffieldundef{#2season}
           {\ifdateyearsequal{#2}{#2end}
              {\iffieldsequal{#2month}{#2endmonth}
                 {\csuse{mkbibdate#1}{}{}{#2day}}
                 {\csuse{mkbibdate#1}{}{#2month}{#2day}}}
              {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
               \iffieldsequal{#2dateera}{#2enddateera}{}
                 {\dateeraprint{#2year}}}}
           {\ifdateyearsequal{#2}{#2end}
             {\csuse{mkbibseasondate#1}{}{#2season}}
             {\csuse{mkbibseasondate#1}{#2year}{#2season}%
              \iffieldsequal{#2dateera}{#2enddateera}{}
                {\dateeraprint{#2year}}}}%
         \dateuncertainprint
         \iffieldundef{#2endyear}
           {\printfield{extradate}}
           {\iffieldequalstr{#2endyear}{}
              {\printfield{extradate}%
               \printtext{\mkopenendeddaterange}}
              {\printtext{%
                 \bibdaterangesep
                 \enddatecircaprint
                 \iffieldundef{#2endseason}
                   {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
                   {\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}%
                 \printfield{extradate}%
                 \enddateuncertainprint
                 \dateeraprint{#2endyear}}}}}%
  \endgroup}


% {<datetype>}
\renewrobustcmd*{\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}{}
              {\mkopenendeddaterange}
              {\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>}
\renewrobustcmd*{\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}{}
              {\mkopenendeddaterange}
              {\printtext{%
                 \bibdaterangesep
                 \enddatecircaprint
                 \iffieldundef{#1season}
                   {\blx@ymddate{#1}{end}%
                    % Optionally print the time after the date
                    \blx@printtime{#1}{end}}
                   {\csuse{mkbibseasondateshort}{#1endyear}{#1endseason}}}%
               \enddateuncertainprint
               \dateeraprint{#1endyear}}}}}%
  \endgroup}

% BIBLIOGRAPHY DRIVERS

\DeclareBibliographyDriver{book}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{multi:titles}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \printfield{edition}%
  \newunit\newblock
  \usebibmacro{names:subsidiary}%
  \newunit\newblock
  \usebibmacro{location+publisher+date}%
  \newunit%
  \printfield{version}%
  \usebibmacro{urldate-space}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \printfield{volumes}
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \newunit\newblock
  \usebibmacro{location}%
  \setunit{\addspace}%
  \iftoggle{bbx:totalpages}
    {\printfield{pagetotal}}
    {}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

\DeclareBibliographyDriver{periodical}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  % Names macro just because of author-year style
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{periodical:titles}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \printfield{edition}%
  \newunit\newblock
  \usebibmacro{location+publisher+date}%
  \setunit{\numerationpunct}%
  \usebibmacro{serial:numeration}%
  \setunit{\addspace}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \newunit\newblock
  \usebibmacro{location}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}%

\DeclareBibliographyDriver{article}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{titles}{}{}%
  \newunit\newblock
  \usebibmacro{titles}{journal}{emph}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \printfield{edition}%
  \newunit\newblock
  \iftoggle{bbx:articlepubinfo}
    {\usebibmacro{location+publisher+date}}
    {\usebibmacro{date}}%
  \setunit{\numerationpunct}%
  \usebibmacro{serial:numeration}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \setunit{\addspace}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \newunit\newblock
  \usebibmacro{location}%
  \newunit\newblock
  \printfield{note}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}%

\DeclareBibliographyDriver{inbook}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{titles}{}{}%
  \newunit\newblock
  \usebibmacro{in:}%
  \printnames{bookauthor}%
  \newunit\newblock
  \usebibmacro{host:titles}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \printfield{edition}%
  \newunit\newblock
  \usebibmacro{names:subsidiary}%
  \newunit\newblock
  \usebibmacro{location+publisher+date}%
  \setunit{\addcomma\space}%
  \usebibmacro{book:numeration}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \printfield{version}%
  \setunit{\addspace}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \newunit\newblock
  \usebibmacro{location}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}%

\DeclareBibliographyDriver{incollection}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{titles}{}{}%
  \newunit\newblock
  \usebibmacro{in:}%
  \usebibmacro{editor}%
  \newunit\newblock
  \usebibmacro{host:titles}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \printfield{edition}%
  \newunit\newblock
  \usebibmacro{names:subsidiary}%
  \newunit\newblock
  \usebibmacro{location+publisher+date}%
  % could number be even used in `incollection`?
  % It should be at some other place in this case
  \setunit{\numerationpunct}%
  \usebibmacro{book:numeration}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \printfield{version}%
  \setunit{\addspace}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \newunit\newblock
  \usebibmacro{location}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}%

\DeclareBibliographyDriver{online}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{multi:titles}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \printfield{edition}%
  \newunit\newblock
  \usebibmacro{names:subsidiary}%
  \newunit\newblock
  \usebibmacro{location+publisher+fulldate}%
  \newunit
  \printfield{version}%
  \usebibmacro{urldate-space}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \setunit{\addspace}%
  \iftoggle{bbx:totalpages}
    {\printfield{pagetotal}}
    {}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}%

\DeclareBibliographyDriver{thesis}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{titles}{}{emph}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \usebibmacro{location+publisher+date}%
  \newunit
  \printfield{version}%
  \usebibmacro{urldate-space}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \iftoggle{bbx:thesisinfoinnotes}
    {}
    {\printfield{type}%
     \newunit\newblock
     \printlist{institution}%
     \newunit\newblock
     \usebibmacro{thesissupervisor}}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \setunit{\addspace}%
  \iftoggle{bbx:totalpages}
    {\printfield{pagetotal}}
    {}%
  \newunit\newblock
  \iftoggle{bbx:thesisinfoinnotes}
    {\printfield{type}
     \newunit\newblock
     \printlist{institution}%
     \newunit\newblock
     \usebibmacro{thesissupervisor}}
    {}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}%

\DeclareBibliographyDriver{report}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{titles}{}{emph}%
  \setunit{\addspace}%
  \usebibmacro{medium-type}%
  \newunit\newblock
  \usebibmacro{location+publisher+fulldate}%
  \newunit
  \printfield{version}%
  \usebibmacro{urldate-space}%
  \usebibmacro{urldate}%
  \newunit\newblock
  \iffieldundef{type}
    {}
    {\printfield{type}%
     \setunit*{\addcomma\space}}%
  \printfield{number}%
  \newunit\newblock
  \printlist{institution}%
  \newunit\newblock
  \usebibmacro{identifier}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \setunit{\addspace}%
  \iftoggle{bbx:totalpages}
    {\printfield{pagetotal}}
    {}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

\DeclareBibliographyDriver{patent}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{names:primary}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{titles}{}{emph}%
  \newunit\newblock
  \usebibmacro{names:subsidiary}%
  \newunit\newblock
  \usebibmacro{patentinventor}%
  \newunit
  \usebibmacro{publicationdate}%
  \newunit
  \usebibmacro{applicationdate}%
  \newunit
  \printfield{note}%
  \newunit\newblock
  \printlist{location}%
  \newunit\newblock
  \iffieldundef{type}
    {}
    {\printfield{type}%
     \setunit*{\addspace}}%
  \printfield{number}%
  \newunit\newblock
  \usebibmacro{urldate}%
  \newunit\newblock
  \usebibmacro{availability+access}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}%

% BIBLIOGRAPHY ALIASES

\DeclareBibliographyAlias{mvbook}{book}
\DeclareBibliographyAlias{bookinbook}{inbook}
\DeclareBibliographyAlias{suppbook}{inbook}
\DeclareBibliographyAlias{booklet}{book}
\DeclareBibliographyAlias{collection}{book}
\DeclareBibliographyAlias{suppcollection}{incollection}
\DeclareBibliographyAlias{manual}{book}
\DeclareBibliographyAlias{misc}{book}
\DeclareBibliographyAlias{suppperiodical}{article}
\DeclareBibliographyAlias{proceedings}{collection}
\DeclareBibliographyAlias{inproceedings}{incollection}
\DeclareBibliographyAlias{reference}{collection}
\DeclareBibliographyAlias{inreference}{incollection}
\DeclareBibliographyAlias{unpublished}{book}
\DeclareBibliographyAlias{movie}{book}
\DeclareBibliographyAlias{music}{book}
\DeclareBibliographyAlias{*}{misc}

\endinput

% vim: ft=tex
