From 296ed3e2e65f36c6c418b68a25b6398586f61abf Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 30 Nov 2019 22:19:04 +0000 Subject: kvoptions (30nov19) git-svn-id: svn://tug.org/texlive/trunk@52985 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/kvoptions/kvoptions-patch.sty | 544 ++++++++++++++ .../texmf-dist/tex/latex/kvoptions/kvoptions.sty | 836 +++++++++++++++++++++ 2 files changed, 1380 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/kvoptions/kvoptions-patch.sty create mode 100644 Master/texmf-dist/tex/latex/kvoptions/kvoptions.sty (limited to 'Master/texmf-dist/tex/latex/kvoptions') diff --git a/Master/texmf-dist/tex/latex/kvoptions/kvoptions-patch.sty b/Master/texmf-dist/tex/latex/kvoptions/kvoptions-patch.sty new file mode 100644 index 00000000000..28c106b8487 --- /dev/null +++ b/Master/texmf-dist/tex/latex/kvoptions/kvoptions-patch.sty @@ -0,0 +1,544 @@ +%% +%% This is file `kvoptions-patch.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% kvoptions.dtx (with options: `patch') +%% +%% This is a generated file. +%% +%% Project: kvoptions +%% Version: 2019/11/29 v3.13 +%% +%% Copyright (C) +%% 2004, 2006, 2007, 2009-2011 Heiko Oberdiek +%% 2016-2019 Oberdiek Package Support Group +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c of this license or (at your option) any later +%% version. This version of this license is in +%% https://www.latex-project.org/lppl/lppl-1-3c.txt +%% and the latest version of this license is in +%% https://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. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% The Current Maintainers of this work are +%% Heiko Oberdiek and the Oberdiek Package Support Group +%% https://github.com/ho-tex/kvoptions/issues +%% +%% +%% This work consists of the main source file kvoptions.dtx +%% and the derived files +%% kvoptions.sty, kvoptions.pdf, kvoptions.ins, kvoptions.drv, +%% kvoptions-patch.sty, example-mycolorsetup.sty, +%% kvoptions-test1.tex, kvoptions-test2.tex, +%% kvoptions-test3.tex, kvoptions-test4.tex, +%% kvoptions-test4.sty. +%% +%% No we don't need the option 'color'. +%% With color support option 'emphcolor' will dynamically +%% change the color of \emph statements. +\def\KVO@IfDefThen#1#2{% + \ifx#1\ltx@undefined + \else + \ifx#1\relax + \else + #2% + \fi + \fi +}% +\def\KVO@GetClassOptionsList{% + \let\KVO@classoptionslist\@classoptionslist + \KVO@IfDefThen\@classoptionslist{% + \KVO@IfDefThen\XKV@documentclass{% + \ifx\XKV@documentclass\ltx@empty + \else + \KVO@IfDefThen\XKV@classoptionslist{% + \ifx\XKV@classoptionslist\ltx@empty + \else + \let\KVO@classoptionslist\XKV@classoptionslist + \fi + }% + \fi + }% + }% +}% +\NeedsTeXFormat{LaTeX2e} +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode123=1 % { + \catcode125=2 % } + \catcode64=11 % @ + \def\x{\endgroup + \expandafter\edef\csname KVO@AtEnd\endcsname{% + \endlinechar=\the\endlinechar\relax + \catcode13=\the\catcode13\relax + \catcode32=\the\catcode32\relax + \catcode35=\the\catcode35\relax + \catcode61=\the\catcode61\relax + \catcode64=\the\catcode64\relax + \catcode123=\the\catcode123\relax + \catcode125=\the\catcode125\relax + }% + }% +\x\catcode61\catcode48\catcode32=10\relax% +\catcode13=5 % ^^M +\endlinechar=13 % +\catcode35=6 % # +\catcode64=11 % @ +\catcode123=1 % { +\catcode125=2 % } +\def\TMP@EnsureCode#1#2{% + \edef\KVO@AtEnd{% + \KVO@AtEnd + \catcode#1=\the\catcode#1\relax + }% + \catcode#1=#2\relax +} +\TMP@EnsureCode{39}{12}% ' +\TMP@EnsureCode{40}{12}% ( +\TMP@EnsureCode{41}{12}% ) +\TMP@EnsureCode{43}{12}% + +\TMP@EnsureCode{44}{12}% , +\TMP@EnsureCode{45}{12}% - +\TMP@EnsureCode{46}{12}% . +\TMP@EnsureCode{47}{12}% / +\TMP@EnsureCode{58}{12}% : +\TMP@EnsureCode{60}{12}% < +\TMP@EnsureCode{62}{12}% > +\TMP@EnsureCode{91}{12}% [ +\TMP@EnsureCode{93}{12}% ] +\TMP@EnsureCode{96}{12}% ` +\TMP@EnsureCode{124}{12}% | +\edef\KVO@AtEnd{\KVO@AtEnd\noexpand\endinput} +\ProvidesPackage{kvoptions-patch}% + [2019/11/29 v3.13 LaTeX patch for keyval options (HO)]% +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname eTeXversion\endcsname\relax + \PackageWarningNoLine{kvoptions-patch}{% + Package loading is aborted, because e-TeX is missing% + }% + \expandafter\KVO@AtEnd +\fi% +\RequirePackage{etexcmds}[2007/09/09] +\ifetex@unexpanded +\else + \PackageError{kvoptions-patch}{% + Could not find eTeX's \string\unexpanded.\MessageBreak + Try adding \string\RequirePackage\string{etexcmds\string} % + before \string\documentclass% + }\@ehd + \expandafter\KVO@AtEnd +\fi% +\@ifpackageloaded{xkvltxp}{% + \PackageWarningNoLine{kvoptions}{% + Option `patch' cannot be used together with\MessageBreak + package `xkvltxp' that is already loaded.\MessageBreak + Therefore package loading is aborted% + }% + \KVO@AtEnd +}{}% +\def\@if@ptions#1#2#3{% + \begingroup + \KVO@normalize\KVO@temp{#3}% + \edef\x{\endgroup + \noexpand\@if@pti@ns{% + \detokenize\expandafter\expandafter\expandafter{% + \csname opt@#2.#1\endcsname + }% + }{% + \detokenize\expandafter{\KVO@temp}% + }% + }% + \x +} +\def\@pass@ptions#1#2#3{% + \KVO@normalize\KVO@temp{#2}% + \@ifundefined{opt@#3.#1}{% + \expandafter\gdef\csname opt@#3.#1% + \expandafter\endcsname\expandafter{% + \KVO@temp + }% + }{% + \expandafter\gdef\csname opt@#3.#1% + \expandafter\expandafter\expandafter\endcsname + \expandafter\expandafter\expandafter{% + \csname opt@#3.#1\expandafter\endcsname\expandafter,\KVO@temp + }% + }% +} +\def\ProcessOptions{% + \let\ds@\@empty + \@ifundefined{opt@\@currname.\@currext}{% + \let\@curroptions\@empty + }{% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\@curroptions + \expandafter\expandafter\expandafter{% + \csname opt@\@currname.\@currext\endcsname + }% + }% + \@ifstar\KVO@xprocess@ptions\KVO@process@ptions +} +\def\KVO@process@ptions{% + \@for\CurrentOption:=\@declaredoptions\do{% + \ifx\CurrentOption\@empty + \else + \begingroup + \ifx\@currext\@clsextension + \toks@{}% + \else + \KVO@GetClassOptionsList + \toks@\expandafter{\KVO@classoptionslist,}% + \fi + \toks\tw@\expandafter{\@curroptions}% + \edef\x{\endgroup + \noexpand\in@{,\CurrentOption,}{,\the\toks@\the\toks\tw@,}% + }% + \x + \ifin@ + \KVO@use@ption + \expandafter\let\csname ds@\CurrentOption\endcsname\@empty + \fi + \fi + }% + \KVO@process@pti@ns +} +\def\KVO@xprocess@ptions{% + \ifx\@currext\@clsextension + \else + \KVO@GetClassOptionsList + \@for\CurrentOption:=\KVO@classoptionslist\do{% + \ifx\CurrentOption\@empty + \else + \KVO@in@\CurrentOption\@declaredoptions + \ifin@ + \KVO@use@ption + \expandafter\let\csname ds@\CurrentOption\endcsname\@empty + \fi + \fi + }% + \fi + \KVO@process@pti@ns +} +\def\KVO@in@#1#2{% + \in@false + \begingroup + \@for\x:=#2\do{% + \ifx\x#1\relax + \in@true + \fi + }% + \edef\x{\endgroup + \ifin@ + \noexpand\in@true + \fi + }% + \x +} +\def\KVO@process@pti@ns{% + \@for\CurrentOption:=\@curroptions\do{% + \@ifundefined{ds@\KVO@SanitizedCurrentOption}{% + \KVO@use@ption + \default@ds + }% + \KVO@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\KVO@use@ption{% + \begingroup + \edef\x{\endgroup + \noexpand\@removeelement{% + \detokenize\expandafter{\CurrentOption}% + }{% + \detokenize\expandafter{\@unusedoptionlist}% + }% + }% + \x\@unusedoptionlist + \csname ds@\KVO@SanitizedCurrentOption\endcsname +} +\def\OptionNotUsed{% + \ifx\@currext\@clsextension + \xdef\@unusedoptionlist{% + \ifx\@unusedoptionlist\@empty + \else + \detokenize\expandafter{\@unusedoptionlist,}% + \fi + \detokenize\expandafter{\CurrentOption}% + }% + \fi +} +\def\CurrentOption@SaveLevel{0} +\def\ExecuteOptions{% + \expandafter\KVO@ExecuteOptions + \csname CurrentOption@\CurrentOption@SaveLevel\endcsname +} +\def\KVO@ExecuteOptions#1#2{% + \let#1\CurrentOption + \edef\CurrentOption@SaveLevel{% + \the\numexpr\CurrentOption@SaveLevel+1% + }% + \@for\CurrentOption:=#2\do{% + \csname ds@\CurrentOption\endcsname + }% + \edef\CurrentOption@SaveLevel{% + \the\numexpr\CurrentOption@SaveLevel-1% + }% + \let\CurrentOption#1% +} +\def\KVO@fileswith@pti@ns#1[#2]#3[#4]{% + \ifx#1\@clsextension + \ifx\@classoptionslist\relax + \KVO@normalize\KVO@temp{#2}% + \expandafter\gdef\expandafter\@classoptionslist\expandafter{% + \KVO@temp + }% + \def\reserved@a{% + \KVO@onefilewithoptions{#3}[{#2}][{#4}]#1% + \@documentclasshook + }% + \else + \def\reserved@a{% + \KVO@onefilewithoptions{#3}[{#2}][{#4}]#1% + }% + \fi + \else + \begingroup + \let\KVO@temp\relax + \let\KVO@onefilewithoptions\relax + \let\@pkgextension\relax + \def\reserved@b##1,{% + \ifx\@nil##1\relax + \else + \ifx\relax##1\relax + \else + \KVO@onefilewithoptions{##1}[{\KVO@temp}][{#4}]% + \@pkgextension + \fi + \expandafter\reserved@b + \fi + }% + \edef\reserved@a{\zap@space#3 \@empty}% + \edef\reserved@a{\expandafter\reserved@b\reserved@a,\@nil,}% + \toks@{#2}% + \def\KVO@temp{\the\toks@}% + \edef\reserved@a{\endgroup \reserved@a}% + \fi + \reserved@a +} +\def\KVO@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 + \def\reserved@a{% + \@ifl@aded\@currext{#1}{% + \@if@ptions\@currext{#1}{#2}{% + }{% + \begingroup + \@ifundefined{opt@#1.\@currext}{% + \def\x{}% + }{% + \edef\x{% + \expandafter\expandafter\expandafter\strip@prefix + \expandafter\meaning\csname opt@#1.\@currext\endcsname + }% + }% + \def\y{#2}% + \edef\y{\expandafter\strip@prefix\meaning\y}% + \@latex@error{Option clash for \@cls@pkg\space #1}{% + The package #1 has already been loaded % + with options:\MessageBreak + \space\space[\x]\MessageBreak + There has now been an attempt to load it % + with options\MessageBreak + \space\space[\y]\MessageBreak + Adding the global options:\MessageBreak + \space\space + \x,\y\MessageBreak + to your \noexpand\documentclass declaration may fix this.% + \MessageBreak + Try typing \space \space to proceed.% + }% + \endgroup + }% + }{% + \@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 + }% + \@ifl@ter\@currext{#1}{#3}{% + }{% + \@latex@warning@no@line{% + You have requested,\on@line, % + version\MessageBreak + #3' of \@cls@pkg\space #1,\MessageBreak + but only version\MessageBreak + `\csname ver@#1.\@currext\endcsname'\MessageBreak + is available% + }% + }% + \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi + \@popfilename + \@reset@ptions + }% + \reserved@a +} +\def\@unknownoptionerror{% + \@latex@error{% + Unknown option `\KVO@SanitizedCurrentOption' % + for \@cls@pkg\space`\@currname'% + }{% + The option `\KVO@SanitizedCurrentOption' was not declared in % + \@cls@pkg\space`\@currname', perhaps you\MessageBreak + misspelled its name. % + Try typing \space % + \space to proceed.% + }% +} +\def\@@unprocessedoptions{% + \ifx\@currext\@pkgextension + \@ifundefined{opt@\@currname.\@currext}{% + \let\@curroptions\@empty + }{% + \expandafter\let\expandafter\@curroptions + \csname opt@\@currname.\@currext\endcsname + }% + \@for\CurrentOption:=\@curroptions\do{% + \ifx\CurrentOption\@empty\else\@unknownoptionerror\fi + }% + \fi +} +\def\KVO@SanitizedCurrentOption{% + \expandafter\strip@prefix\meaning\CurrentOption +} +\def\KVO@normalize#1#2{% + \let\KVO@result\@empty + \KVO@splitcomma#2,\@nil + \let#1\KVO@result +} +\def\KVO@splitcomma#1,#2\@nil{% + \KVO@ifempty{#1}{}{% + \KVO@checkkv#1=\@nil + }% + \KVO@ifempty{#2}{}{\KVO@splitcomma#2\@nil}% +} +\def\KVO@ifempty#1{% + \expandafter\ifx\expandafter\\\detokenize{#1}\\% + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\def\KVO@checkkv#1=#2\@nil{% + \KVO@ifempty{#2}{% + % option without value + \edef\KVO@x{\zap@space#1 \@empty}% + \ifx\KVO@x\@empty + % ignore empty option + \else + % append to list + \edef\KVO@result{% + \etex@unexpanded\expandafter{\KVO@result},\KVO@x + }% + \fi + }{% + % #1: "key", #2: "value=" + % add key part + \edef\KVO@result{% + \etex@unexpanded\expandafter{\KVO@result},% + \zap@space#1 \@empty + }% + \futurelet\@let@token\KVO@checkfirsttok#2 \@nil| = \@nil|\KVO@nil + }% +} +\def\KVO@checkfirsttok{% + \ifx\@let@token\bgroup + % no space at start + \expandafter\KVO@removelastspace\expandafter=% + % "= \@nil" + \else + \expandafter\KVO@checkfirstA + \fi +} +\def\KVO@checkfirstA#1 #2\@nil{% + \KVO@ifempty{#2}{% + \KVO@removelastspace=#1 \@nil + }{% + \KVO@ifempty{#1}{% + \KVO@removelastspace=#2\@nil + }{% + \KVO@removelastspace=#1 #2\@nil + }% + }% +} +\def\KVO@removelastspace#1 = \@nil|#2\KVO@nil{% + \KVO@ifempty{#2}{% + \edef\KVO@result{% + \etex@unexpanded\expandafter{\KVO@result}% + \etex@unexpanded\expandafter{\KVO@removegarbage#1\KVO@nil}% + }% + }{% + \edef\KVO@result{% + \etex@unexpanded\expandafter{\KVO@result}% + \etex@unexpanded{#1}% + }% + }% +} +\def\KVO@removegarbage#1= \@nil#2\KVO@nil{#1}% +\def\KVO@removeelement#1#2{% + \begingroup + \toks@={}% + \@for\x:=#2\do{% + \ifx\x\@empty + \else + \ifx\x#1\relax + \else + \edef\t{\the\toks@}% + \ifx\t\@empty + \else + \toks@\expandafter{\the\toks@,}% + \fi + \toks@\expandafter{\the\expandafter\toks@\x}% + \fi + \fi + }% + \edef\x{\endgroup + \def\noexpand#2{\the\toks@}% + }% + \x +} +\let\@@fileswith@pti@ns\KVO@fileswith@pti@ns +\ifx\@fileswith@pti@ns\@badrequireerror +\else + \let\@fileswith@pti@ns\KVO@fileswith@pti@ns +\fi +\let\KVO@Patch=Y +\KVO@AtEnd% +\endinput +%% +%% End of file `kvoptions-patch.sty'. diff --git a/Master/texmf-dist/tex/latex/kvoptions/kvoptions.sty b/Master/texmf-dist/tex/latex/kvoptions/kvoptions.sty new file mode 100644 index 00000000000..6451bb0e7b3 --- /dev/null +++ b/Master/texmf-dist/tex/latex/kvoptions/kvoptions.sty @@ -0,0 +1,836 @@ +%% +%% This is file `kvoptions.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% kvoptions.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Project: kvoptions +%% Version: 2019/11/29 v3.13 +%% +%% Copyright (C) +%% 2004, 2006, 2007, 2009-2011 Heiko Oberdiek +%% 2016-2019 Oberdiek Package Support Group +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c of this license or (at your option) any later +%% version. This version of this license is in +%% https://www.latex-project.org/lppl/lppl-1-3c.txt +%% and the latest version of this license is in +%% https://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. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% The Current Maintainers of this work are +%% Heiko Oberdiek and the Oberdiek Package Support Group +%% https://github.com/ho-tex/kvoptions/issues +%% +%% +%% This work consists of the main source file kvoptions.dtx +%% and the derived files +%% kvoptions.sty, kvoptions.pdf, kvoptions.ins, kvoptions.drv, +%% kvoptions-patch.sty, example-mycolorsetup.sty, +%% kvoptions-test1.tex, kvoptions-test2.tex, +%% kvoptions-test3.tex, kvoptions-test4.tex, +%% kvoptions-test4.sty. +%% +%% No we don't need the option 'color'. +%% With color support option 'emphcolor' will dynamically +%% change the color of \emph statements. +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode35=6 % # + \catcode39=12 % ' + \catcode44=12 % , + \catcode45=12 % - + \catcode46=12 % . + \catcode58=12 % : + \catcode64=11 % @ + \catcode123=1 % { + \catcode125=2 % } + \expandafter\let\expandafter\x\csname ver@kvoptions.sty\endcsname + \ifx\x\relax % plain-TeX, first loading + \else + \def\empty{}% + \ifx\x\empty % LaTeX, first loading, + % variable is initialized, but \ProvidesPackage not yet seen + \else + \expandafter\ifx\csname PackageInfo\endcsname\relax + \def\x#1#2{% + \immediate\write-1{Package #1 Info: #2.}% + }% + \else + \def\x#1#2{\PackageInfo{#1}{#2, stopped}}% + \fi + \x{kvoptions}{The package is already loaded}% + \aftergroup\endinput + \fi + \fi +\endgroup% +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode35=6 % # + \catcode39=12 % ' + \catcode40=12 % ( + \catcode41=12 % ) + \catcode44=12 % , + \catcode45=12 % - + \catcode46=12 % . + \catcode47=12 % / + \catcode58=12 % : + \catcode64=11 % @ + \catcode91=12 % [ + \catcode93=12 % ] + \catcode123=1 % { + \catcode125=2 % } + \expandafter\ifx\csname ProvidesPackage\endcsname\relax + \def\x#1#2#3[#4]{\endgroup + \immediate\write-1{Package: #3 #4}% + \xdef#1{#4}% + }% + \else + \def\x#1#2[#3]{\endgroup + #2[{#3}]% + \ifx#1\@undefined + \xdef#1{#3}% + \fi + \ifx#1\relax + \xdef#1{#3}% + \fi + }% + \fi +\expandafter\x\csname ver@kvoptions.sty\endcsname +\ProvidesPackage{kvoptions}% + [2019/11/29 v3.13 Key value format for package options (HO)]% +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode123=1 % { + \catcode125=2 % } + \catcode64=11 % @ + \def\x{\endgroup + \expandafter\edef\csname KVO@AtEnd\endcsname{% + \endlinechar=\the\endlinechar\relax + \catcode13=\the\catcode13\relax + \catcode32=\the\catcode32\relax + \catcode35=\the\catcode35\relax + \catcode61=\the\catcode61\relax + \catcode64=\the\catcode64\relax + \catcode123=\the\catcode123\relax + \catcode125=\the\catcode125\relax + }% + }% +\x\catcode61\catcode48\catcode32=10\relax% +\catcode13=5 % ^^M +\endlinechar=13 % +\catcode35=6 % # +\catcode64=11 % @ +\catcode123=1 % { +\catcode125=2 % } +\def\TMP@EnsureCode#1#2{% + \edef\KVO@AtEnd{% + \KVO@AtEnd + \catcode#1=\the\catcode#1\relax + }% + \catcode#1=#2\relax +} +\TMP@EnsureCode{1}{14}% ^^A (comment) +\TMP@EnsureCode{2}{14}% ^^A (comment) +\TMP@EnsureCode{33}{12}% ! +\TMP@EnsureCode{39}{12}% ' +\TMP@EnsureCode{40}{12}% ( +\TMP@EnsureCode{41}{12}% ) +\TMP@EnsureCode{42}{12}% * +\TMP@EnsureCode{44}{12}% , +\TMP@EnsureCode{45}{12}% - +\TMP@EnsureCode{46}{12}% . +\TMP@EnsureCode{47}{12}% / +\TMP@EnsureCode{58}{12}% : +\TMP@EnsureCode{62}{12}% > +\TMP@EnsureCode{91}{12}% [ +\TMP@EnsureCode{93}{12}% ] +\TMP@EnsureCode{94}{7}% ^ (superscript) +\TMP@EnsureCode{96}{12}% ` +\edef\KVO@AtEnd{\KVO@AtEnd\noexpand\endinput} +\@ifundefined{define@key}{% + \RequirePackage{keyval}\relax +}{} +\RequirePackage{ltxcmds}[2010/12/02] +\RequirePackage{kvsetkeys}[2007/09/29] +\@ifundefined{@x@protect}{% + \def\@x@protect#1\fi#2#3{% + \fi\protect#1% + }% + \let\@typeset@protect\relax +}{} +\@ifundefined{@currname}{% + \def\@currname{}% +}{} +\@ifundefined{@currext}{% + \def\@currext{}% +}{} +\DeclareOption{debugshow}{\catcode\@ne=9 } +\DeclareOption{patch}{% + \AtEndOfPackage{% + \RequirePackage{kvoptions-patch}[2019/11/29]% + }% +} +\ProcessOptions\relax +\define@key{KVO}{family}{% + \expandafter\edef\csname KVO@family@% + \@currname.\@currext\endcsname{#1}% +} +\def\KVO@family{% + \@ifundefined{KVO@family@\@currname.\@currext}{% + \@currname + }{% + \csname KVO@family@\@currname.\@currext\endcsname + }% +} +\define@key{KVO}{prefix}{% + \expandafter\edef\csname KVO@prefix@% + \@currname.\@currext\endcsname{#1}% +} +\def\KVO@prefix{% + \ltx@ifundefined{KVO@prefix@\@currname.\@currext}{% + \@currname @% + }{% + \csname KVO@prefix@\@currname.\@currext\endcsname + }% +} +\define@key{KVO}{setkeys}{% + \expandafter\def\csname KVO@setkeys@% + \@currname.\@currext\endcsname{#1}% +} +\def\KVO@setkeys{% + \ltx@IfUndefined{KVO@setkeys@\@currname.\@currext}{% + \setkeys + }{% + \csname KVO@setkeys@\@currname.\@currext\endcsname + }% +} +\newcommand*{\SetupKeyvalOptions}{% + \kvsetkeys{KVO}% +} +\newcommand*{\DeclareBoolOption}[2][false]{% + \KVO@ifdefinable{if\KVO@prefix#2}{% + \KVO@ifdefinable{\KVO@prefix#2true}{% + \KVO@ifdefinable{\KVO@prefix#2false}{% + \csname newif\expandafter\endcsname + \csname if\KVO@prefix#2\endcsname + \@ifundefined{\KVO@prefix#2#1}{% + \PackageWarning{kvoptions}{% + Initialization of option `#2' failed,\MessageBreak + cannot set boolean option to `#1',\MessageBreak + use `true' or `false', now using `false'% + }% + }{% + \csname\KVO@prefix#2#1\endcsname + }% + \begingroup + \edef\x{\endgroup + \noexpand\define@key{\KVO@family}{#2}[true]{% + \noexpand\KVO@boolkey{\@currname}% + \ifx\@currext\@clsextension + \noexpand\@clsextension + \else + \noexpand\@pkgextension + \fi + {\KVO@prefix}{#2}{####1}% + }% + }% + \x + }% + }% + }% +} +\newcommand*{\DeclareComplementaryOption}[2]{% + \@ifundefined{if\KVO@prefix#2}{% + \PackageError{kvoptions}{% + Cannot generate option code for `#1',\MessageBreak + parent switch `#2' does not exist% + }{% + You are inside % + \ifx\@currext\@clsextension class\else package\fi\space + `\@currname.\@currext'.\MessageBreak + `\KVO@family' is used as familiy % + for the keyval options.\MessageBreak + `\KVO@prefix' serves as prefix % + for internal switch macros.\MessageBreak + \MessageBreak + \@ehc + }% + }{% + \KVO@ifdefinable{\KVO@prefix#1true}{% + \KVO@ifdefinable{\KVO@prefix#1false}{% + \expandafter\let\csname\KVO@prefix#1false\expandafter\endcsname + \csname\KVO@prefix#2true\endcsname + \expandafter\let\csname\KVO@prefix#1true\expandafter\endcsname + \csname\KVO@prefix#2false\endcsname + \begingroup + \edef\x{\endgroup + \noexpand\define@key{\KVO@family}{#1}[true]{% + \noexpand\KVO@boolkey{\@currname}% + \ifx\@currext\@clsextension + \noexpand\@clsextension + \else + \noexpand\@pkgextension + \fi + {\KVO@prefix}{#1}{####1}% + }% + }% + \x + }% + }% + }% +} +\def\KVO@ifdefinable#1{% + \expandafter\@ifdefinable\csname #1\endcsname +} +\def\KVO@boolkey#1#2#3#4#5{% + \edef\KVO@param{#5}% + \ltx@onelevel@sanitize\KVO@param + \ifx\KVO@param\KVO@true + \expandafter\@firstofone + \else + \ifx\KVO@param\KVO@false + \expandafter\expandafter\expandafter\@firstofone + \else + \ifx#2\@clsextension + \expandafter\ClassWarning + \else + \expandafter\PackageWarning + \fi + {#1}{% + Value `\KVO@param' is not supported by\MessageBreak + option `#4'% + }% + \expandafter\expandafter\expandafter\@gobble + \fi + \fi + {% + ^^A\ifx#2\@clsextension + ^^A \expandafter\ClassInfo + ^^A\else + ^^A \expandafter\PackageInfo + ^^A\fi + ^^A{#1}{[option] #4=\KVO@param}% + \csname#3#4\KVO@param\endcsname + }% +} +\def\KVO@true{true} +\def\KVO@false{false} +\ltx@onelevel@sanitize\KVO@true +\ltx@onelevel@sanitize\KVO@false +\newcommand*{\DeclareStringOption}[2][]{% + \@ifnextchar[{% + \KVO@DeclareStringOption{#1}{#2}@% + }{% + \KVO@DeclareStringOption{#1}{#2}{}[]% + }% +} +\def\KVO@DeclareStringOption#1#2#3[#4]{% + \KVO@ifdefinable{\KVO@prefix#2}{% + \@namedef{\KVO@prefix#2}{#1}% + \begingroup + \ifx\\#3\\% + \toks@{}% + \else + \toks@{[{#4}]}% + \fi + \edef\x{\endgroup + \noexpand\define@key{\KVO@family}{#2}\the\toks@{% + ^^A\begingroup + ^^A \toks@{####1}% + ^^A \ifx\@currext\@clsextension + ^^A \noexpand\ClassInfo + ^^A \else + ^^A \noexpand\PackageInfo + ^^A \fi + ^^A {\@currname}{% + ^^A [option] #2={\noexpand\the\toks@}% + ^^A }% + ^^A\endgroup + \noexpand\def + \expandafter\noexpand\csname\KVO@prefix#2\endcsname{####1}% + }% + }% + \x + }% +} +\newcommand*{\DeclareVoidOption}[2]{% + \begingroup + \let\next\@gobbletwo + \KVO@ifdefinable{\KVO@prefix#1}{% + \let\next\@firstofone + }% + \expandafter\endgroup + \next{% + \begingroup + \edef\x{\endgroup + \noexpand\define@key{\KVO@family}{#1}[\KVO@VOID@]{% + \noexpand\KVO@voidkey{\@currname}% + \ifx\@currext\@clsextension + \noexpand\@clsextension + \else + \noexpand\@pkgextension + \fi + {#1}% + {####1}% + \expandafter\noexpand\csname\KVO@prefix#1\endcsname + }% + }% + \x + \begingroup + \toks@{#2}% + \expandafter\endgroup + \expandafter\def + \csname\KVO@prefix#1\expandafter\endcsname + \expandafter{\the\toks@}% + }% +} +\def\KVO@VOID@{@VOID@} +\def\KVO@voidkey#1#2#3#4{% + \def\CurrentOption{#3}% + \begingroup + \def\x{#4}% + \expandafter\endgroup + \ifx\x\KVO@VOID@ + \else + \ifx#2\@clsextension + \expandafter\ClassWarning + \else + \expandafter\PackageWarning + \fi + {#1}{% + Unexpected value for option `#3'\MessageBreak + is ignored% + }% + \fi + ^^A\ifx#2\@clsextension + ^^A \expandafter\ClassInfo + ^^A\else + ^^A \expandafter\PackageInfo + ^^A\fi + ^^A{#1}{[option] #3}% +} +\newcommand*{\DeclareDefaultOption}{% + \@namedef{KVO@default@\@currname.\@currext}% +} +\newcommand*{\DeclareLocalOptions}[1]{% + \comma@parse{#1}\KVO@DeclareLocalOption +} +\def\KVO@DeclareLocalOption#1{% + \expandafter\def\csname KVO@local@\KVO@family @#1\endcsname{}% +} +\SetupKeyvalOptions{% + family=KVOdyn,% + prefix=KVOdyn@% +} +\DeclareBoolOption[true]{global} +\DeclareComplementaryOption{local}{global} +\DeclareStringOption[undef]{action} +\let\KVOdyn@name\relax +\let\KVOdyn@ext\@empty +\define@key{KVOdyn}{class}{% + \def\KVOdyn@name{#1}% + \let\KVOdyn@ext\@clsextension +} +\define@key{KVOdyn}{package}{% + \def\KVOdyn@name{#1}% + \let\KVOdyn@ext\@pkgextension +} +\newcommand*{\DisableKeyvalOption}[3][]{% + \begingroup + \kvsetkeys{KVOdyn}{#1}% + \def\x{\endgroup}% + \@ifundefined{KVO@action@\KVOdyn@action}{% + \PackageError{kvoptions}{% + Unknown disable action % + `\expandafter\strip@prefix\meaning\KVOdyn@action'\MessageBreak + for option `#3' in keyval family '#2'% + }\@ehc + }{% + \csname KVO@action@\KVOdyn@action\endcsname{#2}{#3}% + }% + \x +} +\def\KVO@action@undef#1#2{% + \edef\x{\endgroup + \ifKVOdyn@global\global\fi + \let + \expandafter\noexpand\csname KV@#1@#2\endcsname + \relax + \ifKVOdyn@global\global\fi + \let + \expandafter\noexpand\csname KV@#1@#2@default\endcsname + \relax + }% + ^^A\PackageInfo{kvoptions}{% + ^^A [option] key `#2' of family `#1'\MessageBreak + ^^A is disabled (undef, \ifKVOdyn@global global\else local\fi)% + ^^A}% +} +\def\KVO@action@ignore#1#2{% + \edef\x{\endgroup + \ifKVOdyn@global\global\fi + \let + \expandafter\noexpand\csname KV@#1@#2\endcsname + \noexpand\@gobble + \ifKVOdyn@global\global\fi + \let + \expandafter\noexpand\csname KV@#1@#2@default\endcsname + \noexpand\@empty + }% + ^^A\PackageInfo{kvoptions}{% + ^^A [option] key `#2' of family `#1'\MessageBreak + ^^A is disabled (ignore, \ifKVOdyn@global global\else local\fi)% + ^^A}% +} +\def\KVO@action@error{% + \KVO@do@action{error}% +} +\def\KVO@action@warning{% + \KVO@do@action{warning}% +} +\def\KVO@do@action#1#2#3{% + \ifx\KVOdyn@name\relax + \PackageError{kvoptions}{% + Action type `#1' needs package/class name\MessageBreak + for key `#3' in family `#2'% + }\@ehc + \else + \edef\x{\endgroup + \noexpand\define@key{#2}{#3}[]{% + \expandafter\noexpand\csname KVO@disable@#1\endcsname + {\KVOdyn@name}\noexpand\KVOdyn@ext{#3}% + }% + \ifKVOdyn@global + \global\let + \expandafter\noexpand\csname KV@#2@#3\endcsname + \expandafter\noexpand\csname KV@#2@#3\endcsname + \global\let + \expandafter\noexpand\csname KV@#2@#3@default\endcsname + \expandafter\noexpand\csname KV@#2@#3@default\endcsname + \fi + }% + ^^A\ifx\KVOdyn@ext\@clsextension + ^^A \expandafter\ClassInfo + ^^A\else + ^^A \expandafter\PackageInfo + ^^A\fi + ^^A{\KVOdyn@name}{% + ^^A [option] key `#3' of family `#2'\MessageBreak + ^^A is disabled (#1, \ifKVOdyn@global global\else local\fi)% + ^^A}% + \fi +} +\def\KVO@disable@error#1#2#3{% + \ifx#2\@clsextension + \expandafter\ClassError + \else + \expandafter\PackageError + \fi + {#1}{% + Option `#3' is given too late,\MessageBreak + now the option is ignored% + }\@ehc +} +\def\KVO@disable@warning#1#2#3{% + \ifx#2\@clsextension + \expandafter\ClassWarning + \else + \expandafter\PackageWarning + \fi + {#1}{% + Option `#3' is already consumed\MessageBreak + and has no effect% + }% +} +\newcommand*{\AddToKeyvalOption}{% + \@ifstar{% + \begingroup + \edef\x{\endgroup + \noexpand\KVO@AddToKeyvalOption{\KVO@family}% + }% + \x + }% + \KVO@AddToKeyvalOption +} +\def\KVO@AddToKeyvalOption#1#2{% + \@ifundefined{KV@#1@#2}{% + \PackageWarning{kvoptions}{% + Key `#2' of family `#1' does not exist.\MessageBreak + Ignoring \string\AddToKeyvalOption + }% + \@gobble + }{% + \edef\KVO@next{% + \noexpand\KVO@@AddToKeyvalOption + \expandafter\noexpand\csname KV@#1@#2\endcsname + }% + \afterassignment\KVO@next + \def\KVO@temp##1% + }% +} +\def\KVO@@AddToKeyvalOption#1{% + \begingroup + \toks@\expandafter{#1{##1}}% + \toks@\expandafter{\the\expandafter\toks@\KVO@temp{##1}}% + \edef\x{\endgroup + \noexpand\def\noexpand#1####1{\the\toks@}% + }% + \x +} +\def\KVO@IfDefThen#1#2{% + \ifx#1\ltx@undefined + \else + \ifx#1\relax + \else + #2% + \fi + \fi +}% +\def\KVO@GetClassOptionsList{% + \let\KVO@classoptionslist\@classoptionslist + \KVO@IfDefThen\@classoptionslist{% + \KVO@IfDefThen\XKV@documentclass{% + \ifx\XKV@documentclass\ltx@empty + \else + \KVO@IfDefThen\XKV@classoptionslist{% + \ifx\XKV@classoptionslist\ltx@empty + \else + \let\KVO@classoptionslist\XKV@classoptionslist + \fi + }% + \fi + }% + }% +}% +\newcommand*{\ProcessKeyvalOptions}{% + \@ifstar{% + \begingroup + \edef\x{\endgroup + \noexpand\KVO@ProcessKeyvalOptions{\KVO@family}% + }% + \x + }% + \KVO@ProcessKeyvalOptions +} +\def\KVO@ProcessKeyvalOptions#1{% + \let\@tempc\relax + \let\KVO@temp\@empty + \ifx\@currext\@clsextension + \else + \KVO@GetClassOptionsList + \ifx\KVO@classoptionslist\relax + \else + \@for\KVO@CurrentOption:=\KVO@classoptionslist\do{% + \@ifundefined{KV@#1@\expandafter\KVO@getkey + \KVO@CurrentOption=\@nil}{% + }{% + \@ifundefined{KVO@local@#1@\expandafter\KVO@getkey + \KVO@CurrentOption=\@nil}{% + \ifx\KVO@Patch Y% + \edef\KVO@temp{% + \etex@unexpanded\expandafter{% + \KVO@temp + }% + ,% + \etex@unexpanded\expandafter{% + \KVO@CurrentOption + }% + ,% + }% + \ltx@onelevel@sanitize\KVO@CurrentOption + \else + \edef\KVO@temp{% + \KVO@temp + ,% + \KVO@CurrentOption + ,% + }% + \fi + \@expandtwoargs\@removeelement\KVO@CurrentOption + \@unusedoptionlist\@unusedoptionlist + }{}% + }% + }% + \fi + \fi + \begingroup + \toks\tw@{}% + \@ifundefined{opt@\@currname.\@currext}{% + \toks@\expandafter{\KVO@temp}% + }{% + \toks@\expandafter\expandafter\expandafter{% + \csname opt@\@currname.\@currext\endcsname + }% + \ifx\@currext\@clsextension + \edef\CurrentOption{\the\toks@}% + \toks@\expandafter{\KVO@temp}% + \@for\CurrentOption:=\CurrentOption\do{% + \@ifundefined{% + KV@#1@\expandafter\KVO@getkey\CurrentOption=\@nil + }{% + \@ifundefined{KVO@default@\@currname.\@currext}{% + \ifx\KVO@Patch Y% + \ltx@onelevel@sanitize\CurrentOption + \fi + \ifx\@unusedoptionlist\@empty + \global\let\@unusedoptionlist\CurrentOption + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\@unusedoptionlist + \expandafter\expandafter\expandafter{% + \expandafter\@unusedoptionlist + \expandafter,\CurrentOption + }% + \fi + }{% + \toks\tw@\expandafter{% + \the\toks\expandafter\tw@\expandafter,\CurrentOption + }% + }% + }{% + \toks@\expandafter{% + \the\expandafter\toks@\expandafter,\CurrentOption + }% + }% + }% + \else + \@ifundefined{KVO@default@\@currname.\@currext}{% + \toks@\expandafter\expandafter\expandafter{% + \expandafter\KVO@temp\the\toks@ + }% + }{% + \edef\CurrentOption{\the\toks@}% + \toks@\expandafter{\KVO@temp}% + \@for\CurrentOption:=\CurrentOption\do{% + \@ifundefined{% + KV@#1@\expandafter\KVO@getkey\CurrentOption=\@nil + }{% + \toks\tw@\expandafter{% + \the\toks\expandafter\tw@\expandafter,\CurrentOption + }% + }{% + \toks@\expandafter{% + \the\expandafter\toks@\expandafter,\CurrentOption + }% + }% + }% + }% + \fi + }% + \edef\KVO@temp{\endgroup + \noexpand\KVO@calldefault{\the\toks\tw@}% + \noexpand\KVO@setkeys{#1}{\the\toks@}% + }% + \KVO@temp + \let\CurrentOption\@empty + \AtEndOfPackage{\let\@unprocessedoptions\relax}% +} +\newcommand*{\ProcessLocalKeyvalOptions}{% + \@ifstar{% + \begingroup + \edef\x{\endgroup + \noexpand\KVO@ProcessLocalKeyvalOptions{\KVO@family}% + }% + \x + }% + \KVO@ProcessLocalKeyvalOptions +} +\def\KVO@ProcessLocalKeyvalOptions#1{% + \let\@tempc\relax + \let\KVO@temp\@empty + \ifx\@currext\@pkgextension + \else + \PackageError{kvoptions}{% + \string\ProcessLocalKeyvalOptions\space is intended for packages only% + }\@ehc + \fi + \begingroup + \toks\tw@{}% + \@ifundefined{opt@\@currname.\@currext}{% + \toks@\expandafter{\KVO@temp}% + }{% + \toks@\expandafter\expandafter\expandafter{% + \csname opt@\@currname.\@currext\endcsname + }% + \@ifundefined{KVO@default@\@currname.\@currext}{% + \toks@\expandafter\expandafter\expandafter{% + \expandafter\KVO@temp\the\toks@ + }% + }{% + \edef\CurrentOption{\the\toks@}% + \toks@\expandafter{\KVO@temp}% + \@for\CurrentOption:=\CurrentOption\do{% + \@ifundefined{% + KV@#1@\expandafter\KVO@getkey\CurrentOption=\@nil + }{% + \toks\tw@\expandafter{% + \the\toks\expandafter\tw@\expandafter,\CurrentOption + }% + }{% + \toks@\expandafter{% + \the\expandafter\toks@\expandafter,\CurrentOption + }% + }% + }% + }% + }% + \edef\KVO@temp{\endgroup + \noexpand\KVO@calldefault{\the\toks\tw@}% + \noexpand\KVO@setkeys{#1}{\the\toks@}% + }% + \KVO@temp + \let\CurrentOption\@empty + \AtEndOfPackage{\let\@unprocessedoptions\relax}% +} +\def\KVO@getkey#1=#2\@nil{#1} +\def\KVO@calldefault#1{% + \begingroup + \def\x{#1}% + \expandafter\endgroup + \ifx\x\@empty + \else + \@for\CurrentOption:=#1\do{% + \ifx\CurrentOption\@empty + \else + \expandafter\KVO@setcurrents\CurrentOption=\@nil + \@nameuse{KVO@default@\@currname.\@currext}% + \fi + }% + \fi +} +\def\KVO@setcurrents#1=#2\@nil{% + \def\CurrentOptionValue{#2}% + \ifx\CurrentOptionValue\@empty + \let\CurrentOptionKey\CurrentOption + \let\CurrentOptionValue\relax + \else + \edef\CurrentOptionKey{\zap@space#1 \@empty}% + \expandafter\KVO@setcurrentvalue\CurrentOption\@nil + \fi +} +\def\KVO@setcurrentvalue#1=#2\@nil{% + \KV@@sp@def\CurrentOptionValue{#2}% +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname documentclass\endcsname\relax + \def\ProcessKeyvalOptions{% + \@ifstar{}\@gobble + }% +\fi +\KVO@AtEnd% +\endinput +%% +%% End of file `kvoptions.sty'. -- cgit v1.2.3