%% regulatory.sty
%% Copyright 2024 E. Nijenhuis
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status ‘maintained’.
%
% The Current Maintainer of this work is E. Nijenhuis.
%
% This work consists of the files regulatory.tex,
% regulatory-preamble.tex, regulatory-nl.tex, regulatory-en.tex,
% example1.bib, example2.bib,
% example1-nl.tex, example2-nl.tex,
% example1-en.tex, example2-en.tex,
% md-example.tex, example.md,
% regulatory.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{regulatory}[2024/09/04 0.0.4 Xerdi's Regulatory Package]

\RequirePackage{pgfopts}
\RequirePackage{xifthen}
\RequirePackage{keyval}
\RequirePackage{xstring}
\RequirePackage{xspace}

\newif\ifregulatory@markdown
\newif\ifregulatory@bibtogls
\newif\ifregulatory@legacy
\newif\ifregulatory@alldefs
\pgfkeys{
    /regulatory/.is family,
    /regulatory,
    md/.is if=regulatory@markdown,
    md=false,
    bib2gls/.is if=regulatory@bibtogls,
    bib2gls=true,
    legacy/.is if=regulatory@legacy,
    legacy=false,
    alldefs/.is if=regulatory@alldefs,
    alldefs=false
}

\InputIfFileExists{regulatory.cfg}{%
    \PackageInfo{regulatory}{Using local configuration file}%
}{%
    \PackageInfo{regulatory}{No local configuration file}%
}

\newboolean{regulatory@nameinlink}
\setboolean{regulatory@nameinlink}{true}

\ProcessPgfPackageOptions{/regulatory}

% Markdown support
\ifregulatory@markdown
\RequirePackage[hashEnumerators,definitionLists,hybrid,headerAttributes=true]{markdown}
\setkeys{markdownRenderers}{
headingOne={\article{#1}},
olItemWithNumber={\item{}},
olBeginTight={\begin{paras}},
olEndTight={\end{paras}},
olBegin={\begin{paras}},
olEnd={\end{paras}},
dlBeginTight={\begin{labeling}{\@glswidestname}},
dlEndTight={\end{labeling}},
dlBegin={\begin{labeling}{\@glswidestname}},
dlEnd={\end{labeling}}%
\renewcommand\markdownRendererOlItemWithNumber[1]{\item{}\label{ml:##1}}
}
\fi

% Pakketten ná markdown (anders gaat enumitem kapot)
\RequirePackage{xcolor}
\RequirePackage{xassoccnt}
\RequirePackage{xpatch}
\RequirePackage{titlesec}
\RequirePackage{enumitem}
\RequirePackage{fmtcount}
\RequirePackage{scrextend}
\RequirePackage{xr-hyper}
\RequirePackage[user,counter,hyperref,xr]{zref}
\RequirePackage{zref-xr,zref-user,zref-clever,zref-hyperref}
\RequirePackage{hyperref}
\RequirePackage{pgf}
\RequirePackage[sanitize=none,nopostdot]{glossaries}
\ifregulatory@bibtogls
\RequirePackage[record,style=alttree]{glossaries-extra}
\else
\PackageWarning{regulatory}{Using glossaries for definitions without bib2gls. This is mostly untested.}
\fi

\RequirePackage{attachfile2}
\RequirePackage{translations}

\newboolean{regulatory@defslisted}
\setboolean{regulatory@defslisted}{false}

% Kleuren
\providecolor{artlabel}{rgb}{0,0,0}
\providecolor{arttitle}{rgb}{0,0,0}
\providecolor{paralabel}{rgb}{0,0,0}
\providecolor{paratitle}{rgb}{0,0,0}
\providecolor{sublabel}{rgb}{0,0,0}
\providecolor{subtitle}{rgb}{0,0,0}



% Artikelen
\newcounter{article}
\titleclass{\article}[0]{straight}
\titleformat{\article}{\normalfont\color{arttitle}}{\bfseries\color{artlabel}Artikel \thearticle.\quad}{1em}{}
\titlespacing*{\article}{0pt}{3.5ex plus 1ex minus .2ex}{5pt}

\newcounter{para}
\titleclass{\para}{straight}[\article]
\titleformat{\para}{\normalfont\color{paratitle}}{\normalfont\color{paralabel}\thearticle.\thepara.\quad}{1em}{}
\titlespacing*{\para}{0pt}{3.5ex plus 1ex minus .2ex}{5pt}
\counterwithin{para}{article}

\renewcommand{\thearticle}{\arabic{article}}
\renewcommand{\thepara}{\arabic{para}}
\makeatletter
\newcommand{\l@article}{\@dottedtocline{1}{1.5em}{2.3em}}
\def\toclevel@article{2}
\newcommand{\l@para}{\@dottedtocline{1}{3.8em}{2.3em}}
\def\toclevel@para{3}

\newcounter{provisions}
\newlist{provisions}{enumerate}{1}
\setlist[provisions,1]{label=\arabic*.,align=left,itemsep=0pt}
\counterwithin{provisions}{section}

\newlist{paras}{enumerate}{2}
\setlist[paras,1]{label=\thearticle.\arabic*.,ref=\arabic*,align=left,itemsep=0pt}
\setlist[paras,2]{label=\abalphnum{\arabic*}),ref=\arabic*,itemsep=0pt}
\counterwithin{parasi}{article}
\counterwithin{parasii}{parasi}

\zref@newprop{article}[-1]{\number\value{article}}
\zref@newprop{para}[-1]{\ifnum\value{para}>0\number\value{para}\else\number\value{parasi}\fi}
\zref@newprop{sub}[-1]{\number\value{parasii}}
\zref@addprops{main}{article,para,sub}

\DeclareTranslation{dutch}{article}{artikel}
\DeclareTranslation{dutch}{paragraph}{lid}
\DeclareTranslation{dutch}{subparagraph}{onderdeel}
\DeclareTranslation{dutch}{Article}{Artikel}
\DeclareTranslation{dutch}{Paragraph}{Lid}
\DeclareTranslation{dutch}{Subparagraph}{Onderdeel}
\DeclareTranslation{dutch}{to}{tot}
\DeclareTranslation{dutch}{Definitions}{Definities}
\DeclareTranslation{dutch}{of the}{van de}

\zcRefTypeSetup{article}{%
    Name-sg = \GetTranslation{Article},
    name-sg = \GetTranslation{article},
    Name-pl = Artikelen,
    name-pl = artikelen
}
\zcRefTypeSetup{para}{%
    Name-sg = \GetTranslation{Paragraph},
    name-sg = \GetTranslation{paragraph},
    Name-pl = Leden,
    name-pl = leden
}
\zcRefTypeSetup{parasi}{%
    Name-sg = \GetTranslation{Paragraph},
    name-sg = \GetTranslation{paragraph},
    Name-pl = Leden,
    name-pl = leden
}
\zcRefTypeSetup{parasii}{%
    Name-sg = \GetTranslation{Subparagraph},
    name-sg = \GetTranslation{subparagraph},
    Name-pl = Onderdelen,
    name-pl = onderdelen
}

\makeatother
{\catcode`\#=12 \gdef\hashchar{#}}
\makeatletter
\def\rref@linkpr{\href{\rref@current@fullurl}}

\newboolean{rref@cap}
\def\@ifrrefcap#1#2{%
    \ifthenelse{\boolean{rref@cap}}{%
        #1%
        \ifthenelse{\equal{#1}{}}{}{%
            \setboolean{rref@cap}{false}%
        }%
    }{%
        #2%
    }%
}
\def\@ifnameinlink#1#2{%
    \ifthenelse{\boolean{regulatory@nameinlink}}{#1}{#2}%
}

\newcommand\rref@middleconjunction{, }
\newcommand\rref@lastconjunction{ \GetTranslation{and} }
\newcommand\rref@rangeconjunction{ \GetTranslation{to} }

\newcommand\setmiddleconjunction[1]{\renewcommand\rref@middleconjunction{#1}}
\newcommand\setlastconjunction[1]{\renewcommand\rref@lastconjunction{#1}}
\newcommand\setrangeconjunction[1]{\renewcommand\rref@rangeconjunction{#1}}

\newcommand\setconjunction[3]{%
    \setmiddleconjunction{#1}%
    \setlastconjunction{#1}%
    \setrangeconjunction{#1}%
}

\newcommand\setjuncto{%
\setlastconjunction{ jo.\ }%
}

\newcommand\unsetjuncto{%
\setlastconjunction{ \GetTranslation{and} }%
}

\ifregulatory@legacy
\setjuncto
\fi

\newcommand\rref@refformat@noop[1]{#1}
\newcommand\rref@refformat@parenthesis[1]{(#1)}
\newcommand\rref@refformat@ordinal[1]{\@ifrrefcap{\Ordinalstringnum{#1}}{\ordinalstringnum{#1}}}
\newcommand\rref@refformat@alpha[1]{\@ifrrefcap{\ABAlphnum{#1}}{\abalphnum{#1}}}
\newcommand\rref@label@prefix[2]{#1 #2}
\newcommand\rref@label@postfix[2]{#2 #1}
\newcommand\rref@label@refonly[2]{\@gobble{#1}#2}
\newcommand\rref@group@braced[1]{{[}#1{]~}}

\newcommand\rref@init@lang@article[1]{%
    \pgfkeys{/rref/#1/article/.is family,
        /rref/#1/article,
        name/.initial=\GetTranslation{article},
        Name/.initial=\GetTranslation{Article},
        ref format/.initial=\rref@refformat@noop,
        label format/.initial=\rref@label@prefix,
        group conjunction/.initial={},
        group format/.initial=\rref@refformat@noop
    }
}
\newcommand\rref@init@lang@para[1]{%
    \pgfkeys{/rref/#1/para/.is family,
        /rref/#1/para,
        name/.initial=\GetTranslation{paragraph},
        Name/.initial=\GetTranslation{Paragraph},
        ref format/.initial=\rref@refformat@parenthesis,
        label format/.initial=\rref@label@refonly,
        group conjunction/.initial={,},
        group format/.initial=\rref@refformat@noop
    }
}
\newcommand\rref@init@lang@sub[1]{%
    \pgfkeys{/rref/#1/sub/.is family,
        /rref/#1/sub,
        name/.initial=\GetTranslation{subparagraph},
        Name/.initial=\GetTranslation{Subparagraph},
        ref format/.initial=\rref@refformat@ordinal,
        label format/.initial=\rref@label@postfix,
        group conjunction/.initial={,},
        group format/.initial=\rref@group@braced
    }
}

\newcommand\rref@setup@lang[3]{%
    \pgfkeys{/rref/#1/#2,#3}
}

\newcommand\rref@setup[4]{%
    \rref@init@lang@article{#1}
    \rref@init@lang@para{#1}
    \rref@init@lang@sub{#1}
    \rref@setup@lang{#1}{article}{#2}
    \rref@setup@lang{#1}{para}{#3}
    \rref@setup@lang{#1}{sub}{#4}
}

% The defaults are already based on English, so no arguments are given.
\rref@setup{english}{}{}{}

\rref@setup{dutch}{
    group conjunction={,~}
}{
    ref format=\rref@refformat@ordinal,
    label format=\rref@label@postfix,
    group conjunction={,~},
    group format=\rref@refformat@noop
}{
    ref format=\rref@refformat@alpha,
    label format=\rref@label@prefix,
    group conjunction={,~},
    group format=\rref@refformat@noop
}%

\newcommand\rref@set[4][\languagename]{%
    \pgfkeysgetvalue{/rref/#1/#2/#3}{#4}%
}

\newcommand\rref@get[3][\languagename]{%
    \pgfkeysvalueof{/rref/#1/#2/#3}%
}

\newcommand\rref@name[2][\languagename]{\@ifrrefcap{\rref@get[#1]{#2}{Name}}{\rref@get[#1]{#2}{name}}}
\def\rref@article@name{\rref@name{article}}
\def\rref@para@name{\rref@name{para}}
\def\rref@sub@name{\rref@name{sub}}

\newcommand\rref@refformat[2][\rref@current@type]{\rref@set{#1}{ref format}{\@@rrefformat}\@@rrefformat{#2}}
\newcommand\rref@labelformat[2][\rref@current@type]{\rref@set{#1}{label format}{\@@labelformat}\@@labelformat{\rref@name{#1}}{#2}}
\newcommand\rref@linkformat[2][\rref@current@type]{%
    \@ifnameinlink{%
        \rref@linkpr{\rref@labelformat[#1]{\rref@refformat[#1]{#2}}}%
    }{%
        \rref@labelformat[#1]{\rref@linkpr{\rref@refformat[#1]{#2}}}%
    }%
}
\newcommand\rref@reflink[2][\rref@current@type]{%
    \rref@linkpr{\rref@refformat[#1]{#2}}%
}
\newcommand\rref@groupformat[2][\rref@current@type]{%
    \rref@set{#1}{group format}{\@@groupformat}\@@groupformat{#2}%
}

\def\rref{\@ifstar\rref@star\rref@nostar}
\def\rref@star#1{%
    \rref@setcurrent{#1}%
    \ifnum\rref@current@value>0%
        \rref@refformat{\rref@current@value}%
    \else%
        \zref{#1}%
    \fi%
}
\def\rref@nostar#1{%
    \rref@setcurrent{#1}%
    \ifnum\rref@current@value>0%
        \rref@linkpr{\rref@refformat{\rref@current@value}}%
    \else%
        \zcref[noname]{#1}%
    \fi%
}
\def\Rref{\@ifstar\Rref@star\Rref@nostar}
\def\Rref@star#1{%
    \setboolean{rref@cap}{true}%
    \rref*{#1}%
}
\def\Rref@nostar#1{%
    \setboolean{rref@cap}{true}%
    \rref{#1}%
}

\def\nref{\@ifstar\nref@star\nref@nostar}
\def\nref@star#1{%
    \rref@setcurrent{#1}%
    \ifnum\rref@current@value>0%
        \rref@labelformat{\rref@refformat{\rref@current@value}}%
    \else%
        \zcref*{#1}%
    \fi%
}
\def\nref@nostar#1{%
    \rref@setcurrent{#1}%
    \ifnum\rref@current@value>0%
        \rref@linkformat{\rref@current@value}%
    \else%
        \zcref{#1}%
    \fi%
}
\def\Nref{\@ifstar\Nref@star\Nref@nostar}
\def\Nref@star#1{%
    \setboolean{rref@cap}{true}%
    \nref*{#1}%
}
\def\Nref@nostar#1{%
    \setboolean{rref@cap}{true}%
    \nref{#1}%
}

\def\rref@setcurrent#1{%
    \def\rref@current{#1}%
    \def\rref@current@counter{\zref@extract{#1}{counter}}%
    \def\rref@current@article{\zref@extract{#1}{article}}%
    \def\rref@current@para{\zref@extract{#1}{para}}%
    \def\rref@current@sub{\zref@extract{#1}{sub}}%
    \rref@settype%
    \rref@setlink%
}
\def\rref@settype{%
    \ifthenelse{\equal{article}{\rref@current@counter}}{%
        \def\rref@current@type{article}%
        \def\rref@current@value{\rref@current@article}%
        \def\rref@current@fullformat{}%
    }{%
        \ifthenelse{\equal{para}{\rref@current@counter}\or\equal{parasi}{\rref@current@counter}}{%
            \def\rref@current@type{para}%
            \def\rref@current@value{\rref@current@para}%
        }{%
            \ifthenelse{\equal{parasii}{\rref@current@counter}}{%
                \def\rref@current@type{sub}%
                \def\rref@current@value{\rref@current@sub}%
            }{%
                \def\rref@current@type{}%
                \def\rref@current@value{-1}%
            }%
        }%
    }%
}
\def\rref@setlink{%
    \def\rref@current@anchor{\zref@extract{\rref@current}{anchor}}%
    \def\rref@current@url{\zref@extractdefault{\rref@current}{url}{}}%
    \def\rref@current@fullurl{\rref@current@url\hashchar\rref@current@anchor}%
}
\newcommand\rref@number[1]{%
    \zref@extractdefault{#1}{\rref@current@type}{-1}%
}

\newcommand\aref@setcurrent[1]{%
    \def\aref@current@reflink{\rref@reflink[\rref@current@type]{\rref@current@value}}%
    \zref@ifrefcontainsprop{#1}{externaldocument}{%
        \filename@parse{\expanded{\zref@extract{#1}{externaldocument}}}%
        \edef\@aref@filelabel{\expanded{\filename@base}}%
        \def\@aref@postlink{%
            , \documentlabel{\@aref@filelabel}%
            \ifthenelse{\equal{\artifactfootnote{\@aref@filelabel}}{true}\and\equal{\artifactreferred{\@aref@filelabel}}{false}}{%
                \documentfootnote{\@aref@filelabel}%
            }{}%
        }%
    }{%
        \def\@aref@postlink{}%
    }%
    \ifthenelse{\equal{\rref@current@type}{article}}{%
        \def\@aref@prefix{}%
        \def\@aref@postfix{}%
    }{%
        \ifthenelse{\equal{\rref@current@type}{para}}{%
            \def\@aref@prefix{%
                \rref@labelformat[article]{\rref@current@article}\rref@get{article}{group conjunction}%
            }%
            \def\@aref@postfix{}%
        }{%
            \ifthenelse{\equal{\rref@current@type}{sub}}{%
                \def\@aref@prefix{%
                    \rref@labelformat[article]{\rref@refformat[article]{\rref@current@article}}\rref@get{article}{group conjunction}%
                    \rref@labelformat[para]{\rref@refformat[para]{\rref@current@para}}\rref@get{para}{group conjunction}%
                }%
                \def\@aref@postfix{}%
            }{%
                \def\@aref@prefix{}%
                \def\@aref@postfix{}%
            }%
        }%
    }%
}

\newcommand{\aref}[1]{%
    \def\@@arefsetup##1##2{%
        \rref@setcurrent{##1}%
        \aref@setcurrent{##1}%
        \rref@groupformat{\@aref@prefix}%
        ##2%
        \@aref@postfix\@aref@postlink%
    }%
    \IfSubStr{#1}{,}{%
        \StrBefore[1]{#1}{,}[\firstarg]%
        \@@arefsetup{\firstarg}{\rref@labelformat{\aref@group{#1}}}%
    }{%
        \@@arefsetup{#1}{\nref{#1}}%
    }%
}

\newcommand{\Aref}[1]{%
    \setboolean{rref@cap}{true}%
    \aref{#1}%
}

\def\listterminator{-1}

\newcommand\aref@group[1]{%
    \bubblesort{#1}%
    \expandafter\begincompaction\sortedlist,\listterminator,\relax%
}
\def\begincompaction#1,#2\relax{%
    \def\startlist{#1}%
    \def\currentendlist{#1}%
    \findendlist#2\relax%
}
\def\findendlist#1,#2\relax{%
    \ifnum\numexpr\rref@number{\currentendlist}+1\relax=\rref@number{#1}\relax%
        \def\currentendlist{#1}%
        \findendlist#2\relax%
    \else%
        \ifnum\rref@number{\startlist}=\rref@number{\currentendlist}\relax%
            \ignorespaces\rref{\startlist}\unskip%
        \else%
            \ifnum\numexpr\rref@number{\startlist}+1\relax=\rref@number{\currentendlist}\relax%
                \ignorespaces\rref{\startlist}\unskip%
                \ifnum\rref@number{#1}=\listterminator\relax%
                    \rref@lastconjunction%
                \else%
                    \rref@middleconjunction%
                \fi\ignorespaces%
                \rref{\currentendlist}\unskip%
            \else%
                \ignorespaces\rref{\startlist}\unskip\rref@rangeconjunction\ignorespaces%
                \rref{\currentendlist}\unskip%
            \fi%
        \fi%
        \ifnum\rref@number{#1}=\listterminator\else%
            \IfStrEq{#2}{\listterminator,}{\rref@lastconjunction}{\rref@middleconjunction}\begincompaction#1,#2\relax%
        \fi%
    \fi%
}
\newcommand\bubblesort[1]{\def\sortedlist{}\sortlist#1,\listterminator,\relax}
\def\sortlist#1,#2,#3\relax{%
    \rref@setcurrent{#1}%
    \aref@setcurrent{#1}%
    \ifnum\rref@number{#2}=\listterminator\relax%
        \edef\sortedlist{\sortedlist#1}%
    \else%
        \ifnum\rref@number{#1}<\rref@number{#2}\relax%
            \edef\sortedlist{\sortedlist#1,}%
            \sortlist#2,#3\relax%
        \else%
            \let\tmp\sortedlist%
            \def\sortedlist{}%
            \expandafter\sortlist\tmp#2,#1,#3\relax%
        \fi%
    \fi%
}

\GetAllResetLists
\RegisterPostLabelHook{\zlabel}

\newglossary*{definitions}{Definitions}
\newglossary*{externals}{Externals}

\newcommand\artifact@footnote@noop[1]{#1}
\newcommand\artifact@def@label@default[1]{~(\GetTranslation{see} #1)}

\newcommand\newartifact[2]{%
    \pgfkeys{
        /artifact/#1/.is family,
        /artifact/#1,
        name/.initial = #1,
        filename/.initial = #1.pdf,
        path/.initial = ./,
        ref label/.initial=,
        def label/.initial=\artifact@def@label@default,
        footnote/.initial = true,
        footnote label/.initial=\artifact@footnote@noop,
        url/.initial=,
        referred/.initial = false,
        defs/.initial=,
        author/.initial=<author>,
        subject/.initial=<subject>,
        description/.initial=<description>
    }
    \pgfkeys{/artifact/#1,#2}
}
\newcommand\@aget[2]{\pgfkeysvalueof{/artifact/#1/#2}}
\newcommand\artifact@setfootnotelabel[1]{\pgfkeysgetvalue{/artifact/#1/footnote label}{\artifactfootnotelabel}}
\newcommand\artifactname[1]{\@aget{#1}{name}}
\newcommand\artifactfullname[1]{\@aget{#1}{path}\@aget{#1}{name}}
\newcommand\artifactfilename[1]{\@aget{#1}{filename}}
\newcommand\artifactfullfilename[1]{\@aget{#1}{path}\@aget{#1}{filename}}
\newcommand\artifactfootnote[1]{\@aget{#1}{footnote}}
\newcommand\artifacturl[1]{\@aget{#1}{url}}
\newcommand\artifactreferred[1]{\@aget{#1}{referred}}
\newcommand\artifactdefs[1]{\@aget{#1}{defs}}
\newcommand\artifactauthor[1]{\@aget{#1}{author}}
\newcommand\artifactsubject[1]{\@aget{#1}{subject}}
\newcommand\artifactdescription[1]{\@aget{#1}{description}}

\renewcommand{\glossarysection}[2][]{\@gobble{#1}\@gobble{#2}}%
\setglossarypreamble[definitions]{%
    \ifnum\value{article}=0%
        \article{\GetTranslation{Definitions}}\label{art:definitions}%
        \vspace*{-\baselineskip}%
    \else%
        \ifnum\value{parasi}=0%
            \vspace*{-\baselineskip}%
        \fi%
    \fi%
}

\newcommand\describe[1]{\setboolean{regulatory@defslisted}{true}\glstarget{#1}{\glsentrydesc{#1}}}
\newcommand\printdefs[1]{%
    \renewcommand*{\glsnamefont}[1]{\textmd{##1}}%
    \setboolean{regulatory@defslisted}{true}%
    \glssetwidest{#1}%
    \ifnum\value{parasi}>0%
        \def\@@wrapper##1{\begin{minipage}{\linewidth}##1\end{minipage}}%
    \else%
        \def\@@wrapper##1{##1}%
    \fi%
    \@@wrapper{%
        \ifregulatory@bibtogls%
            \printunsrtglossary[type=definitions,style=alttree,title={},nonumberlist=true]%
        \else%
            \printglossary[type=definitions,style=alttree,title={},nonumberlist=true]%
        \fi%
    }%
}

\attachfilesetup{color=black}

\newcommand\documentattachment[2]{%
    \def\@tmpfile{\artifactfullfilename{#1}}%
    \IfFileExists{\@tmpfile}{%
    \textattachfile[description={\artifactdescription{#1}},subject={\artifactsubject{#1}},author={\artifactauthor{#1}}]{\@tmpfile}{#2}}%
    {\texttt{#2}}%
}

\newcommand\documentlabel[1]{%
    \def\@@label{\@aget{#1}{ref label}}%
    \ifthenelse{\equal{\@@label}{}}{%
        \GetTranslation{of the} \artifactsubject{#1}%
    }{\@@label}%
}

\newcommand\documentfootnote[2][]{%
    \pgfkeysifdefined{/artifact/#2/referred}{%
        \pgfkeys{/artifact/#2,referred=true}%
        \artifact@setfootnotelabel{#2}%
        \ifthenelse{\equal{#1}{}}{%
            \def\artifact@description{\artifactsubject{#2}}%
        }{%
            \def\artifact@description{#1}%
        }%
        \footnote{\artifactfootnotelabel{\documentattachment{#2}{\artifact@description}}}%
    }{\PackageWarning{regulatory}{Artifact does not exists '#2'}\footnote{DOCUMENT NOT FOUND '#2'}}
}

\edef\@regulatory@bib@selection{}
\ifregulatory@alldefs
\edef\@regulatory@bib@selection{,selection=all}
\fi

\newcommand\loadglsdefs[1]{%
    \setboolean{regulatory@defslisted}{true}%
    \ifregulatory@bibtogls%
        \GlsXtrLoadResources[type=definitions,src={#1},sort={nl-NL},category={defs}\@regulatory@bib@selection]%
    \else%
        \loadglsentries[definitions]{#1}%
    \fi%
}

\newcommand\loadextdefs[2][externals]{%
    \ifregulatory@bibtogls%
        \GlsXtrLoadResources[type=externals,src={#2},sort={nl-NL},category={#1}]%
    \else%}{%
        \loadglsentries[externals]{#2}%
    \fi%}%
    \glsdefpostlink{#1}{%
        \ifthenelse{\equal{\artifactreferred{#1}}{true}}{}{%
            \@aget{#1}{def label}{%
                \artifactsubject{#1}%
                \documentfootnote{#1}%
            }%
        }%
    }%
}

\newcommand\refdocument[3][ext-]{%
    \newartifact{#2}{footnote=false,#3}%
    \zexternaldocument[#1]{\artifactfullname{#2}}[#2]%
}

\newcommand\masterdocument[3][ext-]{%
    \newartifact{#2}{#3}%
    \zexternaldocument[#1]{\artifactfullname{#2}}[#2]%
    \ifthenelse{\equal{\string\artifactdefs{#2}}{}}{%
        \PackageWarning{regulatory}{No definitions given to the master document. \the\gls commands will therefore not work.}%
    }{%
        \PackageWarning{regulatory}{Agreement file loads #1, #2, #3.}
        \loadextdefs[#2]{\artifactdefs{#2}}%
        \ifregulatory@bibtogls%
            \glssetcategoryattribute{#2}{targeturl}{\artifactfilename{#2}}%
            \glssetcategoryattribute{#2}{targetname}{\glolinkprefix\glslabel}%
        \fi%
    }%
}

\AtEndPreamble{%
\ifregulatory@bibtogls\else%
\ifthenelse{\boolean{regulatory@defslisted}}{\makeglossaries}{}%
\fi%
}
\AtEndDocument{%
\ifregulatory@alldefs\glsaddallunused\fi%
}