From c0c24a908aa4305f2c1b9ddd33fcb1b4d01da90b Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 1 May 2014 22:42:47 +0000 Subject: xkeyval (1may14) git-svn-id: svn://tug.org/texlive/trunk@33780 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/generic/xkeyval/keyval.tex | 18 +- Master/texmf-dist/tex/generic/xkeyval/pst-xkey.tex | 2 +- Master/texmf-dist/tex/generic/xkeyval/xkeyval.tex | 35 +- Master/texmf-dist/tex/generic/xkeyval/xkvex1.tex | 153 +++++++++ Master/texmf-dist/tex/generic/xkeyval/xkvex2.tex | 356 +++++++++++++++++++++ Master/texmf-dist/tex/generic/xkeyval/xkvex3.tex | 93 ++++++ Master/texmf-dist/tex/generic/xkeyval/xkvex4.tex | 106 ++++++ Master/texmf-dist/tex/generic/xkeyval/xkvtxhdr.tex | 2 +- 8 files changed, 737 insertions(+), 28 deletions(-) create mode 100644 Master/texmf-dist/tex/generic/xkeyval/xkvex1.tex create mode 100644 Master/texmf-dist/tex/generic/xkeyval/xkvex2.tex create mode 100644 Master/texmf-dist/tex/generic/xkeyval/xkvex3.tex create mode 100644 Master/texmf-dist/tex/generic/xkeyval/xkvex4.tex (limited to 'Master/texmf-dist/tex/generic/xkeyval') diff --git a/Master/texmf-dist/tex/generic/xkeyval/keyval.tex b/Master/texmf-dist/tex/generic/xkeyval/keyval.tex index fbabde0c57c..20b64a84a47 100644 --- a/Master/texmf-dist/tex/generic/xkeyval/keyval.tex +++ b/Master/texmf-dist/tex/generic/xkeyval/keyval.tex @@ -7,7 +7,7 @@ %% xkeyval.dtx (with options: `xkvkeyval') %% %% --------------------------------------- -%% Copyright (C) 2004-2012 Hendri Adriaens +%% Copyright (C) 2004-2014 Hendri Adriaens %% --------------------------------------- %% %% This work may be distributed and/or modified under the @@ -37,23 +37,23 @@ %% Based on keyval.sty. %% \def\XKV@tempa#1{% -\def\KV@@sp@def##1##2{% +\long\def\KV@@sp@def##1##2{% \futurelet\XKV@resa\KV@@sp@d##2\@nil\@nil#1\@nil\relax##1}% -\def\KV@@sp@d{% +\long\def\KV@@sp@d{% \ifx\XKV@resa\@sptoken \expandafter\KV@@sp@b \else \expandafter\KV@@sp@b\expandafter#1% \fi}% -\def\KV@@sp@b#1##1 \@nil{\KV@@sp@c##1}% +\long\def\KV@@sp@b#1##1 \@nil{\KV@@sp@c\@empty##1}% } \XKV@tempa{ } -\def\KV@@sp@c#1\@nil#2\relax#3{\XKV@toks{#1}\edef#3{\the\XKV@toks}} -\def\KV@do#1,{% +\long\def\KV@@sp@c#1\@nil#2\relax#3{\XKV@toks\expandafter{#1}\edef#3{\the\XKV@toks}} +\long\def\KV@do#1,{% \ifx\relax#1\@empty\else \KV@split#1==\relax \expandafter\KV@do\fi} -\def\KV@split#1=#2=#3\relax{% +\long\def\KV@split#1=#2=#3\relax{% \KV@@sp@def\XKV@tempa{#1}% \ifx\XKV@tempa\@empty\else \expandafter\let\expandafter\XKV@tempc @@ -78,9 +78,9 @@ \XKV@tempb\relax \fi} \def\KV@def#1#2[#3]{% - \@namedef{KV@#1@#2@default\expandafter}\expandafter + \long\@namedef{KV@#1@#2@default\expandafter}\expandafter {\csname KV@#1@#2\endcsname{#3}}% - \@namedef{KV@#1@#2}##1} + \long\@namedef{KV@#1@#2}##1} \endinput %% %% End of file `keyval.tex'. diff --git a/Master/texmf-dist/tex/generic/xkeyval/pst-xkey.tex b/Master/texmf-dist/tex/generic/xkeyval/pst-xkey.tex index e6bbd7f8972..3fa4f9e7e37 100644 --- a/Master/texmf-dist/tex/generic/xkeyval/pst-xkey.tex +++ b/Master/texmf-dist/tex/generic/xkeyval/pst-xkey.tex @@ -7,7 +7,7 @@ %% xkeyval.dtx (with options: `pxktex') %% %% --------------------------------------- -%% Copyright (C) 2004-2012 Hendri Adriaens +%% Copyright (C) 2004-2014 Hendri Adriaens %% --------------------------------------- %% %% This work may be distributed and/or modified under the diff --git a/Master/texmf-dist/tex/generic/xkeyval/xkeyval.tex b/Master/texmf-dist/tex/generic/xkeyval/xkeyval.tex index 1aaf4c68e54..838aa208869 100644 --- a/Master/texmf-dist/tex/generic/xkeyval/xkeyval.tex +++ b/Master/texmf-dist/tex/generic/xkeyval/xkeyval.tex @@ -7,7 +7,7 @@ %% xkeyval.dtx (with options: `xkvtex') %% %% --------------------------------------- -%% Copyright (C) 2004-2012 Hendri Adriaens +%% Copyright (C) 2004-2014 Hendri Adriaens %% --------------------------------------- %% %% This work may be distributed and/or modified under the @@ -58,10 +58,10 @@ \newif\ifXKV@preset \let\XKV@rm\@empty \ifx\ProvidesFile\@undefined - \message{2012/10/14 v2.6b key=value parser (HA)} + \message{2014/04/27 v2.6c key=value parser (HA)} \input xkvtxhdr \else - \ProvidesFile{xkeyval.tex}[2012/10/14 v2.6b key=value parser (HA)] + \ProvidesFile{xkeyval.tex}[2014/04/27 v2.6c key=value parser (HA)] \@addtofilelist{xkeyval.tex} \fi \long\def\@firstoftwo#1#2{#1} @@ -144,7 +144,7 @@ #2\@@#3#4\fi{#5}{#1}% } \long\def\XKV@wh@l@st#1\@@#2#3\fi#4#5{} -\def\XKV@addtomacro@n#1#2{% +\long\def\XKV@addtomacro@n#1#2{% \XKV@tempa@toks\expandafter{#1#2}% \edef#1{\the\XKV@tempa@toks}% } @@ -223,7 +223,7 @@ }% \let#1\@empty\@i#3\@s@l@ctive@sanitize } -\def\XKV@checksanitizea#1#2{% +\long\def\XKV@checksanitizea#1#2{% \XKV@ch@cksanitize{#1}#2=% \ifin@\else\XKV@ch@cksanitize{#1}#2,\fi \ifin@\@selective@sanitize[0]{,=}#2\fi @@ -232,12 +232,12 @@ \XKV@ch@cksanitize{#1}#2,% \ifin@\@selective@sanitize[0],#2\fi } -\def\XKV@ch@cksanitize#1#2#3{% +\long\def\XKV@ch@cksanitize#1#2#3{% \XKV@tempa@toks{#1}\edef#2{\the\XKV@tempa@toks}% \@onelevel@sanitize#2% \@expandtwoargs\in@#3{#2}% \ifin@ - \def#2##1#3##2\@nil{% + \long\def#2##1#3##2\@nil{% \XKV@tempa@toks{##2}\edef#2{\the\XKV@tempa@toks}% \ifx#2\@empty\else\in@false\fi }% @@ -359,7 +359,7 @@ \XKV@@ifcmd#1#2{\@nil}\@nil#3% } \def\XKV@getkeyname#1#2{\expandafter\XKV@g@tkeyname#1=\@nil#2} -\def\XKV@g@tkeyname#1=#2\@nil#3{% +\long\def\XKV@g@tkeyname#1=#2\@nil#3{% \XKV@ifcmd{#1}\savevalue#3{\XKV@rkvtrue\XKV@sgfalse}{% \XKV@ifcmd{#1}\gsavevalue#3% {\XKV@rkvtrue\XKV@sgtrue}{\XKV@rkvfalse\XKV@sgfalse}% @@ -375,7 +375,7 @@ \def\define@key{\XKV@testoptb\XKV@define@key} \def\XKV@define@key#1{% \@ifnextchar[{\XKV@d@fine@k@y{#1}}{% - \expandafter\def\csname\XKV@header#1\endcsname####1% + \long\expandafter\def\csname\XKV@header#1\endcsname####1% }% } \def\XKV@d@fine@k@y#1[#2]{% @@ -658,7 +658,7 @@ }% } \def\setkeys{\XKV@testopta{\XKV@testoptc\XKV@setkeys}} -\def\XKV@setkeys[#1]#2{% +\long\def\XKV@setkeys[#1]#2{% \XKV@checksanitizea{#2}\XKV@resb \let\XKV@naa\@empty \XKV@for@o\XKV@resb\XKV@tempa{% @@ -684,13 +684,13 @@ }% \XKV@presetfalse } -\def\XKV@s@tkeys#1#2{% +\long\def\XKV@s@tkeys#1#2{% \XKV@sp@deflist\XKV@na{#2}% \XKV@for@n{#1}\CurrentOption{% \expandafter\XKV@s@tk@ys\CurrentOption==\@nil }% } -\def\XKV@s@tk@ys#1=#2=#3\@nil{% +\long\def\XKV@s@tk@ys#1=#2=#3\@nil{% \XKV@g@tkeyname#1=\@nil\XKV@tkey \expandafter\KV@@sp@def\expandafter\XKV@tkey\expandafter{\XKV@tkey}% \ifx\XKV@tkey\@empty @@ -780,18 +780,18 @@ }% \fi } -\def\XKV@replacepointers#1{% +\long\def\XKV@replacepointers#1{% \let\XKV@tempa\@empty \let\XKV@resa\@empty - \XKV@r@placepointers#1\usevalue\@nil + \XKV@r@placepointers\@empty#1\usevalue\@nil } -\def\XKV@r@placepointers#1\usevalue#2{% - \XKV@addtomacro@n\XKV@tempa{#1}% +\long\def\XKV@r@placepointers#1\usevalue#2{% + \expandafter\XKV@addtomacro@n\expandafter\XKV@tempa\expandafter{#1}% \def\XKV@tempb{#2}% \ifx\XKV@tempb\@nnil\else\XKV@afterfi \XKV@ifundefined{XKV@\XKV@header#2@value}{% \XKV@err{no value recorded for key `#2'; ignored}% - \XKV@r@placepointers + \XKV@r@placepointers\@empty }{% \@expandtwoargs\in@{,#2,}{,\XKV@resa,}% \ifin@\XKV@afterelsefi @@ -799,6 +799,7 @@ \else\XKV@afterfi \XKV@addtolist@x\XKV@resa{#2}% \expandafter\expandafter\expandafter\XKV@r@placepointers + \expandafter\expandafter\expandafter\@empty \csname XKV@\XKV@header#2@value\endcsname \fi }% diff --git a/Master/texmf-dist/tex/generic/xkeyval/xkvex1.tex b/Master/texmf-dist/tex/generic/xkeyval/xkvex1.tex new file mode 100644 index 00000000000..a6c24b244a0 --- /dev/null +++ b/Master/texmf-dist/tex/generic/xkeyval/xkvex1.tex @@ -0,0 +1,153 @@ +%% +%% This is file `xkvex1.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% xkeyval.dtx (with options: `xkvex1') +%% +%% --------------------------------------- +%% Copyright (C) 2004-2014 Hendri Adriaens +%% --------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) 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 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% This Current Maintainer of this work is Hendri Adriaens. +%% +%% This work consists of the file xkeyval.dtx and derived files +%% keyval.tex, xkvtxhdr.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, pst-xkey.tex, pst-xkey.sty, xkveca.cls, xkvecb.cls, +%% xkvesa.sty, xkvesb.sty, xkvesc.sty, xkvex1.tex, xkvex2.tex, +%% xkvex3.tex and xkvex4.tex. +%% +%% The following files constitute the xkeyval bundle and must be +%% distributed as a whole: readme, xkeyval.pdf, keyval.tex, +%% pst-xkey.sty, pst-xkey.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, xkvtxhdr.tex, pst-xkey.dtx and xkeyval.dtx. +%% +\input xkeyval + +\catcode`\@=11 + +%% xkeyval package: TeX example +%% Hendri Adriaens + +\noindent Example 1. This example demonstrates the use of the new +macros for setting keys of the `xkeyval' package. Have a look at the +source for information about this example and to understand the output. + +%% Define keys. +\define@key{fami}{keyi}{key 1: #1 } +\define@key{famii}{keyii}{key 2: #1 } +\define@key{famiii}{keyiii}[test 2]{key 3: #1 } +\define@key{famiv}{keyi}{key 4: #1 } + +%% Set keys from multiple families. +\setkeys{fami,famii,famiii}{keyi=test 1,keyiii} + +%% Multiplely defined keys will be taken from the first family on the +%% list that defines the key. When + is used, all families +%% defining the key will set it. +\setkeys{fami,famiv}{keyi=test 3}\par +\setkeys{famiv,fami}{keyi=test 4}\par +\setkeys+{fami,famiv}{keyi=test 5}\par + +%% Starred form sets keys that it can find in the families specified. +%% Keys that cannot be located will be put onto a list for later use +%% by \setrmkeys. +\setkeys*{famiv}{keyi=test 9,keyii=http://www.test10.com, + keyiii=test 11}\par + +%% Try to set the remaining keys from the previous step. The starred +%% version defines a new list in case there are still keys that cannot +%% be located in the given families. The command below does not do +%% anything since the `keyi' key has already been taken from family +%% `famiv' above. +\setrmkeys*{fami}\par + +%% The normal version will complain (as \setkeys) when it cannot locate +%% a key which was previously submitted to \xsetkeys and hasn't been +%% set yet by previous commands. `xkeyval' commands can also be used to +%% set `keyval' options. +\setrmkeys{famii,famiii}\par + +%% Set keys, excluding some keys. +\setkeys{fami,famii,famiii}[keyi,keyiii]{keyi=test 6,keyii=test +7,keyiii=test 8}\par + +%% Test whether a key is defined in a family from the list. +\key@ifundefined{fami,famii}{keyiii} +{keyiii is not defined in family `fami' or `famii'} +{keyiii is defined in family `fami' or `famii'} + +%% Define some keys and macros. +\define@cmdkey[my]{fama}[my@]{keya}[none]{} +\define@choicekey[my]{fama}{keyb}{a,b,c}[b]{correct input: #1} +\define@boolkey[my]{famb}{keyc}[true]{} +\def\testa{\setkeys[my]{fama}} +\def\testb{\setkeys[my]{famb}} +\def\testset{\setkeys[my]{fama,famb}} + +%% Now \testa can only set keya, \testb can only +%% set keyb and \testset can set both. +\testa{keya} + \my@keya\ +\testa{keyb} +\testb{keyc} + \ifmy@famb@keyc true \else false \fi +\testset{keya=test 11,keyb=c,keyc=false} + \my@keya\space + \ifmy@famb@keyc true \else false \fi + +%% Pointer system + +%% First we (re)define some keys. +\define@key{fam}{keyi}{key 1: #1 } +\define@key{fam}{keyii}{key 2: #1 } +\define@key{fam}{keyiii}[test 2]{key 3: #1 } + +%% Pointers can be used to copy the value of other keys in the same +%% family. This can be done in two ways. The first example shows `on +%% the spot' value saving. +\setkeys{fam}{\savevalue{keyi}=test 12,\savevalue{keyii}=\usevalue{keyi}} +\setkeys{fam}{keyiii=\usevalue{keyii}} + +%% However, you can also predefine the keys to be saved for the entire +%% document with a single command. +\savekeys{fam}{keyi,keyii} +\setkeys{fam}{keyi=test 13,keyii=\usevalue{keyi}} +\setkeys{fam}{keyiii=\usevalue{keyii}} + +%% Pointers can be used in default values as well. Remember that the +%% previous example used \savekeys for keyi and keyii. +\define@key{fam}{keyi}{keyi: #1 } +\define@key{fam}{keyii}[\usevalue{keyi}]{keyii: #1 } +\define@key{fam}{keyiii}[\usevalue{keyii}]{keyiii: #1 } +\setkeys{fam}{keyi=test 14} +\setkeys{fam}{keyii} +\setkeys{fam}{keyiii} + +%% Presetting keys + +%% Simple example of the preset system. +\define@key{fam}{keyi}{keyi: #1 } +\define@key{fam}{keyii}{keyii: #1 } +\presetkeys{fam}{keyi=blue}{keyii=\usevalue{keyi}} +\setkeys{fam}{}\par +\setkeys{fam}{keyi=red}\par +\setkeys{fam}{keyii=red} +\presetkeys{fam}{keyi=red}{}\par +\setkeys{fam}{keyii=\usevalue{keyi}} + +\bye +\endinput +%% +%% End of file `xkvex1.tex'. diff --git a/Master/texmf-dist/tex/generic/xkeyval/xkvex2.tex b/Master/texmf-dist/tex/generic/xkeyval/xkvex2.tex new file mode 100644 index 00000000000..8616eb81f63 --- /dev/null +++ b/Master/texmf-dist/tex/generic/xkeyval/xkvex2.tex @@ -0,0 +1,356 @@ +%% +%% This is file `xkvex2.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% xkeyval.dtx (with options: `xkvex2') +%% +%% --------------------------------------- +%% Copyright (C) 2004-2014 Hendri Adriaens +%% --------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) 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 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% This Current Maintainer of this work is Hendri Adriaens. +%% +%% This work consists of the file xkeyval.dtx and derived files +%% keyval.tex, xkvtxhdr.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, pst-xkey.tex, pst-xkey.sty, xkveca.cls, xkvecb.cls, +%% xkvesa.sty, xkvesb.sty, xkvesc.sty, xkvex1.tex, xkvex2.tex, +%% xkvex3.tex and xkvex4.tex. +%% +%% The following files constitute the xkeyval bundle and must be +%% distributed as a whole: readme, xkeyval.pdf, keyval.tex, +%% pst-xkey.sty, pst-xkey.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, xkvtxhdr.tex, pst-xkey.dtx and xkeyval.dtx. +%% +\documentclass{article} +\usepackage{xkeyval} +\usepackage{xcolor,calc} + +%% Example of setting keyval options using xkeyval +\usepackage{hyperref} +\usepackage{helvet} +\setkeys{Hyp,Hel}{colorlinks,urlcolor=green,scaled=.85} + +\title{\textsf{xkeyval} package\\\normalsize\emph{Example 2}} +\author{Hendri Adriaens} +\setlength{\parindent}{0cm} + +\makeatletter + +\begin{document} +\maketitle + +This example demonstrates the use of the new macros for setting +keys of the \textsf{xkeyval} package. Below each piece of verbatim +code, you can find its output. + +\section{Simple operations} + +Define keys. +\begin{verbatim} +\define@key{fami}{keyi}{key 1: #1\space} +\define@key{famii}{keyii}{key 2: #1\space} +\define@key{famiii}{keyiii}[test 2]{key 3: #1\space} +\define@key{famiv}{keyi}{key 4: #1\space} +\end{verbatim} +\define@key{fami}{keyi}{key 1: #1\space} +\define@key{famii}{keyii}{key 2: #1\space} +\define@key{famiii}{keyiii}[test 2]{key 3: #1\space} +\define@key{famiv}{keyi}{key 4: #1\space} + +Set keys from multiple families. +\begin{verbatim} +\setkeys{fami,famii,famiii}{keyi=test 1,keyiii} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\setkeys{fami,famii,famiii}{keyi=test 1,keyiii} +\end{itemize} + +Multiplely defined keys will be taken from the first family on the +list that defines the key. When \verb|+| is used, all families +defining the key will set it. +\begin{verbatim} +\setkeys{fami,famiv}{keyi=test 3} +\setkeys{famiv,fami}{keyi=test 4} +\setkeys+{fami,famiv}{keyi=test 5} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\setkeys{fami,famiv}{keyi=test 3}\par +\setkeys{famiv,fami}{keyi=test 4}\par +\setkeys+{fami,famiv}{keyi=test 5} +\end{itemize} + +Starred form sets keys that it can find in the families specified. +Keys that cannot be located will be put onto a list for later use +by \verb+\setrmkeys+. +\begin{verbatim} +\setkeys*{famiv}{keyi=test 9,keyii=\url{http://www.test10.com}, + keyiii=this key has been set on page \thepage} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\setkeys*{famiv}{keyi=test 9,keyii=\url{http://www.test10.com}, + keyiii=this key has been set on page \thepage} +\end{itemize} + +Try to set the remaining keys from the previous step. The starred +version defines a new list in case there are still keys that +cannot be located in the given families. The command below does +not do anything since the \verb+keyi+ key has already been taken +from family \verb+famiv+ above. +\begin{verbatim} +\setrmkeys*{fami} +\end{verbatim} +\setrmkeys*{fami}\par + +The normal version will complain (as \verb+\setkeys+) when it +cannot locate a key which was previously submitted to +\verb+\setkeys+ and hasn't been set yet by previous commands. +\textsf{xkeyval} commands can also be used to set \textsf{keyval} +options as is done to the color of the url created with the +\textsf{hyperref} package and the scaling of the font used for +`\textsf{xkeyval}' with the \textsf{helvet} package. (See the +preamble of the example for the code). +\begin{verbatim} +\setrmkeys{famii,famiii} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\setrmkeys{famii,famiii} +\end{itemize} + +Set keys, excluding some keys. +\begin{verbatim} +\setkeys{fami,famii,famiii}[keyi,keyiii]{keyi=test 6,keyii=test 7,keyiii=test 8} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\setkeys{fami,famii,famiii}[keyi,keyiii]{keyi=test 6,keyii=test 7,keyiii=test 8} +\end{itemize} + +Test whether a key is defined in a family from the list. +\begin{verbatim} +\key@ifundefined{fami,famii}{keyiii} +{keyiii is not defined in family `fami' or `famii'} +{keyiii is defined in family `fami' or `famii'} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\key@ifundefined{fami,famii}{keyiii} +{keyiii is not defined in family `fami' or `famii'} +{keyiii is defined in family `fami' or `famii'} +\end{itemize} + +Define some keys and macros. +\begin{verbatim} +\define@cmdkey[my]{fama}[my@]{keya}[none]{} +\define@choicekey[my]{fama}{keyb}{a,b,c}[b]{correct input: #1} +\define@boolkey[my]{famb}{keyc}[true]{} +\def\testa{\setkeys[my]{fama}} +\def\testb{\setkeys[my]{famb}} +\def\testset{\setkeys[my]{fama,famb}} +\end{verbatim} +\define@cmdkey[my]{fama}[my@]{keya}[none]{} +\define@choicekey[my]{fama}{keyb}{a,b,c}[b]{correct input: #1} +\define@boolkey[my]{famb}{keyc}[true]{} +\def\testa{\setkeys[my]{fama}} +\def\testb{\setkeys[my]{famb}} +\def\testset{\setkeys[my]{fama,famb}} +Now \verb+\testa+ can only set \verb+keya+, \verb+\testb+ can only +set \verb+keyb+ and \verb+\testset+ can set both. +\begin{verbatim} +\testa{keya} + \my@keya\ +\testa{keyb} +\testb{keyc} + \ifmy@famb@keyc true \else false \fi +\testset{keya=test 11,keyb=c,keyc=false} + \my@keya\space + \ifmy@famb@keyc true \else false \fi +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\testa{keya} + \my@keya\ +\testa{keyb} +\testb{keyc} + \ifmy@famb@keyc true \else false \fi +\testset{keya=test 11,keyb=c,keyc=false} + \my@keya\space + \ifmy@famb@keyc true \else false \fi +\end{itemize} + +\section{Pointers and values} + +First we (re)define some keys. +\begin{verbatim} +\define@key{fam}{keyi}{key 1: #1 } +\define@key{fam}{keyii}{key 2: #1 } +\define@key{fam}{keyiii}[test 2]{key 3: #1 } +\end{verbatim} +\define@key{fam}{keyi}{key 1: #1 } +\define@key{fam}{keyii}{key 2: #1 } +\define@key{fam}{keyiii}[test 2]{key 3: #1 } + +Pointers can be used to copy the value of other keys in the same +family. This can be done in two ways. The first example shows `on +the spot' value saving. +\begin{verbatim} +\setkeys{fam}{\savevalue{keyi}=test 12,\savevalue{keyii}=\usevalue{keyi}} +\setkeys{fam}{keyiii=\usevalue{keyii}} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\setkeys{fam}{\savevalue{keyi}=test 12,\savevalue{keyii}=\usevalue{keyi}} +\setkeys{fam}{keyiii=\usevalue{keyii}} +\end{itemize} + +However, you can also predefine the keys to be saved for the entire +document with a single command. Note that we force keys to be saved +globally. This is necessary here since the commands in the source of +this document appear in an environment. +\begin{verbatim} +\savekeys{fam}{\global{keyi},\global{keyii}} +\setkeys{fam}{keyi=test 13,keyii=\usevalue{keyi}} +\setkeys{fam}{keyiii=\usevalue{keyii}} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\savekeys{fam}{\global{keyi},\global{keyii}} +\setkeys{fam}{keyi=test 13,keyii=\usevalue{keyi}} +\setkeys{fam}{keyiii=\usevalue{keyii}} +\end{itemize} + +Pointers can be used in default values as well. Remember that the +previous example used \verb+\savekeys+ for \verb+keyi+ and \verb+keyii+. +\begin{verbatim} +\define@key{fam}{keyi}{keyi: #1 } +\define@key{fam}{keyii}[\usevalue{keyi}]{keyii: #1 } +\define@key{fam}{keyiii}[\usevalue{keyii}]{keyiii: #1 } +\setkeys{fam}{keyi=test 14} +\setkeys{fam}{keyii} +\setkeys{fam}{keyiii} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\define@key{fam}{keyi}{keyi: #1 } +\define@key{fam}{keyii}[\usevalue{keyi}]{keyii: #1 } +\define@key{fam}{keyiii}[\usevalue{keyii}]{keyiii: #1 } +\setkeys{fam}{keyi=test 14} +\setkeys{fam}{keyii} +\setkeys{fam}{keyiii} +\end{itemize} + +\section{Presetting keys} + +Simple example of the preset system. +\begin{verbatim} +\define@key{fam}{keyi}{keyi: #1 } +\define@key{fam}{keyii}{keyii: #1 } +\presetkeys{fam}{keyi=blue}{keyii=\usevalue{keyi}} +\setkeys{fam}{}\par +\setkeys{fam}{keyi=red}\par +\setkeys{fam}{keyii=red} +\presetkeys{fam}{keyi=red}{} +\setkeys{fam}{keyii=\usevalue{keyi}} +\end{verbatim} +\begin{itemize} +\item[$\Rightarrow$] +\define@key{fam}{keyi}{keyi: #1 } +\define@key{fam}{keyii}{keyii: #1 } +\presetkeys{fam}{keyi=blue}{keyii=\usevalue{keyi}} +\setkeys{fam}{}\par +\setkeys{fam}{keyi=red}\par +\setkeys{fam}{keyii=red} +\presetkeys{fam}{keyi=red}{}\par +\setkeys{fam}{keyii=\usevalue{keyi}} +\end{itemize} + +\section{Application of pointers, values and presets} + +\setkeys{Hyp}{urlcolor=black} +More complicated example of the preset +system and pointer system. See for more information about this +example the +\textsf{xkeyval} article on\par +\url{http://www.tug.org/TUGboat/tb25-2/tb81adriaens.pdf}. +\begin{verbatim} +\newdimen\shadowsize +\define@boolkey{Fbox}{frame}[true]{} +\define@boolkey{Fbox}{shadow}[true]{} +\define@key{Fbox}{framecolor}{\def\Fboxframecolor{#1}} +\define@key{Fbox}{shadowcolor}{\def\Fboxshadowcolor{#1}} +\define@key{Fbox}{framesize}{\setlength\fboxrule{#1}} +\define@key{Fbox}{shadowsize}{\setlength\shadowsize{#1}} +\presetkeys{Fbox}{frame,framecolor=red,framesize=0.5pt}% + {shadow=\usevalue{frame},shadowcolor=\usevalue{framecolor}!40,% + shadowsize=\usevalue{framesize}*4} +\savekeys{Fbox}{frame,framecolor,framesize} +\newcommand*\Fbox[2][]{% + \setkeys{Fbox}{#1}% + {\ifKV@Fbox@frame\else\fboxrule0pt\fi + \ifKV@Fbox@shadow\else\shadowsize0pt\fi + \sbox0{\fcolorbox{\Fboxframecolor}{white}{#2}}% + \hskip\shadowsize + \color{\Fboxshadowcolor}% + \rule[-\dp0]{\wd0}{\ht0+\dp0}% + \llap{\raisebox{\shadowsize}% + {\box0\hskip\shadowsize}}}% +} +\Fbox{demo1} +\Fbox[framecolor=blue]{demo2} +\Fbox[shadow=false]{demo3} +\Fbox[framesize=1pt]{demo4} +\Fbox[frame=false,shadow]{demo5} +\end{verbatim} +\newdimen\shadowsize +\define@boolkey{Fbox}{frame}[true]{} +\define@boolkey{Fbox}{shadow}[true]{} +\define@key{Fbox}{framecolor}% + {\def\Fboxframecolor{#1}} +\define@key{Fbox}{shadowcolor}% + {\def\Fboxshadowcolor{#1}} +\define@key{Fbox}{framesize}% + {\setlength\fboxrule{#1}} +\define@key{Fbox}{shadowsize}% + {\setlength\shadowsize{#1}} +\presetkeys{Fbox}% + {frame,framecolor=red,framesize=0.5pt}% + {shadow=\usevalue{frame}, + shadowcolor=\usevalue{framecolor}!40, + shadowsize=\usevalue{framesize}*4} +\savekeys{Fbox}{frame,framecolor,framesize} +\newcommand*\Fbox[2][]{% + \setkeys{Fbox}{#1}% + {\ifKV@Fbox@frame\else\fboxrule0pt\fi + \ifKV@Fbox@shadow\else\shadowsize0pt\fi + \sbox0{\fcolorbox{\Fboxframecolor}{white}{#2}}% + \hskip\shadowsize + \color{\Fboxshadowcolor}% + \rule[-\dp0]{\wd0}{\ht0+\dp0}% + \llap{\raisebox{\shadowsize}% + {\box0\hskip\shadowsize}}}% +} +\Fbox{demo1} +\Fbox[framecolor=blue]{demo2} +\Fbox[shadow=false]{demo3} +\Fbox[framesize=1pt]{demo4} +\Fbox[frame=false,shadow]{demo5} + +\end{document} +\endinput +%% +%% End of file `xkvex2.tex'. diff --git a/Master/texmf-dist/tex/generic/xkeyval/xkvex3.tex b/Master/texmf-dist/tex/generic/xkeyval/xkvex3.tex new file mode 100644 index 00000000000..a21a493e9aa --- /dev/null +++ b/Master/texmf-dist/tex/generic/xkeyval/xkvex3.tex @@ -0,0 +1,93 @@ +%% +%% This is file `xkvex3.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% xkeyval.dtx (with options: `xkvex3') +%% +%% --------------------------------------- +%% Copyright (C) 2004-2014 Hendri Adriaens +%% --------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) 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 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% This Current Maintainer of this work is Hendri Adriaens. +%% +%% This work consists of the file xkeyval.dtx and derived files +%% keyval.tex, xkvtxhdr.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, pst-xkey.tex, pst-xkey.sty, xkveca.cls, xkvecb.cls, +%% xkvesa.sty, xkvesb.sty, xkvesc.sty, xkvex1.tex, xkvex2.tex, +%% xkvex3.tex and xkvex4.tex. +%% +%% The following files constitute the xkeyval bundle and must be +%% distributed as a whole: readme, xkeyval.pdf, keyval.tex, +%% pst-xkey.sty, pst-xkey.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, xkvtxhdr.tex, pst-xkey.dtx and xkeyval.dtx. +%% +%% keyi will set \keyi in xkveca.cls +%% keyvi will set \keyvi in xkveca.cls and xkvesc.sty will pick +%% it up from \documentclass and redefine it +%% IgnoredGlobal and another=key will be considered as global +%% options to be passed on to packages. Not used anymore. +\documentclass[keyi=test1,keyvi,another=key,IgnoredGlobal,10pt]{xkveca} + +%% keyii will set \keyii in xkvesa.sty +%% keyiv will be passed to xkvesb.sty as unknown option +%% the other input will be passed on to xkvesb as well. +\usepackage[keyii=test2,keyiv=test4,test5]{xkvesa} + +%% keyvii will set \keyvii in xkvesc.sty +\usepackage[keyvii]{xkvesc} + +\title{\textsf{xkeyval} package\\\normalsize\emph{Example 3}} +\author{Hendri Adriaens} +\setlength{\parindent}{0cm} + +\makeatletter +\let\@tempa\@classoptionslist +\let\@tempb\@unusedoptionlist + +\begin{document} +\maketitle + +This example demonstrates the use of the new macros for declaring +class and package options of the \textsf{xkeyval} package. Please +study the files \verb+xkvex2.tex+, \verb+xkveca.cls+, +\verb+xkvecb.cls+, \verb+xkvesa.sty+, \verb+xkvesb.sty+ and +\verb+xkvesc.sty+ carefully to understand the output below.\\ + +Set by \verb+xkveca.cls+: \keyi\par +Set by \verb+xkvesa.sty+, copied from \verb+\documentclass+: \keyia\par +Set by \verb+xkvesa.sty+: \keyii\par +Set by \verb+xkvesb.sty+, passed on from \verb+xkvesa.sty+: \keyiii\par +Set by \verb+xkvesb.sty+, passed on as unknown key from \verb+xkvesa.sty+: \keyiv\par +Set by \verb+xkvesb.sty+, passed on as unknown from \verb+xkvesa.sty+: \keyv\par +Set by the class, copied by \verb+xkvesc.sty+: \keyvi\par +Set by \verb+xkvesc.sty+: \keyvii\par +Set by \verb+xkvecb.cls+, passed on from \verb+xkveca.cls+: \keyviii\\ + +The document class is: \XKV@documentclass\par +Unused global options: \@tempb\\ + +Notice the content of the following macros.\par +\verb+\@classoptionslist+: \@tempa\par +\verb+\XKV@classoptionslist+: \XKV@classoptionslist\\ + +This shows that \verb+key=value+ pairs have been deleted from the +class options list so that subsequent packages which are not using +\textsf{xkeyval} and are scanning this list will not run into +problems.\\ + +\end{document} +\endinput +%% +%% End of file `xkvex3.tex'. diff --git a/Master/texmf-dist/tex/generic/xkeyval/xkvex4.tex b/Master/texmf-dist/tex/generic/xkeyval/xkvex4.tex new file mode 100644 index 00000000000..a7cdfc45a6d --- /dev/null +++ b/Master/texmf-dist/tex/generic/xkeyval/xkvex4.tex @@ -0,0 +1,106 @@ +%% +%% This is file `xkvex4.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% xkeyval.dtx (with options: `xkvex4') +%% +%% --------------------------------------- +%% Copyright (C) 2004-2014 Hendri Adriaens +%% --------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) 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 2003/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% This Current Maintainer of this work is Hendri Adriaens. +%% +%% This work consists of the file xkeyval.dtx and derived files +%% keyval.tex, xkvtxhdr.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, pst-xkey.tex, pst-xkey.sty, xkveca.cls, xkvecb.cls, +%% xkvesa.sty, xkvesb.sty, xkvesc.sty, xkvex1.tex, xkvex2.tex, +%% xkvex3.tex and xkvex4.tex. +%% +%% The following files constitute the xkeyval bundle and must be +%% distributed as a whole: readme, xkeyval.pdf, keyval.tex, +%% pst-xkey.sty, pst-xkey.tex, xkeyval.sty, xkeyval.tex, xkvview.sty, +%% xkvltxp.sty, xkvtxhdr.tex, pst-xkey.dtx and xkeyval.dtx. +%% +%% Load LaTeX kernel macros patch +\RequirePackage{xkvltxp} + +%% keyi will set \keyi in xkveca.cls +%% keyvi will set \keyvi in xkveca.cls and xkvesc.sty will pick +%% it up from \documentclass and redefine it +%% IgnoredGlobal and another=key will be considered as global +%% options to be passed on to packages. Not used anymore. +\documentclass[keyi=test1 on page \thepage,keyvi,another=key,IgnoredGlobal,10pt]{xkveca} + +%% keyii will set \keyii in xkvesa.sty +%% keyiv will be passed to xkvesb.sty as unknown option +%% the other input will be passed on to xkvesb as well. +\usepackage[keyii=test2 on page \thepage,keyiv=test4 on page \thepage,test5]{xkvesa} + +%% keyvii will set \keyvii in xkvesc.sty +\usepackage[keyvii]{xkvesc} + +\title{\textsf{xkeyval} package\\\normalsize\emph{Example 4}} +\author{Hendri Adriaens} +\setlength{\parindent}{0cm} + +\makeatletter +\let\@tempa\@classoptionslist +\let\@tempb\@unusedoptionlist +\let\@tempc\XKV@classoptionslist +\@onelevel@sanitize\@tempc + +\begin{document} +\maketitle + +This example demonstrates the use of the new macros for declaring +class and package options of the \textsf{xkeyval} package. Please +study the files \verb+xkvex2.tex+, \verb+xkveca.cls+, +\verb+xkvecb.cls+, \verb+xkvesa.sty+, \verb+xkvesb.sty+ and +\verb+xkvesc.sty+ carefully to understand the output below.\\ + +Set by \verb+xkveca.cls+: \keyi\par +Set by \verb+xkvesa.sty+, copied from \verb+\documentclass+: \keyia\par +Set by \verb+xkvesa.sty+: \keyii\par +Set by \verb+xkvesb.sty+, passed on from \verb+xkvesa.sty+: \keyiii\par +Set by \verb+xkvesb.sty+, passed on as unknown from \verb+xkvesa.sty+: \keyiv\par +Set by \verb+xkvesb.sty+, passed on as unknown from \verb+xkvesa.sty+: \keyv\par +Set by the class, copied by \verb+xkvesc.sty+: \keyvi\par +Set by \verb+xkvesc.sty+: \keyvii\par +Set by \verb+xkvecb.cls+, passed on from \verb+xkveca.cls+: \keyviii\\ + +The document class is: \XKV@documentclass\par +Unused global options: \texttt{\@tempb}\\ + +Notice the content of the following macros.\par +\verb+\@classoptionslist+: \texttt{\@tempa}\par +\verb+\XKV@classoptionslist+:\par\texttt{\@tempc}\\ + +This shows that \verb+key=value+ pairs have been deleted from the +class options list so that subsequent packages which are not using +\textsf{xkeyval} and are scanning this list will not run into +problems.\\ + +\newpage +This page shows that key values are only expanded when they are +actually used. They are not expanded during option processing.\\ + +\keyi\par +\keyii\par +\keyiv + +\end{document} +\endinput +%% +%% End of file `xkvex4.tex'. diff --git a/Master/texmf-dist/tex/generic/xkeyval/xkvtxhdr.tex b/Master/texmf-dist/tex/generic/xkeyval/xkvtxhdr.tex index e535d8bf345..f6933df422b 100644 --- a/Master/texmf-dist/tex/generic/xkeyval/xkvtxhdr.tex +++ b/Master/texmf-dist/tex/generic/xkeyval/xkvtxhdr.tex @@ -7,7 +7,7 @@ %% xkeyval.dtx (with options: `xkvheader') %% %% --------------------------------------- -%% Copyright (C) 2004-2012 Hendri Adriaens +%% Copyright (C) 2004-2014 Hendri Adriaens %% --------------------------------------- %% %% This work may be distributed and/or modified under the -- cgit v1.2.3