%%
%% This is file `expkv.tex',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% expkv.dtx  (with options: `tex')
%% 
%% --------------------------------------------------------------
%% expkv -- an expandable key=val implementation
%% E-mail: jspratte@yahoo.de
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% --------------------------------------------------------------
%% 
%% Copyright (C) 2020 Jonathan P. Spratte
%% 
%% This  work may be  distributed and/or  modified under  the conditions  of the
%% LaTeX Project Public License (LPPL),  either version 1.3c  of this license or
%% (at your option) any later version.  The latest version of this license is in
%% the file:
%% 
%%   http://www.latex-project.org/lppl.txt
%% 
%% This work is "maintained" (as per LPPL maintenance status) by
%%   Jonathan P. Spratte.
%% 
%% This work consists of the file  expkv.dtx
%% and the derived files           expkv.pdf
%%                                 expkv.sty
%%                                 expkv.tex
%% 
\expandafter\ifx\csname ekvVersion\endcsname\relax
\else
  \expandafter\endinput
\fi
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname numexpr\endcsname\relax
  \errmessage{expkv requires e-TeX}
  \expandafter\endinput
\fi
\def\ekvVersion{1.2}
\def\ekvDate{2020-04-10}
\csname ekv@tmp\endcsname
\expandafter\chardef\csname ekv@tmp\endcsname=\catcode`\@
\catcode`\@=11
\long\def\@gobble#1{}
\long\def\@firstofone#1{#1}
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}
\long\def\ekv@fi@secondoftwo\fi\@firstoftwo#1#2{\fi#2}
\long\def\ekv@gobbleto@stop#1\ekv@stop{}
\def\ekv@gobble@mark\ekv@mark{}
\long\def\ekv@gobble@from@mark@to@stop\ekv@mark#1\ekv@stop{}
\long\def\ekv@ifempty#1%
  {%
    \ekv@ifempty@\ekv@ifempty@A#1\ekv@ifempty@B\ekv@ifempty@true
      \ekv@ifempty@A\ekv@ifempty@B\@secondoftwo
  }
\long\def\ekv@ifempty@#1\ekv@ifempty@A\ekv@ifempty@B{}
\long\def\ekv@ifempty@true\ekv@ifempty@A\ekv@ifempty@B\@secondoftwo#1#2{#1}
\long\def\ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo#1#2{#2}
\long\def\ekv@ifempty@true@F\ekv@ifempty@A\ekv@ifempty@B\@firstofone#1{}
\long\def\ekv@ifempty@true@F@gobble\ekv@ifempty@A\ekv@ifempty@B\@firstofone#1#2%
  {}
\long\def\ekv@ifempty@true@F@gobbletwo
    \ekv@ifempty@A\ekv@ifempty@B\@firstofone#1#2#3%
  {}
\long\def\ekv@ifblank@\ekv@mark#1{\ekv@ifempty@\ekv@ifempty@A}
\def\ekv@ifdefined#1%
  {%
    \expandafter
    \ifx\csname\ifcsname #1\endcsname #1\else relax\fi\endcsname\relax
      \ekv@fi@secondoftwo
    \fi
    \@firstoftwo
  }
\def\ekv@name#1#2{\ekv@name@set{#1}\ekv@name@key{#2}}
\def\ekv@name@set#1{ekv#1(}
\def\ekv@name@key#1{#1)}
\def\ekv@undefined@set#1{! expkv Error: Set `#1' undefined.}
\protected\def\ekv@checkvalid#1#2%
  {%
    \ekv@ifempty{#1}%
      {%
        \def\ekv@tmp{}%
        \errmessage{expkv Error: empty set name not allowed}%
      }%
      {%
        \ekv@ifempty{#2}%
          {%
            \def\ekv@tmp{}%
            \errmessage{expkv Error: empty key name not allowed}%
          }%
          \@secondoftwo
      }%
    \@gobble
  }
\def\ekvifdefined#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}}}
\def\ekvifdefinedNoVal#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}N}}
\protected\long\def\ekvdef#1#2#3%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\def\csname\ekv@name{#1}{#2}\endcsname##1{#3}%
        \expandafter\ekv@defset\csname\ekv@undefined@set{#1}\endcsname{#1}%
      }%
  }
\protected\long\def\ekvdefNoVal#1#2#3%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\def\csname\ekv@name{#1}{#2}N\endcsname{#3}%
        \expandafter\ekv@defset\csname\ekv@undefined@set{#1}\endcsname{#1}%
      }%
  }
\protected\def\ekvlet#1#2#3%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\let\csname\ekv@name{#1}{#2}\endcsname#3%
        \expandafter\ekv@defset\csname\ekv@undefined@set{#1}\endcsname{#1}%
      }%
  }
\protected\def\ekvletNoVal#1#2#3%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\let\csname\ekv@name{#1}{#2}N\endcsname#3%
        \expandafter\ekv@defset\csname\ekv@undefined@set{#1}\endcsname{#1}%
      }%
  }
\protected\def\ekvletkv#1#2#3#4%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\let\csname\ekv@name{#1}{#2}\expandafter\endcsname
        \csname\ekv@name{#3}{#4}\endcsname
        \expandafter\ekv@defset\csname\ekv@undefined@set{#1}\endcsname{#1}%
      }%
  }
\protected\def\ekvletkvNoVal#1#2#3#4%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\let\csname\ekv@name{#1}{#2}N\expandafter\endcsname
        \csname\ekv@name{#3}{#4}N\endcsname
        \expandafter\ekv@defset\csname\ekv@undefined@set{#1}\endcsname{#1}%
      }%
  }
\protected\def\ekv@defset#1#2%
  {%
    \ifx#1\relax
      \edef#1##1{\ekv@name@set{#2}\ekv@name@key{##1}}%
    \fi
  }
\def\ekvset#1#2{%
\endgroup
\long\def\ekvset##1##2%
  {%
    \expandafter\ekv@set\csname\ekv@undefined@set{##1}\endcsname
      \ekv@mark##2#1\ekv@stop#1{}%
  }
\long\def\ekv@set##1##2#1%
  {%
    \ekv@gobble@from@mark@to@stop##2\ekv@endset\ekv@stop
    \ekv@set@other##1##2,\ekv@stop,%
    \ekv@set##1\ekv@mark
  }
\long\def\ekv@endset
    \ekv@stop\ekv@set@other##1,\ekv@stop,\ekv@set##2\ekv@mark
    ##3%
  {##3}
\long\def\ekv@eq@other##1=##2\ekv@mark##3##4\ekv@stop
  {%
    ##3##1\ekv@stop\ekv@mark##2%
  }
\long\def\ekv@eq@active##1#2##2\ekv@mark##3##4\ekv@stop
  {%
    ##3##1\ekv@stop\ekv@mark##2%
  }
\long\def\ekv@set@other##1##2,%
  {%
    \ekv@gobble@from@mark@to@stop##2\ekv@endset@other\ekv@stop
    \ekv@eq@other##2\ekv@nil\ekv@mark\ekv@set@eq@other@a
      =\ekv@mark\ekv@set@eq@active\ekv@stop
    ##1%
    \ekv@set@other##1\ekv@mark
  }
\long\def\ekv@set@eq@other@a##1\ekv@stop
  {%
    \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@other@active@a
      #2\ekv@mark\ekv@set@eq@other@b\ekv@stop
  }
\long\def\ekv@set@eq@other@b
    ##1\ekv@nil\ekv@mark\ekv@set@eq@other@active@a\ekv@stop\ekv@mark
  {%
    \ekv@strip{##1}\ekv@set@pair
  }
\long\def\ekv@set@eq@other@active@a##1\ekv@stop##2\ekv@nil\ekv@mark
  {%
    \ekv@set@eq@other@active@b{##1}##2=%
  }
\long\def\ekv@set@eq@other@active@b##1%
  {%
    \ekv@strip{##1}\ekv@set@pair
  }
\long\def\ekv@set@eq@active
    ##1\ekv@nil\ekv@mark\ekv@set@eq@other@a\ekv@stop\ekv@mark
  {%
    \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@active@
      #2\ekv@mark\ekv@set@noeq\ekv@stop
  }
\long\def\ekv@set@eq@active@##1\ekv@stop
  {%
    \ekv@strip{##1}\ekv@set@pair
  }
\long\def\ekv@set@noeq##1\ekv@nil\ekv@mark\ekv@set@eq@active@\ekv@stop\ekv@mark
  {%
    \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F@gobble
      \ekv@ifempty@A\ekv@ifempty@B\@firstofone
      {\ekv@strip{##1}\ekv@set@key}%
  }
\long\def\ekv@endset@other
    \ekv@stop
    \ekv@eq@other##1\ekv@nil\ekv@mark\ekv@set@eq@other@a
    =\ekv@mark\ekv@set@eq@active\ekv@stop
    ##2%
    \ekv@set@other##3\ekv@mark
  {}
\long\def\ekvbreak##1##2\ekv@stop#1##3{##1}
\long\def\ekvbreakPreSneak ##1##2\ekv@stop#1##3{##1##3}
\long\def\ekvbreakPostSneak##1##2\ekv@stop#1##3{##3##1}
\long\def\ekvsneak##1##2\ekv@stop#1##3%
  {%
    ##2\ekv@stop#1{##3##1}%
  }
\long\def\ekvsneakPre##1##2\ekv@stop#1##3%
  {%
    ##2\ekv@stop#1{##1##3}%
  }
\long\def\ekvparse##1##2##3%
  {%
    \ekv@parse##1##2\ekv@mark##3#1\ekv@stop#1%
  }
\long\def\ekv@parse##1##2##3#1%
  {%
    \ekv@gobble@from@mark@to@stop##3\ekv@endparse\ekv@stop
    \ekv@parse@other##1##2##3,\ekv@stop,%
    \ekv@parse##1##2\ekv@mark
  }
\long\def\ekv@endparse
    \ekv@stop\ekv@parse@other##1,\ekv@stop,\ekv@parse##2\ekv@mark
  {}
\long\def\ekv@parse@other##1##2##3,%
  {%
    \ekv@gobble@from@mark@to@stop##3\ekv@endparse@other\ekv@stop
    \ekv@eq@other##3\ekv@nil\ekv@mark\ekv@parse@eq@other@a
      =\ekv@mark\ekv@parse@eq@active\ekv@stop
    ##1##2%
    \ekv@parse@other##1##2\ekv@mark
  }
\long\def\ekv@parse@eq@other@a##1\ekv@stop
  {%
    \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active@a
      #2\ekv@mark\ekv@parse@eq@other@b\ekv@stop
  }
\long\def\ekv@parse@eq@other@b
    ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active@a\ekv@stop\ekv@mark
  {%
    \ekv@strip{##1}\ekv@parse@pair
  }
\long\def\ekv@parse@eq@other@active@a##1\ekv@stop##2\ekv@nil\ekv@mark
  {%
    \ekv@parse@eq@other@active@b{##1}##2=%
  }
\long\def\ekv@parse@eq@other@active@b##1%
  {%
    \ekv@strip{##1}\ekv@parse@pair
  }
\long\def\ekv@parse@eq@active
    ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@a\ekv@stop\ekv@mark
  {%
    \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@active@
      #2\ekv@mark\ekv@parse@noeq\ekv@stop
  }
\long\def\ekv@parse@eq@active@##1\ekv@stop
  {%
    \ekv@strip{##1}\ekv@parse@pair
  }
\long\def\ekv@parse@noeq
    ##1\ekv@nil\ekv@mark\ekv@parse@eq@active@\ekv@stop\ekv@mark
  {%
    \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F@gobbletwo
      \ekv@ifempty@A\ekv@ifempty@B\@firstofone
      {\ekv@strip{##1}\ekv@parse@key}%
  }
\long\def\ekv@endparse@other
    \ekv@stop
    \ekv@eq@other##1\ekv@nil\ekv@mark\ekv@parse@eq@other@a
    =\ekv@mark\ekv@parse@eq@active\ekv@stop
    ##2%
    \ekv@parse@other##3\ekv@mark
  {}
\long\def\ekv@parse@pair##1##2\ekv@nil
  {%
    \ekv@strip{##2}\ekv@parse@pair@{##1}%
  }
\long\def\ekv@parse@pair@##1##2##3##4%
  {%
    \unexpanded{##4{##2}{##1}}%
  }
\long\def\ekv@parse@key##1##2##3%
  {%
    \unexpanded{##2{##1}}%
  }
}
\begingroup
\catcode`\,=13
\catcode`\==13
\ekvset,=
\def\ekvchangeset#1%
  {%
    \expandafter\ekv@changeset\csname\ekv@undefined@set{#1}\endcsname\ekv@mark
  }
\long\def\ekv@changeset#1#2\ekv@set@other#3#4\ekv@set#5%
  {%
    \ekv@gobble@mark#2\ekv@set@other#1#4\ekv@set#1%
  }
\long\def\ekv@set@pair#1#2\ekv@nil#3%
  {%
    \expandafter\ekv@set@pair@
      \csname
        \ifcsname #3{#1}\endcsname
          #3{#1}%
        \else
          relax%
        \fi
      \endcsname
      {#2}%
      {%
        \ekv@ifdefined{#3{#1}N}%
          \ekv@err@noarg
          \ekv@err@unknown
          #3{#1}%
      }%
  }
\long\def\ekv@set@pair@#1#2%
  {%
    \ifx#1\relax
      \ekv@fi@secondoftwo
    \fi
    \@firstoftwo
    {\ekv@strip{#2}#1}%
  }
\long\def\ekv@set@key#1#2%
  {%
    \expandafter\ekv@set@key@
      \csname
        \ifcsname #2{#1}N\endcsname
          #2{#1}N%
        \else
          relax%
        \fi
      \endcsname
      {%
        \ekv@ifdefined{#2{#1}}%
          \ekv@err@reqval
          \ekv@err@unknown
          #2{#1}%
      }%
  }
\def\ekv@set@key@#1%
  {%
    \ifx#1\relax
      \ekv@fi@secondoftwo
    \fi
    \@firstoftwo#1%
  }
\begingroup
\edef\ekv@err
  {%
    \endgroup
    \unexpanded{\long\def\ekv@err}##1%
      {%
        \unexpanded{\expandafter\ekv@err@\@firstofone}%
        {\unexpanded\expandafter{\csname ! expkv Error:\endcsname}##1.}%
        \unexpanded{\ekv@stop}%
      }%
  }
\ekv@err
\def\ekv@err@{\expandafter\ekv@gobbleto@stop}
\long\def\ekv@err@common #1#2{\expandafter\ekv@err@common@\string#2{#1}}
\long\def\ekv@err@common@#1`#2' #3.#4#5{\ekv@err{#4 (`#5', set `#2')}}
\long\def\ekv@err@unknown#1#2{\ekv@err@common{unknown key}#1{#2}}
\long\def\ekv@err@noarg  #1#2{\ekv@err@common{value forbidden}#1{#2}}
\long\def\ekv@err@reqval #1#2{\ekv@err@common{value required}#1{#2}}
\def\ekv@strip#1%
  {%
    \long\def\ekv@strip##1%
      {%
        \ekv@strip@a
          ##1%
          \ekv@nil
          \ekv@mark#1%
          #1\ekv@nil{}%
        \ekv@stop
      }%
    \long\def\ekv@strip@a##1\ekv@mark#1##2\ekv@nil##3%
      {%
        \ekv@strip@b##3##1##2\ekv@nil
      }%
    \long\def\ekv@strip@b##1#1\ekv@nil
      {%
        \ekv@strip@c##1\ekv@nil
      }%
    \long\def\ekv@strip@c\ekv@mark##1\ekv@nil##2\ekv@stop##3%
      {%
        ##3{##1}%
      }%
  }
\ekv@strip{ }
\catcode`\@=\ekv@tmp
%% 
%%
%% End of file `expkv.tex'.
