%%
%% 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
%% 
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname numexpr\endcsname\relax
  \errmessage{expkv requires e-TeX}
  \expandafter\endinput
\fi
\expandafter\ifx\csname ekvVersion\endcsname\relax
\else
  \expandafter\endinput
\fi
\def\ekvVersion{0.3}
\def\ekvDate{2020-01-22}
\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@gobbletostop#1\ekv@stop{}
\long\def\ekv@fi@gobble\fi\@firstofone#1{\fi}
\long\def\ekv@fi@secondoftwo\fi\@firstoftwo#1#2{\fi#2}
\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@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@ifdefined@pair#1#2%
  {%
    \expandafter\ekv@ifdefined@pair@
      \csname
        \ifcsname #1{#2}\endcsname
          #1{#2}%
        \else
          relax%
        \fi
      \endcsname
  }
\def\ekv@ifdefined@pair@#1%
  {%
    \ifx#1\relax
      \ekv@fi@secondoftwo
    \fi
    \@firstoftwo
    {\ekv@set@pair@#1\ekv@mark}%
  }
\def\ekv@ifdefined@key#1#2%
  {%
    \expandafter\ekv@ifdefined@key@
      \csname
        \ifcsname #1{#2}N\endcsname
          #1{#2}N%
        \else
          relax%
        \fi
      \endcsname
  }
\def\ekv@ifdefined@key@#1%
  {%
    \ifx#1\relax
      \ekv@fi@secondoftwo
    \fi
    \@firstoftwo#1%
  }
\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)}
\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}%
        \ekv@defset{#1}%
      }%
  }
\protected\long\def\ekvdefNoVal#1#2#3%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\def\csname\ekv@name{#1}{#2}N\endcsname{#3}%
        \ekv@defset{#1}%
      }%
  }
\protected\def\ekvlet#1#2#3%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\let\csname\ekv@name{#1}{#2}\endcsname#3%
        \ekv@defset{#1}%
      }%
  }
\protected\def\ekvletNoVal#1#2#3%
  {%
    \ekv@checkvalid{#1}{#2}%
      {%
        \expandafter\let\csname\ekv@name{#1}{#2}N\endcsname#3%
        \ekv@defset{#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
        \ekv@defset{#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
        \ekv@defset{#1}%
      }%
  }
\protected\def\ekv@defset#1%
  {%
    \expandafter\edef\csname\ekv@name@set{#1}\endcsname##1%
      {\ekv@name@set{#1}\ekv@name@key{##1}}%
  }
\def\ekvset#1#2{%
\endgroup
\long\def\ekvset##1##2%
  {%
    \expandafter\ekv@set\csname\ekv@name@set{##1}\endcsname
      \ekv@mark##2#1\ekv@stop#1{}%
  }
\long\def\ekv@set##1##2#1%
  {%
    \ekv@ifstop##2\ekv@endset\ekv@mark\ekv@stop
    \ekv@set@other##1##2,\ekv@stop,%
    \ekv@set##1\ekv@mark
  }
\long\def\ekv@endset
    \ekv@mark\ekv@stop\ekv@set@other##1,\ekv@stop,\ekv@set##2\ekv@mark
    ##3%
  {##3}
\long\def\ekv@set@other##1##2,%
  {%
    \ekv@ifblank@##2\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F
      \ekv@ifempty@A\ekv@ifempty@B\@firstofone
      {%
        \ekv@ifhas@eq@other##2=\ekv@ifempty@B\ekv@ifempty@false
          \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
          {\ekv@set@eq@other##1##2\ekv@stop}%
          {%
            \ekv@ifhas@eq@active##2#2\ekv@ifempty@B\ekv@ifempty@false
              \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
              {\ekv@set@eq@active##1##2\ekv@stop}%
              {%
                \ekv@ifstop##2\ekv@endset@other\ekv@mark\ekv@stop
                \ekv@strip{##2}\ekv@set@key##1%
              }%
          }%
      }%
    \ekv@set@other##1\ekv@mark%
  }
\long\def\ekv@set@eq@other##1##2=%
  {%
    \ekv@ifhas@eq@active##2#2\ekv@ifempty@B\ekv@ifempty@false
      \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
      {\ekv@set@eq@active##1##2=}%
      {\ekv@strip{##2}\ekv@set@pair##1}%
  }
\long\def\ekv@set@eq@active##1##2#2%
  {%
    \ekv@strip{##2}\ekv@set@pair##1%
  }
\long\def\ekv@ifhas@eq@other\ekv@mark##1={\ekv@ifempty@\ekv@ifempty@A}
\long\def\ekv@ifhas@eq@active\ekv@mark##1#2{\ekv@ifempty@\ekv@ifempty@A}
\long\def\ekv@endset@other
    \ekv@mark\ekv@stop\ekv@strip##1\ekv@set@key##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%
  {%
    \expanded{\ekv@parse##1##2\ekv@mark##3#1\ekv@stop#1}%
  }
\long\def\ekv@parse##1##2##3#1%
  {%
    \ekv@ifstop##3\ekv@endparse\ekv@mark\ekv@stop
    \ekv@parse@other##1##2##3,\ekv@stop,%
    \ekv@parse##1##2\ekv@mark
  }
\long\def\ekv@endparse
    \ekv@mark\ekv@stop\ekv@parse@other##1,\ekv@stop,\ekv@parse##2\ekv@mark
  {}
\long\def\ekv@parse@other##1##2##3,%
  {%
    \ekv@ifblank@##3\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F
      \ekv@ifempty@A\ekv@ifempty@B\@firstofone
      {%
        \ekv@ifhas@eq@other##3=\ekv@ifempty@B\ekv@ifempty@false
          \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
          {\unexpanded{##2}\ekv@parse@eq@other##3\ekv@stop}%
          {%
            \ekv@ifhas@eq@active##3#2\ekv@ifempty@B\ekv@ifempty@false
              \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
              {\unexpanded{##2}\ekv@parse@eq@active##3\ekv@stop}%
              {%
                \ekv@ifstop##3\ekv@endparse@other\ekv@mark\ekv@stop
                \unexpanded{##1}{\ekv@strip{##3}\unexpanded}%
              }%
          }%
      }%
    \ekv@parse@other##1##2\ekv@mark
  }
\long\def\ekv@parse@eq@other##1=%
  {%
    \ekv@ifhas@eq@active##1#2\ekv@ifempty@B\ekv@ifempty@false
      \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
      {\ekv@parse@eq@active##1=}%
      {{\ekv@strip{##1}\unexpanded}\ekv@parse@pair\ekv@mark}%
  }
\long\def\ekv@parse@eq@active##1#2%
  {%
    {\ekv@strip{##1}\unexpanded}\ekv@parse@pair\ekv@mark
  }
\long\def\ekv@endparse@other
    \ekv@mark\ekv@stop\unexpanded##1%
    \ekv@parse@other##2\ekv@mark
  {}
\long\def\ekv@parse@pair##1\ekv@stop
  {%
    {\ekv@strip{##1}\unexpanded}%
  }
}
\begingroup
\catcode`\,=13
\catcode`\==13
\ekvset,=
\long\def\ekv@ifstop#1\ekv@mark\ekv@stop{}
\long\def\ekv@set@pair#1#2%
  {%
    \ekv@ifdefined@pair#2{#1}%
      {%
        \ekv@ifdefined{#2{#1}N}%
          \ekv@err@noarg
          \ekv@err@unknown
          #2{#1}%
        \ekv@gobbletostop
      }%
  }
\long\def\ekv@set@pair@#1#2\ekv@stop
  {%
    \ekv@strip{#2}#1%
  }
\long\def\ekv@set@key#1#2%
  {%
    \ekv@ifdefined@key#2{#1}%
      {%
        \ekv@ifdefined{#2{#1}}%
          \ekv@err@reqval
          \ekv@err@unknown
          #2{#1}%
      }%
  }
\begingroup
\edef\ekv@err
  {%
    \endgroup
    \unexpanded{\long\def\ekv@err}##1%
      {%
        \unexpanded{\expandafter\ekv@err@\@firstofone}%
        {\expandafter\noexpand\csname ! expkv Error:\endcsname ##1.}%
        \unexpanded{\ekv@stop}%
      }%
  }
\ekv@err
\def\ekv@err@{\expandafter\ekv@gobbletostop}
\long\def\ekv@err@common #1#2{\expandafter\ekv@err@common@\string#2{#1}}
\long\def\ekv@err@common@#1#2#3#4#5(#6#7{\ekv@err{#6 (`#7', set `#5')}}
\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'.
