%%
%% This is file `keycommand.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% keycommand.dtx  (with options: `package')
%% 
%% This is a generated file.
%% 
%% keycommand : key-value interface for commands and environments in LaTeX [v3.1 2010/04/15]
%% 
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3 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
%% 
%% This work consists of the main source file keycommand.dtx
%% and the derived files
%%    keycommand.sty, keycommand.pdf, keycommand.ins,
%%    keycommand-example.tex
%% 
%% keycommand : an easy way to define commands with optional keys
%% Copyright (C) 2009-2010 by Florent Chervet <florent.chervet@free.fr>
%% 
\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
   [2005/12/01]% LaTeX must be 2005/12/01 or younger (see kvsetkeys.dtx).
\ProvidesPackage{keycommand}
   [2010/04/15 v3.1 - key-value interface for commands and environments in LaTeX]
\def\kcmd@pkg@name{keycommand}
\RequirePackage{etex,kvsetkeys,xkeyval,etoolbox,etextools}
\def\kcmd@Xsetkeys{\XKV@testopta{\XKV@testoptc\XKV@setkeys}}% in case \setkeys was overwritten
\@ifpackagelater{etextools}{2009/08/27}\relax
   {\PackageError\kcmd@pkg@name{keycommand requires an implementation of\MessageBreak
   package etextools later than 2009/08/27.\MessageBreak
   Please update your distribution with a recent version of etextools}%
   {The keycommand package will not be loaded.}%
   \expandafter\endinput}
\let\kcmd@AtEnd\@empty
\def\TMP@EnsureCode#1#2{%
  \edef\kcmd@AtEnd{%
    \kcmd@AtEnd
    \catcode#1 \the\catcode#1\relax
  }%
  \catcode#1 #2\relax
}
\TMP@EnsureCode{32}{10}% space
\TMP@EnsureCode{61}{12}% = sign
\TMP@EnsureCode{45}{12}% - sign
\TMP@EnsureCode{62}{12}% > sign
\TMP@EnsureCode{46}{12}% . dot
\TMP@EnsureCode{47}{8}% / slash (etextools)
\AtEndOfPackage{\kcmd@AtEnd\undef\kcmd@AtEnd}
\def\kcmd@keyfam#1{\detokenize{keycmd->}\expandafter\@gobble\string#1}
\newrobustcmd\kcmd@normalize@setkeys[4]{%
   \kv@normalize{#4}\expandafter\let\expandafter\kv@list\expandafter\@empty
   \expandafter\kv@parse@normalized\expandafter{\kv@list}{\kcmd@normalize@braces{#2}}%
   \expandafter\@swaparg\expandafter{\kv@list,}{\kcmd@Xsetkeys*{#2}}%
   \ettl@nbk#3//% undeclared keys are assigned to "OtherKeys"
      {\csedef{#2@#3}{\expandonce{\XKV@rm}}}% (if specified, ie not empty)
      {\expandafter\ettl@nbk\XKV@rm//% (otherwise a recoverable error is thown)
         {\PackageError\kcmd@pkg@name{The key-value pairs :\MessageBreak
         \XKV@rm\MessageBreak
         cannot be processed for key-command \string#1\MessageBreak
         See the definition of the key-command!}{}}{}//}//}
\long\def\kcmd@normalize@braces#1#2#3{% This is kvsetkeys processor for normalizing braces
   \edef\kv@list{\expandonce\kv@list,%
         #2\if @\detokenize{#3}@\else ={{{\unexpanded{#3}}}}\fi}}
\def\kcmd@check@typeofkey#1{% expands to
   \kcmd@check@typeofkey@bool#1bool //%
      {\kcmd@check@typeofkey@enumst#1enum* //%
         {\kcmd@check@typeofkey@enum#1enum //%
            {\kcmd@check@typeofkey@choicest#1choice* //%
               {\kcmd@check@typeofkey@choice#1choice //%
                  05//}4//}3//}2//}1//}
\def\kcmd@check@typeofkey@bool #1bool #2//{\ettl@nbk#1//}
\def\kcmd@get@keyname@bool #1bool #2//{#2}
\def\kcmd@check@typeofkey@enumst #1enum* #2//{\ettl@nbk#1//}
\def\kcmd@get@keyname@enumst #1enum* #2//{#2}
\def\kcmd@check@typeofkey@enum #1enum #2//{\ettl@nbk#1//}
\def\kcmd@get@keyname@enum #1enum #2//{#2}
\def\kcmd@check@typeofkey@choicest #1choice* #2//{\ettl@nbk#1//}
\def\kcmd@get@keyname@choicest #1choice* #2//{#2}
\def\kcmd@check@typeofkey@choice #1choice #2//{\ettl@nbk#1//}
\def\kcmd@get@keyname@choice #1choice #2//{#2}
\protected\long\def\kcmd@definekey#1#2#3#4#5{% define the keys using xkeyval macros
   \ifcase\kcmd@check@typeofkey{#4}\relax% standard
      #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,#4}%
      \define@cmdkey{#3}[{#3@}]{#4}[{#5}]{}%
   \or% bool
      #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@bool#4//}%
      \kcmd@define@boolkey#1{#3}{\kcmd@get@keyname@bool#4//}{#5}%
   \or% enum*
      #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@enumst#4//}%
      \kcmd@define@choicekey#1*{#3}{\kcmd@get@keyname@enumst#4//}{#5}{\expandonce\val}%
   \or% enum
      #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@enum#4//}%
      \kcmd@define@choicekey#1{}{#3}{\kcmd@get@keyname@enum#4//}{#5}{\expandonce\val}%
   \or% choice*
      #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@choicest#4//}%
      \kcmd@define@choicekey#1*{#3}{\kcmd@get@keyname@choicest#4//}{#5}{\number\nr}%
   \or% choice
      #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@choice#4//}%
      \kcmd@define@choicekey#1{}{#3}{\kcmd@get@keyname@choice#4//}{#5}{\number\nr}%
   \fi
   \ifx#2\global\relax
      #2\csletcs{KV@#3@#4}{KV@#3@#4}% globalize
      #2\csletcs{KV@#3@#4@default}{KV@#3@#4@default}% globalize default value
   \fi}
\long\def\kcmd@firstchoiceof#1,#2\@nil{\unexpanded{#1}}
\long\def\kcmd@define@choicekey#1#2#3#4#5#6{\begingroup\edef\kcmd@define@choicekey{\endgroup
      \noexpand\define@choicekey#2+{#3}{#4}
            [\noexpand\val\noexpand\nr]%
            {\unexpanded{#5}}% list of allowed values
            [{\kcmd@firstchoiceof#5,\@nil}]% default value
            {\csedef{#3@#4}{\unexpanded{#6}}}% define key value if in the allowed list
            {\kcmd@error@handler\noexpand#1{#3}{#4}{\kcmd@firstchoiceof#5,\@nil}}% error handler
   }\kcmd@define@choicekey}
\def\kcmd@define@boolkey#1#2#3#4{\begingroup
   \ettl@nbk#4//{\def\default{#4}}{\def\default{true}}//%
   \edef\kcmd@define@boolkey{\endgroup
      \noexpand\define@choicekey*+{#2}{#3}[\noexpand\val\noexpand\nr]%
            {false,true}
            [{\expandonce\default}]%
            {\csedef{#2@#3}{\noexpand\number\noexpand\nr}}%
            {\kcmd@error@handler\noexpand#1{#2}{#3}{\expandonce\default}}%
   }\kcmd@define@boolkey}
\protected\long\def\kcmd@error@handler#1#2#3#4{%
   \PackageError\kcmd@pkg@name{%
      Value `\val\space' is not allowed in key #3\MessageBreak
      for key-command \string#1.\MessageBreak
      I'll use the default value `#4' for this key.\MessageBreak
      See the definition of the key-command!}{%
      \csdef{#2@#3}{#4}}}
\def\kcmd@undefinekeys#1#2{% #1 = global, #2 = family
   \ifcsundef{#2.keylist}
      {}
      {\expandnext{\csvloop[\kcmd@undefinekey{#1}{#2}]}{\csname #2.keylist\endcsname}}%
      \cslet{#2.keylist}\noexpand\@gobble}
\def\kcmd@undefinekey#1#2#3{% #1 = global, #2 = family, #3 = key
   #1\csundef{KV@#2@#3}%
   #1\csundef{KV@#2@#3@default}%
}
\protected\long\def\kcmd@def#1#2[#3][#4][#5]#6#7{%
   \@ifdefinable#1{\kcmd@defcommand#1[{#3}][{#4}][{#5}]{#6}{#2}{#7}}}
\protected\long\def\kcmd@defcommand#1[#2][#3][#4]#5#6#7{%
   \edef\kcmd@fam{\kcmd@keyfam{#1}}\let\commandkey\relax
   \edef\kcmd@defcommand{\endgroup
      \kcmd@undefinekeys{\kcmd@gbl}{\kcmd@fam}% undefines all keys for this keycommand family
      \kcmd@mount@unexpandchar{\kcmd@fam}{\expandonce\kcmd@unexpandchar}%
      \unexpanded{\kv@parse{#2,#3}}{\kcmd@definekey\noexpand#1{\kcmd@gbl}{\kcmd@fam}}% defines keys
      \csdef{\kcmd@fam.commandkey}####1{\noexpand\csname\kcmd@fam @####1\endcsname}%
      \csdef{\kcmd@fam.getcommandkey}####1{%
         \unexpanded{\unexpanded\expandafter\expandafter\expandafter}{%
                           \noexpand\csname\kcmd@fam @####1\endcsname}}%
      \let\commandkey\noexpandcs{\kcmd@fam.\kcmd@plus get\fi commandkey}%
      \kcmd@plus% \newkeycommand+
         \csdef{\kcmd@fam}{\kcmd@yargedef{\kcmd@gbl}{\kcmd@long}{\noexpandcs\kcmd@fam}
                              {\number#4}{#6}{\csname\kcmd@fam.unexpandchar\endcsname}}%
         \unless\ifx#6\relax% that means we have to define a key-environment
            \def#6{\kcmd@yargedef{\kcmd@gbl}{\kcmd@long}{#6}%
                              0\relax{\csname\kcmd@fam.unexpandchar\endcsname}}%
         \fi
      \else% \newkeycommand
         \csdef{\kcmd@fam}{\kcmd@yargdef{\kcmd@gbl}{\kcmd@long}{\noexpandcs\kcmd@fam}
                              {\number#4}{#6}}%
         \unless\ifx#6\relax% that means we have to define a key-environment
            \def#6{\kcmd@yargdef{\kcmd@gbl}{\kcmd@long}{#6}0\relax}%
         \fi
      \fi
      \kcmd@gbl\protected\edef#1{% entry point
         \let\noexpand\noexpand\commandkey\noexpand\noexpand\noexpandcs{%
                     \kcmd@fam.\kcmd@plus get\fi commandkey}%
         \noexpand\csvloop[\noexpand\kcmd@resetdefault{\kcmd@fam}]{\noexpandcs{\kcmd@fam.keylist}}%
         \noexpand\noexpand\noexpand\@testopt{%
            \kcmd@setkeys\noexpand\noexpand#1{\kcmd@fam}{\kcmd@otherkeys{#3}}}{}}%
      \noexpandcs\kcmd@fam%
   }\kcmd@defcommand{#5}{#7}%
}
\protected\long\def\kcmd@setkeys#1#2#3[#4]{%
   \kcmd@normalize@setkeys{#1}{#2}{#3}{#4}\csname#2\endcsname}
\def\kcmd@resetdefault#1#2{\noexpandcs{KV@#1@#2@default}}
\long\def\kcmd@otherkeys#1{\ettl@nbk#1//{\kcmd@@therkeys#1=\@nil}{}//}
\long\def\kcmd@@therkeys#1=#2\@nil{#1}
\protected\def\kcmd@mount@unexpandchar#1#2{%
   \ettl@nbk#2//{%
      \protected\csdef{#1.unexpandchar}{\begingroup
         \catcode`\~\active \lccode`\~`#2 \lccode`#2 0\relax
         \lowercase{\def~{\catcode`#2\active
            \long\def~########1~{\unexpanded{########1}}}%
            \ettl@aftergroup@def~\endgroup~}}}%
      {\cslet{#1.unexpandchar}\@empty}//%
}
\protected \def \kcmd@yargdef #1#2#3#4#5{\begingroup
   \def \kcmd@yargd@f ##1#4##2##{\afterassignment#5\endgroup
      #1#2\expandafter\def\expandafter#3\@gobble ##1#4%
   }\kcmd@yargd@f 0##1##2##3##4##5##6##7##8##9###4%
}
\protected\def\kcmd@yargedef#1#2#3#4#5#6{\begingroup
   \letcs\kcmd@nargs{kcmd@#4of9}%
   \long\def\kcmd@yarg@edef##1##2{\afterassignment#5\endgroup
      #1\edef#3{\begingroup #6%
         #2\edef\unexpanded{#3##2}{\endgroup\unexpanded{##1}%
         }\noexpand#3}%
   }%
   \protected\def\kcmd@yarg@body{\edef\body{\unexpanded\expandafter\expandafter\expandafter{%
      \expandafter#3\kcmd@nargs{{####1}}{{####2}}{{####3}}{{####4}}{{####5}}{{####6}}{{####7}}{{####8}}{{####9}}}%
   }\expandafter\kcmd@yarg@edef\expandafter{\body}}%
   \def\kcmd@yarged@f##1#4##2##{%
      \edef\kcmd@yargedef@next{\kcmd@yarg@body{\expandonce{\@gobble ##1#4}}}%
      \afterassignment\kcmd@yargedef@next
      \expandafter\def\expandafter#3\@gobble ##1#4%
   }\kcmd@yarged@f 0##1##2##3##4##5##6##7##8##9###4%
}
\def\kcmd@XofNINE#1{%
   \def\kcmd@XofNine##1#1##2##{%
      \expandafter\csedef{kcmd@#1of9}####1####2####3####4####5####6####7####8####9{%
                           \@gobble ##1#1}%
   }\kcmd@XofNine 0##1##2##3##4##5##6##7##8##9###1{}%
}
\csvloop*[\kcmd@XofNINE]{1,2,3,4,5,6,7,8,9,0}
\undef\kcmd@XofNine\undef\kcmd@XofNINE
\protected\def\newkeycommand{\begingroup
   \let\kcmd@gbl\@empty\kcmd@modifiers\new@keycommand}
\protected\def\renewkeycommand{\begingroup
   \let\kcmd@gbl\@empty\kcmd@modifiers\renew@keycommand}
\protected\def\providekeycommand{\begingroup
   \let\kcmd@gbl\@empty\kcmd@modifiers\provide@keycommand}
\protected\def\kcmd@modifiers#1{%
   \futuredef[*+]\kcmd@modifiers{% only once inside group
      \edef\kcmd@long{\expandafter\kcmd@ifstar\kcmd@modifiers*\relax}%
      \edef\kcmd@plus{\expandafter\kcmd@ifplus\kcmd@modifiers+\relax}%
      \@testopt{\kcmd@unexpandchar#1}{}}}
\def\kcmd@ifstar#1*#2\relax{\ettl@nbk#2//{}\long//}
\def\kcmd@ifplus#1+#2\relax{\ettl@nbk#2//{\noexpand\iftrue}{\noexpand\iffalse}//}
\def\kcmd@unexpandchar#1[#2]{\def\kcmd@unexpandchar{#2}% only once inside group...
   \kcmd@plus \ettl@nbk#2//
         {\def\kcmd@unexpandchar@activate{\catcode`#2 \active}}%
         {\let\kcmd@unexpandchar@activate\relax}//%
   \else\ettl@nbk#2//%
      {\PackageError\kcmd@pkg@name{shortcut option for \string\unexpanded\MessageBreak
      You can't use a shortcut option for \string\unexpanded\MessageBreak
      without the \string+ form of \string\newkeycommand!}%
      {I will ignore this option and proceed.}%
      \let\kcmd@unexpandchar\@empty}%
      {}//%
   \fi#1}
\protected\def\new@keycommand#1{\@testopt{\@newkeycommand#1}{}}
\protected\def\@newkeycommand#1[#2]{% #2 = key=values or N=mandatory args
   \kcmd@plus \kcmd@unexpandchar@activate \fi% activates unexpand-char before reading definition
   \ifstrnum{#2}%
      {\@new@key@command#1[][][{#2}]}% no kv, no optkey, number of args
      {\@testopt{\@new@keycommand#1[{#2}]}0}}% kv, check for optkey/nr of args
\protected\def\@new@keycommand#1[#2][#3]{%
   \ifstrnum{#3}%
      {\@new@key@command#1[{#2}][][{#3}]}% no optkey
      {\@testopt{\@new@key@command#1[{#2}][{#3}]}0}}
\protected\long\def\@new@key@command#1[#2][#3][#4]#5{%
      \kcmd@def#1\relax[{#2}][{#3}][{#4}]{#5}{}}
\protected\def\renew@keycommand#1{\begingroup
   \escapechar\m@ne\edef\@gtempa{{\string#1}}%
   \expandafter\@ifundefined\@gtempa
      {\endgroup\@latex@error{\noexpand#1undefined}\@ehc}
      \endgroup
   \let\@ifdefinable\@rc@ifdefinable
   \new@keycommand#1}
\protected\def\provide@keycommand#1{%
   \escapechar\m@ne\edef\@gtempa{{\string#1}}%
   \expandafter\@ifundefined\@gtempa
      {\new@keycommand#1}
      {\@testopt{\provide@key@command\kcmd@notdefinable}{}}}
\protected\def\provide@key@command#1[#2]{\@tempswafalse\kcmd@def#1{#2}}
\protected\def\newkeyenvironment{\begingroup
   \let\kcmd@gbl\@empty\kcmd@modifiers\new@keyenvironment}
\protected\def\renewkeyenvironment{\begingroup
   \let\kcmd@gbl\@empty\kcmd@modifiers\renew@keyenvironment}
\def\new@keyenvironment#1{\@testopt{\@newkeyenva{#1}}{}}
\def\@newkeyenva#1[#2]{%
   \ifstrnum{#2}%
      {\@newkeyenv{#1}{[][][{#2}]}}
      {\@testopt{\@newkeyenvb{#1}[{#2}]}{}}}
\def\@newkeyenvb#1[#2][#3]{%
   \ifstrnum{#3}%
      {\@newkeyenv{#1}{[{#2}][][{#3}]}}
      {\@testopt{\@newkeyenvc{#1}{[{#2}][{#3}]}}0}}
\def\@newkeyenvc#1#2[#3]{\@newkeyenv{#1}{#2[{#3}]}}
\long\def\@newkeyenv#1#2{%
   \kcmd@plus \kcmd@unexpandchar@activate \fi
   \kcmd@keyenvir@def{#1}{#2}%
}
\long\def\kcmd@keyenvir@def#1#2#3#4{%
   \cslet{end#1}\protected
   \expandafter\kcmd@def\csname #1\expandafter\endcsname\csname end#1\endcsname#2{#3}{#4}%
}
\def\renew@keyenvironment#1{%
  \@ifundefined{#1}%
     {\@latex@error{Environment #1 undefined}\@ehc
     }\relax
  \cslet{#1}\relax
  \new@keyenvironment{#1}}


\newcommand*\ifcommandkey[1]{\csname @\expandafter\expandafter\expandafter
   \ettl@nbk\commandkey{#1}//{first}{second}//%
   oftwo\endcsname}
\newcommand\showcommandkeys[1]{\let\do\showcommandkey\docsvlist{#1}}
\newcommand\showcommandkey[1]{key \string"#1\string" = %
   \expandnext\expandnext\expandnext\detokenize{\commandkey{#1}}\par}
\endinput
%%
%% End of file `keycommand.sty'.
