%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% % This is file 'skeyval-ltxpatch.sty', version 1.3, 2013/05/15. % % % % The rationale for this package: the patch in 'xkvltxp' package isn't % % strong enough. % % % % This package and accompanying files may be distributed and/or % % modified under the conditions of the LaTeX Project Public License, % % either version 1.3 of this license or any later version. The latest % % version of this license is in http://www.latex-project.org/lppl.txt % % and version 1.3 or later is part of all distributions of LaTeX % % version 2005/12/01 or later. % % % % The LPPL maintenance status of this software is 'author-maintained'. % % % % This software is provided 'as it is', without warranty of any kind, % % either expressed or implied, including, but not limited to, the % % implied warranties of merchantability and fitness for a particular % % purpose. % % % % The following files constitute the skeyval bundle and must be % % distributed as a whole: % % % % README, skeyval.sty, skeyval-core.tex, skeyval-for.tex, % % skeyval-view.sty, skeyval-ltxpatch.sty, skeyval-ltxcmds.tex, % % skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, % % skeyval-testpkg.sty, skeyval-pokayoke1, skeyval-pokayoke2, % % skeyval-view-pokayoke1. % % % % Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). % %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% \begingroup \catcode035 06 % # \catcode064 11 % @ \catcode123 01 % { \catcode125 02 % } \catcode044 12 % , \def\skv@prova{\endgroup \def\do##1,{% \ifx\do##1\else \catcode##1\string=\the\catcode##1\relax \expandafter\do \fi }% \edef\skv@ltxp@restorecodes{\do35,64,123,125,61,59,13,\do,}% } \skv@prova \edef\skv@ltxp@restorecodes{% \unexpanded\expandafter{\skv@ltxp@restorecodes}% \endlinechar\the\endlinechar\relax } \endlinechar13 % \catcode035 06 % # \catcode064 11 % @ \catcode123 01 % { \catcode125 02 % } \catcode061 12 % = \catcode044 12 % , \def\do#1=#2,{% \ifx\do#1\else \edef\skv@ltxp@restorecodes{% \unexpanded\expandafter{\skv@ltxp@restorecodes}% \catcode#1=\the\catcode#1\relax }% \catcode#1=#2\relax \expandafter\do \fi } \do 032=10,033=12,036=03,038=04,040=12,041=12,042=12,043=12,% 059=12,045=12,047=12,058=12,063=12,091=12,093=12,126=13,\do=,% \NeedsTeXFormat{LaTeX2e}[2011/06/27] \ProvidesPackage{skeyval-ltxpatch} [2013/05/15 v1.3 Patches for LaTeX2e kernel options processing (AM)] \ifdefined\skvz@\else\newdimen\skvz@\fi \def\@space{ } \protected\def\skvltxptracingall{% \tracinggroups\@ne\tracingifs\@ne\loggingall\tracingassigns\@ne \tracingonline\skvz@\tracingifs\skvz@ } \let\skvltxploggingall\skvltxptracingall \def\skvltxp@cmptwo#1#2\@@a#3#4\@@b#5{% \csname @#5#1#3first\else second\fi oftwo\endcsname } \begingroup \lccode`\&=0 \catcode`\&=7 \lccode`\!=0 \catcode`\!=8 \lowercase{\endgroup \def\skvltxp@ifleadspace#1{\skvltxp@ifl@adspace!#1! &}% \def\skvltxp@ifl@adspace#1! #2&{% \skvltxp@ifnull{#2}\@secondoftwo\@firstoftwo } \def\skvltxp@ifnull#1{\skvltxp@cmptwo#1&\@@a&\@@b\ifx} \def\skvltxp@ifx#1#2{\skvltxp@cmptwo#1&\@@a#2!\@@b\ifx} \def\skvltxp@trimspace#1{\skvltxp@trimspace@a.#1& &} \def\skvltxp@trimspace@a#1 &{\skvltxp@trimspace@b#1&} \def\skvltxp@trimspace@b#1{% \unexpanded\expandafter{% \romannumeral0% \expandafter\skvltxp@ifleadspace\expandafter{\@gobble#1}{% \@gobble#1% }{% \expandafter\@space\@gobble#1% }% }% } } \protected\def\skvltxp@despacecontent#1{% \edef#1{\expandafter\skvltxp@trimspace\expandafter{#1}}% } % \skvltxp@setupnormalizer{} % should not be used for normalizing keyval lists. \protected\def\skvltxp@setupnormalizer#1#2{% \begingroup \lccode`\~=`#1\relax \lowercase{\endgroup \def#2##1{% \unexpanded\expandafter {\romannumeral\skvltxp@activeparser#1##1#1~\skv@nil}% }% \def\skvltxp@activeparser##1~##2\skv@nil{% \skvltxp@ifnull{##2} {\skvltxp@spaceparser##1 #1\skv@nil} {\skvltxp@activeparser##1#1##2\skv@nil}% }% }% \def\skvltxp@spaceparser##1 #1##2\skv@nil{% \skvltxp@ifnull{##2} {\skvltxp@parserspace##1#1 \skv@nil} {\skvltxp@spaceparser##1#1##2\skv@nil}% }% \def\skvltxp@parserspace##1#1 ##2\skv@nil{% \skvltxp@ifnull{##2} {\skvltxp@doubleparser##1#1#1\skv@nil} {\skvltxp@parserspace##1#1##2\skv@nil}% }% \def\skvltxp@doubleparser##1#1#1##2\skv@nil{% \skvltxp@ifnull{##2}{% \skvltxp@ifnull{##1}{0 }{0\expandafter\@space\@gobble##1}% }{% \skvltxp@doubleparser##1#1##2\skv@nil }% }% } \skvltxp@setupnormalizer{,}\skvltxp@commanormalize \newif\ifbreakkerpaloop \def\kerpaloopdepth{0} % \kerpaloop{}{}{<1.parameter.callback>} % \kerpaloop*{}{}{<1.parameter.callback>} \protected\def\kerpaloop{\@ifstar{\skv@kerpaloop1}{\skv@kerpaloop0}} \def\skv@kerpaloop#1#2#3#4{% \xdef\kerpaloopdepth{\the\numexpr\kerpaloopdepth+1}% \def\skv@k@rpaloop{kerpaloop@\romannumeral\kerpaloopdepth}% \breakkerpaloopfalse \@namedef{\skv@k@rpaloop}##1#2{% \skvltxp@ifx{##1}\kerpaloop{% \breakkerpaloopfalse }{% #4\relax \ifbreakkerpaloop \breakkerpaloopfalse \begingroup \@namedef\skv@k@rpaloop####1\kerpaloop#2{\endgroup}% \fi \@nameuse\skv@k@rpaloop }% }% \edef\reserved@a{% \if0#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi {\unexpanded{#3}}{\unexpanded\expandafter{#3}}% }% \ifx\reserved@a\@empty\expandafter\@gobble\else\expandafter\@iden\fi {% \csname\skv@k@rpaloop\expandafter\endcsname \reserved@a#2\kerpaloop#2% }% \xdef\kerpaloopdepth{\the\numexpr\kerpaloopdepth-1}% } % \skvltxp@getoptionnames \def\skvltxp@getoptionnames#1#2{% \def#2{}% \edef#1{\expandafter\skvltxp@commanormalize\expandafter{#1}}% \def\do##1=##2=##3\skv@nil{% \edef#2{\ifx\@empty#2\else#2,\fi##1}% }% \kerpaloop*{,}#1{\do##1==\skv@nil}% } \def\@ptionlist#1{% \@ifundefined{opt@#1}{}{\unexpanded\expandafter \expandafter\expandafter{\csname opt@#1\endcsname}}% } \def\@if@ptions#1#2#3{% \@expandtwoargs\@if@pti@ns{\@ptionlist{#2.#1}}{\unexpanded{#3}}% } \def\@if@pti@ns#1#2{% % \skvltxp@setupnormalizer{,}% \edef\skv@options@i{\skvltxp@commanormalize{#1}}% \edef\skv@options@ii{\skvltxp@commanormalize{#2}}% \ifx\skv@options@i\skv@options@ii \def\skv@tempa{\expandafter\@firstoftwo\@gobbletwo}% \else \ifx\skv@options@ii\@empty \ifx\skv@options@i\@empty \def\skv@tempa{\expandafter\@firstoftwo\@gobbletwo}% \else \def\skv@tempa{\expandafter\@secondoftwo\@gobbletwo}% \fi \else \let\skv@tempa\@iden \fi \fi \skv@tempa{% \let\skv@tempa\@firstoftwo \def\do##1{% \@expandtwoargs\in@{,\detokenize{##1},}% {,\detokenize\expandafter{\skv@options@i},}% \ifin@\else\let\skv@tempa\@secondoftwo\breakkerpalooptrue\fi }% \kerpaloop*{,}\skv@options@ii{\do{##1}}% }% \skv@tempa } \def\@onefilewithoptions#1[#2][#3]#4{% \@pushfilename \xdef\@currname{#1}% \global\let\@currext#4% \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty \let\CurrentOption\@empty \@reset@ptions \makeatletter \@ifl@aded\@currext{#1}{% \@if@ptions\@currext{#1}{#2}{}{% % Merge the two options lists: \let\skv@tempa\skv@options@i \skvltxp@ifnull{#2}{}{% \def\do##1{% \@expandtwoargs\in@{,\detokenize{##1},}% {,\detokenize\expandafter{\skv@tempa},}% \ifin@\else \edef\skv@tempa{% \ifx\skv@tempa\@empty\else \detokenize\expandafter{\skv@tempa},\fi \detokenize{##1}% }% \fi }% \kerpaloop*{,}\skv@options@ii{\do{##1}}% }% \@onelevel@sanitize\skv@options@i \@onelevel@sanitize\skv@options@ii \@latex@error{Option clash for \@cls@pkg\@space #1}{% The package '#1' has already been loaded with \ifx\skv@options@i\@empty no options\MessageBreak\else options:\MessageBreak\@space\@space[\skv@options@i]\fi. \MessageBreak There has now been an attempt to load it with \ifx\skv@options@ii\@empty no options\else options \MessageBreak\@space\@space[\skv@options@ii]\fi. \MessageBreak Adding the global options\MessageBreak \@space\@space'\skv@tempa'\MessageBreak to your \noexpand\documentclass declaration may fix this problem. }% }% }{% \@pass@ptions\@currext{#2}{#1}% \global\expandafter \let\csname ver@\@currname.\@currext\endcsname\@empty \InputIfFileExists{\@currname.\@currext}{}{% \@missingfileerror\@currname\@currext }% \let\@unprocessedoptions\@@unprocessedoptions \csname\@currname.\@currext-h@@k\endcsname \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@undefined \@unprocessedoptions }% \def\skv@tempa##1 v##2 ##3\@nil##4{% \edef##4{'##1\ifx\\##2\\\else\@space v##2\fi'}% }% \skv@tempa#3 v \@nil\skv@tempb \expandafter\expandafter\expandafter\skv@tempa \csname ver@#1.\@currext\expandafter\endcsname \@space v \@nil\skv@tempc \@ifl@ter\@currext{#1}{#3}{}{% \@expandtwoargs\AtEndDocument{% \noexpand\@latex@warning@no@line{% You requested,\on@line, version\MessageBreak \skv@tempb\@space of \@cls@pkg\@space #1,\MessageBreak but only version \skv@tempc\MessageBreak is available }% }{}% }% \ifx\@currext\@clsextension \let\LoadClass\@twoloadclasserror \fi \@popfilename \@reset@ptions } \protected\def\ProcessOptions{% \let\ds@\@empty \edef\@curroptions{\@ptionlist{\@currname.\@currext}}% \ifx\@classoptionslist\relax \let\@classoptionslist@a\relax \else % LaTeX can't process options with values. So we filter out % option values: \skvltxp@getoptionnames\@classoptionslist\@classoptionslist@a \fi \skvltxp@getoptionnames\@curroptions\@curroptions@a \@ifstar\@xprocess@ptions\@process@ptions } \def\@process@ptions{% \@for\CurrentOption:=\@declaredoptions\do{% \ifx\CurrentOption\@empty\else \@expandtwoargs\in@{,\CurrentOption,}{% ,\ifx\@currext\@clsextension\else \ifx\@classoptionslist@a\relax\else\@classoptionslist@a,\fi\fi \@curroptions@a,}% \ifin@ \@use@ption \expandafter\let\csname ds@\CurrentOption\endcsname\@empty \fi \fi }% \@process@pti@ns } \def\@xprocess@ptions{% \ifx\@currext\@clsextension\else \@for\CurrentOption:=\@classoptionslist@a\do{% \ifx\CurrentOption\@empty\else \@expandtwoargs\in@{,\CurrentOption,}{,\@declaredoptions,}% \ifin@ \@use@ption \expandafter\let\csname ds@\CurrentOption\endcsname\@empty \fi \fi }% \fi \@process@pti@ns } \def\@process@pti@ns{% \@for\CurrentOption:=\@curroptions@a\do{% \@ifundefined{ds@\CurrentOption}{\@use@ption\default@ds}{\@use@ption}% }% \@for\CurrentOption:=\@declaredoptions\do{% \expandafter\let\csname ds@\CurrentOption\endcsname\relax }% \let\CurrentOption\@empty \let\@fileswith@pti@ns\@@fileswith@pti@ns \AtEndOfPackage{\let\@unprocessedoptions\relax}% } \def\@pass@ptions#1#2#3{% \def\reserved@a{#2}% \def\reserved@b{\CurrentOption}% \ifx\reserved@a\reserved@b \@ifundefined{opt@#3.#1}{% \@temptokena\expandafter{#2}% }{% \@temptokena\expandafter\expandafter\expandafter {\csname opt@#3.#1\endcsname}% \@temptokena\expandafter\expandafter\expandafter{% \expandafter\the\expandafter\@temptokena\expandafter,#2}% }% \else \@ifundefined{opt@#3.#1}{% \@temptokena{#2}% }{% \@temptokena\expandafter\expandafter\expandafter {\csname opt@#3.#1\endcsname}% \@temptokena\expandafter{\the\@temptokena,#2}% }% \fi \expandafter\xdef\csname opt@#3.#1\endcsname{\the\@temptokena}% } \def\OptionNotUsed{% \ifx\@currext\@clsextension \let\reserved@a\CurrentOption \@onelevel@sanitize\reserved@a \xdef\@unusedoptionlist{% \@unusedoptionlist \ifx\@unusedoptionlist\@empty\else,\fi \reserved@a }% \fi } \def\@use@ption{% \begingroup \skvltxp@despacecontent\CurrentOption \@onelevel@sanitize\reserved@a \@onelevel@sanitize\@unusedoptionlist \def\skv@tempa{}% \def\do##1=##2=##3\@nil{% \edef\reserved@a{\skvltxp@trimspace{##1}}% }% \kerpaloop*{,}\@unusedoptionlist{% \do##1==\@nil \ifx\reserved@a\CurrentOption\else \edef\skv@tempa{% \skv@tempa\ifx\skv@tempa\@empty\else,\fi##1% }% \fi }% \global\let\@unusedoptionlist\skv@tempa \endgroup \csname ds@\CurrentOption\endcsname } \def\@fileswith@pti@ns#1[#2]#3[#4]{% \ifx\@clsextension#1% \ifx\@classoptionslist\relax \@temptokena{#2}% \xdef\@classoptionslist{\the\@temptokena}% \def\reserved@a{% \@onefilewithoptions#3[#2][#4]#1\@documentclasshook }% \else \def\reserved@a{\@onefilewithoptions#3[#2][#4]#1}% \fi \else \@temptokena{#2}% \def\reserved@b##1,{% \ifx\@nnil##1\relax\else \ifx\relax##1\relax\else \noexpand\@onefilewithoptions##1% [\the\@temptokena][#4]\noexpand\@pkgextension \fi \expandafter\reserved@b \fi }% \edef\reserved@a{\zap@space#3 \@empty}% \edef\reserved@a{\expandafter\reserved@b\reserved@a,\@nnil,}% \fi \reserved@a } \let\@@fileswith@pti@ns\@fileswith@pti@ns \skv@ltxp@restorecodes \endinput %% End of file `skeyval-ltxpatch.sty'.