summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/ltxkeys
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-08-15 23:04:13 +0000
committerKarl Berry <karl@freefriends.org>2011-08-15 23:04:13 +0000
commit5c9d629f843570179358708a673501e5a647a617 (patch)
tree69bc8e44446b946194971933ac3756bdb60b9c30 /Master/texmf-dist/tex/latex/ltxkeys
parentc94e2deaaa21a46bcd63069cb63f3f6a807139a9 (diff)
ltxkeyx (15aug11)
git-svn-id: svn://tug.org/texlive/trunk@23566 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/ltxkeys')
-rw-r--r--Master/texmf-dist/tex/latex/ltxkeys/ltxkeys.sty915
1 files changed, 568 insertions, 347 deletions
diff --git a/Master/texmf-dist/tex/latex/ltxkeys/ltxkeys.sty b/Master/texmf-dist/tex/latex/ltxkeys/ltxkeys.sty
index 62cb38a1a3a..a1ff1d3b98a 100644
--- a/Master/texmf-dist/tex/latex/ltxkeys/ltxkeys.sty
+++ b/Master/texmf-dist/tex/latex/ltxkeys/ltxkeys.sty
@@ -1,6 +1,6 @@
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
% %
-% This is file 'ltxkeys.sty', version 0.1.0, July 2011. %
+% This is file 'ltxkeys.sty', version 0.0.1, July 2011. %
% %
% This package and accompanying files may be distributed and/or %
% modified under the conditions of the LaTeX Project Public License, %
@@ -19,16 +19,24 @@
% Copyright (c) 2011 Ahmed Musa (amusa22@gmail.com). %
% %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
-\RequirePackage{catoptions}[2011/07/07]
+
+\RequirePackage{catoptions}[2011/07/30]
\UseNormalCatcodes
\StyleFilePurpose{Robust and fast key-value parser}
\StyleFileRCSInfo
-$Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
+$Id: ltxkeys.sty,v 0.0.1 2011/07/30 09:00:00 Ahmed Musa Exp $
\ProvidesPackage{ltxkeys}[\StyleFileInfo]
\NeedsTeXFormat{LaTeX2e}[1996/12/01]
\SetStyleFileMessages[ltxkeys@]{info}{warn}{err}
-\newvariables{if}[ltxkeys@]{break,st,pl,sw,sv,noval,pxop,exop,kf,
- rm,ssk,dec,dep,twk,verbose,inputvalid}[false]
+\robust@def*\ltxkeys@error#1#2{\ltxkeys@err{#1}{#2}\@gobble}
+\robust@def*\ltxkeys@vwarn#1{%
+ \ifltxkeys@verbose\wlog{[ltxkeys debug] -- #1.}\fi
+}
+\robust@def*\ltxkeys@vinfo#1{%
+ \ifltxkeys@verbose\wlog{[ltxkeys debug] ++ #1.}\fi
+}
+\newvariables{if}[ltxkeys@]{break,st,pl,sw,sv,nv,noval,pxop,exop,%
+ inpreset,kf,rm,ssk,dec,dep,twk,verbose,swa}[false]
\newvariables{if}{inputvalid}[false]
\robust@def*\SetSlaveWithMaster{\global\ltxkeys@ssktrue}
\robust@def*\SetNoSlaveWithMaster{\global\ltxkeys@sskfalse}
@@ -40,10 +48,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ltxkeys@err{No \string\documentclass}\@ehc
\emptifycsset{\cpt@documentclass,\cpt@classoptionslist}%
}
-\robust@def*\ltxkeys@gobble@to@nil{%
- \begingroup
- \defpass\reserved@a##1\ltxkeys@nil{\endgroup}%
-}
\robust@def*\ltxkeys@testst#1{\cpt@ifstar{\ltxkeys@sttrue#1}{\ltxkeys@stfalse#1}}
\robust@def*\ltxkeys@testpl#1{\cpt@ifplus{\ltxkeys@pltrue#1}{\ltxkeys@plfalse#1}}
\robust@def*\ltxkeys@teststpl#1{\ltxkeys@testst{\ltxkeys@testpl{#1}}}
@@ -75,101 +79,11 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\expandafter\noexpand\@gobble##1%
}%
}{ }
-\newvariables{tog}{rem@repl,rem@repl@all}
-\robust@def*\ltxkeys@removeoneelement{\cpt@testopt\ltxkeys@rem@veoneelement,}
-\robust@def\ltxkeys@rem@veoneelement[#1]#2#3{%
- \ifcpt@check\cpt@checklistparser{#1}\relax\fi
- \begingroup
- \edef\parser{\detokenize{#1}}%
- \def\ltxkeys@tempa##1{%
- \def\ltxkeys@remove####1#1##1#1####2\remove@nil{%
- \def#2{####1#1####2}%
- \cpt@trimparser[#1]#2%
- }%
- \xifinsetTF{\detokenize{#1##1#1}}{\parser\cptoxdetok{#2}\parser}{%
- \expandafter\ltxkeys@remove\expandafter#1#2#1\remove@nil
- \iftogFT{rem@repl@all}{}{%
- \expandafter\ltxkeys@tempa\expandafter{\ltxkeys@tempb}%
- }%
- }{}%
- }%
- \iftogTF{rem@repl}{%
- \edef\ltxkeys@tempb{\unexpanded{#3}}%
- }{%
- \cpt@sttrue\cpt@csvnormalize[#1]#2%
- \ltxkeys@trimspaces{#3}\ltxkeys@tempb
- }%
- \expandafter\ltxkeys@tempa\expandafter{\ltxkeys@tempb}%
- \postgroupdef#2\endgroup
-}
-\robust@def*\ltxkeys@removeelements{\cpt@testopt\ltxkeys@rem@veelements,}
-\robust@def\ltxkeys@rem@veelements[#1]#2#3{%
- \begingroup
- \cpt@sttrue\cpt@csvnormalize[#1]#2%
- \cpt@checkfalse
- \togtrue{rem@repl}%
- \long\def\csv@do##1{%
- \ltxkeys@removeoneelement[#1]#2{##1}%
- }%
- \csv@@parse[#1]{#3}%
- \postgroupdef#2\endgroup
-}
-% \ltxkeys@replaceoneelement[<parser>]{<cs>}{<search>}{<replace>}
-\robust@def*\ltxkeys@replaceoneelement{%
- \cpt@testopt\ltxkeys@repl@ceoneelement,%
-}
-\robust@def\ltxkeys@repl@ceoneelement[#1]#2#3#4{%
- \ifcpt@check\cpt@checklistparser{#1}\relax\fi
- \begingroup
- \edef\parser{\detokenize{#1}}%
- \def\ltxkeys@tempa##1{%
- \def\ltxkeys@replace####1#1##1#1####2\rep@nil{%
- \def#2{####1#1#4#1####2}%
- \cpt@trimparser[#1]#2%
- }%
- \xifinsetFT{\detokenize{#1##1#1}}{\parser\cptoxdetok#2\parser}{}{%
- \expandafter\ltxkeys@replace\expandafter#1#2#1\rep@nil
- \iftogFT{rem@repl@all}{}{%
- \expandafter\ltxkeys@tempa\expandafter{\ltxkeys@tempb}%
- }%
- }%
- }%
- \iftogTF{rem@repl}{%
- \edef\ltxkeys@tempb{\unexpanded{#3}}%
- }{%
- \cpt@sttrue\cpt@csvnormalize[#1]#2%
- \ltxkeys@trimspaces{#3}\ltxkeys@tempb
- }%
- \expandafter\ltxkeys@tempa\expandafter{\ltxkeys@tempb}%
- \postgroupdef#2\endgroup
-}
-\robust@def*\ltxkeys@replaceelements{\cpt@testopt\ltxkeys@repl@ceelements,}
-\robust@def\ltxkeys@repl@ceelements[#1]#2#3#4{%
- \begingroup
- \edef\ltxkeys@tempa{\unexpanded{#3}}%
- \edef\ltxkeys@tempb{\unexpanded{#4}}%
- \def\csv@do##1{\cpt@sttrue\cpt@csvnormalize[#1]##1}%
- \csv@@loop[,]{#2,\ltxkeys@tempa,\ltxkeys@tempb}%
- \def\ltxkeys@tempc##1#1##2\noboundary##3#1##4\noboundary{%
- \ltxkeys@replaceoneelement[#1]#2{##1}{##3}%
- \ifblankTF{##2}{}{%
- \ifblankTF{##4}{}{%
- \ltxkeys@tempc##2\noboundary##4\noboundary
- }%
- }%
- }%
- \cpt@checkfalse
- \togtrue{rem@repl}%
- \cptexpandsecond\ltxkeys@tempc{%
- \expandcsonce\ltxkeys@tempa#1\noboundary
- \expandcsonce\ltxkeys@tempb#1\noboundary
- }%
- \postgroupdef#2\endgroup
-}
\robust@def*\ltxkeys@oneoftwo#1\endgroup{%
\let\@firstoftwo\relax
\let\@secondoftwo\relax
- \edefpass\ltxkeys@tempa{\endgroup
+ \cptpassexpanded{%
+ \endgroup
\ifcase#1\relax
\if@boolTF{cpt@choicefd}\@firstoftwo\@secondoftwo
\or
@@ -190,7 +104,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\cptexpanded{%
\toks@{\def\noexpand\ltxkeys@order{\the\@tempcnta}}%
}%
- \ltxkeys@breaktrue
+ \loopbreaktrue
}%
\advance\@tempcnta\@ne
}%
@@ -200,19 +114,18 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def*\ltxkeys@ifeltcountTF{\cpt@testopt\ltxkeys@ifeltcount{=}}
\robust@def*\ltxkeys@ifeltcount[#1]#2#3{%
\begingroup
- \def\ltxkeys@do##1{\advance\@tempcnta by1}%
\@tempcnta\z@pt
+ \def\ltxkeys@do##1{%
+ \advance\@tempcnta by1
+ }%
\ltxkeys@csvloop{#2}%
- \expandafter\endgroup\csname @\ifnum\@tempcnta#1\numexpr#3%
- first\else second\fi oftwo\endcsname
+ \aftercsname\endgroup{@\ifnum\@tempcnta#1\numexpr#3%
+ first\else second\fi oftwo}%
}
\robust@def*\ltxkeys@nomatcherr{%
- \ltxkeys@err{User input '\reserved@e' not in list:
+ \ltxkeys@error{User input '\reserved@e' not in list:
\MsgBrk '\reserved@f'}\@ehc
- \@gobble
}
-% A re-implementation of xkeyval's \XKV@checkchoice for
-% arbitrary parser and more robustness:
\robust@def*\ltxkeys@checkchoice{%
\cpt@teststpl{\cpt@testopt\ltxkeys@cc@a,}%
}
@@ -220,7 +133,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ifcpt@check\cpt@checklistparser{#1}{}\fi
\cpt@testopt{\ltxkeys@cc@b#1}{}%
}
-\robust@def*\comma@cc{%
+\robust@def*\ltxkeys@commacheckchoice{%
\cpt@teststpl{\cpt@testopt{\ltxkeys@cc@b,}{}}%
}
\robust@def*\CheckInput#1#2{%
@@ -235,15 +148,15 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def*\ltxkeys@cc@b#1[#2]#3#4{%
\begingroup
\ifcpt@st\lowercase{\fi
- \ltxkeys@trimspaces{#3}\user@input
- \edef\valid@vals{\unexpanded{#4}}%
+ \ltxkeys@trimspaces{#3}\us@rinput
+ \edef\nomin@tions{\unexpanded{#4}}%
\ifcpt@st}\fi
\def\ltxkeys@ccparser{#1}%
- \cpt@sttrue\cpt@csvnormalize[#1]\valid@vals
+ \cpt@sttrue\cpt@csvnormalize[#1]\nomin@tions
\cptexpandsecond{%
\ifblankTF{#2}\ltxkeys@cc@d{\ltxkeys@cc@c#2}\ltxkeys@nil
}{%
- {\expandcsonce\user@input}{\expandcsonce\valid@vals}%
+ {\expandcsonce\us@rinput}{\expandcsonce\nomin@tions}%
}%
}
\robust@def*\ltxkeys@cc@c#1#2\ltxkeys@nil#3#4{%
@@ -275,8 +188,8 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
\cptpassexpanded{%
\endgroup
- \def\noexpand\reserved@e{\expandcsonce\user@input}%
- \def\noexpand\reserved@f{\expandcsonce\valid@vals}%
+ \def\noexpand\reserved@e{\expandcsonce\us@rinput}%
+ \def\noexpand\reserved@f{\expandcsonce\nomin@tions}%
\expandcsonce\ltxkeys@tempa
}%
}
@@ -286,7 +199,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\def\csv@do##1{%
\def#1{##1}%
\ifstrcmpTF{##1}{#3}{%
- \cpt@choicefdtrue\cptbreakloop
+ \cpt@choicefdtrue\loopbreak
}{%
\pushnumber#2%
}%
@@ -304,15 +217,13 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ifcpt@pl
\noexpand\@secondoftwo
\else
- \def\noexpand\reserved@e{\expandcsonce\user@input}%
- \def\noexpand\reserved@f{\expandcsonce\valid@vals}%
+ \def\noexpand\reserved@e{\expandcsonce\us@rinput}%
+ \def\noexpand\reserved@f{\expandcsonce\nomin@tions}%
\unexpanded{\expandafter\ltxkeys@nomatcherr\@gobble}%
\fi
\fi
}%
}
-
-% \ltxkeys@ifincsvlistTF*[parser](no.){sublist}{mainlist}{true}{false}
\robust@def*\ltxkeys@ifincsvlistTF{\cpt@teststopt\ltxkeys@ifincsvlist,}
\robust@def*\ltxkeys@ifincsvlist[#1]{%
\cpt@testpnopt{\ltxkeys@if@ncsvlist#1}{1}%
@@ -325,28 +236,29 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\edef\ltxkeys@tempb{\unexpanded{#4}}%
\ifcpt@st}\fi
\cpt@sttrue\cpt@csvnormalize[#1]\ltxkeys@tempb
- \cpt@cnta\z@pt\def\itemspresent{}%
+ \cpt@cnta\z@pt\def\ltxkeys@itemspresent{}%
\def\csv@do##1{%
\xifinsetFT{\detokenize{#1##1#1}}
{\parser\cptoxdetok\ltxkeys@tempb\parser}{}{%
- \edef\itemspresent{\cptliststack,\itemspresent\unexpanded{##1}}%
+ \edef\ltxkeys@itemspresent
+ {\cptliststack,\ltxkeys@itemspresent\unexpanded{##1}}%
\advance\cpt@cnta\@ne
}%
- \ifnum\cpt@cnta>\numexpr#2-1\relax\cptbreakloop\fi
+ \ifnum\cpt@cnta>\numexpr#2-1\relax\loopbreak\fi
}%
\csv@@parse*[#1]\ltxkeys@tempa
\ifnum\cpt@cnta>\numexpr#2-1\relax
- \edef\nritems{\the\cpt@cnta}%
+ \edef\ltxkeys@nritems{\the\cpt@cnta}%
\else
- \def\itemspresent{}\def\nritems{-1}%
+ \def\ltxkeys@itemspresent{}\def\ltxkeys@nritems{-1}%
\fi
\cptexpandsecond\endgroup{%
- \cpt@csexit\itemspresent\cpt@csexit\nritems
- \ifx\itemspresent\@empty\noexpand\@secondoftwo\else
+ \cpt@csexit\ltxkeys@itemspresent
+ \cpt@csexit\ltxkeys@nritems
+ \ifx\ltxkeys@itemspresent\@empty\noexpand\@secondoftwo\else
\noexpand\@firstoftwo\fi
}%
}
-% \ltxkeys@ifintsvlistTF(no){sublist}{mainlist}{true}{false}
\robust@def*\ltxkeys@ifintsvlistTF{%
\cpt@testst{\cpt@testpnopt\ltxkeys@ifintsvlist{1}}%
}
@@ -356,68 +268,65 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\edef\ltxkeys@tempa{\unexpanded{#2}}%
\edef\ltxkeys@tempb{\unexpanded{#3}}%
\ifcpt@st}\fi
- \def\itemspresent{}\cpt@cnta\z@pt
+ \def\ltxkeys@itemspresent{}\cpt@cnta\z@pt
\def\tsv@do##1{%
\xifinsetFT{\detokenize{##1}}{\cptoxdetok\ltxkeys@tempb}{}{%
- \edef\itemspresent{\cptliststack{}\itemspresent\unexpanded{##1}}%
+ \edef\ltxkeys@itemspresent
+ {\cptliststack{}\ltxkeys@itemspresent\unexpanded{##1}}%
\advance\cpt@cnta\@ne
}%
- \ifnum\cpt@cnta>\numexpr#1-1\relax\cptbreakloop\fi
+ \ifnum\cpt@cnta>\numexpr#1-1\relax\loopbreak\fi
}%
\s@expandarg\tsv@@parse\ltxkeys@tempa
\ifnum\cpt@cnta>\numexpr#1-1\relax
- \edef\nritems{\the\cpt@cnta}%
+ \edef\ltxkeys@nritems{\the\cpt@cnta}%
\else
- \def\itemspresent{}\def\nritems{-1}%
+ \def\ltxkeys@itemspresent{}\def\ltxkeys@nritems{-1}%
\fi
\cptexpandsecond\endgroup{%
- \cpt@csexit\itemspresent\cpt@csexit\nritems
- \ifx\itemspresent\@empty\noexpand\@secondoftwo\else
+ \cpt@csexit\ltxkeys@itemspresent
+ \cpt@csexit\ltxkeys@nritems
+ \ifx\ltxkeys@itemspresent\@empty\noexpand\@secondoftwo\else
\noexpand\@firstoftwo\fi
}%
}
-% \ltxkeys@ifinTF*(no.){sublist}{mainlist}{true}{false}
-\robust@def*\ltxkeys@ifinTF{%
- \cpt@testst{\cpt@testpnopt\ltxkeys@ifin{1}}%
+\robust@def*\ltxkeys@ifinlistTF{%
+ \cpt@testst{\cpt@testpnopt\ltxkeys@ifinlist{1}}%
}
-\robust@def*\ltxkeys@ifin(#1)#2#3{%
+\robust@def*\ltxkeys@ifinlist(#1)#2#3{%
\begingroup
\ifcpt@st\lowercase{\fi
\edef\ltxkeys@tempa{\unexpanded{#2}}%
\edef\ltxkeys@tempb{\unexpanded{#3}}%
\ifcpt@st}\fi
- \cpt@sttrue\cpt@csvnormalize[,]\ltxkeys@tempa
- \cpt@cnta\z@pt\def\itemspresent{}%
- \def\do##1,{%
- \ifnot@nil{##1}{%
- \xifinsetFT{\detokenize{##1}}{\cptoxdetok\ltxkeys@tempb}{}{%
- \edef\itemspresent{\cptliststack,\itemspresent\unexpanded{##1}}%
- \advance\cpt@cnta\@ne
- }%
- \ifnumcmpTF\cpt@cnta>\numexpr#1-1{\gobble@to@sentinel\@nil,}{\do}%
+ \def\ltxkeys@itemspresent{}\cpt@cnta\z@pt
+ \s@expandarg\docommalist\ltxkeys@tempa{%
+ \xifinsetFT{\detokenize{##1}}{\cptoxdetok\ltxkeys@tempb}{}{%
+ \edef\ltxkeys@itemspresent
+ {\cptliststack,\ltxkeys@itemspresent\unexpanded{##1}}%
+ \advance\cpt@cnta\@ne
}%
+ \ifnum\cpt@cnta>\numexpr#1-1\relax\loopbreak\fi
}%
- \expandafter\do\ltxkeys@tempa,\@nil,%
\ifnum\cpt@cnta>\numexpr#1-1\relax
- \edef\nritems{\the\cpt@cnta}%
+ \edef\ltxkeys@nritems{\the\cpt@cnta}%
\else
- \def\itemspresent{}\def\nritems{-1}%
+ \def\ltxkeys@itemspresent{}\def\ltxkeys@nritems{-1}%
\fi
\cptexpandsecond\endgroup{%
- \cpt@csexit\itemspresent\cpt@csexit\nritems
- \ifcsemptyTF\itemspresent{\noexpand\@secondoftwo}
+ \cpt@csexit\ltxkeys@itemspresent
+ \cpt@csexit\ltxkeys@nritems
+ \ifcsemptyTF\ltxkeys@itemspresent{\noexpand\@secondoftwo}
{\noexpand\@firstoftwo}%
}%
}
-\robust@def*\ltxkeys@inpkgcls#1{%
+\robust@def*\ltxkeys@notinpkgclserr#1{%
\ifinstylefileTF{}{%
\ltxkeys@err{Command '\detokenize{#1}' issued outside
style file}{The command '\detokenize{#1}' is available
only in style files.}%
}%
}
-\new@def*\ltxkeys@parsestack{}
-\newletcs\ltxkeys@break\ltxkeys@breaktrue
\robust@def*\ltxkeys@csvloop{%
\let\ltxkeys@nlz\cptfalse
\let\ltxkeys@inkv\cptfalse
@@ -440,45 +349,36 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}
\robust@def*\ltxkeys@parse@a#1{%
\cpt@stchoose{cpt@st}{#1}\ltxkeys@arg\ltxkeys@parse@a
- \global\advance\ltxkeys@csvdepth\@ne
- \letcsntocsn{ifltxkeys@break@\romannumeral\ltxkeys@csvdepth}
- {ifltxkeys@break}%
- \letcsntocs{ltxkeys@doo@\romannumeral\ltxkeys@csvdepth}\ltxkeys@doo
- \xdef\ltxkeys@parsestack{%
- \letcsntocsn{ifltxkeys@break}
- {ifltxkeys@break@\romannumeral\ltxkeys@csvdepth}%
- \letcsntocsn{ltxkeys@doo}{ltxkeys@doo@\romannumeral\ltxkeys@csvdepth}%
- \ltxkeys@nil{\expandcsonce\ltxkeys@parsestack}%
- }%
+ \pushfunctions\ltxkeys@parse
+ {\ifloopbreak,\ltxkeys@doo}\ltxkeys@csvdepth
\ifdefTF\ltxkeys@do
{\let\ltxkeys@doo\ltxkeys@do}{\cpt@notdeferr\ltxkeys@do}%
\def\ltxkeys@parse@b{%
- \if@boolTF{ltxkeys@break}{%
- \defpass\reserved@a####1\ltxkeys@nil,{}%
+ \if@boolTF{loopbreak}{%
+ \gobble@to@sentinel\ltxkeys@nil,%
}{%
\ltxkeys@parse@c.%
}%
}%
- \long\def\ltxkeys@parse@c##1,{%
- \edef\ltxkeys@arg{\expandcsonce{\@gobble##1}}%
- \ifxTF\ltxkeys@arg\ltxkeys@nnil{}{%
- \ifxTF\@empty\ltxkeys@arg{}{%
- \expandafter\ltxkeys@doo\expandafter{\ltxkeys@arg}\relax
- }%
- \ltxkeys@parse@b
- }%
- }%
- \ifpsiboolTF{ltxkeys@nlz}{%
+ \ifswitchTF{ltxkeys@nlz}{%
\cpt@sttrue
- \usename{cpt@\if\ltxkeys@inkv kv\else csv\fi normalize}[,]\ltxkeys@arg
+ \usename{cpt@\if\ltxkeys@inkv kv\else
+ csv\fi normalize}[,]\ltxkeys@arg
}{}%
- \ltxkeys@breakfalse
+ \loopbreakfalse
\expandafter\ltxkeys@parse@b\ltxkeys@arg,\ltxkeys@nil,%
- \def\reserved@a##1\ltxkeys@nil{##1\gdef\ltxkeys@parsestack}%
- \expandafter\reserved@a\ltxkeys@parsestack
- \global\advance\ltxkeys@csvdepth\m@one
+ \popfunctions\ltxkeys@parse\ltxkeys@csvdepth
\ifnum\ltxkeys@csvdepth=\z@pt\undefcs\ltxkeys@do\fi
}
+\robust@def*\ltxkeys@parse@c#1,{%
+ \edef\ltxkeys@arg{\expandcsonce{\@gobble#1}}%
+ \ifxTF\ltxkeys@arg\ltxkeys@nnil{}{%
+ \ifxTF\@empty\ltxkeys@arg{}{%
+ \expandafter\ltxkeys@doo\expandafter{\ltxkeys@arg}\relax
+ }%
+ \ltxkeys@parse@b
+ }%
+}
\robust@def*\ltxkeys@testopt@a#1{\cpt@testopt{\ltxkeys@testopt@b#1}{KV}}
\robust@def*\ltxkeys@testopt@b#1[#2]#3{%
\ltxkeys@makepf{#2}%
@@ -527,6 +427,9 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def*\ltxkeys@testopt@g#1#2{%
\cptexpandarg\ltxkeys@testopt@a{\noexpandcsn{ltxkeys@#1}{#2}}%
}
+\robust@def*\ltxkeys@testopt@h#1{%
+ \cptexpandarg\ltxkeys@testopt@a{\noexpandcsn{ltxkeys@#1}}%
+}
\robust@def*\ltxkeys@bracedefault#1[{%
\begingroup
\toks@{#1}%
@@ -575,6 +478,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\csn@xdef{\ltxkeys@hdr#1@keys}{\expandcsonce{#2}}%
}%
}
+\new@def*\ltxkeys@currtriple{\ltxkeys@ttpref,\ltxkeys@tfam,\ltxkeys@tkey}
\robust@def*\ltxkeys@makepf#1{%
\s@expandarg\ltxkeys@trimspaces{#1}\ltxkeys@ttpref
\edef\ltxkeys@tpref{%
@@ -587,11 +491,45 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ltxkeys@tpref\ifcsnullTF\ltxkeys@tfam{}{\ltxkeys@tfam @}%
}%
}
+\new@def*\ltxkeys@badkeynamelist{}
+\robust@def*\ltxkeys@badkeynames#1{%
+ \ifcsnullTF\ltxkeys@badkeynamelist{%
+ \edef\ltxkeys@badkeynamelist{\detokenize{#1}}%
+ \cpt@sttrue\cpt@csvnormalize[,]\ltxkeys@badkeynamelist
+ }{%
+ \cptexpandsecond{\cptfiltermergecsv[,]}
+ {\noexpand\ltxkeys@badkeynamelist{\detokenize{#1}}}\nofilter
+ }%
+}
+\robust@def*\ltxkeys@removebadkeynames#1{%
+ \ifcsnullTF\ltxkeys@badkeynamelist{%
+ \ltxkeys@info{Couldn't delete from empty
+ \string\ltxkeys@badkeynamelist}%
+ }{%
+ \cptexpandsecond{\cptfilterremovecsv[,]}
+ {\noexpand\ltxkeys@badkeynamelist{\detokenize{#1}}}\nofilter
+ }%
+}
+\ltxkeys@badkeynames{.code,ordkey,cmdkey,choicekey,boolkey,%
+ handledkeys,presetkeys,postsetkeys%
+}
+\robust@def*\ltxkeys@findbadkeyname#1{%
+ \begingroup
+ \edef\ltxkeys@tempa{\cpttrimspaces{#1}}%
+ \oifinset@sp@TF,\ltxkeys@tempa\ltxkeys@badkeynamelist{%
+ \ltxkeys@err{Bad key name '\ltxkeys@tempb'}\@ehc
+ }{}%
+ \endgroup
+}
\robust@def*\ltxkeys@saveinitialkeyvals#1#2#3{%
\xifinsetTF{\detokenize{\savevalue}}{\cptoxdetok{#2}}{%
\ltxkeys@err{\noexpand\savevalue pointer not allowed
\MsgBrk when defining a key}\@ehc
- }{}%
+ }{%
+ \ifltxkeys@verbose
+ \s@expandarg\ltxkeys@findbadkeyname{#2}%
+ \fi
+ }%
\ifltxkeys@twk\else
\ifltxkeys@sv
\letcstocsn\ltxkeys@tempa{\ltxkeys@hdr initial@keyvals}%
@@ -601,11 +539,8 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
\fi
\fi
- \ifltxkeys@verbose
- \wlog{Key defined: \ltxkeys@ttpref, \ltxkeys@tfam, \ltxkeys@tkey.}%
- \fi
+ \ltxkeys@vinfo{Key defined: \ltxkeys@currtriple}%
}
-% \ltxkeys@ordkey[pref]{fam}{key}[dft]{fn}
\robust@def*\ltxkeys@ordkey{%
\ltxkeys@svtrue\ltxkeys@swfalse
\ltxkeys@testopt@a\ltxkeys@ordkey@a
@@ -624,7 +559,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ltxkeys@saveinitialkeyvals{}{#1}{#2}%
\csn@def{\ltxkeys@hdr#1}##1{#3}%
}
-% \ltxkeys@cmdkey[pref]{fam}[mp]{key}[dft]{fn}
\robust@def*\ltxkeys@cmdkey{%
\ltxkeys@svtrue\ltxkeys@swfalse
\ltxkeys@testopt@e\ltxkeys@cmdkey@a{cmd}%
@@ -640,8 +574,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
\expandafter\ltxkeys@tempa\ltxkeys@tempb{#4}%
}
-% \ltxkeys@boolkey[pref]{fam}[mp]{key}[dft]{fn}
-% \ltxkeys@boolkey+[pref]{fam}[mp]{key}[dft]{fn}{keyvalerr}
\robust@def*\ltxkeys@boolkey{%
\ltxkeys@svtrue\ltxkeys@swtrue
\ltxkeys@testpl{\ltxkeys@testopt@e\ltxkeys@boolkey@a{bool}}%
@@ -670,9 +602,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
{\cpt@sttrue\ltxkeys@cc@b,[\ltxkeys@resa]{##1}{true,false}#5}%
}%
}
-% \ltxkeys@biboolkeys[pref]{fam}[mp]{key1,key2}[dft]{key1-fn}{key2-fn}
-% \ltxkeys@biboolkeys+[pref]{fam}[mp]{key1,key2}[dft]{key1-fn}{key2-fn}
-% {<fallback>}
\robust@def*\ltxkeys@biboolkeys{%
\ltxkeys@svtrue\ltxkeys@swtrue
\ltxkeys@testpl{\ltxkeys@testopt@e\ltxkeys@biboolkeys@a{}}%
@@ -693,8 +622,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}
\robust@def*\ltxkeys@biboolkeys@d#1#2#3{%
\ltxkeys@ifeltcountTF[=]{#2}\tw@{}{%
- \ltxkeys@err{Biboolean keys '#2' not equal to 2}\@ehc
- \@gobble
+ \ltxkeys@error{Biboolean keys '#2' not equal to 2}\@ehc
}%
\def\ltxkeys@keys{#2}%
\cpt@sttrue\cpt@csvnormalize[,]\ltxkeys@keys
@@ -750,7 +678,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\settogfalse{\ltxkeys@hdr#2}%
}%
}
-% \ltxkeys@stylekey[<pref>]{<fam>}[<mp>]{<key>}[<dft>](<deps>){<fn>}
\robust@def*\ltxkeys@stylekey{%
\ltxkeys@svtrue\ltxkeys@swfalse
\ltxkeys@testst{%
@@ -788,7 +715,9 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def*\ltxkeys@setdependants#1#2{%
\letcstocsn\ltxkeys@tempa{\ltxkeys@hdr\ltxkeys@tkey @dependants}%
\ifcsemptyTF\ltxkeys@tempa{}{%
- \cpt@sttrue\cpt@csvnormalize[;]\ltxkeys@tempa
+ \cpt@sttrue
+ \expandafter\cpt@csvnormalize
+ \expandafter[\ltxkeys@keyparser]\ltxkeys@tempa
\if@boolTF{ltxkeys@dec}{}{%
\cptexpandargonce{\ltxkeys@s@tdependants{#1}{#2}}\ltxkeys@tempa
}%
@@ -827,11 +756,13 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\@temptokena{#1}%
\def\ltxkeys@splita##1/##2/{%
\ifblankTF{##1##2}{%
- \gobble@to@ltxkeys@nil
+ \ltxkeys@warn{Something wrong with dependant keys}\@ehc
+ \expandafter\gobble@to@sentinel\expandafter
+ \ltxkeys@nil\ltxkeys@keyparser
}{%
\ltxkeys@trimspaces{##1}\key@type
- \def\stripstar####1*\@empty####2\@nil{\edef\key@type{####1}}%
- \expandafter\stripstar\key@type\@empty*\@empty\@nil
+ \def\striplaststar####1*\@empty####2\@nil{\edef\key@type{####1}}%
+ \expandafter\striplaststar\key@type\@empty*\@empty\@nil
\xifstrcmpFT\key@type{sty}{}{%
\ltxkeys@err{A dependant key can't have dependants:
\MsgBrk ||\the\@temptokena||}\@ehc
@@ -875,7 +806,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\cptpassexpanded{%
\ifnum\numexpr#1=\@ne
\toks1{%
- \the\toks1\oifblankTF{\the\toks1}{}{;}%
+ \the\toks1\oifblankTF{\the\toks1}{}{\ltxkeys@keyparser}%
\key@type/\key@name
\ifcsnullTF\key@default{}{/\expandcsonce\key@default}%
\ifcsnullTF\key@macro{}{/\expandcsonce\key@macro}%
@@ -887,13 +818,11 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
}%
}
-% \ltxkeys@choicekey
-% *+[<pref]{<fam>}[<mp>]{<key>}[<bin>]{<alt>}[<dft>]{<f1>}{<f2>}
\robust@def*\ltxkeys@choicekey{%
\ltxkeys@svtrue\ltxkeys@swfalse
- \ltxkeys@teststpl{%
+ \ltxkeys@teststpl{\cpt@testcl{%
\ltxkeys@testopt@a{\cpt@testopt\ltxkeys@choicekey@a{chc\ltxkeys@hdr}}%
- }%
+ }}%
}
\robust@def*\ltxkeys@choicekey@a[#1]#2{%
\begingroup
@@ -930,13 +859,24 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ifinsetTF{/.code=}{#4}{%
\def\ltxkeys@tempa{\ltxkeys@executechclist}%
}{%
- \def\ltxkeys@tempa{\@gobble}%
+ \ifinsetTF{/}{#4}{%
+ \def\ltxkeys@tempa{\ltxkeys@executechclist}%
+ }{%
+ \def\ltxkeys@tempa{\@gobble}%
+ }%
}%
\edef#1{%
- \edef\cptmakecs{#2}{\noexpand\unexpanded{####1}}%
+ \csn@edef{#2}{\noexpand\unexpanded{####1}}%
\cptmakecs{cpt@st\ifltxkeys@st true\else false\fi}%
\cptmakecs{cpt@pl\ifltxkeys@pl true\else false\fi}%
- \unexpanded{\ltxkeys@cc@b,[#3]}{####1}{\expandcsonce\ltxkeys@chclist}%
+ \ifcpt@cl
+ \edef\noexpand\reserved@a{####1}%
+ \else
+ \edef\noexpand\reserved@a{\noexpand\unexpanded{####1}}%
+ \fi
+ \def\noexpand\reserved@b{\unexpanded{\ltxkeys@cc@b,[#3]}}%
+ \unexpanded{\expandafter\reserved@b\expandafter{\reserved@a}}%
+ {\expandcsonce\ltxkeys@chclist}%
\unexpanded{#5}\expandcsonce\ltxkeys@tempa{\unexpanded{#4}}%
}%
\def\ltxkeys@tempa{\def#1####1}%
@@ -946,33 +886,45 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\begingroup
\def\ltxkeys@chclist{}%
\def\ltxkeys@tempb##1/.code=##2\ltxkeys@nil{%
- \ltxkeys@trimspaces{##1}\ltxkeys@tempa
+ \ltxkeys@tempd{##1}{##2}%
+ }%
+ \def\ltxkeys@tempc##1/##2/##3\ltxkeys@nil{%
+ \ltxkeys@tempd{##1}{##2}%
+ }%
+ \def\ltxkeys@tempd##1##2{%
+ \expandafter\ltxkeys@trimspaces\expandafter
+ {\@gobble##1}\ltxkeys@tempa
\ifcase#2\relax
\cptaddtolist*[,]\ltxkeys@chclist\ltxkeys@tempa
\or
- \cptpassexpanded{\lowercase{%
+ \cptexpandarg\lowercase{%
\def\noexpand\ltxkeys@tempa{\expandcsonce\ltxkeys@tempa}%
\def\noexpand\ltxkeys@tval{\expandcsonce\ltxkeys@tval}%
- }}%
- \oifstrcmpFT\ltxkeys@tempa\ltxkeys@tval{}{%
- \edef\ltxkeys@chclist{\unexpanded{##2}}%
- \cptbreakloop
}%
+ \oifstrcmpTF\ltxkeys@tempa\ltxkeys@tval{%
+ \edef\ltxkeys@chclist{\unexpanded{##2}}%
+ \loopbreak
+ }{}%
\else
- \ltxkeys@err{Invalid number '#2' in \string\ltxkeys@makechclist}\@ehc
+ \ltxkeys@err{Invalid number '#2' while
+ in \string\ltxkeys@makechclist}\@ehc
\fi
}%
\def\csv@do##1{%
\ifinsetTF{/.code=}{##1}{%
- \ltxkeys@tempb##1\ltxkeys@nil
+ \ltxkeys@tempb.##1\ltxkeys@nil
}{%
- \ltxkeys@tempb##1/.code=\ltxkeys@nil
+ \ltxkeys@tempc.##1//\ltxkeys@nil
}%
}%
- \ifinsetTF{/.code=}{#1}{%
+ \expandafter\ifinsetTF\expandafter{\ltxkeys@keyparser}{#1}{%
\expandafter\csv@@parse\expandafter[\ltxkeys@keyparser]{#1}%
}{%
- \csv@@parse[,]{#1}%
+ \ifinsetTF{,}{#1}{%
+ \csv@@parse[,]{#1}%
+ }{%
+ \csv@@parse[,]{#1,}%
+ }%
}%
\postgroupdef\ltxkeys@chclist\endgroup
}
@@ -992,20 +944,46 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
}
\robust@def*\ltxkeys@getkeyname#1=#2\ltxkeys@nil#3{%
- \ltxkeys@trimspaces{#1}#3%
+ \ltxkeys@findpointer\savevalue{#1}#3\ltxkeys@svtrue\ltxkeys@svfalse
+ \ltxkeys@findpointer\needvalue{#1}#3\ltxkeys@nvtrue\ltxkeys@nvfalse
+ \ifdefTF\ltxkeys@fromgetkeynames{%
+ \def#3{#1}%
+ }{%
+ \ltxkeys@trimspaces{#1}#3%
+ }%
}
\robust@def*\ltxkeys@getkeynames#1{%
+ \begingroup
+ \def\ltxkeys@fromgetkeynames{}%
\def\ltxkeys@keynames{}%
\def\ltxkeys@do##1{%
- \ltxkeys@getkeyname##1=\ltxkeys@nil\ltxkeys@tkey
+ \ltxkeys@getkeyname##1=\ltxkeys@nil\ltxkeys@tempa
\edef\ltxkeys@keynames{%
- \cptliststack,\ltxkeys@keynames\expandcsonce\ltxkeys@tkey
+ \cptliststack,\ltxkeys@keynames\expandcsonce\ltxkeys@tempa
}%
}%
- \ifblankTF{#1}{}{\ltxkeys@csvparse{#1}}%
+ \ifblankTF{#1}{}{\ltxkeys@kvparse{#1}}%
+ \postgroupdef\ltxkeys@keynames\endgroup
+}
+\robust@def*\ltxkeys@getkeyvalue#1=#2\ltxkeys@nil#3{%
+ \ifinsetTF{=\ltxkeys@nil}{#2\ltxkeys@nil}{%
+ \ltxkeys@novalfalse
+ \begingroup
+ \def\ltxkeys@tempa##1=##2\ltxkeys@nil{\endgroup
+ \s@expandarg\ltxkeys@trimspaces{\@gobble##1}#3%
+ \let\CurrentVal#3%
+ }%
+ \ltxkeys@tempa.#2\ltxkeys@nil
+ }{%
+ \ltxkeys@novaltrue\def#3{}%
+ }%
+}
+\robust@def*\ltxkeys@splitkeyval#1\ltxkeys@nil#2#3{%
+ \ltxkeys@getkeyname#1=\ltxkeys@nil#2%
+ \ltxkeys@getkeyvalue#1=\ltxkeys@nil#3%
}
\robust@def*\option@keys{%
- \ltxkeys@inpkgcls\option@keys
+ \ltxkeys@notinpkgclserr\option@keys
\cpt@testst\ltxkeys@optionk@ys
}
\robust@def*\ltxkeys@optionk@ys{%
@@ -1016,7 +994,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
}
\robust@def*\notoption@keys{%
- \ltxkeys@inpkgcls\notoption@keys
+ \ltxkeys@notinpkgclserr\notoption@keys
\ltxkeys@testopt@g{optionkeys}{not}%
}
\robust@def*\ltxkeys@optionkeys#1#2{%
@@ -1024,7 +1002,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ifcsndefTF{\ltxkeys@hdr##1}{%
\ifcsndefTF{\ltxkeys@hdr#1option@keys}{%
\xifinsetTF{,\detokenize{##1},}
- {,\cptsxdetok{\@nameuse{\ltxkeys@hdr#1option@keys}},}{}{%
+ {,\cptsxdetok{\usename{\ltxkeys@hdr#1option@keys}},}{}{%
\csn@edef{\ltxkeys@hdr#1option@keys}{%
\expandcsnonce{\ltxkeys@hdr#1option@keys},%
\unexpanded{##1}%
@@ -1059,12 +1037,91 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def*\makenotoption@keys{%
\cpt@sttrue\cpt@testopt\ltxkeys@makeoptionkeys{KV}%
}
+\robust@def*\ltxkeys@handledkeys{%
+ \ltxkeys@testopt@h{h@ndledkeys}%
+}
+\robust@def*\ltxkeys@removehandledkeys{%
+ \ltxkeys@testopt@h{rem@vehandledkeys}%
+}
+\robust@def*\ltxkeys@undefhandledkeys{%
+ \cpt@testcl{\ltxkeys@testopt@h{undefh@ndledkeys}}%
+}
+\robust@def*\ltxkeys@emptifyhandledkeys{%
+ \cpt@testcl{\ltxkeys@testopt@h{emptifyh@ndledkeys}}%
+}
+\robust@def*\ltxkeys@h@ndledkeys#1{%
+ \letcstocsn\ltxkeys@rsvda{\ltxkeys@hdr handledkeys}%
+ \def\ltxkeys@do##1{%
+ \ifcsndefTF{\ltxkeys@hdr##1}{%
+ \def\ltxkeys@tempb{##1}%
+ \ifdefTF\ltxkeys@rsvda{%
+ \oifinset@sp@TF,\ltxkeys@tempb\ltxkeys@rsvda{}{%
+ \edef\ltxkeys@rsvda{%
+ \cptliststack,\ltxkeys@rsvda\unexpanded{##1}%
+ }%
+ }%
+ }{%
+ \let\ltxkeys@rsvda\ltxkeys@tempb
+ }%
+ }{%
+ \ltxkeys@err{Key '##1' is undefined in family '\ltxkeys@tfam'
+ \MsgBrk Only defined keys can be made handled keys.}\@ehc
+ }%
+ }%
+ \ltxkeys@csvparse{#1}%
+ \letcsntocs{\ltxkeys@hdr handledkeys}\ltxkeys@rsvda
+}
+\robust@def*\ltxkeys@rem@vehandledkeys#1{%
+ \letcstocsn\ltxkeys@rsvda{\ltxkeys@hdr handledkeys}%
+ \ifdefTF\ltxkeys@rsvda{%
+ \def\ltxkeys@do##1{%
+ \ifcsndefTF{\ltxkeys@hdr##1}{%
+ \def\ltxkeys@tempb{##1}%
+ \oifinset@sp@TF,\ltxkeys@tempb\ltxkeys@rsvda{%
+ \let\cpt@fromrem\cpttrue\cpt@sttrue
+ \cpt@removeoneelement[,]\ltxkeys@rsvda{##1}%
+ }{%
+ \ltxkeys@warn{Key '##1' with prefix '\ltxkeys@ttpref' in family
+ \MsgBrk '\ltxkeys@tfam' is not a handled key:
+ \MsgBrk It couldn't be deleted from handled keys list.}%
+ }%
+ }{%
+ \ltxkeys@err{Key '##1' is undefined in family '\ltxkeys@tfam'}%
+ {Key '##1' with prefix '\ltxkeys@ttpref' in family
+ \MsgBrk '\ltxkeys@tfam' is not defined:\MsgBrk
+ Can't be deleted from handled keys list.}%
+ }%
+ }%
+ \ltxkeys@csvparse{#1}%
+ }{%
+ \ltxkeys@err{No handled keys for family '\ltxkeys@tfam'}%
+ {No handled keys exist for prefix '\ltxkeys@ttpref' and
+ \MsgBrk family '\ltxkeys@tfam'.}%
+ }%
+ \letcsntocs{\ltxkeys@hdr handledkeys}\ltxkeys@rsvda
+}
+\robust@def*\ltxkeys@undefh@ndledkeys{%
+ \ifcsndefTF{\ltxkeys@hdr handledkeys}{%
+ \usename{\ifcpt@cl g\fi undefcsn}{\ltxkeys@hdr handledkeys}%
+ }{%
+ \ltxkeys@err{No handled keys for prefix '\ltxkeys@ttpref'
+ \MsgBrk and family '\ltxkeys@tfam': couldn't undefine}\@ehc
+ }%
+}
+\robust@def*\ltxkeys@emptifyh@ndledkeys{%
+ \ifcsndefTF{\ltxkeys@hdr handledkeys}{%
+ \usename{\ifcpt@cl g\fi emptifycsn}{\ltxkeys@hdr handledkeys}%
+ }{%
+ \ltxkeys@err{No handled keys for prefix '\ltxkeys@ttpref'
+ \MsgBrk and family '\ltxkeys@tfam': couldn't emptify}\@ehc
+ }%
+}
\robust@def*\ltxkeys@testoptionkey#1{%
\ifcsndefFT{\ltxkeys@hdr#1option@keys}{}{%
\cpt@choicefdfalse
\def\ltxkeys@do##1{%
\s@expandarg\ifstrcmpTF\ltxkeys@tkey{##1}{%
- \cpt@choicefdtrue\ltxkeys@break
+ \cpt@choicefdtrue\loopbreak
}{}%
}%
\aftercsname{\ltxkeys@csvloop*}{\ltxkeys@hdr#1option@keys}%
@@ -1082,7 +1139,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\cpt@choicefdfalse
\def\ltxkeys@do##1{%
\s@expandarg\ifstrcmpTF\ltxkeys@tkey{##1}{%
- \cpt@choicefdtrue\ltxkeys@break
+ \cpt@choicefdtrue\loopbreak
}{}%
}%
\aftercsname{\ltxkeys@csvloop*}{\ltxkeys@hdr needvalue@keys}%
@@ -1108,7 +1165,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
}
\robust@def*\ltxkeys@accumkeyvals#1{%
- \ltxkeys@ifinTF(1)%
+ \ltxkeys@ifinlistTF(1)%
{\ltxkeys@setmnkey,\setmnkey,\setaliaskey}{#1}%
\ltxkeys@twktrue\ltxkeys@twkfalse
\begingroup
@@ -1131,7 +1188,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\fi
\endgroup
}
-% \ltxkeys@definekeys[pref]<fam>[macropf]{<keyname>=<dft>/<callback>; ...}
\robust@def*\ltxkeys@definekeys{%
\begingroup
\endlinechar\m@one
@@ -1152,13 +1208,20 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ltxkeys@trimspaces{#3}\macro@prefix
\toks@{\undefcs\ifdefkeyst}%
\def\key@vals{}%
+ % We want \ltxkeys@definekeys to have a slightly different
+ % syntax to \ltxkeys@declarekeys. So we use '=' here. But
+ % the equality sign can always be replaced with '/' and
+ % this won't cause any problems:
+ \def\ltxkeys@tempa##1\ltxkeys@nil{%
+ \expandafter\ltxkeys@splitc\reserved@a/##1//\ltxkeys@nil
+ }%
\def\ltxkeys@splita##1={%
- \begingroup
- \defpass\reserved@a####1\ltxkeys@nil{\endgroup
- \ltxkeys@splitb##1/####1//\ltxkeys@nil
- }.%
+ \def\reserved@a{##1}\ltxkeys@tempa.%
}%
- \def\ltxkeys@splitb##1/##2/##3/##4\ltxkeys@nil{%
+ \def\ltxkeys@splitb##1/{%
+ \def\reserved@a{##1}\ltxkeys@tempa.%
+ }%
+ \def\ltxkeys@splitc##1/##2/##3/##4\ltxkeys@nil{%
\ifblankTF{##1}{%
\ifblankTF{##2##3}{}{%
\ltxkeys@err{Empty key name while in
@@ -1173,7 +1236,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\MsgBrk '#2' with prefix '#1'}\@ehc
}%
\fi
- \ifblankTF{##2}{%
+ \oifblankTF{\@gobble##2}{%
\def\key@default{}%
}{%
\s@expandarg\ltxkeys@trimspaces{\@gobble##2}\key@default
@@ -1215,8 +1278,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def*\ltxkeys@keytypeerr#1{%
\edef\ltxkeys@badkeytypes{\cptliststack,\ltxkeys@badkeytypes#1}%
}
-% \ltxkeys@declarekeys[pref]<fam>[macropf]{<keytype>/<keyname>
-% /<dft>/<callback><parser> ...}
\robust@def*\ltxkeys@declarekeys{%
\begingroup
\endlinechar\m@one
@@ -1239,7 +1300,8 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\toks@{\undefcs\ifdefkeyst}%
\def\ltxkeys@splita##1/##2/{%
\ifblankTF{##1##2}{%
- \gobble@to@ltxkeys@nil
+ \ltxkeys@warn{Something wrong in using \string\ltxkeys@declarekeys}\@ehc
+ \expandafter\gobble@to@sentinel\expandafter\ltxkeys@nil\ltxkeys@keyparser
}{%
\ifblankTF{##2}{%
\ltxkeys@err{Empty key name in \string\ltxkeys@declarekeys}\@ehc
@@ -1283,12 +1345,12 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
{\key@type}{%
{sty}{%
\ltxkeys@stylekey\ltxkeys@tempa
- [\expandcsonce\key@default](\expandcsonce\dependant)%
+ [\expandcsonce\key@default](\expandcsonce\ltxkeys@dependant)%
{\unexpanded{##2}}%
}%
{sty*}{%
\ltxkeys@stylekey*\ltxkeys@tempa
- [\expandcsonce\key@default](\expandcsonce\dependant)%
+ [\expandcsonce\key@default](\expandcsonce\ltxkeys@dependant)%
{\unexpanded{##2}}%
}%
{cmd}{%
@@ -1302,7 +1364,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
{choice}{%
\ltxkeys@choicekey*+\ltxkeys@tempa
- [\unexpanded{\val\nr}]{\expandcsonce\ltxkeys@alt}%
+ [\unexpanded{\userinput\nr}]{\expandcsonce\ltxkeys@alt}%
[\expandcsonce\key@default]{\unexpanded{##2}}%
{\ltxkeys@keyvalerr}%
}%
@@ -1339,32 +1401,149 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def\ltxkeys@declarekeys@d#1{%
\begingroup
\ifblankTF{#1}{%
- \def\dependant{}%
+ \def\ltxkeys@dependant{}%
}{%
\ifinsetFT{>}{#1}{%
\ltxkeys@err{Missing key type and name in dependant key
^^J\detokenize{#1}'}{No '>' in dependant key.}%
- \def\dependant{}%
+ \def\ltxkeys@dependant{}%
}{%
\def\ltxkeys@tempa##1>##2>##3>##4>##5\ltxkeys@nil{%
- \edef\dependant{\unexpanded{##1/##2/##3/##4}}%
+ \edef\ltxkeys@dependant{\unexpanded{##1/##2/##3/##4}}%
}%
\ltxkeys@tempa#1>>>>\ltxkeys@nil
}%
}%
- \postgroupdef\dependant\endgroup
+ \postgroupdef\ltxkeys@dependant\endgroup
+}
+\robust@def*\ltxkeys@presetkeys{%
+ \cpt@testcl{\ltxkeys@testopt@g{ppsetkeys}{pre}}%
+}
+\robust@def*\ltxkeys@removepresetkeys{%
+ \cpt@testcl{\ltxkeys@testopt@g{removeppsetkeys}{pre}}%
+}
+\robust@def*\ltxkeys@undefpresetkeys{%
+ \cpt@testcl{\ltxkeys@testopt@g{undefppsetkeys}{pre}}%
+}
+\robust@def*\ltxkeys@postsetkeys{%
+ \cpt@testcl{\ltxkeys@testopt@g{ppsetkeys}{post}}%
+}
+\robust@def*\ltxkeys@removepostsetkeys{%
+ \cpt@testcl{\ltxkeys@testopt@g{removeppsetkeys}{post}}%
+}
+\robust@def*\ltxkeys@undefpostsetkeys{%
+ \cpt@testcl{\ltxkeys@testopt@g{undefppsetkeys}{post}}%
+}
+\robust@def*\ltxkeys@ppsetkeys#1#2{%
+ \def\ltxkeys@rsvda{}\def\ltxkeys@rsvdb{}%
+ \def\ltxkeys@do##1{%
+ \ltxkeys@splitkeyval##1\ltxkeys@nil\ltxkeys@tkey\ltxkeys@tval
+ \ifcsndefFT{\ltxkeys@hdr\ltxkeys@tkey}{%
+ \ltxkeys@err{Key '\ltxkeys@currtriple' is undefined.}\@ehc
+ }{%
+ \ifcsndefTF{@\ltxkeys@hdr#1setkeys}{}{%
+ \emptifycsn{@\ltxkeys@hdr#1setkeys}%
+ }%
+ \xifinsetTF{,\cptoxdetok\ltxkeys@tkey,}
+ {,\cptsxdetok{\usename{@\ltxkeys@hdr#1setkeys},}}{%
+ \ltxkeys@err{Double entry for key '\ltxkeys@currtriple' in\MsgBrk
+ #1set key list}\@ehc
+ }{%
+ \edef\ltxkeys@rsvda{\cptliststack,\ltxkeys@rsvda
+ \ltxkeys@tkey\ifcsemptyTF\ltxkeys@tval{}
+ {=\expandcsonce\ltxkeys@tval}}%
+ \edef\ltxkeys@rsvdb{\cptliststack,\ltxkeys@rsvdb
+ \expandcsonce\ltxkeys@tkey}%
+ }%
+ }%
+ }%
+ \ltxkeys@kvparse{#2}%
+ \ifcsemptyTF\ltxkeys@rsvda{}{%
+ \ifcsndefTF{\ltxkeys@hdr#1setkeys}{%
+ \cptpassexpanded{%
+ \cptfiltermergekv\noexpandcsn{\ltxkeys@hdr#1setkeys}%
+ {\expandcsonce\ltxkeys@rsvda}\noexpand\nofilter
+ \cptfiltermergecsv\noexpandcsn{@\ltxkeys@hdr#1setkeys}
+ {\ltxkeys@rsvdb}\noexpand\nofilter
+ }%
+ }{%
+ \csn@edef{\ltxkeys@hdr#1setkeys}{\expandcsonce\ltxkeys@rsvda}%
+ \csn@edef{@\ltxkeys@hdr#1setkeys}{\expandcsonce\ltxkeys@rsvdb}%
+ }%
+ \ifcpt@cl
+ \globalizecsn{\ltxkeys@hdr#1setkeys}%
+ \globalizecsn{@\ltxkeys@hdr#1setkeys}%
+ \fi
+ }%
+}
+\robust@def*\ltxkeys@removeppsetkeys#1#2{%
+ \ifcsndefFT{\ltxkeys@hdr#1setkeys}{%
+ \ltxkeys@err{No #1set keys defined for prefix '\ltxkeys@ttpref'
+ and family '\ltxkeys@tfam'}\@ehc
+ }{%
+ \def\ltxkeys@rsvda{}\def\ltxkeys@rsvdb{}%
+ \def\ltxkeys@do##1{%
+ \ltxkeys@splitkeyval##1=\ltxkeys@nil\ltxkeys@tkey\ltxkeys@tval
+ \ifcsndefFT{\ltxkeys@hdr\ltxkeys@tkey}{%
+ \ltxkeys@err{Key '\ltxkeys@currtriple' is undefined}\@ehc
+ }{%
+ \xifinsetTF{,\cptoxdetok\ltxkeys@tkey=\cptoxdetok\ltxkeys@tval,}%
+ {,\cptsxdetok{\usename{\ltxkeys@hdr#1setkeys}},}{%
+ \edef\ltxkeys@rsvda{\cptliststack,\ltxkeys@rsvda
+ \ltxkeys@tkey\ifcsemptyTF\ltxkeys@tval{}
+ {=\expandcsonce\ltxkeys@tval}}%
+ \edef\ltxkeys@rsvdb{\cptliststack,\ltxkeys@rsvdb
+ \expandcsonce\ltxkeys@tkey}%
+ }{%
+ \ltxkeys@err{Key '\ltxkeys@currtriple' not a #1set key}\@ehc
+ }%
+ }%
+ }%
+ \ltxkeys@kvparse{#2}%
+ \ifcsemptyTF\ltxkeys@rsvda{}{%
+ \cptpassexpanded{%
+ \cptfilterremovekv\noexpandcsn{\ltxkeys@hdr#1setkeys}
+ {\expandcsonce\ltxkeys@rsvda}\noexpand\nofilter
+ \cptfilterremovecsv\noexpandcsn{@\ltxkeys@hdr#1setkeys}
+ {\ltxkeys@rsvdb}\noexpand\nofilter
+ }%
+ \ifcpt@cl
+ \globalizecsn{\ltxkeys@hdr#1setkeys}%
+ \globalizecsn{@\ltxkeys@hdr#1setkeys}%
+ \fi
+ }%
+ }%
+}
+\robust@def*\ltxkeys@undefppsetkeys#1{%
+ \ifcsndefFT{\ltxkeys@hdr#1setkeys}{%
+ \ltxkeys@err{No #1set keys defined for prefix '\ltxkeys@ttpref'
+ and family '\ltxkeys@tfam'}\@ehc
+ }{%
+ \usename{\ifcpt@cl g\fi undefcsn}{\ltxkeys@hdr#1setkeys}%
+ \usename{\ifcpt@cl g\fi undefcsn}{@\ltxkeys@hdr#1setkeys}%
+ }%
}
\robust@def*\ltxkeys@setmnkey#1{%
\xifinsetTF{,}{\detokenize{#1}}{%
\ltxkeys@err{\noexpand\ltxkeys@setmnkey doesn't accept key list}\@ehc
}{%
- \cpt@testopt{\ltxkeys@settmnkey@a#1}{}%
+ \cpt@testopt{\ltxkeys@s@tmnkey#1}{}%
}%
}
-\robust@def*\ltxkeys@settmnkey@a#1[#2]{%
+\robust@def*\ltxkeys@s@tmnkey#1[#2]{%
+ \begingroup
+ \let\x\ltxkeys@tkey\let\y\noexpand
+ \edef\z{\expandcstwice{\csname\ltxkeys@hdr#1\endcsname{}}}%
+ \cptexpandsecond{\endgroup\ltxkeys@ifinlistTF(1)}{%
+ {\y\ltxkeys@setmnkey{\x},\y\setmnkey{\x},\y\setaliaskey{\x}}%
+ {\expandcsonce\z}%
+ }{%
+ \ltxkeys@err{\noexpand\ltxkeys@setmnkey or \noexpand\setmnkey
+ or \noexpand\setaliaskey nested}\@ehc
+ }{}%
\cptexpandsecond\ltxkeys@setkeys{%
[\ltxkeys@ttpref]{\ltxkeys@tfam}{%
- #1=\ifnullTF{#2}{\expandcsonce\ltxkeys@tval}{\unexpanded{#2}}%
+ #1=\ifblankTF{#2}{\expandcsonce\ltxkeys@tval}{\unexpanded{#2}}%
}%
}%
}
@@ -1377,7 +1556,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ifstrcmpTF{##2}{.}{%
\ltxkeys@err{Invalid alternate value list for key '#1'}\@ehc
}{%
- \cptifmacroTF{##2}{%
+ \ifmacroTF{##2}{%
\edef\ltxkeys@alt{\expandcsonce{##2}}%
}{%
\edef\ltxkeys@alt{\unexpanded{##2}}%
@@ -1397,7 +1576,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
}%
}
-% \ltxkeys@initializekeys[<prefix>]{<fams>}[<na>]
\robust@def*\ltxkeys@initializekeys{%
\cpt@testopt\ltxkeys@in@tializekeys{KV}%
}
@@ -1408,27 +1586,28 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\begingroup
\def\ltxkeys@resa{}%
\def\ltxkeys@do##1{%
- \edef\ltxkeys@resa{%
- \cptliststack,\ltxkeys@resa
- \ifcsndefFT{#1@##1@initial@keyvals}{}{%
- \expandcsnonce{#1@##1@initial@keyvals}%
+ \def\ltxkeys@do####1{%
+ \edef\ltxkeys@resa{%
+ \cptliststack,\ltxkeys@resa
+ \ifcsndefFT{##1@####1@initial@keyvals}{}{%
+ \expandcsnonce{##1@####1@initial@keyvals}%
+ }%
}%
}%
+ \ltxkeys@csvparse{#2}%
}%
- \ltxkeys@csvparse{#2}%
+ \ltxkeys@csvparse{#1}%
\ltxkeys@getkeynames{#3}%
\cptexpandsecond{\endgroup\ltxkeys@setkeys*+[#1]{#2}}%
{[\ltxkeys@keynames]{\ltxkeys@resa}}%
}
-
-% \ltxkeys@launchkeys[<prefix>]{<fams>}{<curr>}
\robust@def*\ltxkeys@launchkeys{\cpt@testopt\ltxkeys@l@unchkeys{KV}}
\robust@def*\ltxkeys@l@unchkeys[#1]#2#3{%
\ltxkeys@in@ti@lizekeys{#1}{#2}[#3]%
+ % Don't use the star/plus forms of \ltxkeys@setkeys here,
+ % otherwise we won't be able to catch undefined keys:
\ifblankTF{#3}{}{\ltxkeys@setkeys[#1]{#2}{#3}}%
}
-
-% \ltxkeys@setkeys*+[<prfs>]{<fams>}[<na>]{<curr>}
\robust@def*\ltxkeys@setkeys{%
\ltxkeys@rmfalse
\ltxkeys@teststpl{\ltxkeys@testopt@c\ltxkeys@setkeys@a}%
@@ -1442,33 +1621,78 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
{\expandcsnonce{\ltxkeys@hdr rmkeys}}%
}
\robust@def*\ltxkeys@setkeys@a[#1]#2{%
- \cpt@choicefdfalse
- \def\siso@do##1{%
- \ifstrcmpTF{#2}{##1}\cpt@choicefdtrue\relax
- }%
- \siso@@loop{.,;:+-=*^_/[()]}%
- \ifcpt@choicefd
- \ltxkeys@err{Invalid key list '#2'}\@ehc
- \fi
+ \begingroup
+ \def\x{\ltxkeys@nil}%
+ \xifinsetTF{\x\detokenize{#2}\x}
+ {\x.\x,\x;\x:\x+\x-\x=\x*\x^\x_\x/\x|\x[\x(\x)\x]\x}{%
+ \ltxkeys@err{Invalid key list '#2': Something is wrong}\@ehc
+ }{}%
+ \endgroup
\ifnum\ltxkeys@keydepth=\z@pt
\csn@def{\ltxkeys@hdr rmkeys}{}%
\def\ltxkeys@undefinedkeys{}%
\fi
- \edef\ltxkeys@nakeys{\unexpanded{#1}}%
- \ifcsemptyTF\ltxkeys@nakeys{}{%
- \cpt@sttrue\cpt@csvnormalize[,]\ltxkeys@nakeys
+ \ltxkeys@getkeynames{#2}%
+ \let\ltxkeys@naa\ltxkeys@keynames
+ \ifblankTF{#1}{}{%
+ \edef\ltxkeys@naa{\cptliststack,\ltxkeys@naa\unexpanded{#1}}%
+ }%
+ \ltxkeys@usepresetkeys{pre}%
+ \ltxkeys@setkeys@b{#1}{#2}%
+ \ltxkeys@usepresetkeys{post}%
+ \ltxkeys@exopfalse\ltxkeys@pxopfalse
+ \ifnumcmpTF\ltxkeys@keydepth=\z@pt{%
+ \emptifycsset{%
+ \ltxkeys@keys,\ltxkeys@prefs,\ltxkeys@fams,\ltxkeys@nakeys,%
+ \ltxkeys@naa,\ltxkeys@tpref,\ltxkeys@ttpref,\ltxkeys@tfam,%
+ \ltxkeys@tkey,\ltxkeys@tval,\CurrentPref,\CurrentFam,%
+ \CurrentKeyval,\CurrentKey,\CurrentVal,\ltxkeys@naa
+ }%
+ \ifcsemptyTF\ltxkeys@undefinedkeys{}\ltxkeys@logunknownkeys
+ }{}%
+}
+\robust@def*\ltxkeys@usepresetkeys#1{%
+ \ltxkeys@inpresettrue
+ \begingroup
+ \toks@{}%
+ \ltxkeys@vinfo{Looking for #1-set keys}%
+ \def\ltxkeys@do##1{%
+ \ltxkeys@makepf{##1}%
+ \def\ltxkeys@do####1{%
+ \ltxkeys@makehdr{####1}%
+ \ifcsndefFT{\ltxkeys@hdr#1setkeys}{}{%
+ \cptexpanded{\toks@{\the\toks@\relax\ltxkeys@setkeys@b
+ {\expandcsonce\ltxkeys@naa}
+ {\expandcsnonce{\ltxkeys@hdr#1setkeys}}}}%
+ }%
+ }%
+ \ltxkeys@csvloop*\ltxkeys@fams
+ }%
+ \ltxkeys@csvloop*\ltxkeys@prefs
+ \oifblankTF{\the\toks@}{%
+ \endgroup
+ \ltxkeys@vinfo{No #1-set keys found}%
+ }{%
+ \ltxkeys@vinfo{P\@gobble#1-set keys found. Setting them now}%
+ \expandafter\endgroup\the\toks@
+ \ltxkeys@vinfo{Finished setting #1-set keys}%
+ }%
+ \ltxkeys@inpresetfalse
+}
+\robust@def*\ltxkeys@setkeys@b#1#2{%
+ \ifblankTF{#1}{%
+ \def\ltxkeys@nakeys{}%
+ }{%
+ \edef\ltxkeys@nakeys{\cptcommanormalize{#1}}%
}%
\def\ltxkeys@do##1{%
\edef\CurrentKeyval{\unexpanded{##1}}%
- \ltxkeys@setkeys@b##1=\ltxkeys@nil
+ \ltxkeys@getkeyvalue##1=\ltxkeys@nil\ltxkeys@tval
+ \ltxkeys@setkeys@c##1=\ltxkeys@nil
}%
\ltxkeys@kvparse{#2}%
- \emptifycsset{\CurrentPref,\CurrentFam,\CurrentKeyval,
- \CurrentKey,\CurrentVal}%
- \ltxkeys@exopfalse\ltxkeys@pxopfalse
- \ifcsnullTF\ltxkeys@undefinedkeys{}\ltxkeys@logunknownkeys
}
-\robust@def*\ltxkeys@setkeys@b#1=#2\ltxkeys@nil{%
+\robust@def*\ltxkeys@setkeys@c#1=#2\ltxkeys@nil{%
\ifinsetTF{\needvalue}{#1}{%
\ltxkeys@err{\noexpand\needvalue pointer not allowed
\MsgBrk when setting keys}\@ehc
@@ -1476,18 +1700,6 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ltxkeys@findpointer\savevalue{#1}\ltxkeys@tkey
\ltxkeys@svtrue\ltxkeys@svfalse
\let\CurrentKey\ltxkeys@tkey
- \ifinsetTF{=\ltxkeys@nil}{#2\ltxkeys@nil}{%
- \ltxkeys@novalfalse
- \begingroup
- \defpass\reserved@a##1=##2\ltxkeys@nil{\endgroup
- \edef\ltxkeys@tval{\expandcsonce{\@gobble##1}}%
- \let\CurrentVal\ltxkeys@tval
- }%
- .#2\ltxkeys@nil
- }{%
- \ltxkeys@novaltrue
- \def\ltxkeys@tval{}%
- }%
\ifcsemptyTF\ltxkeys@tkey{%
\ifltxkeys@noval\else
\ltxkeys@err{No key specified for value
@@ -1496,46 +1708,44 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\fi
}{%
\xifinsetTF{,\ltxkeys@tkey,}{,\ltxkeys@nakeys,}{}{%
- \ltxkeys@setkeys@c
+ \ltxkeys@setkeys@d
}%
}%
}
-\robust@def*\ltxkeys@setkeys@c{%
+\robust@def*\ltxkeys@setkeys@d{%
\ltxkeys@kffalse
- \if@boolTF{ltxkeys@pl}{%
- \def\ltxkeys@do##1{%
- \def\CurrentPref{##1}%
- \ltxkeys@makepf{##1}%
- \def\ltxkeys@do####1{%
- \def\ltxkeys@tfam{####1}%
- \let\CurrentFam\ltxkeys@tfam
- \ltxkeys@makehdr\ltxkeys@tfam
- \ltxkeys@setkeys@d
- }%
- \ltxkeys@csvloop*\ltxkeys@fams
- }%
- \ltxkeys@csvloop*\ltxkeys@prefs
+ \if@boolTF{ltxkeys@inpreset}{%
+ \ltxkeys@setkeys@e
}{%
- \def\ltxkeys@do##1{%
- \if@boolTF{ltxkeys@kf}{%
- \ltxkeys@break
- }{%
+ \if@boolTF{ltxkeys@pl}{%
+ \def\ltxkeys@do##1{%
\def\CurrentPref{##1}%
\ltxkeys@makepf{##1}%
\def\ltxkeys@do####1{%
- \if@boolTF{ltxkeys@kf}{%
- \ltxkeys@break
- }{%
- \def\ltxkeys@tfam{####1}%
- \let\CurrentFam\ltxkeys@tfam
- \ltxkeys@makehdr\ltxkeys@tfam
- \ltxkeys@setkeys@d
- }%
+ \def\ltxkeys@tfam{####1}%
+ \let\CurrentFam\ltxkeys@tfam
+ \ltxkeys@makehdr\ltxkeys@tfam
+ \ltxkeys@setkeys@e
}%
\ltxkeys@csvloop*\ltxkeys@fams
}%
+ \ltxkeys@csvloop*\ltxkeys@prefs
+ }{%
+ \def\ltxkeys@do##1{%
+ \def\CurrentPref{##1}%
+ \ltxkeys@makepf{##1}%
+ \def\ltxkeys@do####1{%
+ \def\ltxkeys@tfam{####1}%
+ \let\CurrentFam\ltxkeys@tfam
+ \ltxkeys@makehdr\ltxkeys@tfam
+ \ltxkeys@setkeys@e
+ \ifltxkeys@kf\loopbreak\fi
+ }%
+ \ltxkeys@csvloop*\ltxkeys@fams
+ \ifltxkeys@kf\loopbreak\fi
+ }%
+ \ltxkeys@csvloop*\ltxkeys@prefs
}%
- \ltxkeys@csvloop*\ltxkeys@prefs
}%
\if@boolTF{ltxkeys@kf}{%
\if@boolFT{ltxkeys@pxop}{}{%
@@ -1570,8 +1780,10 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}%
}%
}
-\robust@def*\ltxkeys@setkeys@d{%
- \ifcsndefFT{\ltxkeys@hdr\ltxkeys@tkey}{}{%
+\robust@def*\ltxkeys@setkeys@e{%
+ \ifcsndefFT{\ltxkeys@hdr\ltxkeys@tkey}{%
+ \relax
+ }{%
\ltxkeys@kftrue
\if@boolTF{ltxkeys@pxop}{%
\ltxkeys@testoptionkey{not}%
@@ -1594,8 +1806,10 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\s@expandarg\ltxkeys@replacepointers\ltxkeys@tval
\if@boolTF{ltxkeys@verbose}{%
\ltxkeys@getinnovalnopad
- \wlog{Key executed: \ltxkeys@ttpref, \ltxkeys@tfam,
- \ltxkeys@tkey, \InnocentVal; on level '\the\ltxkeys@keydepth'.}%
+ \ltxkeys@vinfo{%
+ \ifltxkeys@inpreset Preset key\else Key\fi\@space
+ executed: \ltxkeys@currtriple,\InnocentVal;
+ on level '\the\ltxkeys@keydepth'}%
}{}%
\cpt@pushstate\ltxkeys@setkeys\ltxkeys@state\ltxkeys@keydepth
\csname\ltxkeys@hdr\ltxkeys@tkey\expandafter
@@ -1614,12 +1828,14 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\s@expandarg\ltxkeys@replacepointers\ltxkeys@tval
\if@boolTF{ltxkeys@verbose}{%
\ltxkeys@getinnovalnopad
- \wlog{Key executed: \ltxkeys@ttpref, \ltxkeys@tfam,
- \ltxkeys@tkey, \InnocentVal\@space(default);
- on level '\the\ltxkeys@keydepth'.}%
+ \ltxkeys@vinfo{%
+ \ifltxkeys@inpreset Preset key\else Key\fi\@space
+ executed: \ltxkeys@currtriple,\InnocentVal(default);
+ on level '\the\ltxkeys@keydepth'
+ }%
}{}%
\cpt@pushstate\ltxkeys@setkeys\ltxkeys@state\ltxkeys@keydepth
- \cptifmacroTF{#1}{%
+ \ifmacroTF{#1}{%
\expandafter#1\expandafter{\ltxkeys@tval}\relax
}{%
\ltxkeys@err{Faulty key macro '\detokenize{#1}'}\@ehc
@@ -1637,6 +1853,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
{\ltxkeys@hdr savevalue@keys}#1{\ltxkeys@nil}\ltxkeys@nil
}
\robust@def*\ltxkeys@replacepointers#1{%
+ \ltxkeys@vinfo{Replacing pointers of key '\ltxkeys@tkey'}%
\def\ltxkeys@resa{}%
\@tempswafalse
\ifbracedTF{#1}{%
@@ -1653,9 +1870,11 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\if@tempswa
\ifltxkeys@verbose
\ltxkeys@getinnovalnopad
- \wlog{Value '\InnocentVal' of key '\ltxkeys@tkey'
- inherited from key '\ltxkeys@tempb'.}%
+ \ltxkeys@vinfo{Value '\InnocentVal' of key '\ltxkeys@tkey'
+ inherited from key '\ltxkeys@tempb'}%
\fi
+ \else
+ \ltxkeys@vinfo{No pointers found on key '\ltxkeys@tkey'}%
\fi
}{%
\ltxkeys@getsavedval{#2}{%
@@ -1665,10 +1884,9 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\@tempswatrue
\def\ltxkeys@tempb{#2}%
\oifinset@sp@TF,{#2}\ltxkeys@resa{%
- \ltxkeys@err{Dangerous back linking of pointers}{%
+ \ltxkeys@error{Dangerous back linking of pointers}{%
Key pointer replacement terminated due
\MsgBrk to possible back linking.}%
- \@gobble
}{%
\edef\ltxkeys@resa{\cptliststack,\ltxkeys@resa#2}%
\s@expandarg\ifbracedTF\reserved@a{%
@@ -1813,12 +2031,9 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
}
\robust@def*\ltxkeys@dis@bl@keys[#1]#2#3{%
\endgroup
- \def\ltxkeys@prefs{#1}%
- \def\ltxkeys@fams{#2}%
- \def\ltxkeys@keys{#3}%
- \cpt@sttrue\cpt@csvnormalize[,]\ltxkeys@prefs
- \cpt@sttrue\cpt@csvnormalize[,]\ltxkeys@fams
- \cpt@sttrue\cpt@csvnormalize[,]\ltxkeys@keys
+ \edef\ltxkeys@prefs{\cptcommanormalize{#1}}%
+ \edef\ltxkeys@fams{\cptcommanormalize{#2}}%
+ \edef\ltxkeys@keys{\cptcommanormalize{#3}}%
\def\ltxkeys@do##1{%
\ltxkeys@makepf{##1}%
\def\ltxkeys@do####1{%
@@ -1833,10 +2048,8 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\robust@def\ltxkeys@dis@bl@k@ys{%
\def\ltxkeys@do##1{%
\ifcsndefFT{\ltxkeys@hdr##1}{%
- \ifltxkeys@verbose
- \ltxkeys@warn{Key '##1' undefined in families '\ltxkeys@tfam':
- \MsgBrk can't be disabled}%
- \fi
+ \ltxkeys@vwarn{Key '##1' undefined in families '\ltxkeys@tfam':
+ \MsgBrk couldn't be disabled}%
}{%
\edef\ltxkeys@tempa{%
\noexpand\ltxkeys@err{%
@@ -1977,7 +2190,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\cpt@choicefdfalse
\def\ltxkeys@do##1{%
\if@boolTF{cpt@choicefd}{%
- \ltxkeys@break
+ \loopbreak
}{%
\ltxkeys@makepf{##1}%
\ltxkeys@ifk@yd@f
@@ -1990,7 +2203,7 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\def\ltxkeys@do##1{%
\ltxkeys@makehdr{##1}%
\ifcsndefTF{\ltxkeys@hdr\ltxkeys@tkey}{%
- \cpt@choicefdtrue\ltxkeys@break
+ \cpt@choicefdtrue\loopbreak
}{}%
}%
\ltxkeys@csvloop*\ltxkeys@fams
@@ -2016,10 +2229,11 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\xifstrcmpTF\answer{x}\ltxkeys@emergencystop\relax
}
\cpt@cleanup\ltxkeys@processedoptions
+
\cptonlypreamble{%
- \ltxkeys@declareoption,\ltxkeys@declarecmdoption,
- \ltxkeys@declarebooloption,\ltxkeys@declarechoiceoption,
- \ltxkeys@processoptions,\ltxkeys@executeoptions,
+ \ltxkeys@declareoption,\ltxkeys@declarecmdoption,%
+ \ltxkeys@declarebooloption,\ltxkeys@declarechoiceoption,%
+ \ltxkeys@processoptions,\ltxkeys@executeoptions,%
\ltxkeys@unknownoptionhandler,\ltxkeys@unknownkeyhandler
}
\ltxkeys@declareoption*[KV]<ltxkeys>{%
@@ -2029,8 +2243,15 @@ $Id: ltxkeys.sty,v 0.1.0 2011/07/07 09:00:00 Ahmed Musa Exp $
\ltxkeys@declarecmdoption[KV]<ltxkeys>[ltxkeys@]{keyparser}[{;}]{%
\stripallouterbracesincs\ltxkeys@keyparser
}
+\ltxkeys@declarecmdoption[KV]<ltxkeys>[ltxkeys@]{keystacklimit}[4]{%
+ \ifx\\#1\\%
+ \ltxkeys@err{Invalid empty value for 'keystacklimit'}\@ehc
+ \else
+ \xdef\cpt@optionstacklimit{\number#1}%
+ \fi
+}
\ltxkeys@declarebooloption[KV]<ltxkeys>[ltxkeys@]{verbose}[true]{}
-\ltxkeys@executeoptions[KV]<ltxkeys>{keyparser}\relax
+\ltxkeys@executeoptions[KV]<ltxkeys>{keyparser,keystacklimit}\relax
\ltxkeys@processoptions*[KV]<ltxkeys>\relax
\endinput