%% %% 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.0 2010/03/28] %% %% 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 %% \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/03/29 v3.0 - 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} \newrobustcmd\kcmd@normalize@setkeys[4]{% \kv@normalize{#4}\edef\kv@list{\csvloop[\kcmd@normalize@braces]\kv@list}% \expandafter\@swaparg\expandafter{\kv@list}{\kcmd@Xsetkeys*{#2}}% \ettl@nbk#3//{\csedef{#2@#3}{\expandonce{\XKV@rm}}}% {\expandafter\ettl@nbk\XKV@rm//% {\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{\kcmd@normalize@br@ces#1==\@nil} \long\def\kcmd@normalize@br@ces#1=#2=#3\@nil{\unexpanded{#1={{{#2}}},}} \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 the keys for this keycommand \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\expandafter\noexpand\csname\kcmd@fam.\kcmd@plus get\fi commandkey\endcsname \kcmd@plus % %% ENDENVIR ?? \csdef{\kcmd@fam}{\kcmd@yargedef{\kcmd@gbl}{\kcmd@long}{\noexpandcs\kcmd@fam}{\number#4}{#6}{\csname\kcmd@fam.unexpandchar\endcsname}}% \unless\ifx#6\relax\def#6{\kcmd@yargedef{\kcmd@gbl}{\kcmd@long}{#6}0{\relax}{\csname\kcmd@fam.unexpandchar\endcsname}}\fi \else \csdef{\kcmd@fam}{\kcmd@yargdef{\kcmd@gbl}{\kcmd@long}{\noexpandcs\kcmd@fam}{\number#4}{#6}}% \unless\ifx#6\relax\def#6{\kcmd@yargdef{\kcmd@gbl}{\kcmd@long}{#6}0{\relax}}\fi \fi \kcmd@gbl\protected\edef#1{% entry point %%(?? cas où il n'y a pas de clé => pas besoin de \@testopt\kcmd@init etc ... at run time) \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 (also expanded by @newkeyenv) \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]{% \kcmd@plus \kcmd@unexpandchar@activate \fi% activate unexpand-char before reading definition \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% %%?? et si end#1 est déjà défini et pas #1 (\@ifdefinable ne teste que #1) ?? \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}} \def\kcmd@afterelse#1\else#2\fi{\fi#1} \def\kcmd@afterfi#1\fi{\fi#1} \def\kcmd@keyfam#1{\detokenize{keycmd->}\expandafter\@gobble\string#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'.