From fee6ae63b6689ddbae970ff9114c6ed976bf1dab Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Wed, 13 Feb 2013 00:03:06 +0000
Subject: skeyval (12feb13)

git-svn-id: svn://tug.org/texlive/trunk@29092 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/skeyval/skeyval.sty | 797 +++++++++++++-----------
 1 file changed, 437 insertions(+), 360 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/skeyval/skeyval.sty')

diff --git a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
index fce36938787..010ce8c51fd 100644
--- a/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
+++ b/Master/texmf-dist/tex/latex/skeyval/skeyval.sty
@@ -1,5 +1,19 @@
 %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-% This is file 'skeyval.sty', version 1.1a, 2012/10/16.                    %
+% This is file 'skeyval.sty', version 1.2, 2013/02/10.                     %
+%                                                                          %
+%                                  NOTE                                    %
+%                                                                          %
+% Beginning from version 1.0, 2012/09/01, the skeyval package has changed  %
+% radically. Users of pre-version 1.0 of the package can load it now by    %
+% calling:                                                                 %
+%                                                                          %
+%    \usepackage[compatibility]{skeyval}                                   %
+%    \RequirePackage[compatibility]{skeyval}                               %
+%                 or                                                       %
+%    \usepackage{skeyval-bc}                                               %
+%    \RequirePackage{skeyval-bc}                                           %
+%                                                                          %
+%                                LICENSE                                   %
 %                                                                          %
 % This package and accompanying files may be distributed and/or            %
 % modified under the conditions of the LaTeX Project Public License,       %
@@ -15,6 +29,8 @@
 % implied warranties of merchantability and fitness for a particular       %
 % purpose.                                                                 %
 %                                                                          %
+%                              DISTRIBUTION                                %
+%                                                                          %
 % The following files constitute the skeyval bundle and must be            %
 % distributed as a whole:                                                  %
 %                                                                          %
@@ -23,7 +39,7 @@
 %  skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls,          %
 %  and skeyval-testpkg.sty.                                                %
 %                                                                          %
-% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com).                  %
+% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com).                  %
 %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
 
 \begingroup
@@ -67,19 +83,19 @@
 \do 032=10,033=12,036=03,038=04,040=12,041=12,042=12,043=12,%
   059=12,045=12,047=12,058=12,063=12,091=12,093=12,126=13,\do=,%
 
-\ProvidesPackage{skeyval}[2012/10/16 v1.1a Robust key-value parser (AM)]
+\ProvidesPackage{skeyval}[2013/02/10 v1.2 Robust key-value parser (AM)]
 \NeedsTeXFormat{LaTeX2e}[2011/06/27]
 
 \input skeyval-core
 
-\skvrobustdef*\skvAfterEndPackage{%
+\skvrobustdef*\skvafterendpackage{%
   \skvifcsdefTF{\@currname.\@currext-skv@endpkghook}{}{%
     \@namedef{\@currname.\@currext-skv@endpkghook}{}%
   }%
   \expandafter\g@addto@macro
   \csname\@currname.\@currext-skv@endpkghook\endcsname
 }
-\skvrobustdef*\skvAfterPackage#1{%
+\skvrobustdef*\skvafterpackage#1{%
   \skvafterbegindocument{%
     \skvifcsdefTF{ver@#1.\@pkgextension}{}{%
       \skv@warn{Package '#1' was never loaded}%
@@ -99,13 +115,12 @@
   }%
   \unexpanded\expandafter{\@popfilename}%
 }
+\skvundef\skv@documentclass
 \skvrobustdef*\skv@getdocumentclass{%
-  \skv@swafalse
-  \ifx\@filelist\@undefined\else
-    \ifx\@filelist\relax\else
-      \ifx\@filelist\@gobble\else\skv@swatrue\fi
-  \fi\fi
-  \ifskv@swa
+  \ifcase0%
+    \ifx\@filelist\@undefined 1\fi
+    \ifx\@filelist\relax 1\fi
+    \ifx\@filelist\@gobble 1\fi\relax
     \skvcommaparse*\@filelist\skv@tempa{%
       \filename@parse\skv@tempa
       \ifx\filename@ext\@clsextension
@@ -119,20 +134,22 @@
     }%
   \fi
 }
-\skv@getdocumentclass
+
+% The following packages need access to the original \@classoptionslist:
+\skvnewdef*\skv@optionprocessorpackages{%
+  xkeyval,kvoptions,catoptions,biblatex,pgfopts,ltxkeys%
+}
 % Filter class options to remove those with '=':
 \skvrobustdef*\skv@filterclassoptions{%
-  \skv@swafalse
-  \ifx\@classoptionslist\@undefined\else
-    \ifx\@classoptionslist\relax\else\skv@swatrue\fi
-  \fi
-  \ifskv@swa
-    \let\skv@filterclassoptions\relax
+  \ifcase0%
+    \ifx\@classoptionslist\@undefined 1\fi
+    \ifx\@classoptionslist\relax 1\fi\relax
+    \global\let\skv@filterclassoptions\relax
     \skvkvnormalize\@classoptionslist
-    \let\skv@origclassoptlist\@classoptionslist
+    \let\skvoriginalclassoptionslist\@classoptionslist
     \let\skv@classoptionslist\@classoptionslist
     \let\@classoptionslist\@empty
-    \skvcommaloop*\skv@origclassoptlist\skv@tempa{%
+    \skvcommaloop*\skvoriginalclassoptionslist\skv@tempa{%
       \skvxifinTF{=}{\skvexpandonce\skv@tempa}{}{%
         \skvaddtolist*\@classoptionslist\skv@tempa
       }%
@@ -140,11 +157,9 @@
     \def\@fileswith@ptions##1[##2]##3{%
       \edef\skv@tempa{\unexpanded{##3}}%
       \skvcsvnormalize\skv@tempa
-      % The following packages need access to the original
-      % \@classoptionslist.
-      \skvcommaloop{xkeyval,kvoptions,keyval2e,ltxkeys}\skv@prova{%
+      \skvcommaloop*\skv@optionprocessorpackages\skv@prova{%
         \skvxifinTF{,\skv@prova,}{,\skv@tempa,}{%
-          \let\@classoptionslist\skv@origclassoptlist
+          \let\@classoptionslist\skvoriginalclassoptionslist
           \skvbreakloop
         }{}%
       }%
@@ -153,15 +168,6 @@
     }%
   \fi
 }
-\skvifdefFT\skv@documentclass{%
-  \let\skv@documentclass\@empty
-  \let\skv@classoptionslist\@empty
-  \edef\@popfilename{%
-    \skvexpandonce\@popfilename\skv@filterclassoptions
-  }%
-}{%
-  \skv@filterclassoptions
-}
 \skvrobustdef*\skvbeforebegindocument{%
   \skvgappendtomacro\skv@beforebegindoc
 }
@@ -187,7 +193,7 @@
 }
 \skvrobustdef*\skv@notprerr#1{%
   \@latex@error{Command \detokenize{#1} should be used only
-    in preamble}\@ehd
+    in preamble}\skv@ehd
 }
 \skvnewdef*\skv@everypagehook{}
 \skvrobustdef*\skvatbegineverypage{\skvgappendtomacro\skv@everypagehook}
@@ -206,29 +212,37 @@
 
 \skvnewdef*\skv@preamblecmdhook{}
 \skvrobustdef*\skvonlypreamble#1{%
-  \def\do##1{%
+  \def\skv@provb##1{%
+    \skvifntypeTF{##1}{}{%
+      \skv@err{More than one macro
+        \MessageBreak '\detokenize{##1}'.
+        \MessageBreak Maybe a comma is missing in the list}\skv@ehd
+    }%
     \skvxifinTF{\detokenize{\do##1}}{\skvoxdetok\skv@preamblecmdhook}{%
       \skv@warn{Command '\noexpand##1' multiply
         \MessageBreak submitted to \string\skvonlypreamble: ignored}%
     }{%
       \xdef\skv@preamblecmdhook{%
-        \skvexpandonce\skv@preamblecmdhook
-        \unexpanded{\do##1}%
+        \skvexpandonce\skv@preamblecmdhook\unexpanded{\do##1}%
       }%
     }%
   }%
   \skvcommaparse{#1}\skv@prova{%
-    \expandafter\do\expandafter{\skv@prova}%
+    \expandafter\skv@provb\expandafter{\skv@prova}%
   }%
 }
 \AtEndOfPackage{%
   \skvafterbegindocument{%
     \def\do#1{%
       \skvifdefTF#1{%
-        \gdef#1{\@latexerr{'\string#1' is a preamble command}\@ehd}%
+        \gdef#1{\@latexerr{'\string#1' is a preamble command}\skv@ehd}%
       }{%
-        \@@warning{Undefined command '\unexpanded{#1}'
-          appeared in \string\skvonlypreamble}%
+        \ifx\relax#1\else
+          \@@warning{Undefined command '\unexpanded{#1}'
+            \MessageBreak appeared in \string\skvonlypreamble.
+            \MessageBreak Only defined commands should be
+            \MessageBreak submitted to \string\skvonlypreamble.}%
+        \fi
       }%
     }%
     \skv@preamblecmdhook
@@ -242,7 +256,7 @@
 % \skvunknownoptionhandler[<prefixes>]<<families>>{<handler>}
 %
 \skvrobustdef*\skvunknownoptionhandler{%
-  \skv@testopt\skv@unknownoptionhandler\skv@defaultpref
+  \skv@testopt\skv@unknownoptionhandler\skvdefaultprefix
 }
 \skvrobustdef*\skv@unknownoptionhandler[#1]{%
   \skvifnextchar<{\skv@unkn@wnoptionhandler{#1}}%
@@ -251,14 +265,12 @@
 \skvrobustdef*\skv@unkn@wnoptionhandler#1<#2>{%
   \skv@unknownkeyhandler[#1]{#2}%
 }
-
-
 \skvrobustdef*\skv@testopte#1{\skv@testopta{\skv@t@stopte{#1}}}
-\skvrobustdef*\skv@t@stopte#1{\skv@testopt{\skv@t@st@pte{#1}}\skv@defaultpref}
+\skvrobustdef*\skv@t@stopte#1{\skv@testopt{\skv@t@st@pte{#1}}\skvdefaultprefix}
 \skvrobustdef*\skv@t@st@pte#1[#2]{%
   % Only one prefix is allowed:
   \skvxifinTF{,}{\detokenize{#2}}{%
-    \skv@err{Only one prefix is allowed, but you gave '#2'}\@ehd
+    \skv@err{Only one prefix is allowed, but you gave '#2'}\skv@ehd
   }{%
     \skv@makeprefix{#2}%
     \skvifnextchar<{\skv@@t@st@pte{#1}}%
@@ -289,6 +301,14 @@
   \let\skvdefkey\skvvoidkey
   \skv@dox@a
 }
+% \skvdeclareobsoleteoption
+%   [<pref>]{<fam>}{<obsolete key>}{<new key>}[<defa>]{<callback>}
+\skvrobustdef*\skvdeclareobsoleteoption{%
+  \let\@fileswith@pti@ns\@badrequireerror
+  \let\skvdefkey\skvobsoletekey
+  \skv@dox@a
+}
+
 % \skvdeclarebooloption[<pref>]<<fam>>[<mp>]{<key>}[<defa>]{<callback>}
 \skvrobustdef*\skvdeclarebooloption{%
   \let\@fileswith@pti@ns\@badrequireerror
@@ -302,44 +322,40 @@
   \skv@dox@a
 }
 
-% Our default action for unknown options is tied to \@currname & \@currext:
+% Our default action for unknown options is tied to \@currname
+% and \@currext:
 \skvrobustdef\skv@dox#1{%
-  \skvcsedef{skv@dox@\@currname @\@currext}{%
+  \skvcsedef{skv@dox@\@currname.\@currext}{%
     \unexpanded{%
-      \begingroup
       \ifx\skvcurrentvalue\skv@novaluetoks
         \def\skvcurrentvalue{no value}%
       \fi
-      \@onelevel@sanitize\CurrentOption
-      \@onelevel@sanitize\skvcurrentvalue
       #1%
-      \endgroup
     }%
   }%
 }
-\skvrobustdef*\skv@dox@a{\skv@testopt\skv@dox@b\skv@defaultpref}
+\skvrobustdef*\skv@dox@a{\skv@testopt\skv@dox@b\skvdefaultprefix}
 \skvrobustdef*\skv@dox@b[#1]{%
-  \skvifnextchar<%
-    {\skv@dox@c{#1}}{\skv@dox@c{#1}<\@currname.\@currext>}%
+  \skvifnextchar<{\skv@dox@c{#1}}{\skv@dox@c{#1}<\@currname.\@currext>}%
 }
 \skvrobustdef*\skv@dox@c#1<#2>{\skvdefkey[#1]{#2}}
 
 % Declare options with default values that will be used when the options
 % are called without user values.
 %
-% \skvDeclarePassedOptions[<pref>]{<fam>}{<option>=<default>,...}
+% \skvdeclarepassedoptions[<pref>]{<fam>}{<option>=<default>,...}
 %
 % Example:
 %
-%  \skvDeclarePassedOptions[KV]{fam}{%
+%  \skvdeclarepassedoptions[KV]{fam}{%
 %    hyperref={colorlinks,breaklinks},xcolor=svgnames
 %  }
 %
-\skvrobustdef*\skvDeclarePassedOptions{%
-  \skv@testopt\skv@declarepassedoptions\skv@defaultpref
+\skvrobustdef*\skvdeclarepassedoptions{%
+  \skv@testopt\skv@declarepassedoptions\skvdefaultprefix
 }
 \skvrobustdef*\skv@declarepassedoptions[#1]#2#3{%
-  \skvparsekeyvals{#3}\skv@tempa{%
+  \skvparsekvlist{#3}\skv@tempa{%
     \skvexpbracenext\skv@kvsplit\skv@tempa{%
       \skvdeclareoption[#1]<#2>{##1}[##2]{%
         \skvifcsdefTF{ver@##1.sty}{%
@@ -347,9 +363,9 @@
             \MessageBreak now you're passing options to it.
             \MessageBreak Instruction ignored}%
         }{%
-          \skvPassOptionsToPackage{####1}{##1}%
+          \skvpassoptionstopackage{####1}{##1}%
           \AtBeginDocument{%
-            \skvifpackageloaded{##1}{}{%
+            \skvifpackageloadedTF{##1}{}{%
               \skv@warn{Options were passed to package
                 \MessageBreak '##1' but it was never loaded}%
             }%
@@ -359,9 +375,9 @@
     }%
   }%
 }
-% \skvPassOptionsToPackage{<opts>}{<pkg>}
-\skvrobustdef*\skvPassOptionsToPackage{\skv@passoptions{sty}}
-\skvrobustdef*\skvPassOptionsToClass{\skv@passoptions{cls}}
+% \skvpassoptionstopackage{<opts>}{<pkg>}
+\skvrobustdef*\skvpassoptionstopackage{\skv@passoptions{sty}}
+\skvrobustdef*\skvpassoptionstoclass{\skv@passoptions{cls}}
 \skvrobustdef*\skv@passoptions#1#2#3{%
   \begingroup
   \edef\@elt{opt@\skvtrimspace{#3}.#1}%
@@ -372,14 +388,16 @@
   \endgroup
 }
 
-% \skvDeclarePassedOptionsLoadPackage
+% Pass options to package and load the package after processing options.
+%
+% \skvdeclarepassedoptionsloadpackage
 %    [<pref>]{<fam>}{<option>=<default>,...}
 %
-\skvrobustdef*\skvDeclarePassedOptionsLoadPackage{%
-  \skv@testopt\skv@declarepassedoptions@load\skv@defaultpref
+\skvrobustdef*\skvdeclarepassedoptionsloadpackage{%
+  \skv@testopt\skv@declarepassedoptions@load\skvdefaultprefix
 }
 \skvrobustdef*\skv@declarepassedoptions@load[#1]#2#3{%
-  \skvparsekeyvals{#3}\skv@tempa{%
+  \skvparsekvlist{#3}\skv@tempa{%
     \skvexpbracenext\skv@kvsplit\skv@tempa{%
       \skvdeclareoption[#1]<#2>{##1}[##2]{%
         \skvifcsdefTF{ver@##1.sty}{%
@@ -418,86 +436,134 @@
 % 4. The \ProcessOptionsX of xkeyval package doesn't expect any plus (+)
 %    suffix: it processes options only in a single family.
 %
-\skvrobustdef*\skvprocessoptions{\skv@testopte\skv@pox}
+% 5. \skvpackagelist contains the list of loaded packages with their
+%    options that are found on the current paths. See
+%    <https://groups.google.com/forum/#!topic/comp.text.tex/XErNCMcT_jc>
+%    for the rationale. Example:
+%
+%       \usepackage[option1,option2]{foobar}
+%       \show\skvpackagelist
+%       \expandafter\show\csname foobar.sty.poxkeys\endcsname
+%
+\skvnewlet\skvpackagelist\@empty
+\skvrobustdef*\skvprocessoptions{%
+  \skv@getdocumentclass
+  \ifdefined\skv@documentclass
+    \global\let\skv@getdocumentclass\relax
+    \skv@filterclassoptions
+  \fi
+  \skv@testopte\skv@pox
+}
+\skvnewlet\skv@savprocessoptions\skvprocessoptions
+\skvrobustdef*\skv@badprocessoptions{%
+  \skv@testopte{%
+    \skv@err{\noexpand\skvprocessoptions can't be nested}\skv@ehd
+  }%
+}
 \skvrobustdef*\skv@pox[#1]{%
   \skv@inpoxtrue
   \let\@fileswith@pti@ns\@badrequireerror
-  \edef\skv@userclassorpackage{\@currname.\@currext}%
+  \let\skvprocessoptions\skv@badprocessoptions
   \begingroup
-  \let\skv@clsoptsfound\@empty
-  \let\skv@clsorpkgopts\@empty
+  \edef\skv@userclassorpackage{\@currname.\@currext}%
+  \let\skv@classoptionsfound\@empty
+  \let\skv@classorpackageoptions\@empty
+  % The list of pox keys for each family, simply for taking
+  % pox keys outside the current scope:
   \let\skv@exitpoxkeys\@empty
-  \skvifxTF\skv@userclassorpackage\skv@documentclass{%
+  % The list of pox keys in all familes:
+  \let\skvcurrentpoxkeys\@empty
+  \ifx\skv@userclassorpackage\skv@documentclass
+    \skv@inclasstrue
     \let\@unusedoptionlist\skv@classoptionslist
-  }{%
-    \ifcase0\ifx\skv@classoptionslist\@empty\else
-      \ifx\skv@classoptionslist\relax\else\ifskv@st1\fi\fi\fi\relax
-      \skv@swafalse
-    \else
-      \skv@swatrue
-    \fi
-    \skvifboolFT{skv@swa}{}{%
-      \def\ifkeyundef##1##2##3{\skvexpanded{\skvifkeydefFT[##1]{##2}{##3}}}%
-      \skvcommaloop*\skv@classoptionslist\CurrentOption{%
-        \expandafter\expandafter\expandafter
-          \skv@g@tkeyname\CurrentOption=\skv@nil\skvcurrentkey
-        % Test if key is defined in one of the families. The search will
-        % stop as soon as the key is found in any of the families.
-        \ifkeyundef\skvcurrentprefix\skv@fams\skvcurrentkey{}{%
-          \edef\skv@clsoptsfound{%
-            \skvexpandonce\skv@clsoptsfound
-            \ifx\skv@clsoptsfound\@empty\else,\fi
-            \skvexpandonce\CurrentOption
+  \else
+    \skv@inclassfalse
+    \ifcase0%
+      \ifx\skv@classoptionslist\@undefined 1\fi
+      \ifx\skv@classoptionslist\@empty 1\fi
+      \ifx\skv@classoptionslist\relax 1\fi\relax
+      \ifskv@st
+        \def\ifkeyundef##1##2##3{\skvexpanded{\skvifkeydefFT[##1]{##2}{##3}}}%
+        \skvcommaloop*\skv@classoptionslist\CurrentOption{%
+          \expandafter\expandafter\expandafter
+            \skv@g@tkeyname\CurrentOption=\skv@getname@nil\skvcurrentkey
+          % Test if key is defined in one of the families. The search will
+          % stop as soon as the key is found in any of the families.
+          \ifkeyundef\skvcurrentprefix\skv@fams\skvcurrentkey{}{%
+            \edef\skv@classoptionsfound{%
+              \skvaddlist,\skv@classoptionsfound\skvexpandonce\CurrentOption
+            }%
+            \expandafter\skv@removeoption\expandafter{\CurrentOption}%
           }%
-          \expandafter\skv@useoption\expandafter{\CurrentOption}%
         }%
-      }%
-      \ifx\skv@clsoptsfound\@empty\else\skvafterfi
-        \skvexpbracenext\skv@getkeynames\skv@clsoptsfound\skv@tempd
-        \skvexpbracenext\skv@getpoxkeys\skv@tempd
+        \ifx\skv@classoptionsfound\@empty\else
+          \skvexpbracenext\skv@getnamesofkeys\skv@classoptionsfound\skv@tempd
+          \skvexpbracenext\skv@getpoxkeys\skv@tempd
+        \fi
       \fi
-    }%
-  }%
-  \skvletcs\skv@clsorpkgopts{opt@\@currname.\@currext}%
-  \skvifxTF\skv@clsorpkgopts\@empty{}{%
-    \skvifxTF\skv@clsorpkgopts\relax{}{%
-      \skvexpbracenext\skv@getkeynames\skv@clsorpkgopts\skv@tempd
-      \skvexpbracenext\skv@getpoxkeys\skv@tempd
-    }%
-  }%
-  % Package options have higher priority than class options. Hence
-  % filter class options \skv@clsoptsfound that are also present
-  % as package options \skv@clsorpkgopts:
-  \ifcase0\ifx\skv@clsoptsfound\@empty\else
-    \ifx\skv@clsorpkgopts\@empty\else
-      \ifx\skv@clsorpkgopts\relax\else1\fi\fi\fi\relax
-  \else\skvafterfi
+    \fi
+  \fi
+  \skvletcs\skv@classorpackageoptions{opt@\@currname.\@currext}%
+  \ifx\skv@classorpackageoptions\relax
+    \def\skv@classorpackageoptions{}%
+  \fi
+  \skvifemptyTF\skv@classorpackageoptions{}{%
+    \skvexpbracenext\skv@getnamesofkeys\skv@classorpackageoptions\skv@tempd
+    \skvexpbracenext\skv@getpoxkeys\skv@tempd
+    % Package options have higher priority than class options. Hence
+    % filter class options \skv@classoptionsfound that are also present
+    % as package options \skv@classorpackageoptions:
     \skvifxTF\skv@userclassorpackage\skv@documentclass{}{%
-      \skvcommaloop*\skv@clsoptsfound\CurrentOption{%
-        \expandafter\expandafter\expandafter
-          \skv@g@tkeyname\CurrentOption=\skv@nil\skv@tempa
-        \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempd,}{}{%
-          \edef\skv@clsorpkgopts{%
-            \skvexpandonce\skv@clsorpkgopts,\skvexpandonce\CurrentOption
+      \skvifemptyTF\skv@classoptionsfound{}{%
+        \skvcommaloop*\skv@classoptionsfound\CurrentOption{%
+          \expandafter\skv@g@tkeyname\CurrentOption=\skv@getname@nil\skv@tempa
+          \skvxifinTF{,\skvoxdetok\skv@tempa,}{,\skvoxdetok\skv@tempd,}{}{%
+            \edef\skv@classorpackageoptions{%
+              \skvaddlist,\skv@classorpackageoptions
+              \skvexpandonce\CurrentOption
+            }%
           }%
         }%
       }%
     }%
+  }%
+  % Get document class options that are on the current paths:
+  \ifx\skv@userclassorpackage\skv@documentclass
+    \def\skvclassoptionsfound{}%
+    \skvcommaloop*\skv@classorpackageoptions\skv@prova{%
+      \expandafter\skv@g@tkeyname\skv@prova=\skv@getname@nil\skvcurrentkey
+      \edef\skv@prova{[\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}}%
+      \expandafter\skvifkeydefTF\skv@prova{%
+        \edef\skvclassoptionsfound{%
+          \skvaddlist,\skvclassoptionsfound\skvcurrentkey
+        }%
+      }{}%
+    }%
+  \else
+    \let\skvclassoptionsfound\skv@classoptionsfound
   \fi
+  % \skvpackagelist is populated by all calls to \skvprocessoptions.
+  \skvletcs\skv@prova{\@currname.\@currext.poxkeys}%
+  \edef\skvpackagelist{%
+    \skvaddlist,\skvpackagelist
+    \skvifdefFT\skv@prova{}{\@currname.\@currext{\skv@prova}}%
+  }%
+  \let\do\skvcmdexit
   \skvexpanded{\endgroup
-    \skv@exitpoxkeys
-    \skvcmdexit\@unusedoptionlist
-    % There may be preset keys even when \skv@clsorpkgopts is empty:
+    \do\skvclassoptionsfound\do\skvcurrentpoxkeys
+    \do\skvpackagelist\do\@unusedoptionlist
+    \skvboolexit\ifskv@inclass\skv@exitpoxkeys
+    % There may be preset keys even when \skv@classorpackageoptions is empty:
     \skvsetkeys\ifskv@pl+\fi[\skvcurrentprefix]{\skv@fams}[#1]%
-      {\skvexpandonce\skv@clsorpkgopts}%
+      {\skvexpandonce\skv@classorpackageoptions}%
   }%
-  \skvcslet{skv@dox@\@currname @\@currext}\relax
-  \skvinitializermkeys*\skvcurrentprefix\skv@fams
+  \skvcslet{skv@dox@\@currname.\@currext}\relax
   \skv@inpoxfalse
   \let\@fileswith@pti@ns\@@fileswith@pti@ns
+  \let\skvprocessoptions\skv@savprocessoptions
   \AtEndOfPackage{\let\@unprocessedoptions\relax}%
-  \csname skv@\@currname @\@currext @afterprocess@hook\endcsname
-  \skvcslet{skv@\@currname @\@currext @afterprocess@hook}\relax
+  \csname skv@\@currname.\@currext @afterprocess@hook\endcsname
+  \skvcslet{skv@\@currname.\@currext @afterprocess@hook}\relax
 }
 
 % \skvprocessoptionswithclassoptions*+[<pref>]{<fams>}[<na>]
@@ -506,9 +572,11 @@
 %    user hasn't put it.
 %
 \skvrobustdef*\skvprocessoptionswithclassoptions{%
-  \skv@testopte\skv@pox@copyclassoptions
+  \skv@testopte\skv@processoptionswithclassoptions
+}
+\skvrobustdef*\skv@processoptionswithclassoptions[#1]{%
+  \skv@sttrue\skv@pox[#1]%
 }
-\skvrobustdef*\skv@pox@copyclassoptions[#1]{\skv@sttrue\skv@pox[#1]}
 
 % \skvprocessoptionswithoutclassoptions*+[<pref>]{<fams>}[<na>]
 %
@@ -516,175 +584,189 @@
 %    user has put it.
 %
 \skvrobustdef*\skvprocessoptionswithoutclassoptions{%
-  \skv@testopte\skv@pox@nocopyclassoptions
+  \skv@testopte\skv@processoptionswithoutclassoptions
+}
+\skvrobustdef*\skv@processoptionswithoutclassoptions[#1]{%
+  \skv@stfalse\skv@pox[#1]%
 }
-\skvrobustdef*\skv@pox@nocopyclassoptions[#1]{\skv@stfalse\skv@pox[#1]}
 
 % \skv@getpoxkeys{<keys>}
 %
-% Get pox keys (ie, keys processed as options) from package or
-% class options.
+% 1. Get pox keys (ie, keys processed as options) from package or
+%    class options.
+% 2. This isn't a user command! See \skvgetdefinedkeys in file
+%    skeyval-core.tex.
 \skvrobustdef*\skv@getpoxkeys#1{%
   \begingroup
-  \def\xiftest{%
-    \skvexpanded{%
-      \noexpand\skvifkeyinfamiliesFT
-        [\skvcurrentprefix]{\skv@fams}{\skvcurrentkey}%
+  \skvcommaloop*\skv@fams\skvcurrentfamily{%
+    \skv@makeheader\skvcurrentfamily
+    % Prepare to take poxkeys outside the group:
+    \skvxifinTF{\skvoxdetok\skv@header}{\skvoxdetok\skv@exitpoxkeys}{}{%
+      \edef\skv@exitpoxkeys{%
+        \skvexpandonce\skv@exitpoxkeys
+        \noexpand\skvcsexit{\skvcurrentpath.@poxkeys}%
+      }%
     }%
-  }%
-  \skvcommaloop{#1}\skvcurrentkey{%
-    \xiftest{}{%
-      % \skv@header is formed in the search for the key:
-      \skvletcs\skv@prova{\skv@header.@poxkeys}%
-      \skvifdefTF\skv@prova{%
-        \skvxifinTF{,\skvoxdetok\skvcurrentkey,}{,\skvoxdetok\skv@prova,}{}{%
-          \skvcsedef{\skv@header.@poxkeys}{\skv@prova,\skvcurrentkey}%
-        }%
-      }{%
-        \skvcsedef{\skv@header.@poxkeys}{\skvcurrentkey}%
+    \edef\skv@prova{\@currname.\@currext.poxkeys}%
+    \skvxifinTF{\skvoxdetok\skv@prova}{\skvoxdetok\skv@exitpoxkeys}{}{%
+      \edef\skv@exitpoxkeys{%
+        \skvexpandonce\skv@exitpoxkeys\noexpand\skvcsexit{\skv@prova}%
       }%
-      \skvxifinTF{\skvoxdetok\skv@header}{\skvoxdetok\skv@exitpoxkeys}{}{%
-        \edef\skv@exitpoxkeys{%
-          \skvexpandonce\skv@exitpoxkeys
-          \noexpand\skvcsexit{\skv@header.@poxkeys}%
+    }%
+    \skvcommaloop{#1}\skvcurrentkey{%
+      \skvifcsdefFT{\skv@header\skvcurrentkey.@cbk}{}{%
+        \skvletcs\skv@prova{\skvcurrentpath.@poxkeys}%
+        \skvifdefTF\skv@prova{%
+          \skvxifinTF{,\skvcurrentkey,}{,\skv@prova,}{}{%
+            \skvcsedef{\skvcurrentpath.@poxkeys}{%
+              \skvaddlist,\skv@prova\skvcurrentkey
+            }%
+          }%
+        }{%
+          \skvcsedef{\skvcurrentpath.@poxkeys}{\skvcurrentkey}%
+        }%
+        \skvletcs\skv@prova{\@currname.\@currext.poxkeys}%
+        \skvifdefTF\skv@prova{%
+          \skvxifinTF{,\skvcurrentkey,}{,\skv@prova,}{}{%
+            \skvcsedef{\@currname.\@currext.poxkeys}{%
+              \skvaddlist,\skv@prova\skvcurrentkey
+            }%
+          }%
+        }{%
+          \skvcsedef{\@currname.\@currext.poxkeys}{\skvcurrentkey}%
+        }%
+        \skvxifinTF{,\skvcurrentkey,}{,\skvcurrentpoxkeys,}{}{%
+          \edef\skvcurrentpoxkeys{%
+            \skvaddlist,\skvcurrentpoxkeys\skvcurrentkey
+          }%
         }%
       }%
     }%
   }%
+  \let\do\skvcmdexit
   \skvexpanded{\endgroup
-    \skvcmdexit\skv@exitpoxkeys
+    \do\skvcurrentpoxkeys
+    % We need the list in \skv@exitpoxkeys outside the current scope.
+    % It will be used to take poxkeys (on each path) outside the scope
+    % in \skv@pox:
+    \do\skv@exitpoxkeys
+    % We need the poxkeys on each path outside the current scope:
     \skv@exitpoxkeys
   }%
 }
 
 % +++++++++ Utilities for handling options via \directkeys +++++++++%
 
-\skvrobustdef*\dirkeys@declareoptions@a{%
-  \let\@fileswith@pti@ns\@badrequireerror
-  \skv@dox
-}
-\skvrobustdef*\dirkeys@declareoptions@b#1{%
+% \dirkeys@declareoptions{<star>}{<list>}
+%
+% <star>, if present, means new options.
+%
+\skvrobustdef*\dirkeys@declareoptions#1#2{%
   \let\@fileswith@pti@ns\@badrequireerror
-  \skv@inopttrue
   \begingroup
-  \edef\skv@tempb{\unexpanded{#1}}%
+  % The boolean skv@inopt differs from skv@inpox. skv@inopt is only
+  % meant to set the default family in \dirkeys@setdefaultpath
+  % when dealing with options.
+  \skv@inopttrue
   \def\skv@tempa{}%
-  \def\do##1##2{%
+  \edef\skv@tempb{\unexpanded{#2}}%
+  \def\skv@pathdo##1##2{%
     \edef\skv@tempa{%
       \skvexpandonce\skv@tempa
-      \skvdefinekeys\ifskv@handlerswa*\fi[##1]{##2}%
+      \skvdefinekeys#1[##1]{##2}%
       [\dirkeys@holderprefixtoks]{\skvexpandonce\skv@tempb}%
     }%
   }%
-  \dirkeys@getcurrentroots\do
+  \dirkeys@pathlist
   \expandafter\endgroup\skv@tempa
-  \skv@inoptfalse
 }
-% % \dirkeys@executeoptions{<options>}
+% \dirkeys@executeoptions{<plus sign or empty>}{<kvlist>}
 %
-% 1. Ececute options on all the prevailing paths. If any of
-%    the options isn't found on a path, report error (ie,
-%    don't save the key to the list of 'remaining keys'). Unknown
-%    options should be flagged by an error immediately.
-% 2. There is no plus (+) variant for this command/handler.
-% 3. It is the user's responsibility to ensure that keys exist on
-%    current paths. This is easier to enforce if there is only one
-%    current path (prefix and family).
+% 1. <no-plus> = Execute options on ONLY the first path found. If an
+%    option isn't found on the given paths, report error (ie,
+%    don't save the option to the list of 'remaining keys'). Unknown
+%    options should be flagged by an error immediately. Hence no
+%    star (*) form of \dirkeys@executeoptions.
+% 2. <plus> = Execute options on all the prevailing paths. If an
+%    option isn't found on the given paths, flag error.
 %
-\skvrobustdef*\dirkeys@executeoptions#1{%
-  \skv@inopttrue
+\skvrobustdef*\dirkeys@executeoptions#1#2{%
   \begingroup
-  % Don't confuse parameter characters in #1 with those of \do:
-  \edef\skv@tempb{\unexpanded{#1}}%
-  \def\skv@tempa{}%
-  \def\do##1##2{%
-    \skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
-    \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
-    \edef\skv@tempa{%
-      \skvexpandonce\skv@tempa
-      \skvsetkeys[##1]{##2}[\skv@igkeys]{\skvexpandonce\skv@tempb}%
-    }%
-  }%
-  \dirkeys@getcurrentroots\do
-  \expandafter\endgroup\skv@tempa
-  \skv@inoptfalse
-}
-
-% \dirkeys@executeoptions@b{<options>}
-%
-% 1. Ececute options in all the prevailing families. If any of
-%    the options isn't found in at least one family, report error (ie,
-%    don't save the key to the list of 'remaining keys'). Unknown options
-%    should be flagged immediately.
-% 2. The plus (+) variant will execute the option in each family in
-%    which the option is found.
-% 3. The difference between \dirkeys@executeoptions and
-%    \dirkeys@executeoptions@b is that in \dirkeys@executeoptions
-%    the prefixes can be more than one. Options will be executed for
-%    all combinations of prefixes and families.
-% 4. Prevailing prefixes can't be more than one.
-%
-\skvrobustdef*\dirkeys@executeoptions@b#1{%
   \skv@inopttrue
-  \begingroup
-  \dirkeys@collectpaths
-  \skvexpanded{\endgroup
-    \skvsetkeys+[\skv@tempa]{\skv@tempb}[\skv@tempc]%
-  }{#1}%
-  \skv@inoptfalse
-}
-\skvrobustdef*\dirkeys@collectpaths{%
-  \skvemptify{\do\skv@tempa\do\skv@tempb\do\skv@tempc}%
-  \def\do##1##2{%
-    \skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
-    \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
-    \skvxifinTF{,##1,}{,\skv@tempa,}{}{%
-      \edef\skv@tempa{\skv@tempa\ifx\skv@tempa\@empty\else,\fi##1}%
-    }%
-    \skvxifinTF{,##2,}{,\skv@tempb,}{}{%
-      \edef\skv@tempb{\skv@tempb\ifx\skv@tempb\@empty\else,\fi##2}%
-    }%
-    \edef\skv@tempc{%
-      \skv@tempc\ifx\skv@tempc\@empty\else,\fi\skv@igkeys
+  % If the number of families is greater than one, gnored keys
+  % from different families will mixed. This is the case even in
+  % \skvsetkeys.
+  \skvemptify{\skv@igkeys,\skv@fams}%
+  \@tempcnta\skvz@
+  \def\skv@pathdo##1##2{%
+    \advance\@tempcnta\@ne
+    \def\skv@pref{##1}%
+    \ifnum\@tempcnta=\@ne
+      \def\skv@firstpref{##1}%
+    \else
+      \ifx\skv@pref\skv@firstpref\else
+        \skv@err{You can't use multiple prefixes when
+          \MessageBreak calling the handler '.execute options'.
+          \MessageBreak Check your values of '.prefix' and '.paths'}\skv@ehd
+      \fi
+    \fi
+    \skvxifinTF{,##2,}{,\skv@fams,}{}{%
+      \edef\skv@fams{\skvaddlist,\skv@fams##2}%
     }%
+    \skvletcs\skv@prova{##1/##2/.@ignoredkeys}%
+    \ifdefined\skv@prova
+      \edef\skv@igkeys{\skvaddlist,\skv@igkeys\skv@prova}%
+    \fi
   }%
-  \dirkeys@getcurrentroots\do
-  \skvifelementcount*\skv@tempa\tw@
-    {\skv@err{You can't submit more than one prefix here}\@ehd}{}
+  \dirkeys@pathlist
+  \ifx\skv@fams\@empty
+    \skv@err{No family before calling '.execute options'}\skv@ehd
+  \fi
+  \skvexpanded{\endgroup
+    \skvsetkeys#1[\skv@pref]{\skv@fams}[\skv@igkeys]%
+  }{#2}%
 }
-\skvrobustdef*\dirkeys@processoptions{%
-  \skv@inopttrue
+\skvrobustdef*\dirkeys@processoptions#1#2{%
   \begingroup
-  \def\skv@tempa{}%
-  \def\do##1##2{%
-    \skvletcs\skv@igkeys{##1/##2/.@ignoredkeys}%
-    \skvifdefTF\skv@igkeys{}{\def\skv@igkeys{}}%
-    \edef\skv@tempa{%
-      \skvexpandonce\skv@tempa
-      \skvprocessoptions\ifskv@handlerswa*\fi
-      [##1]<##2>[\skv@igkeys]%
+  \skv@inopttrue
+  % If the number of families is greater than one, gnored keys
+  % from different families will mixed. This is the case even in
+  % \skvprocessoptions.
+  \skvemptify{\skv@igkeys,\skv@fams}%
+  \@tempcnta\skvz@
+  \def\skv@pathdo##1##2{%
+    \advance\@tempcnta\@ne
+    \def\skv@pref{##1}%
+    \ifnum\@tempcnta=\@ne
+      \def\skv@firstpref{##1}%
+    \else
+      \ifx\skv@pref\skv@firstpref\else
+        \skv@err{You can't use multiple prefixes when
+          \MessageBreak calling the handler '.process options'.
+          \MessageBreak Check your values of '.prefix' and '.paths'}\skv@ehd
+      \fi
+    \fi
+    \skvxifinTF{,##2,}{,\skv@fams,}{}{%
+      \edef\skv@fams{\skvaddlist,\skv@fams##2}%
     }%
+    \skvletcs\skv@prova{##1/##2/.@ignoredkeys}%
+    \ifdefined\skv@prova
+      \edef\skv@igkeys{\skvaddlist,\skv@igkeys\skv@prova}%
+    \fi
   }%
-  \dirkeys@getcurrentroots\do
-  \expandafter\endgroup\skv@tempa
-  \skv@inoptfalse
-}
-\skvrobustdef*\dirkeys@processoptions@b{%
-  \skv@inopttrue
-  \begingroup
-  \dirkeys@collectpaths
+  \dirkeys@pathlist
+  \ifx\skv@fams\@empty
+    \skv@err{No family before calling '.process options'}\skv@ehd
+  \fi
   \skvexpanded{\endgroup
-    \skvprocessoptions\ifskv@handlerswa*\fi
-    +[\skv@tempa]<\skv@tempb>[\skv@tempc]%
+    \skvprocessoptions#1#2[\skv@pref]<\skv@fams>[\skv@igkeys]%
   }%
-  \skv@inoptfalse
 }
 
 % ++++++++ Keys for the handler <.mega process options> +++++++++ %
 
 \directkeys*{%
-  .prefix=SKV,
-  .family=megapox,
+  .path={SKV/megapox},
   .holder prefix=dirkeys@pox@,
   .initialize keys after define=true,
   .new keys={
@@ -692,124 +774,121 @@
       \def\dirkeys@pox@igkeys{#1}
       \skvstripouterbraces{2}\dirkeys@pox@igkeys
     ,
-    .ord/.options prefix/\skv@defaultpref/
-      \skvxifinTF{,}{\detokenize{#1}}{
-        \skv@err{Only one prefix is allowed in processing options}\@ehd
-      }{
-        \def\dirkeys@pox@pref{#1}
+    .ord/{.prefix,.options prefix}/\skvdefaultprefix/
+      \skv@ifoneprefix{#1}{%
+        \edef\dirkeys@pox@pref{#1}
         \skvstripouterbraces{2}\dirkeys@pox@pref
+      }{%
+        \skv@err{Only one prefix is allowed in
+          \MessageBreak processing options}\skv@ehd
       }
     ,
-    .ord/.options families/\@currname.\@currext/
+    .ord/{.family,.families,.options families,.options family}/
+      \@currname.\@currext/
       \edef\dirkeys@pox@fams{#1}
       \skvstripouterbraces{2}\dirkeys@pox@fams
+      \skv@makepaths\dirkeys@pox@pref\dirkeys@pox@fams
+        \dirkeys@megapox@pathlist\skv@pathdo
     ,
-    .ord/.copy class options/true/
-      \edef\dirkeys@pox@copyclass{\skvifstrcmpTF{#1}{true}{00}{01}}
+    .ord/{path,.paths,.option path,.option paths}/
+      {KV/\@currname.\@currext}/
+      \skv@formatpaths{#1}\dirkeys@megapox@pathlist
+    ,
+    .ord/{.copy class options,.include class options}/true/
+      \edef\dirkeys@pox@copyclass{0\skvifstrcmpTF{#1}{true}{0}{1}}
     ,
-  },
-  .styles={
-    .prefix/.options prefix=#1,
-    .options family/.options families=#1,
-    .family/.options families=#1,
-    .families/.options families=#1,
-    .include class options/.copy class options=#1,
   },
 }
 %\skvshowcs{SKV/megapox/.options family.@cbk}
 %\skvshowcs{SKV/megapox/.pref.@cbk}
 
+\skvnewnumbers[skv@]{megapoxdepth}
 \skvrobustdef*\dirkeys@megaprocessoptions#1{%
-  \skvpushfunctions\dirkeys@megaprocessoptions{%
-    \do\dirkeys@pox@pref\do\dirkeys@pox@fams
+  \skvpushfunctions\dirkeys@megapox{%
+    \do\dirkeys@pathlist\do\skv@pathdo\do\dirkeys@megapox@pathlist
     \do\dirkeys@pox@igkeys\do\dirkeys@pox@copyclass
-  }\skv@gendepth
-  \skv@inopttrue
+  }\skv@megapoxdepth
+  \skvemptify{\dirkeys@megapox@pathlist,\dirkeys@pox@igkeys}%
+  \let\dirkeys@pox@pref\skvdefaultprefix
+  \def\dirkeys@pox@copyclass{01}%
   \skvsetkeys[SKV]{megapox}{#1}%
+  \ifx\dirkeys@pox@igkeys\@empty
+    % So that all '...@ignoredkeys' will be undefined:
+    \let\dirkeys@pox@igkeys\undefined
+  \fi
+  \let\dirkeys@pathlist\dirkeys@megapox@pathlist
+  \def\skv@pathdo##1##2{%
+    \skvcslet{##1/##2/.@ignoredkeys}\dirkeys@pox@igkeys
+  }%
+  \dirkeys@pathlist
   \skvexpanded{%
-    \skvprocessoptions\if\dirkeys@pox@copyclass*\fi+%
-    [\dirkeys@pox@pref]<\dirkeys@pox@fams>[\dirkeys@pox@igkeys]%
+    \dirkeys@processoptions\if\dirkeys@pox@copyclass*\fi{+}%
   }%
-  \skv@inoptfalse
-  \skvpopfunctions\dirkeys@megaprocessoptions\skv@gendepth
+  \skvpopfunctions\dirkeys@megapox\skv@megapoxdepth
 }
 
-% +++++++++++++ Handlers for processing options ++++++++++++++ %
+% +++++++++++++ Handlers for executing and processing options ++++++++++++ %
 
 \directkeys*{%
   .new handlers={
-    .action for unknown options=\dirkeys@declareoptions@a{#1},
-    .declare options={
-      \skv@handlerswafalse\dirkeys@declareoptions@b{#1}
+    {.action for unknown options,.action for unknown options}={
+      \let\@fileswith@pti@ns\@badrequireerror
+      \skv@dox{#1}
     },
-    .new options={
-      \skv@handlerswatrue\dirkeys@declareoptions@b{#1}
+    {.declare option,.declare options,.define option,.define options}={
+      \dirkeys@declareoptions{}{#1}
     },
-    .execute options={
-      \dirkeys@executeoptions{#1}
+    {.new option,.new options}={
+      \dirkeys@declareoptions{*}{#1}
     },
-    .execute options+={
-      \dirkeys@executeoptions@b{#1}
+    {.execute options,.executeoptions,.execute options in one family}={
+      \dirkeys@executeoptions{}{#1}
     },
-    .execute options*={
+    {.execute options*,.executeoptions*}={
       \skv@err
-        {Handler <.execute options*> is undefined}
-        {Handler <.execute options> has no star (*) variant,
+        {Handler '.execute options*' is undefined}
+        {Handler '.execute options' has no star (*) variant,
         \MessageBreak since we don't want to ignore unknown
         \MessageBreak options from within package or class file.}%
     },
-    .execute options*+={
-      \skv@err
-        {Handler <.execute options*+> is undefined}
-        {Handler <.execute options+> has no star (*) variant,
-        \MessageBreak since we don't want to ignore unknown
-        \MessageBreak options from within package or class file.}%
+    {.execute options+,.executeoptions+,.execute options in all families}={
+      \dirkeys@executeoptions{+}{#1}
     },
     % 1. All <.process options> handlers will filter out ignored keys.
     % 2. <.process options*> will copy class options.
-    % 3. <.process options+> will set options in all the active families
-    %    in which the options exist.
-    % 4. <.process options*+> will copy class options and set options in
-    %    all the active families in which the options are found.
-    .process options={
-      \skv@handlerswafalse\dirkeys@processoptions
+    {.process options,.processoptions,.process options in one family}={
+      \dirkeys@processoptions{}{}
     },
-    .process options*={
-      \skv@handlerswatrue\dirkeys@processoptions
+    {.process options*,.processoptions*,
+      .copy class options and process options,
+      .copy class options and process options in one family}={
+      \dirkeys@processoptions{*}{}
     },
-    .process options+={
-      \skv@handlerswafalse\dirkeys@processoptions@b
+    {.process options+,.processoptions+,.process options in all families}={
+      \dirkeys@processoptions{}{+}
     },
-    .process options*+={
-      \skv@handlerswatrue\dirkeys@processoptions@b
+    {.process options*+,.processoptions*+,
+      .copy class options and process options in all families}={
+      \dirkeys@processoptions{*}{+}
     },
     % The handler <.mega process options> will:
-    % 1. Search all families in its key <families>.
-    % 2. Not perform filtering of ignored paths and keys; in fact, will not
+    % 1. Search all families in its key <paths>.
+    % 2. Not filter ignored paths and keys; in fact, it will not
     %    use active paths and keys.
     % 3. The handler '.mega process options' has the keys <ignore options>,
     %    <options prefix>, <options families>, and <copy class options>.
     %    These keys have aliases.
     %    See an example later in this file.
-    .mega process options={
+    {.mega process options,.megaprocessoptions}={
       \dirkeys@megaprocessoptions{#1}
     },
-    .mega process options*={
+    {.mega process options*,.megaprocessoptions*}={
       \dirkeys@megaprocessoptions{#1,copy class options}
     },
   },
   .handler let={
-    .action for unknown option=.action for unknown options,
-    .every unknown option=.action for unknown options,
-    .define options=.declare options,
-    .processoptions=.process options,
-    .processoptions*=.process options*,
-    .copy class options and process options in all active families=
-      .process options*+,
-    .copy class options and process options in all families=
-      .process options*+,
-    .copy class options and process options=.process options*,
-    .executeoptions=.execute options,
+    {.action for unknown option,.every unknown option}=
+      .action for unknown options,
   },
 }
 %\skvshowcs{dirkeys@handler@.every unknown option}
@@ -819,69 +898,59 @@
 % till after the options section:
 \skvrobustdef*\skvafterprocessoptions{%
   \expandafter\skvgappendtomacro
-  \csname skv@\@currname @\@currext @afterprocess@hook\endcsname
+  \csname skv@\@currname.\@currext @afterprocess@hook\endcsname
 }
-\skvnewlet\skvifpackageloaded\@ifpackageloaded
+\skvnewlet\skvifpackageloadedTF\@ifpackageloaded
 
-\def\skv@visiteduseoptions{01}
-\skvrobustdef*\skv@useoption#1{%
-  \if\skv@visiteduseoptions\else
-    \skvcsvnormalize\@unusedoptionlist
-    \def\skv@visiteduseoptions{00}%
-  \fi
-  \begingroup
-  \@onelevel@sanitize\@unusedoptionlist
-  \skv@kvosplit{\detokenize{#1}}{%
-    \edef\CurrentOption{\skvtrimspace{##1}}%
+\skvnewdef*\skv@visiteduseoptions{01}
+\skvrobustdef*\skv@removeoption#1{%
+  \ifx\@unusedoptionlist\@empty\else
+    \if\skv@visiteduseoptions\else
+      \skvcsvnormalize\@unusedoptionlist
+      \def\skv@visiteduseoptions{00}%
+    \fi
+    \begingroup
+    \skv@g@tkeyname#1=\skv@getname@nil\skv@tempb
+    \@onelevel@sanitize\skv@tempb
     \def\skv@tempa{}%
     \skvcommaloop*\@unusedoptionlist\skv@prova{%
-      \skv@kvosplit\skv@prova{%
-        \edef\reserved@a{\skvtrimspace{####1}}%
-        \ifx\reserved@a\CurrentOption\else
-          \edef\skv@tempa{%
-            \skv@tempa\ifx\skv@tempa\@empty\else,\fi\skv@prova
-          }%
-        \fi
-      }%
+      \expandafter\skv@g@tkeyname\skv@prova=\skv@getname@nil\skv@provb
+      \@onelevel@sanitize\skv@provb
+      \ifx\skv@provb\skv@tempb\else
+        \edef\skv@tempa{\skvaddlist,\skv@tempa\skvexpandonce\skv@prova}%
+      \fi
     }%
     \let\@unusedoptionlist\skv@tempa
-  }%
-  \skvaftergroupdef\@unusedoptionlist\endgroup
+    \skvaftergroupdef\@unusedoptionlist\endgroup
+  \fi
 }
 \skvonlypreamble{%
-  \skvdeclareoption,\skvexecuteoptions,\skvprocessoptions,\skv@useoption,
-  \dirkeys@declareoptions@a,\dirkeys@declareoptions@b,
-  \dirkeys@megaprocessoptions,\dirkeys@processoptions,
-  \dirkeys@processoptions@b,\skvprocessoptionswithclassoptions,
-  \skvprocessoptionswithoutclassoptions,\dirkeys@executeoptions,
-  \dirkeys@executeoptions@b
+  \skvdeclareoption,\skvexecuteoptions,\skvprocessoptions,\skv@removeoption,
+  \skveveryunknownoption,\dirkeys@declareoptions,
+  \dirkeys@megaprocessoptions,\dirkeys@processoptions,\dirkeys@executeoptions,
+  \skvprocessoptionswithclassoptions,\skvprocessoptionswithoutclassoptions
 }
 
 %+++++++++++++++++ This package's options section ++++++++++++++++++%
 
 \skvrobustdef*\setupskeyval{\skvsetkeys[SKV]{skeyval}}
 \skv@inoptionsectrue
-
-%\skvshowcs{dirkeys@handler@.every unknown option}
-
 \directkeys*{%
   .every unknown option={
     \@onelevel@sanitize\CurrentOption
     \PackageWarning{skeyval}{Unknown option '\CurrentOption' ignored}%
   },
-  .prefix=SKV,
-  .family=skeyval,
+  .path=SKV/skeyval,
   .holder prefix=skv@,
   .new options={
-    .bool/verbose/true,
-    .bool/tracingkeys/true,
+    .bool/{verbose,tracingkeys}/true,
     .ord/{keyparser,key parser}/{,}/
       \def\skv@keyparser{#1}%
       \skvstripouterbraces{2}\skv@keyparser,
     .bool/compatibility/true/
       \ifskv@compatibility
         \skvafterprocessoptions{%
-          \skvifpackageloaded{skeyval-bc}{}{%
+          \skvifpackageloadedTF{skeyval-bc}{}{%
             \RequirePackage{skeyval-bc}%
           }
         }%
@@ -898,9 +967,17 @@
     .copy class options,
   },
 }
-%\skvshowcs{SKV/skeyval/keyparser.@cbk}
-
 \skv@inoptionsecfalse
 
 \skv@restorecodes
 \endinput
+
+
+
+
+
+
+\edef\skv@prova{\@currname.\@currext/\skvcurrentkey}%
+        \skvxifinTF{,\skv@prova,}{,\skvpackagelist,}{}{%
+          \edef\skvpackagelist{\skvaddlist,\skvpackagelist\skv@prova}%
+        }%
-- 
cgit v1.2.3

