diff options
author | Karl Berry <karl@freefriends.org> | 2011-08-15 23:04:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-08-15 23:04:13 +0000 |
commit | 5c9d629f843570179358708a673501e5a647a617 (patch) | |
tree | 69bc8e44446b946194971933ac3756bdb60b9c30 /Master/texmf-dist/tex | |
parent | c94e2deaaa21a46bcd63069cb63f3f6a807139a9 (diff) |
ltxkeyx (15aug11)
git-svn-id: svn://tug.org/texlive/trunk@23566 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/ltxkeys/ltxkeys.sty | 915 |
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 |