1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
% This is file 'keyreader.sty', version 0.1. %
% %
% This package reads multiple keys to be defined by xkeyval.sty. %
% %
% 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 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. %
% %
% Copyright (c) 2009 Ahmed Musa (a.musa@rocketmail.com). %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
\begingroup
\catcode064=11% @
\catcode123=01% {
\catcode125=02% }
\def\x{\endgroup
\edef\kr@restorecodeatend{%
\catcode035=\the\catcode035\relax
\catcode064=\the\catcode064\relax
\catcode123=\the\catcode123\relax
\catcode125=\the\catcode125\relax
}%
}
\x
\catcode035=06% #
\catcode064=11% @
\catcode123=01% {
\catcode125=02% }
\def\kr@ensurecode#1#2{%
\edef\kr@restorecodeatend{%
\kr@restorecodeatend
\catcode#1=\the\catcode#1\relax
}%
\catcode#1=#2\relax
}
\AtEndOfPackage{\kr@restorecodeatend}
\kr@ensurecode{044}{12}% ,
\kr@ensurecode{059}{12}% ;
\kr@ensurecode{038}{03}% &
\ProvidesPackage{keyreader}%
[2009/12/15 v0.1 Read keys for the xkeyval package (AM)]
\NeedsTeXFormat{LaTeX2e}[1996/12/01]
\RequirePackage{xkeyval}[2008/08/13]
\newcommand\kr@warn[1]{\PackageWarningNoLine{keyreader}{#1}}
\newcommand\kr@err[1]{\PackageError{keyreader}{#1}{\@ehc}}
\define@cmdkey[KV]{keyreader}[kr@]{parser}[;]{}
\define@cmdkey[KV]{keyreader}[kr@]{keyprefix}[KV]{}
\define@cmdkey[KV]{keyreader}[kr@]{keyfamily}[fam]{}
\define@cmdkey[KV]{keyreader}[kr@]{macroprefix}[mp@]{}
\DeclareOptionX*{\kr@warn{Unknown option '\CurrentOption' ignored}}
\ExecuteOptionsX[KV]<keyreader>{parser,keyprefix,keyfamily,macroprefix}
\ProcessOptionsX*[KV]<keyreader>\relax
\@ifdefinable\krsetup{%
\def\krsetup#1{\setkeys[KV]{keyreader}{#1}}%
}
\long\def\ifblank#1{\kr@ifblank#1&&\@secondoftwo\@firstoftwo:}
\long\def\kr@ifblank#1#2#4#5:{#4}
\@ifdefinable\stopread{%
\long\def\stopread#1&{\long\def\kr@remainder{#1}}%
}
\def\kr@allist{}
\gdef\kr@define@key#1,#2,#3,#4&{%
\edef\kr@keytype{#1}%
\edef\kr@key{#2}%
\edef\kr@default{#3}%
\def\kr@func{#4}%
\ifcase\number\kr@keytype\relax
\or
\edef\x{\noexpand\define@key[\kr@keyprefix]{\kr@keyfamily}%
{\kr@key}[\kr@default]{\expandafter\noexpand\kr@func}%
}\x
\or
\edef\x{\noexpand\define@cmdkey[\kr@keyprefix]{\kr@keyfamily}%
[\kr@macroprefix]{\kr@key}[\kr@default]{\expandafter\noexpand\kr@func}%
}\x
\or
\edef\x{\noexpand\define@boolkey[\kr@keyprefix]{\kr@keyfamily}%
[\kr@macroprefix]{\kr@key}[\kr@default]{\expandafter\noexpand\kr@func}%
}\x
\or
\ifx\kr@allist\@empty
\kr@err{'\string\kr@allist' is empty: choicekey can't be defined.
\MessageBreak You need to first define '\string\kr@allist'
\MessageBreak as a nonempty set}%
\fi
\edef\x{\noexpand\define@choicekey*[\kr@keyprefix]{\kr@keyfamily}{\kr@key}%
[\noexpand\kr@val\noexpand\kr@nr]{\kr@allist}[\kr@default]%
{\expandafter\noexpand\kr@func}%
}\x
\else
\kr@err{Unknown key type/identifier '\kr@keytype'}%
\fi
}
\newcount\kr@cnta
\newcommand\define@keylist[1]{%
\kr@cnta=\z@\relax\romannumeral-`\q\expandafter\kr@readlist#1;&}
\expandafter\def\expandafter\kr@readlist\expandafter#\expandafter 1\kr@parser#2&{%
\ifblank{#1}{}{%
\ifx#1\stopread\stopread#2&\kr@cnta=1\relax\else\kr@define@key#1&\fi
}%
\ifnum\kr@cnta=\z@\ifblank{#2}{}{\kr@readlist#2&}\fi
}
\endinput
|