%%
%% This is file `expkv-opt.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% expkv-opt.dtx  (with options: `pkg')
%% 
%% ----------------------------------------------------------------
%% expkv-bundle -- an expandable key=val implementation and friends
%% 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-2023 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 files  expkv-bundle.ins
%%                                  expkv.dtx
%%                                  expkv-cs.dtx
%%                                  expkv-def.dtx
%%                                  expkv-opt.dtx
%%                                  expkv-pop.dtx
%% and the derived files            expkv.sty
%%                                  expkv.tex
%%                                  t-expkv.tex
%%                                  expkv-cs.sty
%%                                  expkv-cs.tex
%%                                  t-expkv-cs.tex
%%                                  expkv-def.sty
%%                                  expkv-def.tex
%%                                  t-expkv-def.tex
%%                                  expkv-opt.sty
%%                                  expkv-pop.sty
%%                                  expkv-pop.tex
%%                                  t-expkv-pop.tex
%% 
%% as well as any documentation files shipped with it.
%% 
\IfFormatAtLeastTF{2021/05/01}
  {}
  {%
    \ifx\pkgcls@targetlabel\@empty
      \ifnum\requestedLaTeXdate=\pkgcls@targetdate
        \pkgcls@parse@date@arg{=v0.1}%
      \fi
    \fi
  }
\DeclareRelease{v0.1}{2020/10/10}{expkv-opt-2020-10-10.sty}
\DeclareCurrentRelease{v0.2}{2021/04/04}
\newcommand*\ekvoVersion{1.0}
\newcommand*\ekvoDate{2023-01-23}
\ProvidesPackage{expkv-opt}
  [%
    \ekvoDate\space v\ekvoVersion\space
    parse class and package options with expkv%
  ]
\RequirePackage{expkv}
\protected\long\def\ekvo@CurrentOption@loop#1#2%
  {%
    \ekvo@CurrentOption@loop@#2\ekv@set@other\ekv@mark#1,\ekv@stop,\ekvo@tail
  }
\long\def\ekvo@CurrentOption@loop@#1\ekv@set@other#2,%
  {%
    \ekv@gobble@from@mark@to@stop#2\ekvo@end@loop\ekv@stop
    \ekv@ifblank{#2}%
      {}%
      {%
        \edef\CurrentOption{\unexpanded\expandafter{\ekv@gobble@mark#2}}%
        #1{#2}%
      }%
    \ekvo@CurrentOption@loop@#1\ekv@set@other\ekv@mark
  }
\long\def\ekvo@end@loop#1\ekvo@tail{}
\def\ekvo@ifx@TF#1#2{\ifx#1#2\ekv@fi@firstoftwo\fi\@secondoftwo}
\def\ekvo@ifx@T#1#2{\ifx#1#2\ekv@fi@firstofone\fi\@gobble}
\def\ekvo@ifx@F#1#2{\ifx#1#2\ekv@fi@gobble\fi\@firstofone}
\protected\def\ekvo@do@with@set#1#2%
  {%
    \ekvifdefinedset{#1}%
      {%
        \expandafter
        \let\expandafter\ekvo@name\csname\ekv@undefined@set{#1}\endcsname
        \def\ekvo@setname{#1}%
        #2%
      }%
      {\ekvo@err@undefined@set{#1}}%
  }
\protected\long\def\ekvo@handle@undefined@k@pkg#1%
  {%
    \ekv@ifdefined{\ekvo@name{#1}}%
      {\ekvo@err@value@required{#1}}%
      {\ekvo@err@undefined@key{#1}}%
  }
\def\ekvo@handle@undefined@kv@pkg#1#2%
  {%
    \ekv@ifdefined{\ekvo@name{#1}N}%
      {\ekvo@err@value@forbidden{#1}}%
      {\ekvo@err@undefined@key{#1}}%
  }
\long\def\ekvo@addto@unused@one#1{\ekvo@do@unusedoptionlist\ekvo@addnewto@list}
\long\def\ekvo@addto@unused@two#1#2{\ekvo@do@unusedoptionlist\ekvo@addnewto@list}
\long\def\ekvo@rmfrom@unused@one#1%
  {%
    \ekvo@ifx@F\@unusedoptionlist\@empty
      {\ekvo@do@unusedoptionlist\ekvo@rmfrom@list}%
  }
\long\def\ekvo@rmfrom@unused@two#1#2%
  {%
    \ekvo@ifx@F\@unusedoptionlist\@empty
      {\ekvo@do@unusedoptionlist\ekvo@rmfrom@list}%
  }
\protected\def\ekvo@do@unusedoptionlist#1%
  {%
    \let\ekvo@unpreparedCurrentOption\CurrentOption
    \edef\CurrentOption
      {\expandafter\ekvo@prepare@unusedoption\CurrentOption=\ekv@mark}%
    #1\@unusedoptionlist
    \let\CurrentOption\ekvo@unpreparedCurrentOption
  }
\def\ekvo@prepare@unusedoption{\ekvo@prepare@unusedoption@a\@empty}
\def\ekvo@prepare@unusedoption@a#1%
  {%
    \long\def\ekvo@prepare@unusedoption@a##1=##2\ekv@mark
      {%
        \ekvo@prepare@unusedoption@b##1\ekv@stop
          \ekv@mark\ekvo@prepare@unusedoption@b
          #1\ekv@mark\ekvo@prepare@unusedoption@c
      }%
  }
\ekvo@prepare@unusedoption@a{ }
\long\def\ekvo@prepare@unusedoption@b#1 #2\ekv@mark#3{#3#1#2\ekv@mark#3}
\long\def\ekvo@prepare@unusedoption@c
    #1\ekv@stop
    \ekv@mark\ekvo@prepare@unusedoption@b\ekv@mark\ekvo@prepare@unusedoption@c
  {\unexpanded\expandafter{#1}}
\protected\def\ekvo@set@handlers@local
  {%
    \ekvo@if@need@handlers
      {%
        \ifx\@currext\@clsextension
          \ifx\@classoptionslist\relax
            \let\ekvo@handle@undefined@k\@gobble
            \let\ekvo@handle@undefined@kv\@gobbletwo
          \else
            \expandafter
            \ifx
                \csname @raw@opt@\@currname.\@currext\endcsname
                \@raw@classoptionslist
              \let\ekvo@handle@undefined@k\ekvo@addto@unused@one
              \let\ekvo@handle@undefined@kv\ekvo@addto@unused@two
              \unless\ifx\@unusedoptionlist\@empty
                \let\ekvo@handle@defined@k\ekvo@rmfrom@unused@one
                \let\ekvo@handle@defined@kv\ekvo@rmfrom@unused@two
              \fi
            \else
              \let\ekvo@handle@undefined@k\@gobble
              \let\ekvo@handle@undefined@kv\@gobbletwo
            \fi
          \fi
        \else
          \let\ekvo@handle@undefined@k\ekvo@handle@undefined@k@pkg
          \let\ekvo@handle@undefined@kv\ekvo@handle@undefined@kv@pkg
        \fi
      }%
  }
\protected\def\ekvo@set@handlers@global
  {%
    \unless\ifx\@unusedoptionlist\@empty
      \let\ekvo@handle@defined@k\ekvo@rmfrom@unused@one
      \let\ekvo@handle@defined@kv\ekvo@rmfrom@unused@two
    \fi
    \ekvo@if@need@handlers
      {%
        \let\ekvo@handle@undefined@k\@gobble
        \let\ekvo@handle@undefined@kv\@gobbletwo
      }%
  }
\protected\def\ekvo@set@handlers@list
  {%
    \ekvo@if@need@handlers
      {%
        \let\ekvo@handle@undefined@k\@gobble
        \let\ekvo@handle@undefined@kv\@gobbletwo
      }%
  }
\let\ekvo@if@need@handlers\@firstofone
\protected\long\def\ekvo@dont@need@handlers#1%
  {%
    \let\ekvo@if@need@handlers\@firstofone
  }%
\let\ekvo@handle@defined@k\@gobble
\let\ekvo@handle@defined@kv\@gobbletwo
\protected\def\ekvo@process@common#1#2#3%
  {%
    #1{\ekvo@do@with@set{#3}{#2}}%
  }
\protected\def\ekvo@process@list#1%
  {%
    \expandafter\ekvo@CurrentOption@loop\expandafter{#1}\ekvo@parse
  }
\long\def\ekvo@parse#1%
  {%
    \ekv@eq@other#1\ekv@nil\ekv@mark\ekvo@parse@kv
      =\ekv@mark\ekvo@parse@k
  }
\long\def\ekvo@parse@kv#1\ekv@stop#2\ekv@nil=\ekv@mark\ekvo@parse@k
  {\ekv@strip{#2}{\ekv@strip{#1}\ekvo@parse@kv@}}
\long\def\ekvo@parse@kv@#1#2%
  {%
    \ekv@ifexp{#1}%
      {\ekvo@expansion@kv{#2}}%
      {\ekvo@set@kv{#1}{#2}}%
  }
\long\def\ekvo@expansion@kv#1#2#3#4%
  {%
    \ekv@expansion@rule@{#1}#2\ekv@mark\ekv@stop{#3}{}%
      {\ekvo@handle@defined@kv{#3}{#1}\ekvmorekv}%
    \ekvo@expansion@kv@
  }
\long\def\ekvo@expansion@kv@#1#2{\ekvo@set@kv{#1}{#2}}
\long\def\ekvo@parse@k#1\ekv@nil\ekv@mark\ekvo@parse@kv\ekv@stop\ekv@mark
  {\ekv@strip{#1}\ekvo@parse@k@}
\long\def\ekvo@parse@k@#1%
  {%
    \ekv@ifexp{#1}%
      \ekvo@expansion@k
      {\ekvo@set@k{#1}}%
  }
\long\def\ekvo@expansion@k#1#2#3%
  {%
    \ekv@expansion@rule@{#2}#1\ekv@mark\ekv@stop{}{}%
      {\ekvo@handle@defined@k{#2}\ekvmorekv}%
    \ekvo@expansion@k@
  }
\long\def\ekvo@expansion@k@#1#2{\ekvo@set@k{#2}}
\protected\def\ekvo@set@k#1%
  {%
    \ekv@ifdefined{\ekvo@name{#1}N}%
      {%
        \ekvo@handle@defined@k{#1}%
        \csname\ekvo@name{#1}N\endcsname
      }%
      {\ekvo@handle@undefined@k{#1}}%
  }
\protected\def\ekvo@set@kv#1#2%
  {%
    \ekv@ifdefined{\ekvo@name{#1}}%
      {%
        \ekvo@handle@defined@kv{#1}{#2}%
        \csname\ekvo@name{#1}\endcsname{#2}%
      }%
      {\ekvo@handle@undefined@kv{#1}{#2}}%
  }
\protected\def\ekvo@addto@list#1%
  {%
    \ekvo@ifx@TF#1\@empty
      {\let#1\CurrentOption}%
      {%
        \edef#1%
          {%
            \unexpanded\expandafter{#1},%
            \unexpanded\expandafter{\CurrentOption}%
          }%
      }%
  }
\protected\def\ekvo@addnewto@list#1%
  {%
    \ekvo@ifx@TF#1\@empty
      {\let#1\CurrentOption}%
      {%
        \ekvo@if@in@list#1%
          {}%
          {%
            \edef#1%
              {%
                \unexpanded\expandafter{#1},%
                \unexpanded\expandafter{\CurrentOption}%
              }%
          }%
      }%
  }
\protected\def\ekvo@if@in@list#1%
  {%
    \ekvo@ifx@TF#1\@empty
      \@secondoftwo
      {%
        \let\ekvo@curropt\CurrentOption
        \let\ekvo@if@in@list@result\@secondoftwo
        \expandafter\ekvo@CurrentOption@loop\expandafter{#1}\ekvo@if@in@list@
        \let\CurrentOption\ekvo@curropt
        \ekvo@if@in@list@result
      }%
  }
\protected\long\def\ekvo@if@in@list@#1%
  {%
    \ekvo@ifx@T\ekvo@curropt\CurrentOption
      {%
        \let\ekvo@if@in@list@result\@firstoftwo
        \ekvo@end@loop
      }%
  }
\protected\def\ekvo@rmfrom@list#1%
  {%
    \ekvo@ifx@F#1\@empty
      {%
        \let\ekvo@tmp@list\@empty
        \let\ekvo@curropt\CurrentOption
        \expandafter\ekvo@CurrentOption@loop\expandafter{#1}\ekvo@rmfrom@list@
        \let\CurrentOption\ekvo@curropt
        \let#1\ekvo@tmp@list
      }%
  }
\protected\long\def\ekvo@rmfrom@list@#1%
  {%
    \ekvo@ifx@F\CurrentOption\ekvo@curropt
      {\ekvo@addto@list\ekvo@tmp@list}%
  }
\protected\def\ekvo@err@undefined@key#1%
  {%
    \ekvo@pkg@cls@error
      {Undefined option `\detokenize{#1}'}%
      {The used option was not defined. Perhaps you misspelled it?}%
  }
\protected\def\ekvo@err@value@required#1%
  {%
    \ekvo@pkg@cls@error
      {Missing value for option `\detokenize{#1}'}%
      {The used option requires a value or you misspelled its name.}%
  }
\protected\def\ekvo@err@value@forbidden#1%
  {%
    \ekvo@pkg@cls@error
      {Unwanted value for option `\detokenize{#1}'}%
      {The used option doesn't support a value or you misspelled its name.}%
  }
\protected\def\ekvo@err@undefined@set#1%
  {%
    \PackageError{expkv-opt}%
      {Undefined set `#1'}%
      {The set for which you try to parse options isn't defined in expkv.}%
  }
\protected\def\ekvo@pkg@cls@error
  {%
    \ekvo@ifx@TF\@currext\@clsextension
      \ClassError
      \PackageError
        \@currname
  }
\protected\def\ekvoProcessOptions#1%
  {%
    \ekvo@if@need@handlers
      {%
        \ekvoProcessGlobalOptions{#1}%
        \ekvoProcessLocalOptions {#1}%
        \ekvoProcessFutureOptions{#1}%
        \@gobbletwo
      }%
    \@firstofone
      {%
        \let\ekvo@tmpa\ekvo@handle@undefined@k
        \let\ekvo@tmpb\ekvo@handle@undefined@kv
        \ekvoUseUnknownHandlers\ekvo@tmpa\ekvo@tmpb
        \ekvoProcessGlobalOptions{#1}%
        \ekvoUseUnknownHandlers\ekvo@tmpa\ekvo@tmpb
        \ekvoProcessLocalOptions {#1}%
        \ekvoUseUnknownHandlers\ekvo@tmpa\ekvo@tmpb
        \ekvoProcessFutureOptions{#1}%
        \let\ekvo@tmpa\ekvo@undefined
        \let\ekvo@tmpb\ekvo@undefined
      }%
  }
\protected\def\ekvoProcessLocalOptions
  {%
    \ekvo@process@common
      {\ekv@ifdefined{@raw@opt@\@currname.\@currext}\@firstofone\@gobble}%
      {%
        \ekvo@set@handlers@local
        \expandafter
        \ekvo@process@list\csname @raw@opt@\@currname.\@currext\endcsname
        \AtEndOfPackage{\let\@unprocessedoptions\relax}%
      }%
  }
\protected\def\ekvoProcessGlobalOptions
  {%
    \ekvo@process@common{\ekvo@ifx@F\@classoptionslist\relax}%
      {%
        \ekvo@set@handlers@global
        \ekvo@process@list\@raw@classoptionslist
        \let\ekvo@handle@defined@k\@gobble
        \let\ekvo@handle@defined@kv\@gobbletwo
      }%
  }
\protected\def\ekvoProcessUnusedGlobalOptions#1%
  {%
    \PackageError{expkv-opt}%
      {%
        \noexpand
        \ekvoProcessUnusedGlobalOptions no longer works because of changes in%
        \MessageBreak
        the LaTeX2e kernel%
      }%
      {}%
  }
\IfFormatAtLeastTF{2022/11/01}
  {%
    \protected\def\ekvoProcessFutureOptions#1%
      {%
        \ekvo@if@need@handlers\@gobbletwo
        \@firstofone
          {%
            \expandafter\let
              \csname ekvo@future@undefined@k@\@currname.\@currext\endcsname
              \ekvo@handle@undefined@k
            \expandafter\let
              \csname ekvo@future@undefined@kv@\@currname.\@currext\endcsname
              \ekvo@handle@undefined@kv
          }%
        \protected\expandafter
        \xdef\csname opt@handler@\@currname.\@currext\endcsname
          {\ekv@unexpanded{\ekvo@future{#1}}}%
      }
    \protected\def\ekvo@future
      {%
        \ekvo@process@common
          {\ekv@ifdefined{@raw@opt@\@currname.\@currext}\@firstofone\@gobble}%
          {%
            \ekvo@set@handlers@future
            \expandafter\ekvo@process@list
              \csname @raw@opt@\@currname.\@currext\endcsname
            \AtEndOfPackage{\let\@unprocessedoptions\relax}%
          }%
      }
    \protected\def\ekvo@set@handlers@future
      {%
        \expandafter\let\expandafter
          \ekvo@handle@undefined@k
          \csname
            \ekv@ifdefined{ekvo@future@undefined@k@\@currname.\@currext}%
              {ekvo@future@undefined@k@\@currname.\@currext}%
              {ekvo@handle@undefined@k@pkg}%
          \endcsname
        \expandafter\let\expandafter
          \ekvo@handle@undefined@kv
          \csname
            \ekv@ifdefined{ekvo@future@undefined@kv@\@currname.\@currext}%
              {ekvo@future@undefined@kv@\@currname.\@currext}%
              {ekvo@handle@undefined@kv@pkg}%
          \endcsname
      }
  }
  {%
    \protected\def\ekvoProcessFutureOptions#1%
      {%
        \PackageWarning{expkv-opt}%
          {LaTeX-kernel is too old to process future options.\@gobbletwo}%
        \protected\gdef\ekvoProcessFutureOptions##1{}%
      }%
  }
\protected\def\ekvoProcessOptionsList#1%
  {%
    \ekvo@process@common{\ekvo@ifx@F#1\@empty}%
      {%
        \ekvo@set@handlers@list
        \ekvo@process@list#1%
      }%
  }
\protected\def\ekvoUseUnknownHandlers
  {%
    \let\ekvo@if@need@handlers\ekvo@dont@need@handlers
    \@ifstar\ekvoUseUnknownHandlers@s\ekvoUseUnknownHandlers@n
  }
\protected\def\ekvoUseUnknownHandlers@s
  {%
    \long\def\ekvo@handle@undefined@k##1%
      {%
        \ekv@ifdefined{\ekvo@name{}uN}%
          {%
            \csname\ekvo@name{}uN\expandafter\endcsname\expandafter
              {\detokenize{##1}}{##1}%
          }%
          {\@gobble}%
      }%
    \long\def\ekvo@handle@undefined@kv##1##2%
      {%
        \ekv@ifdefined{\ekvo@name{}u}%
          {%
            \csname\ekvo@name{}u\ekv@expanded{\endcsname
              {\ekv@unexpanded{##2}}{\detokenize{##1}}}{##1}%
          }%
          {}%
      }%
  }
\protected\def\ekvoUseUnknownHandlers@n#1#2%
  {%
    \let\ekvo@handle@undefined@k#1\relax
    \let\ekvo@handle@undefined@kv#2\relax
  }
\@onlypreamble\ekvoProcessOptions
\@onlypreamble\ekvoProcessLocalOptions
\@onlypreamble\ekvoProcessGlobalOptions
\@onlypreamble\ekvoProcessFutureOptions
\@onlypreamble\ekvoProcessOptionsList
\@onlypreamble\ekvoUseUnknownHandlers
%% 
%%
%% End of file `expkv-opt.sty'.
