From fee6ae63b6689ddbae970ff9114c6ed976bf1dab Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 13 Feb 2013 00:03:06 +0000 Subject: skeyval (12feb13) git-svn-id: svn://tug.org/texlive/trunk@29092 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/skeyval/README | 445 +++++++++++++++++++-- .../doc/latex/skeyval/skeyval-pokayoke1.pdf | Bin 126238 -> 126258 bytes .../doc/latex/skeyval/skeyval-pokayoke1.tex | 166 ++++++-- .../doc/latex/skeyval/skeyval-pokayoke2.pdf | Bin 136342 -> 136229 bytes .../doc/latex/skeyval/skeyval-pokayoke2.tex | 68 +++- .../doc/latex/skeyval/skeyval-testclass.cls | 51 +-- .../doc/latex/skeyval/skeyval-testpkg.sty | 61 ++- .../doc/latex/skeyval/skeyval-view-pokayoke1.pdf | Bin 107744 -> 0 bytes .../doc/latex/skeyval/skeyval-view-pokayoke1.tex | 139 ------- 9 files changed, 666 insertions(+), 264 deletions(-) delete mode 100644 Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf delete mode 100644 Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex (limited to 'Master/texmf-dist/doc/latex/skeyval') diff --git a/Master/texmf-dist/doc/latex/skeyval/README b/Master/texmf-dist/doc/latex/skeyval/README index 5a43e018146..00977c54e35 100644 --- a/Master/texmf-dist/doc/latex/skeyval/README +++ b/Master/texmf-dist/doc/latex/skeyval/README @@ -6,7 +6,7 @@ Ahmed Musa VERSION -Version 1.1a, October 16, 2012. +Version 1.2, February 10, 2013. LOCATION ON CTAN @@ -14,7 +14,7 @@ macros/latex/contrib/skeyval LICENSE -Copyright (c) 2010-2012 Ahmed Musa +Copyright (c) 2010-2013 Ahmed Musa This software is author-maintained. Permission is granted to copy, distribute and/or modify this software under the terms of the @@ -60,19 +60,18 @@ The 's' in skeyval means 'skeleton keys' or 'master keys'. The skeyval package provides commands for compactly defining and initializing all types of key (ordinary, command, boolean, style, choice, -etc). It attempts to combine the features of ltxkeys package (which has -the syntax of the xkeyval package) and pgfkeys package. One of the powers -of pgfkeys package lies in its use of handlers. But the way handlers -are used in pgfkeys package does add to computational complexity and -overheads. Family or key filtering in pgfkeys is particularly complex -and inefficient. Nesting of family or key filtering is, in particular, -not recommended. +etc). It attempts to combine the features of xkeyval package and +pgfkeys package. One of the powers of pgfkeys package lies in its use +of handlers. But the way handlers are used in pgfkeys package does add +to computational complexity and overheads. Family or key filtering in +pgfkeys is particularly complex and inefficient. Nesting of family or +key filtering is, in particular, not recommended. In pgfkeys package, handlers come at the end of the key name, so that if a key isn't defined, the system tests to find if the key has a handler at its end. If a handler is found and defined, the handler's callback (called 'code' by pgfkeys package) is executed on the -current path. +current path. The required search overhead isn't insignificant. The skeyval package puts handlers at the beginning of the key (or a set of keys) and uses the handler to process the key (or a set @@ -81,12 +80,58 @@ complexity. Key processing, including filtering, can be nested naturally and efficiently. The skeyval package also maintains and, in fact, greatly extends the -functionality and syntaxes of the ltxkeys package. Very few examples -of the functionality of skeyval package are +functionality and syntaxes of the xkeyval and ltxkeys packages. -** The callbacks of keys can be readily modified using commands - like \skvaddtocallback, \skvprependtocallback, \skvappendtocallback, - or the handlers .prepend code, .append code, .add code. +Some of the features of skeyval vs. xkeyval are as follows. All the +features listed below could be incorporated in xkeyval package but +at a great expense. + +* xkeyval's use of the rather expensive selective sanitization + scheme of Uwe Kern; + +* xkeyval strips three levels of outer braces in the values of keys; + +* the impossibility of parsing unbalanced conditionals in key values + while using xkeyval; + +* xkeyval requires a large payload for defining many keys in the + same family; + +* when using xkeyval, existing keys could be easily overridden + (there is nothing like \newcommand functionality); + +* key macros, once defined by xkeyval, are difficult to modify/patch; + +* key macros defined by xkeyval can't accept more than one argument; + +* xkeyval provides no machinery for deploying style (subject/observer) + keys; + +* xkeyval offers no direct tools for key-commands and key-environments; + +* xkeyval can't be loaded before \documentclass (eg, in the past the + fontspec package needed this feature); + +* skeyval offers 'list processor keys' (called 'listkeys'). + + +Very few examples of the functionality of skeyval package are given in +the following. + +** Ordinary, command/store, boolean, toggle, and choice keys can be + defined and set. For example, + + \skvordkeys[KV]{fam}{key1,key2}[default value]{% + \def\testcmd##1##2{#1+##1+##2}% + } + \skvoptionkeys[KV]{fam}{key1} + \skvnonoptionkeys[KV]{fam}{key2} + + \skvchoicekeys[KV]{fam}[mp@]{key1,key2}[\val\nr]{% + center.do=\def\vala{#1}, + right.do=\def\valb{#1}, + left.do=\def\valc{#1} + }[center]{\def\x##1{#1*##1}} ** Apart from the usual keys in xkeyval and ltxkeys packages, it is now possible to define a rather weird key like @@ -112,6 +157,40 @@ of the functionality of skeyval package are evaluate (\x) as (\pgfmathresult) using (\pgfmathparse{\x^10}) } +** Default prefix can be set by + + \skvsetdefaultprefix{} + + For a fixed prefix, this can be used to avoid repeated entry of the + key prefix in many of the commands of the skeyval package. Note, + however, that the first '[]' in + + \skvordkey[KV]{fam}{key1}[deafult value]{} + + still can't be used for any other thing than the key prefix. + + With + + \skvsetdefaultprefix{myprefix} + + we can do + + \skvordkey{fam}{key1}[deafult1]{} + \skvcmdkey{fam}[mp@]{key2}[deafultx,defaulty]{% + \def\cmd##1{#1+#2+##1}% + } + \skvassignargs{fam}[.expanded]{key2}{#1,#2} + + and much later + + \def\valuex{valuex} + \def\valuey{valuey} + \skvsetkeys[myprefix]{fam}{key1=value1,key2={\valuex,\valuey}} + +** The callbacks of keys can be readily modified using commands + like \skvaddtocallback, \skvprependtocallback, \skvappendtocallback, + or the handlers .prepend code, .append code, .add code. + ** Handlers The skeyval package has many handlers. The handlers of @@ -126,7 +205,7 @@ of the functionality of skeyval package are introduced. \skvappendstyles[KV]{fam}{key1,key2}{keya=.expanded{\vala},keyb=valb} - [defaultof 1&2]{\def\y##1{#1*##1}} + [default of key1&2]{\def\y##1{#1*##1}} Here the subjects are key1 and key2, while the observers are keya and keyb. For now, the only thing the subject does is to set the given values @@ -146,12 +225,13 @@ of the functionality of skeyval package are \skvassignargs[KV1,KV2]{fam1,fam2}[x1]{keya,keyb}{#1/#2} \skvsetkeys[KV1]{fam2}{keya=vala/valb} - 'x1' here means expand argument once at setting keys. + 'x1' here means 'expand argument once at setting keys'. + +** \directkeys command: \directkeys{% .exec code=\def\avalue{a+b}, - .prefixes={KV1,KV2}, - .families={fam1,fam2}, + .paths={KV1/fam1,KV1/fam2,KV2/fam1,KV2/fam2}, .holder prefix=mp@, .initialize keys after define, .define keys={ @@ -175,7 +255,7 @@ of the functionality of skeyval package are \directkeys{ .default prefix=KV, % The prefix for 'famx' will be 'KV'. - .paths={KV3/fam3,famx}, + .paths={KV3/fam3,KV3/famx}, .new keys={ .initialize keys after define=false, .ord/keya/defa/\def\ya##1{#1*##1*#2}, @@ -207,7 +287,7 @@ of the functionality of skeyval package are .prepend code={ keyb=\def\pre##1{#1+##1}, }, - .styles{ + .slots{ key1/keya=value1, key2/keyb=value2 }, @@ -219,6 +299,26 @@ of the functionality of skeyval package are }, } +** Handlers and letting handlers + + The skeyval has many handlers and many tools for creating handlers. + A full listing of handlers and their meaning will be provided in + the user manual. + + .define handlers, .define handler + .new handlers, .new handler + .new reserved handlers, .new reserved handler, + .define reserved handlers, .define reserved handler + .define narg handler,.define narg handlers + .new narg handler,.new narg handlers + .new reserved narg handler,.new reserved narg handlers, + .define reserved narg handler,.define reserved narg handlers + .handlers let, .handler let + .handlers let*, .handler let*, .force handler let + .handlers let reserved, .handler let reserved + .reserve handlers + + ** Prepending and appending to key names and callbacks at definition time: @@ -237,16 +337,15 @@ of the functionality of skeyval package are ** Several new features are introduced by the skeyval package. For - example, we now have 'style' and 'link' keys in the context of - ltxkeys syntax. For example, to link keys via .link or .style - handler: + example, we now have 'slot' and 'link' keys. For example, to link + keys via .link or .slot handler, we can do: \directkeys{% .link={key1, key2}/keya, .link={key3, key4}/{keya, keyb}, - .append style expand twice={key3, key4}/keyf=\valuea, - .prepend style expanded={key5, key6}/{keyc=#1, keyd=#1}, - .prepend style={key7, key8}/{keyd=#1, keye=#1}, + .append slot expand twice={key3, key4}/keyf=\valuea, + .prepend slot expanded={key5, key6}/{keyc=#1, keyd=#1}, + .prepend slot={key7, key8}/{keyd=#1, keye=#1}, .allowed values expanded=keye/{ center.do=\def\curralign##1{\hfil##1\hfil}, right.do=\def\curralign##1{\hfill##1}, @@ -314,8 +413,12 @@ of the functionality of skeyval package are ** Keys can be 'made', as in \skvmakekeys[ - .prefix=KVA, .families={fam1,fam2}, .holder prefix=mp@, - .all are new, .define in all families, .initialize after define + .prefix=KVA, + .families={fam1,fam2}, + .holder prefix=mp@, + .all are new, + .define in all families, + .initialize after define ]{% .ord/{keya,keyb}/{default-a}, .arg/keyb/{#1+#2}, @@ -360,7 +463,7 @@ of the functionality of skeyval package are \fi } \newcommand*\drawcoloredarrows[1]{% - \foreacfox {#1}{% + \foreachfox {#1}{% \draw[\usecolor{##1},-stealth] (0,-##1)--(2,-##1); } } @@ -370,7 +473,184 @@ of the functionality of skeyval package are \end{tikzpicture} \end{document} -** Keys defined in families can be viewed in files using the package +** Arguments of keys: + + Argument of keys can be prescribed + + 1. Within the key's callback by using the pointers + + .arg, .arg unexpanded, .arg expand once, .arg expand twice, + .arg expanded. + + Example: + + \def\somemethod#1#2{% + \begingroup + \color{#1}% + Using \ifskvnovalue default\else user \fi value of `\skvcurrentkey'. + \endgraf + Argument-2 of key: #2% + \endgroup + } + % Test arguments given inside the callback: + \skvcmdkeys[KV]{fam}{keya}[red/default]{% + .arg expanded{#1/#2}% + \somemethod{#1}{#2}% + } + \begin{document} + \def\aval{blue/Some stuff} + \skvsetkeys[KV]{fam}{keya=\aval} + \end{document} + + 2. By calling the command \skvassignargs. + + 3. By using the following handlers within \directkeys or within + \skvdefinekeys + + .arg, .arg unexpanded, .arg expand once, .arg expand twice, + .arg expanded + + +** Listkeys + + List processor keys. The key's value is considered a csv list + and each of its element is used as the argument of the key's callback. + The user of a listkey doesn't have to define his own list processor, + or define one key for each list item. The list separator can be + arbitrary; it can be specified in the key's callback as the + argument of the dummy commands \listsep and \listparser. The default + list separator is comma (,). + + \makeatletter + \def\somemethod#1#2{% + \begingroup + \color{#1}% + \ifskvnovalue + \ifnum\skvlistcount=\@ne + \endgraf + Using default value of `\skvcurrentkey': + \fi + \else + \ifnum\skvlistcount=\@ne + \endgraf + Using user value of `\skvcurrentkey': + \fi + \fi + \endgroup + \endgraf + Processing item no. \skvlistcount: #2% + } + + % Use comma (,), the default list separator, as the list + % separator for keya and keyb: + \skvlistkeys[KV]{fam}{keya,keyb}[default1,default2]{% + \somemethod{blue}{#1}% + % Process only four (4) items of the list/value for keya and keyb: + \ifnum\skvlistcount=4\relax + \skvstopprocessinglistkey + \fi + } + %\skvshowcs{KV/fam/keya.@cbk} + + % Use semicolon (;) as the list separator for keyc and keyd: + \skvlistkeys[KV]{fam}{keyc,keyd}[default1;default2]{% + % The next line gives error, as expected, since a list key + % can't have an assigned argument that isn't simple. + % .arg{#1,#2}% + \listsep{;}\somemethod{red}{#1}% + } + \makeatother + + \begin{document} + \parindent0pt + % No values for keya and keyb; use their default values: + \skvsetkeys[KV]{fam}{keya,keyb} + \par\bigskip + \skvsetkeys[KV]{fam}{% + keya={item1A,item1B,item1C,item1D,item1E,item1F}, + keyb={item2A,item2B,item2C,item2D,item2E,item2F} + } + \par\bigskip + % Set keyc and keyd with their default values: + \skvsetkeys[KV]{fam}{keyc,keyd} + \par\bigskip + \skvsetkeys[KV]{fam}{% + keyc={item1A;item1B;item1C;item1D}, + keyd={item2A;item2B;item2C;item2D} + } + \end{document} + +** Make any key a listkeys at key-setting time + + You can use the pointers '.process list' on any key's value at + key-setting time to temporarily turn that key into a listkey. + Its current value will be processed as a list, ie, the key's + callback will be applied to every element of the current value. + This scheme is costlier than defining the key as a listkey, + using \skvlistkey, but it is more versatile. This allows any + key to accept and process a value that is a list, irrespective + of its argument pattern. + + Example 1: + + \skvordkeys[KV]{fam}{key1,key2}[default]{\def\xx##1{##1*#1}} + \skvsetkeys[KV]{fam}{% + key1=val1,key2=.process list{val2a,val2b} + } + + Example 2: + + \skvordkeys[KV]{fam}{key1,key2}[default]{% + .arg expanded{#1/#2}% + \def\x##1{##1*#1*#2}% + } + \def\aval{val1a/val1b} + \def\bval{val2a/val2b,val2c/val2d} + \skvsetkeys[KV]{fam}{% + % Because of '.arg expanded' in the key's callback, \aval + % will be expanded at setting keys: + key1=\aval, + % \bval will be expanded before its content is processed + % as a list. Because of '.arg expanded' in the key's callback, + % each element in \bval will be expanded at setting keys: + key2=.expand once process list{\bval} + } + + Example 3: + + \skvordkeys[KV]{fam}{key1}[default]{\def\x##1{##1*#1}} + \def\aval{val1a,val1b,val1c,val1d} + \def\bval{\aval} + \def\cval{\bval} + \skvsetkeys[KV]{fam}{% + key1=.expand once process list{\aval}, + key1=.expand twice process list{\bval}, + key1=.expand process list{\cval} + } + + +** Disabling keys: + + Message type to be issued when a disabled key is called: + + \skvmessagetypefordisabledkey{} + + can be 'warning', 'error', or 'nothing'. The default is + 'warning'. + + The key(s) may be disabled long before \skvmessagetypefordisabledkey + is called. + + Disabling keys locally: + + \skvdisablekeys[]{}{} + + Disabling keys globally: + + \skvgdisablekeys[]{}{} + + +** Keys defined in families can be 'viewed' in files using the package 'skeyval-view'. The functionality of 'skeyval-view' is greater than that of xkeyval-view package. @@ -383,5 +663,106 @@ of the functionality of skeyval package are module. It is a generalization of PGF's \foreach macro for arbitrary parsers and list separators, including active parsers. +** For a package 'foobar', you can access its options by + + \csname opt@foobar.sty\endcsname + + To get the options that were actually found/defined and instantiated + during the processing of options, the skeyval package offers + \skvpackagelist and '.poxkeys' (processed options). + + If 'option1' and 'option2' (but not 'option3') are recognized + options of foobar.sty, then after + + \usepackage[option1,option2,option3]{foobar} + + you can issue + + \show\skvpackagelist -> foobar.sty{option1,option2} + + \expandafter\show\csname foobar.sty.poxkeys\endcsname + -> option1, option2 + +** Key filtering + + The handlers for key filtering are + + .prefix, .change prefix, .family, .change family, .families, + .change families, .add family, .add families, .ignore family, + .ignore families, .restore family, .restore families, .paths, + .change path, .change paths, .add paths, .ignore paths, .restore paths, + .ignore keys, .restore keys + + \newcommand{\storecontent}{} + \newcommand{\usecontent}{% + \ifx\storecontent\@empty + \@@warning{\noexpand\storecontent is empty}% + \else + \storecontent + \fi + } + \directkeys{% + % Define keys in two families: + .families={family1,family2}, + .define ordinary keys={ + store//\skvappendtomacro\storecontent{#1}, + remove//\skvpatchcmd\storecontent{#1}{}{}{ + \@@warning{No token '\detokenize{#1}' in command \string\storecontent} + } + } + } + \def\savpar{\par} + \def\bigvskip{\par\bigskip} + \def\showfam{Family: \skvcurrentfamily\savpar} + + \begin{document} + \directkeys{% + % Set keys in only family1: + .family=family1, + .set keys={ + store={\showfam first test\bigvskip}, + store={\showfam second test\bigvskip} + }, + .exec code=\usecontent{\color{red}\savpar\hrule\bigvskip}, + % Set keys in only family2: + .family=family2, + .set keys={ + remove={\showfam first test\bigvskip}, + remove={\showfam second test\bigvskip}, + store={\showfam third test\bigvskip}, + store={\showfam fourth test\bigvskip} + }, + .exec code=\usecontent + } + \end{document} + +** Inheritance of keys + + There are \skvkeyslet with the syntax + + \skvkeyslet[]{}{} + -> {,,...,}={} + + and the handler .inherit. + + \directkeys{ + .prefix=KV, + .family=fam, + .define ordinary keys={ + key1/def1/\def\cmd##1{#1*##1}, + key2/def2 + }, + .inherit={ + {key3,key4}={key1}, + } + } + \skvshowcs{KV/fam/key3.@cbk} + +** Defining and setting keys on fixed prefix and family + + \skvsetprefix{KV} + \skvsetfamily{fam} + \skvdefineordkey{key1}[def1]{\def\cmd##1{#1*##1}} + \skvprocesskeys{key1=value1} -% End of readme file \ No newline at end of file +% End of readme file of skeyval package. diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf index aad9d8e117d..b38b077fa0a 100644 Binary files a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf and b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.pdf differ diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex index 2be16f1aa95..ed79d37585d 100644 --- a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex +++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke1.tex @@ -12,12 +12,9 @@ watermarkcolor=brown!80!yellow ]{skeyval-testclass} -%\show\@unusedoptionlist - -\skvifpackageloaded{xcolor}{}{\usepackage[dvipsname]{xcolor}} +\skvifpackageloadedTF{xcolor}{}{\usepackage[dvipsname]{xcolor}} \usepackage{lipsum} - % The command \cmdalign is just for illustrating how key values % may be expanded at key setting time: \def\cmdalign{justified} @@ -29,14 +26,18 @@ unknown-option, ]{skeyval-testpkg} -% Keys whose names are zapped internally: -\skvzcmdkeys[KV]{fam}[mp@]{provide value,give value}[true]{} +%+++++++++++ Keys whose names are zapped internally ++++++++++++++% + +\skvzcmdkeys[KV]{fam}[mp@]{provide value,give value}[some value]{} \skvzboolkeys[KV]{fam}[mp@]{provide value,give value}[true]{} -% Parenthesized keys are keys with names that have parentheses. +%++++++++++++++++++++++ Parenthesized keys +++++++++++++++++++++++% + +% Parenthesized keys are keys with names that have parentheses % The following is a key of 3 arguments. The default values are -% \x, \y, and \numexpr\x*2. -\skvpntkey[KV]{fam}{evaluate (?) as (?) using (?)}[\x\y{\numexpr\x*2}]{% +% \x, \y, and \numexpr\x*2 - since there are 3 arguments. +% +\skvpntkey[KV]{fam}{evaluate (?) as (?) using (?)}[{\x}{\y}{\numexpr\x*2}]{% \def\argone{#1}\def\argtwo{#2}\def\argthree{#3}% % '\detokenize{\pgfmath}' won't work here! \skvxifinTF{\relax\string\pgfmath}{\relax\detokenize{#3}}{% @@ -47,6 +48,7 @@ } % The above parenthesized key can be set as follows: +% \def\cmda{2} \skvsetkeys[KV]{fam}{% evaluate (\cmda) as (\cmdb) using (\pgfmathsetmacro\cmdb{\cmda*10}) @@ -56,29 +58,40 @@ \newcommand*\vgap{\endgraf\medskip} \def\keycval{xx} -%% +++++++++++++++ Examples of using \directkeys command +++++++++ %% +%% +++++++++++++++ Examples of using \directkeys command ++++++++++% % Note: When the value of a handler contains equality sign (=) or % comma (,), it should be enclosed in braces. +\directkeys*{% + % Defining new handlers that can't be overloaded: + .new reserved handlers={ + {.x handler,.x handlers}={ + \dirkeys@defhandlers{00}{#1} + }, + } +} + \directkeys*{ .exec=\skvtestcnt\z@, .prefix = KV1, .family = fam1, .holder prefix = mp@, .add paths={KV2/fam2,KV3/fam3}, - .ignore roots={KV2/fam2,KV3/fam3}, - .restore roots={KV2/fam2,KV3/fam3}, + .ignore paths={KV2/fam2,KV3/fam3}, + .restore paths={KV2/fam2,KV3/fam3}, .save initial values of keys, .initialize keys after define=false, .new keys = { .ord/keya/{dfta,dftb}/ + %\def\skvhp{my@} \def\cmda##1{#1*##1*#2}\logsetting - , + , .arg/keya/{#1,#2}, + % See argument of keyb below: .cmd/keyb/{1cm,2cm}/ \edef\boxht{\the\dimexpr#1*2\relax} - \edef\boxwd{\the\dimexpr#1*10\relax}, + \edef\boxwd{\the\dimexpr#2*2\relax}, .choice/keyc/center/{right,left,center,justified}, .bool/keyd/true, .cmd/keye/dfte/\def\cmde##1{##1#1}, @@ -102,66 +115,77 @@ .restore keys = keye, .link={keye2/keye}, % Choices for keye can be declared directly: - .estate pattern={keye,keye2}/{ + .state pattern expanded={keye,keye2}/{ center.do=\def\curralign##1{\hfil##1\hfil}, right.do=\def\curralign##1{\hfill##1}, left.do=\def\curralign##1{##1\hfill}, justified.do=\let\curralign\@iden }, - .exec code ={ + .exec code={ \def\leftval{left}\def\rightval{right} \def\rrightval{\rightval} }, % key1 and key2 are undefined. They will be defined internally % with the default values of keyc and keyd: - .prepend style={ + .prepend slots={ key1/{keyc=.expanded{\rightval}},key2/{keyd=false} }, - .append style={ + .append slots={ key1/{keye=right,keyf=valf} }, % When key3 and key4 are set, use their expanded values to set keye: .elink={ {key3,key4}/keye }, - .style expand twice={ + .slot expand twice={ key5/{keyf=#1,keyg=#1} }, .set keys={ key3=.expand once{\leftval}, key5=.expand twice{\rrightval} }, - .prepend link={ - {key6,key7}/{keye,keyf},{key8,key9}/{keye,keyg} + .prepend links={ + {key6,key7}/{keye,keyf}, + {key8,key9}/{keye,keyg} }, .exec code=\skvsetkeys[KV1]{fam1}{key6=center}, % Set keya and keyb on previously declared and the following paths. % Enter known keys in \mysuccesslist. Try 14 families; stop when % 12 families have been hit (ie, keys have been set in them % successfully): + .exec code=\def\flukepaths{}, .search also set keys={ - .add prefixes={KV3,KV4}, - .add families={fam3,fam4}, + .paths={KX/famx,KV1/fam1,KV3/fam3,KV3/fam4,KV4/fam3,KV4/fam4}, + .ignore keys={keyc}, .try=14, - .upper goal=12, + .min success=10, + .max success=12, .success list=\mysuccesslist, - .kv={keya={val1,val2},keyb={1cm,2cm}} + .if any path fails={% + \edef\flukepaths{\skvaddlist,\flukepaths\skvcurrentpath} + }, + .if hits less than goal={\skvsetkeys[KV1]{fam1}{keyc=center}}, + .kv={keya={val1,val2},keyb={1cm,2cm},keyc} }, % .exec code={\show\mysuccesslist}, \directkeys*{ .exec=\skvtestcnt\z@\def\mysuccesslist{}, - .paths={KUA/fam1,KUB/fam2}, - .define keys={ - .ord/{keya,keyb,keyc}/.na/ + .paths={KUA/fam1,KUA/fam2,KUB/fam1,KUB/fam2}, + .define ordinary keys={ + {keya,keyb,keyc}/.na/ \def\y##1{#1*##1} \typeout{***}\logsetting + \skvsetkeys[KV1]{fam1}{keyc=center} , } }, % '.try set keys' works independent of previously declared paths: .try set keys={ - .prefixes={KUA,KUB,KUC}, - .families={fam1,fam2,fam3,fam4}, + .paths={ + KUA/fam1,KUA/fam2,KUA/fam3,KUA/fam4, + KUB/fam1,KUB/fam2,KUB/fam3,KUB/fam4, + KUC/fam1,KUC/fam2,KUC/fam3,KUC/fam4 + }, .try=8, .upper goal=4, .lower goal=2, @@ -169,10 +193,10 @@ .success list=\mysuccesslist, .kv={keya=vala,keyb=valb,keyc=valc} }, -% .exec code={\show\mysuccesslist}, +%.exec code={\show\mysuccesslist}, } -\dirkeys*{ +\directkeys*{ .exec=\skvtestcnt\z@\def\mysuccesslist{}, .paths={KUA/fam1,KUB/fam2}, .hp=mp@, @@ -184,18 +208,17 @@ % keya has no default but has a complex callback: .ord/keya/.na/{ \skvtestcnt\z@\def\mysuccesslistb{} - \dirkeys{ + \directkeys{ .path={KVX/famx}, - .sa set keys={% - .prefixes={KUA,KUB}, - .families={fam1,fam2}, + .search also set keys={% + .paths={KUA/fam1,KUA/fam2,KUB/fam1,KUB/fam2}, .try=8, .upper goal=4, .lower goal=1, .success list=\mysuccesslistb, .kv={keyb=valb} }, -% .exec code=\show\mysuccesslistb, +% .exec code=\show\mysuccesslistb, } } , @@ -211,8 +234,10 @@ }/.na/\@@warning{Invalid value '\detokenize{#1}' for keye2}, }, .try set keys={% - .prefixes={KUA,KUB}, - .families={fam1,fam2,fam3,fam4}, + .paths={ + KUA/fam1,KUA/fam2,KUA/fam3,KUA/fam4, + KUB/fam1,KUB/fam2,KUB/fam3,KUB/fam4 + }, .try=1, .upper goal=1, .lower goal=1, @@ -226,7 +251,6 @@ \makeatother \begin{document} - \title{The \texttt{\textcolor{blue}{skeyval}} Package\\[1ex] Version 1.1a\\[1ex] \textsf{Test document 1}} @@ -251,7 +275,6 @@ return to their own country. \hfill{\small Hieronymus Hornschuch (1608)}\endgraf \end{\mpfalign} - \begingroup \par\bigskip \noindent @@ -356,10 +379,21 @@ on their deeds. \lipsum[1] \end{collectbody} - \end{document} +%%+++++++++++++++++++++ Assigning arguments to keys +++++++++++++++++%% + +\skvsetdefaultprefix{myprefix} +\skvordkey{fam}{key1}[deafult1]{} +\skvcmdkey{fam}[mp@]{key2}[deafultx,defaulty]{% + \def\cmd##1{#1+#2+##1}% +} +\skvassignargs{fam}[.expanded]{key2}{#1,#2} +\def\valuex{valuex} +\def\valuey{valuey} +\skvsetkeys[myprefix]{fam}{key1=value1,key2={\valuex,\valuey}} + %%+++++++++++++++++++++ Examples of \skvmakekeys +++++++++++++++++++%% \skvmakekeys[ @@ -481,6 +515,52 @@ on their deeds. } \makeatother -% End of file skeyval-pokayoke1.tex +%++++++++++++++++++++++++ \ifcases ++++++++++++++++++++++++++++++% +\skvifcases b\then + case{a}{\def\x{do a}} + case{b}{\def\x{do b}} + case{c}{\def\x{do c}} + % default{\def\x{no match}} +\fi +\skvifcasse{x} + case{a}{\def\x{do a}} + case{b}{\def\x{do b}} + case{c}{\def\x{do c}} +\elsedo + \def\x{no match} +\endif + +\skvifcasse{x} + case{a}{\def\x{do a}} + case{b}{\def\x{do b}} + case{c}{\def\x{do c}} +%\elsedo +% \def\x{no match} +\endif + +%++++++++++++ Processing a key's value as a comma list +++++++++++% + +\skvordkeys[KV]{fam}{key1,key2}[default]{% + .arg{#1/#2}% + \def\x##1{##1*#1*#2}% +} +\def\aval{val1a/val1b} +\def\bval{val2a/val2b,val2c/val2d} +\skvsetkeys[KV]{fam}{% + key1=\aval, + key2=.eprocess list{\bval} +} + +\skvordkeys[KV]{fam}{key1}[default]{\def\x##1{##1*#1}} +\def\aval{val1a,val1b,val1c,val1d} +\def\bval{\aval} +\def\cval{\bval} +\skvsetkeys[KV]{fam}{% + key1=.expand once process list{\aval}, + key1=.expand twice process list{\bval}, + key1=.expand process list{\cval} +} + +% End of file skeyval-pokayoke1.tex diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf index 7e995aab364..8f1cda84161 100644 Binary files a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf and b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.pdf differ diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex index 57195061611..b720169ebbe 100644 --- a/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex +++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-pokayoke2.tex @@ -1,8 +1,6 @@ \documentclass[ insertwatermark,watermarkcolor=blue!55, - firstpagenumber=2, - maketitlepage, - unknown-key + firstpagenumber=2,maketitlepage,unknown-option ]{skeyval-testclass} \setupskvtestclass{% @@ -88,7 +86,7 @@ count in=\xc all \x satisfying \ifnum\x>5\fi ] in \alist { \newforeach[ - parser={;}, + parser={;}, subparser=:, evaluate=\y as \ye using \numexpr\y*10 ] \y:\z in {1:red; 2:green; 3:blue; 4:brown; 5:purple} do { @@ -103,4 +101,64 @@ \end{document} -% End of file skeyval-pokayoke2.tex \ No newline at end of file + +%++ Pokayoke for \skvsetdirectkeysparser and \skvsetdefinekeysparser ++% + +\usepackage{tikz} +\usetikzlibrary{shapes.geometric} +\makeatletter +\skvsetdirectkeysparser{;} +\skvsetdefinekeysparser{;} +\directkeys*{ + .family=graph; + .holder prefix=cvt@; + .initialize keys after define; + .define keys={ + .ord/num vertices,number of vertices,vertices/6/ + \skvensureinteger{vertices}{#1} + \def\cvt@vertices{#1} + ; + .ord/radius,circle radius/2/\def\cvt@radius{#1}; + .cmd/x,y/0 + }; + .preset keys={vertices,radius,x,y} +} +\newcommand*\drawgraph[1][]{% + \directkeys{ + .family=graph; + .set keys={#1} + } + \pgfmathsetmacro\halfcircleradius{\cvt@radius/2} + \draw[blue] (\cvt@x,\cvt@y) circle (\halfcircleradius cm) + node [regular polygon, regular polygon sides=\cvt@vertices, + minimum size=\cvt@radius cm, draw=none, name={vertex set}]{}; + \foreach \x in {1,...,\cvt@vertices}{ + \node[draw,circle,inner sep=1pt,blue,fill=blue] at (vertex set.corner \x){}; + } + \foreach \x in {1,...,\cvt@vertices}{ + \foreach \y in {\x,...,\cvt@vertices}{ + \draw[ultra thin, red] (vertex set.corner \x)--(vertex set.corner \y); + } + } +} +\makeatother +\begin{document} +\begin{tikzpicture} +\drawgraph[number of vertices=6, circle radius=3, x=0, y=0] +\drawgraph[number of vertices=8, circle radius=3, x=4, y=0] +\end{tikzpicture} +\par\bigskip +\begin{tikzpicture} +% Use default values of positions: +\drawgraph[vertices=8, radius=3] +% Use default values of vertices and radius: +\drawgraph[x=4, y=0] +\end{tikzpicture} +\par\bigskip +\begin{tikzpicture} +% Use default values of all keys: +\drawgraph +\end{tikzpicture} +\end{document} + +% End of file skeyval-pokayoke2.tex diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls b/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls index c81c535c0ef..ecb846dc99b 100644 --- a/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls +++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-testclass.cls @@ -1,5 +1,5 @@ %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% -% This is file 'skeyval-testclass.cls', version 1.1a, 2012/10/16. % +% This is file 'skeyval-testclass.cls', version 1.2, 2013/02/10. % % % % This package and accompanying files may be distributed and/or % % modified under the conditions of the LaTeX Project Public License, % @@ -23,11 +23,10 @@ % skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, % % and skeyval-testpkg.sty. % % % -% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). % +% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). % %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% -\ProvidesClass{skeyval-testclass} - [2012/10/16 v1.1a skeyval test class (AM)] +\ProvidesClass{skeyval-testclass}[2013/02/10 v1.2 skeyval test class (AM)] \NeedsTeXFormat{LaTeX2e}[2011/06/27] \@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}} \@ifpackageloaded{xcolor}{}{\RequirePackage{xcolor}} @@ -80,9 +79,7 @@ \skvnewlet\skv@sav@footnote\footnote \skvnewlet\skv@sav@thanks\thanks \AtEndOfPackage{% - \skvdisablekeys[SKVC]{title}{% - insertwatermark - }% + \skvdisablekeys[SKVC]{title}{insertwatermark}% } \AtBeginDocument{% \def\footnote{\unskip\skv@sav@footnote}% @@ -94,6 +91,11 @@ } \let\skvcl@settitlepageno\@gobble +% Example of option and nonoption keys: +\skvordkeys[KV]{fam}{testkey1,testkey2}[value]{} +\skvoptionkeys[KV]{fam}{testkey1} +\skvnonoptionkeys[KV]{fam}{testkey2} + % LaTeX will zap spaces in key name, anyway. So our options don't have % spaces within themselves. @@ -107,6 +109,8 @@ .family=textemphasis, .hp=xem@, .new options={ + .initialize keys after define, + .ord/{testkey1,testkey2,testkey3}/default, .bool/useitalic/true, .bool/usebold/true, .bool/usecolor/true, @@ -127,6 +131,8 @@ usecolour/usecolor, colour/color, }, + .option keys = {testkey1}, + .nonoption keys = {testkey2,testkey3}, % Modifying the article title: .change family=title, .hp=skvcl@, @@ -183,32 +189,29 @@ .cmd/watermarkscale/5, .cmd/watermarkcolor/gray!55, }, - .styles={ + .slots={ showdate/putdate=#1, first-page-number/firstpagenumber=#1, titlepage/maketitlepage=#1, }, - % Options execution and processing: - .families = {textemphasis,title}, - % Ececute the options in all the prevailing families. If any of - % the options isn't found in at least one family, report error (ie, - % don't save the key to the list of 'remaining keys'). Unknown options - % should be flagged immediately. - .execute options+={ - useitalic,usebold,usecolor,color, - make-textemphasis-inactive=false,putdate,datefont, - clearpage=false,pretitleskip,posttitleskip, + % Ececute the options in the current family. If any of the options + % isn't found, report error (ie, don't save the key to the list of + % 'remaining keys'). Unknown options should be flagged immediately. + % Use '.execute options+' or '.execute options in all families' to + % execute options in multiple families. + .execute options={ + putdate,datefont,clearpage=false,pretitleskip,posttitleskip, authorfont,titlefont,watermarkscale,firstpagenumber, insertwatermark=false,watermarkxshift,watermarkyshift, watermarktext,watermarkcolor,fontsize }, - % Use '.mega process options*' or '.copy class options and process...': -% .mega process options*={ -% prefix=SKVC, -% families={textemphasis,title}, -% }, - .copy class options and process options in all families, + .families={textemphasis,title}, + .process options in all families, } +%\show\skvcurrentpoxkeys + +% testkey1 is an option key: don't set it outside option list: +% \skvsetkeys[SKVC]{textemphasis}{testkey1} \skvrobustdef*\setupskvtestclass{% \skvsetkeys*+[SKVC]{textemphasis,title}% diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty b/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty index 30de37acd89..d2467bc9f1d 100644 --- a/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty +++ b/Master/texmf-dist/doc/latex/skeyval/skeyval-testpkg.sty @@ -1,5 +1,5 @@ %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% -% This is file 'skeyval-testpkg.sty', version 1.1a, 2012/10/16. % +% This is file 'skeyval-testpkg.sty', version 1.2, 2013/02/10. % % % % This package and accompanying files may be distributed and/or % % modified under the conditions of the LaTeX Project Public License, % @@ -23,11 +23,10 @@ % skeyval-pstkey.sty, skeyval-pstkey.tex, skeyval-testclass.cls, % % and skeyval-testpkg.sty. % % % -% Copyright (c) 2010-2012 Ahmed Musa (amusa22@gmail.com). % +% Copyright (c) 2010-2013 Ahmed Musa (amusa22@gmail.com). % %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% -\ProvidesPackage{skeyval-testpkg} - [2012/10/16 v1.1a skeyval test package 1 (AM)] +\ProvidesPackage{skeyval-testpkg}[2013/02/10 v1.2 skeyval test package (AM)] \NeedsTeXFormat{LaTeX2e} \@ifpackageloaded{skeyval}{}{\RequirePackage{skeyval}} \RequirePackage{graphicx} @@ -41,7 +40,7 @@ % Declare options with default values that will be used when the options % are called without user values. % -\skvDeclarePassedOptionsLoadPackage[SKVT]{testpkg}{% +\skvdeclarepassedoptionsloadpackage[SKVT]{testpkg}{% hyperref={colorlinks,breaklinks},xcolor=svgnames } @@ -72,8 +71,10 @@ \def\alignvalb{\alignval} \def\stextstyle{\sffamily} -\skvsetkeys[SKVT]{abrtext}{align=.expand twice{\alignvalb}, - text style=.expand once{\stextstyle},author,show author} +\skvsetkeys[SKVT]{abrtext}{ + align=.expand twice{\alignvalb}, + text style=.expand once{\stextstyle},author,show author +} %%+++++++++++++++++++++++++++ Citations +++++++++++++++++++++++++++%% @@ -266,13 +267,12 @@ .k handler={2}{\def\x##1{##1*#1*#2}}, .l handler={3}{\def\x##1{##1*#1*#2*#3}} }, + .reserve handlers={reservedx , reservedy}, .holder prefix = mp@, .prefix = KV, - .add prefixes = {KVA,KVD}, .families = {fam1, fam2}, .add family = {fam3}, .add families = {fama,famb,famc}, - .ignore prefixes = {KVA,KVD}, .ignore families = {fama,famb,famc}, .restore families = {fama,famb}, .restore paths = {KVA/fama,KVD/famc}, @@ -330,21 +330,21 @@ .set keys = {keya=vala}, }, .exec code = \def\keycval{true}, - % Prepend style keye to key1 and key2: - .prepend style={key1/{keye=.expanded{\keycval}},key2/{keye=false}}, - % Multi-prepend styles: - .prepend style={{key3,key4}/{keye=true,keyf=true},key5/{keye=false}}, - % Prepend style keyd to key6: - .prepend style={key6/{keyd=right}}, - % Append styles keye and keyf to key7 and key8. - % '.styles' and '.style' are equivalent to '.append styles' - % and '.append style'. - .append style={key7/{keye=true},key8/{keyf=false}}, + % Prepend slot keye to key1 and key2: + .prepend slot={key1/{keye=.expanded{\keycval}},key2/{keye=false}}, + % Multi-prepend slots: + .prepend slot={{key3,key4}/{keye=true,keyf=true},key5/{keye=false}}, + % Prepend slot keyd to key6: + .prepend slot={key6/{keyd=right}}, + % Append slots keye and keyf to key7 and key8. + % '.slots' and '.slot' are equivalent to '.append slots' + % and '.append slot'. + .append slot={key7/{keye=true},key8/{keyf=false}}, % The next two link keyb and keyc to key9. #1 here refers to the % current value of key9. The same effect can be achieved directly % via the '.link' handler: - .prepend style={key9/{keyb=#1}}, - .append style={key9/{keyc=#1}}, + .prepend slot={key9/{keyb=#1}}, + .append slot={key9/{keyc=#1}}, .set keys = {key9=val9}, % Link keye and keyf to key10 and key11. The values of key10 and % key11 are used to set keye and keyf. key10 and key11 are hence @@ -432,4 +432,23 @@ \skvprocessoptions*+[SKVT]\relax %\skvrestrictedprocessoptions*+[SKVT]\relax +\skvcomment +Here you could also use: + +\directkeys{ + .mega process options*={ + .prefix=SKVT, + .families={abrtext,shadowbox,citation,testpkg}, + } +} + +or + +\directkeys{ + .prefix=SKVT, + .families={abrtext,shadowbox,citation,testpkg}, + .copy class options and process options in all families, +} +\endcomment + \endinput diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf b/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf deleted file mode 100644 index fc4c8014215..00000000000 Binary files a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.pdf and /dev/null differ diff --git a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex b/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex deleted file mode 100644 index 9ad80b2a5c5..00000000000 --- a/Master/texmf-dist/doc/latex/skeyval/skeyval-view-pokayoke1.tex +++ /dev/null @@ -1,139 +0,0 @@ -\documentclass{skeyval-testclass} -\usepackage[xcolor-options=dvipsnames]{skeyval-view} -\usetikzlibrary[topaths] - -\makeatletter - -\setupviewkeys{length of default=30} - -\skvdefinekeys[KV]{fam1}[vhp@]{% - .initialize after define, - .ord/{keya,keya2}/default-a, - .cmd/keyb, - .zcmd/key c/\def\cmdc##1{##1}/ - \edef\y{\detokenize\expandafter{\vhp@keyc}}\def\x##1{#1*key c*##1}, - % No default for keyd: - .choice/keyd/.na - /{center.do=\def\x##1{#1*##1},left.do={\def\ans{#1}},right} - /\def\z##1{#1*##1} - /\@warning{Invalid value for keyd}, - .bool/show shadow/true, - .zbool/show center/true/\edef\cmd{\ifvhp@showcenter Yes\else No\fi}, - .ord/keye, - .cmd/keyf, -} -%\show\y -%\skvshowcs{KV@fam1@show center} -%\show\cmd - -% Define some keys: -\directkeys*{ - .prefix=KV, - .family=fam2, - .holder prefix=hp@, - .initialize keys after define, - .define keys={% - .ord/keya, - .ord/galaxy/Messier 51a/\def\constellation{Canes Venatici}, - .choice/planet/Earth/{Earth.do=\def\x##1{#1*##1},Mars,Jupiter}, - .bool/space travel/true, - .cmd/astronaut/Yuri Gagarin/ - \edef\x{\ifx\hp@astronaut\@empty Neil Armstrong\else\hp@astronaut\fi}, - .ord/space observatory/Hubble Space Telescope/ - \def\father{Lyman Spitzer~(1914--1997)}, - }, -} - -\makeatother - -\begin{document} - -\title{The \texttt{\textcolor{blue}{skeyval-view}} Package\\[.25ex] - Version 1.1a\\[1ex] - \textsf{Test document}} -\author{Ahmed Musa} -\maketitle - -\skvviewkeys{% - .show={ - family=fam1, - color=blue - }, - .show={ - families={fam1,fam2}, - only those with default=true, - write to file=\jobname.skvv, - show labels=true, - show wlabels=true, - }, - .show={ - family=fam1, - only those with default=[none], - show labels=true, - color=cyan, - }, - .show={ - families={fam1,fam2}, - only those without default=true, - color=purple, - }, - .show={ - family=fam2, - columns={prefix,family,key type,default}, - color=teal - }, - .show={ - only those in family=fam2, - columns={family,type,default} - }, - .show={ - only those in families={fam1,fam2}, - columns={prefix,family,type,default}, - color=magenta - } -} - -\newpage - -\skvtestcnt0\relax -\skvrecurse - \advance\skvtestcnt1\relax - \vskip\baselineskip\noindent - \textcolor{blue!\the\numexpr10*\skvtestcnt!red!% - \the\numexpr100/\skvtestcnt}{% - The play was a great success, but the audience was a disaster. - \endgraf{\small Oscar Wilde, 1854--1900} - }% -\while - \ifnum\skvtestcnt<8\relax -\fi - -% Credit: Quintin Jean-Noël -\newcount\mycount -\begin{center} -\begin{tikzpicture}[scale=.5,transform shape] -\newforeach \nr in {1,...,8}{ - \mycount=\numexpr(\nr-1)*45\relax - \node[draw,circle,inner sep=0.25cm] (N-\nr) at (\the\mycount:5.4cm) {}; -} -\newforeach \nr in {9,...,16}{ - \mycount=\numexpr(\nr-1)*45+22\relax - \node[draw,circle,inner sep=0.25cm] (N-\nr) at (\the\mycount:5.4cm) {}; -} -\newforeach \nr in {1,...,15}{ - \mycount=\numexpr\nr+1\relax - \newforeach \nra in {\the\mycount,...,16}{ - \path (N-\nr) edge[->,bend right=3] (N-\nra) edge[<-,bend left=3] - (N-\nra); - } -} -\end{tikzpicture} -\end{center} - - -\bigskip -Find more information about the \textcolor{red}{\texttt{show shadow}} option on page~\pageref{KV/fam1/show shadow}. - -\end{document} - -% End of file skeyval-view-pokayoke1.tex \ No newline at end of file -- cgit v1.2.3