texlive[44987] Master: simplekv.tex runtime

commits+karl at tug.org commits+karl at tug.org
Tue Aug 8 22:41:36 CEST 2017


Revision: 44987
          http://tug.org/svn/texlive?view=revision&revision=44987
Author:   karl
Date:     2017-08-08 22:41:36 +0200 (Tue, 08 Aug 2017)
Log Message:
-----------
simplekv.tex runtime

Modified Paths:
--------------
    trunk/Master/tlpkg/libexec/ctan2tds

Added Paths:
-----------
    trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.tex

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex

Deleted: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex	2017-08-08 20:40:20 UTC (rev 44986)
+++ trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex	2017-08-08 20:41:36 UTC (rev 44987)
@@ -1,329 +0,0 @@
-% !TeX encoding = ISO-8859-1
-% Ce fichier contient le code comment\xE9 de l'extension "simplekv"
-%
-% IMPORTANT : pour que les commentaires s'affichent correctement,
-%             ouvrir ce fichier avec l'encodage ISO-8859-1
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                    %
-\def\skvname                  {simplekv}                             %
-\def\skvver                     {0.1}                                %
-%                                                                    %
-\def\skvdate                 {2017/08/08}                            %
-%                                                                    %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% --------------------------------------------------------------------
-% 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 2005/12/01 or later.
-% --------------------------------------------------------------------
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Christian Tellechea
-% Copyright : Christian Tellechea 2017
-% email: unbonpetit at netc.fr
-%        Commentaires, suggestions et signalement de bugs bienvenus !
-%        Comments, bug reports and suggestions are welcome.
-% Copyright: Christian Tellechea 2017
-% --------------------------------------------------------------------
-% L'extension simplekv est compos\xE9e des 5 fichiers suivants :
-%   - code               : simplekv            (.tex et .sty)
-%   - manuel en fran\xE7ais : simplekv-fr         (.tex et .pdf)
-%   - fichier lisezmoi   : README
-% --------------------------------------------------------------------
-
-\expandafter\edef\csname skv_restorecatcode\endcsname{\catcode`\noexpand\_=\the\catcode`\_\relax}
-\catcode`\_11
-
-%################################################
-%################################################
-% Cette macro est \xE9quivalente \xE0 0 et sert notamment \xE0 stopper le d\xE9veloppement
-% de \romannumeral
-\chardef\skv_stop 0
-
-% D\xE9finition du quark, notamment ins\xE9r\xE9 \xE0 la fin d'une liste pour en reconnaitre
-% la fin et stopper la r\xE9cursivit\xE9
-\def\skv_quark{\skv_quark}
-
-% Voici les macros habituelles de s\xE9lection d'arguments
-\long\def\skv_first#1#2{#1}
-\long\def\skv_second#1#2{#2}
-
-% Voici la macro pour 1-d\xE9velopper ou 2-d\xE9velopper le 2e argument (le 1er \xE9tant
-% d\xE9pouill\xE9 des accolades)
-%     \skv_exparg{<a>}{<b>} devient <a>{<b>}
-%     \skv_eearg{<a>}{<b>} devient <a>{**<b>}
-\long\def\skv_exparg#1#2{\expandafter\skv_exparg_i\expandafter{#2}{#1}}%
-\long\def\skv_eearg#1#2{\expandafter\expandafter\expandafter\skv_exparg_i\expandafter\expandafter\expandafter{#2}{#1}}%
-\long\def\skv_exparg_i#1#2{#2{#1}}
-
-% Et la macro pour 1-d\xE9velopper le 2e argument (le 1er et le 2e argument sont
-% d\xE9pouill\xE9s des accolades)%
-%     \skv_expafter{<a>}{<b>} devient <a><*b>
-\long\def\skv_expafter#1#2{\expandafter\skv_expafter_i\expandafter{#2}{#1}}
-\long\def\skv_expafter_i#1#2{#2#1}
-
-% Enfin, la macro pour former le nom du 2e argument (le 1er est d\xE9pouill\xE9 des
-% accolades)
-%     \skv_argcsname{<a>}{<b>} devient <a>\<b>
-\def\skv_argcsname#1#{\skv_argcsname_i{#1}}
-\def\skv_argcsname_i#1#2{\skv_expafter{#1}{\csname#2\endcsname}}
-
-\def\skv_eaddtomacro#1#2{\skv_exparg{\skv_exparg{\def#1}}{\expandafter#1#2}}
-
-%################################################
-%################ macros de test ################
-%################################################
-% Voici quelques macros \xE0 s\xE9lection d'arguments pour les tests
-\def\skv_ifcsname#1{\ifcsname#1\endcsname\expandafter\skv_first\else\expandafter\skv_second\fi}
-\long\def\skv_ifx#1{\ifx#1\expandafter\skv_first\else\expandafter\skv_second\fi}
-\long\def\skv_ifempty#1{\skv_exparg\skv_ifx{\expandafter\relax\detokenize{#1}\relax}}
-
-% Ces macros sont utiles pour \skv_removeextremespaces, qui retire les
-% espaces extr\xEAmes de son argument
-%     Voir codes 320-324 (http://progtex.fr/wp-content/uploads/2014/09/code.txt)
-%     et pages 339-343 de "Apprendre \xE0 programmer en TeX"
-\long\def\skv_ifspacefirst#1{\expandafter\skv_ifspacefirst_i\detokenize{#10} \_nil}
-\long\def\skv_ifspacefirst_i#1 #2\_nil{\skv_ifempty{#1}}
-\expandafter\def\expandafter\skv_gobspace\space{}
-\def\skv_removefirstspaces{\romannumeral\skv_removefirstspaces_i}
-\long\def\skv_removefirstspaces_i#1{\skv_ifspacefirst{#1}{\expandafter\skv_removefirstspaces_i\expandafter{\skv_gobspace#1}}{\skv_stop#1}}
-\begingroup
-	\catcode0 12
-	\long\gdef\skv_removelastspaces#1{\romannumeral\skv_removelastspaces_i#1^^00 ^^00\_nil}
-	\long\gdef\skv_removelastspaces_i#1 ^^00{\skv_removelastspaces_ii#1^^00}
-	\long\gdef\skv_removelastspaces_ii#1^^00#2\_nil{\skv_ifspacefirst{#2}{\skv_removelastspaces_i#1^^00 ^^00\_nil}{\skv_stop#1}}
-\endgroup
-\long\def\skv_removeextremespaces#1{%
-	\romannumeral\expandafter\expandafter\expandafter\skv_removelastspaces\expandafter\expandafter\expandafter
-	{\expandafter\expandafter\expandafter\skv_stop\skv_removefirstspaces{#1}}%
-}
-
-%################################################
-%############## syst\xE8me cl\xE9/valeur ##############
-%################################################
-% Ceci est le bool\xE9en indiquant si la lecture de <cl\xE9s>=<valeurs> d\xE9finit les
-% <cl\xE9s> _par d\xE9faut_ ou qu'il s'agit d'une _red\xE9finition_ des <cl\xE9s> d\xE9j\xE0
-% existantes
-\newif\ifskv_default
-
-% macros chapeau appelant la m\xEAme macro avec le bool\xE9en pr\xE9alablement d\xE9fini
-\def\setKVdefault{\skv_defaulttrue\skv_readKV}
-\def\setKV{\skv_defaultfalse\skv_readKV}
-
-% L'argument obligatoire #1 est le nom du <trousseau> et #2 est l'ensemble
-% des <cl\xE9s>=<valeurs>
-\def\skv_readKV[#1]#2{%
-	\skv_ifempty{#2}
-% Si aucune <cl\xE9s>=<valeurs> alors qu'on d\xE9finit les <valeurs> par d\xE9faut,
-% message d'erreur et on s'arr\xEAte l\xE0
-		{\ifskv_default\errmessage{No key/val found, no default key/val defined}\fi}
-% Sinon, initialiser \xE0 <vide> la macro \skv_[<trousseau>] uniquement si on
-% cr\xE9\xE9 les <valeurs> par d\xE9faut
-		{\ifskv_default\skv_argcsname\let{skv_[#1]}\empty\fi
-% Puis on passe aux choses s\xE9rieuses, on va lire un par un tous les \xE9l\xE9ments
-% <cl\xE9>=<valeur> (contenus dans #2) en mettant le quark comme dernier couple
-% pour montrer la fin de la liste
-		\skv_readKV_i[#1]#2,\skv_quark,%
-		}%
-}
-
-\def\skv_readKV_i[#1]#2,{%
-% #2 est le premier couple "<cl\xE9>=<valeur>" de la liste qui reste \xE0 traiter :
-% tout d'abord, on se d\xE9barrasse des espaces extr\xEAmes
-	\skv_eearg{\def\__temp}{\skv_removeextremespaces{#2}}%
-% Si ce qui en r\xE9sulte est \xE9gal au <quark>,
-	\skv_ifx{\__temp\skv_quark}
-% alors, on a fini et on ne fait rien (fin du processus)
-		{}
-% Sinon, si ce qui en r\xE9sulte est vide (le couple "<cl\xE9>=<valeur>" \xE9tait donc
-% vide ou compos\xE9 d'un espace)
-		{\skv_ifx{\__temp\empty}
-% On a fini et on ne fait rien (fin du processus)
-			{}
-% dans le cas contraire, on va isoler la <cl\xE9> et la <valeur> du couple lu en
-% prenant soin de mettre \xE0 la fin "=<quark>" pour se pr\xE9munir du cas o\xF9
-% "<cl\xE9>=<valeur>" ne contient que la "<cl\xE9>" et pas de signe "=", ce qui
-% ferait planter la macro \xE0 arguments d\xE9limit\xE9s
-			{\expandafter\skv_find_kv\__temp=\skv_quark\_nil[#1]%
-			}%
-% Lorsque la <cl\xE9> et la <valeur> est trouv\xE9e et stock\xE9e, recommencer et aller
-% lire le prochain couple "<cl\xE9>=<valeur>"
-		\skv_readKV_i[#1]%
-		}%
-}
-
-% Voici la macro \xE0 arguments d\xE9limit\xE9s \xE0 qui on a transmis
-%     <cl\xE9>=<valeur>=<quark> (si <cl\xE9>=<valeur> est l'\xE9l\xE9ment lu)
-% ou
-%     <cl\xE9>=<quark> (si <cl\xE9> est seule)
-% et qui va isoler la <cl\xE9> de la <valeur>.
-\def\skv_find_kv#1=#2\_nil[#3]{%
-% #1 est ce qui se trouve avant le _premier_ signe "=" et
-% #2 est ce qui se trouve entre le premier signe "=" et le \_nil
-% Pour la <cl\xE9>, pas de probl\xE8me, c'est _obligatoirement_ ce qui est avant le
-% signe "=", que ce signe soit pr\xE9sent dans le couple lu ou pas puisqu'on y a
-% rajout\xE9 "=<quark>".
-% On \xE9limine les espaces extr\xEAmes pour obtenir la <cl\xE9> d\xE9finitive stock\xE9e dans
-% \__key (il faut 2-d\xE9velopper \skv_removeextremespaces pour qu'elle donne son
-% argument sans espace extr\xEAme)
-	\edef\__key{\detokenize\expandafter\expandafter\expandafter{\skv_removeextremespaces{#1}}}%
-% Pour la <valeur>, on lui \xF4te d'abord les espaces extr\xEAmes
-	\skv_eearg{\def\__val}{\skv_removeextremespaces{#2}}%
-	\skv_ifx{\__val\skv_quark}
-% Si elle est \xE9gale au <quark>, alors la <valeur> vaut "true"
-		{\def\__val{true}}%
-% Sinon, \xF4ter "=<quark>" de la fin de l'argument #2, \xE9liminer les espaces
-% extr\xEAmes de ce qui en r\xE9sulte et stocker le tout dans \__val (tout ceci est
-% effectu\xE9 par la macro \skv_find_val <valeur>=<quark>)
-		{\skv_find_val#2}%
-% Si on lit les <cl\xE9s>=<valeurs> par d\xE9faut,
-	\ifskv_default
-% assigner \xE0 la macro "\skv_[<trousseau>]_<cl\xE9>" la <valeur> trouv\xE9e
-		\skv_argcsname\let{skv_[#3]_\detokenize\expandafter{\__key}}\__val
-% Puis ajouter \xE0 la macro "\skv_[<trousseau>]", qui a \xE9t\xE9 pr\xE9alablement
-% initialis\xE9e \xE0 <vide> :
-%     \def\skv_[<trousseau>]_<cl\xE9>{<valeur>}
-		\skv_argcsname\skv_eaddtomacro{skv_[#3]}%
-			{\expandafter\def\csname skv_[#3]_\detokenize\expandafter{\__key}\expandafter\endcsname\expandafter{\__val}}%
-% C'est selon ce hashage que sont enregistr\xE9s les couples <cl\xE9>/<valeur> : les
-% <cl\xE9s> sont contenues dans les noms des macros tandis que les <valeurs> sont
-% les textes de remplacement de ces macros.
-% C'est rapide et simple :
-%    a)  pour trouver une <valeur> d'apr\xE8s sa <cl\xE9>, il suffit de d\xE9velopper la
-%        macro \skv_[<trousseau>]_<cl\xE9>
-%    b) pour red\xE9finir une <cl\xE9>, il suffit de red\xE9finir cette macro avec la
-%       nouvelle <valeur>
-%    c) il est facile de v\xE9rifier qu'une <cl\xE9> existe en v\xE9rifiant que la macro
-%       associ\xE9e est d\xE9finie, la primitive \ifcsname le fait tr\xE8s bien
-%    d) en revanche, on ne peut pas faire de recherche _inverse_ de fa\xE7on
-%       pratique : il est en effet plus difficile de trouver la (ou les) <cl\xE9>
-%       contenant une <valeur> donn\xE9e, mais cette limitation n'a pas grande
-%       importance ici (je ne sais pas si les autres syst\xE8mes de <cl\xE9>/<valeur>
-%       sont programm\xE9s de telle sorte que cela soit simple...)
-% Bref, la macro "\skv_[<trousseau>]" contient donc _toutes_ les d\xE9finitions
-% des macros d\xE9finissant les <cl\xE9s>/<valeurs> _par d\xE9faut_ et ex\xE9cuter 
-% "\skv_[<trousseau>]" remet donc toutes les <cl\xE9s> \xE0 leur <valeur> par d\xE9faut.
-	\else
-% Dans le cas o\xF9 on _lit_ des nouvelles <valeurs> pour des <cl\xE9s>
-		\skv_ifcsname{skv_[#3]_\__key}
-% Si la <cl\xE9> existe (ssi la macro "\skv_[<trousseau>]_<cl\xE9>" est d\xE9finie),
-% alors assigner la <valeur> \xE0 cette macro
-			{\skv_argcsname\let{skv_[#3]_\__key}\__val}%
-% Sinon, \xE9mettre un message d'erreur et ne rien faire de plus
-			{\errmessage{Key "\__key" is not defined: nothing is modified}}%
-	\fi
-}
-
-% Cette macro \xE0 qui on a transmis "<valeur>=<quark>" ne garde que <valeur>, en
-% \xF4te les espaces extr\xEAmes et stocke le r\xE9sultat dans \__val
-\def\skv_find_val#1=\skv_quark{\skv_eearg{\def\__val}{\skv_removeextremespaces{#1}}}
-
-% Cette macro remet toutes les <cl\xE9s> \xE0 leur <valeurs> par d\xE9faut en ex\xE9cutant
-% la macro "\skv_[<trousseau>]"
-\def\useKVdefault[#1]{%
-	\skv_ifcsname{skv_[#1]}
-		{\csname skv_[#1]\endcsname}
-% Si la macro "\skv_[<trousseau>]" n'existe pas, message d'erreur
-		{\errmessage{Undefined set of keys "#1"}}%
-}
-
-% Cette macro donne la <valeur> correspondant \xE0 la <cl\xE9> contenue dans #2
-\def\useKV[#1]#2{%
-% Avec \romannumeral, la <valeur> sera obtenue apr\xE8s _2_ d\xE9veloppements de
-% \useKV[<trousseau>]{<cl\xE9>}
-	\romannumeral\skv_ifempty{#2}
-% Si la <cl\xE9> est vide, message d'erreur (il ne peut y avoir de <valeur>
-% associ\xE9e \xE0 une <cl\xE9> vide)
-		{\skv_stop\errmessage{Key name missing}}
-		{\skv_ifcsname{skv_[#1]_\skv_removeextremespaces{#2}}
-% Si la macro "\skv_[<trousseau>]_<cl\xE9>" existe, 2-d\xE9velopper le \csname pour
-% avoir la <valeur>
-			{\expandafter\expandafter\expandafter\skv_stop\csname skv_[#1]_\skv_removeextremespaces{#2}\endcsname}
-% Sinon, message d'erreur
-			{\skv_stop\errmessage{Key "\skv_removeextremespaces{#2}" not defined}}%
-		}%
-}
-
-% Voici une macro purement d\xE9veloppable qui teste si #2 (la <cl\xE9> du <trousseau>
-% #1) est \xE9gale \xE0 "true" ou \xE0 "false" et selon l'issue, ex\xE9cute le 1er ou 2e
-% argument qui suit (arguments appel\xE9s <vrai> et <faux>)
-\def\ifboolKV[#1]#2{%
-% Cette macro donnera un des 2 arguments <vrai> ou <faux> en _2_ d\xE9veloppements
-% gr\xE2ce au \romannumeral
-	\romannumeral\skv_ifempty{#2}
-% Si la <cl\xE9> est vide, message d'erreur
-		{\skv_stop\errmessage{Key name missing}\skv_second}
-		{\skv_ifcsname{skv_[#1]_\skv_removeextremespaces{#2}}
-% Si la <cl\xE9> d\xE9barrass\xE9e de ses espaces extr\xEAmes existe, tester son contenu
-			{\skv_eearg\ifboolKV_i{\csname skv_[#1]_\skv_removeextremespaces{#2}\endcsname}}
-% Sinon, message d'erreur
-			{\skv_stop\errmessage{Key "\skv_removeextremespaces{#2}" not defined}\skv_second}%
-		}%
-}
-
-% Cette macro teste si #1, qui est une <valeur>, vaut "true" ou "false"
-\def\ifboolKV_i#1{%
-% Tester d'abord si elle vaut "true"
-	\skv_ifargtrue{#1}
-		{\expandafter\skv_stop\skv_first}
-		{\skv_ifargfalse{#1}
-% Puis si elle vaut "false"
-			{\expandafter\skv_stop\skv_second}
-% Si ni l'un ni l'autre, la <valeur> n'est pas un bool\xE9en acceptable
-			{\skv_stop\errmessage{Value "#1" is not a valid boolean}\skv_second}%
-		}%
-}
-
-% La macro \skv_ifargtrue{<argument>} teste de fa\xE7on purement d\xE9veloppable si
-% <argument> vaut "true" ou "false".
-% Pour cela, on transmet \xE0 \skv_ifargtrue_i l'argument "<argument>true" qui est
-% d\xE9limit\xE9 par \_nil
-\def\skv_ifargtrue#1{\skv_ifargtrue_i#1true\_nil}
-% Dans la macro \skv_ifargtrue_i, l'argument #1 est ce qui se trouve avant
-% "true" dans "<argument>true" :
-%     - s'il n'est pas vide, s\xE9lectionner l'argument <faux>
-%     - s'il est vide, cela signifie que <argument> commence par "true" ; il est
-%       donc de la forme "true<autre>"
-%       L'argument #2 est ce qui se trouve apr\xE8s "true" dans "true<autre>true",
-%       c'est donc "<autre>true".
-%       Pour \xEAtre s\xFBr que <autre> est <vide>, on transmet "<autre>true" \xE0
-%       \skv_ifargtrue_ii qui teste si la r\xE9union de ce qui est avant le
-%       premier "true" et ce qui est apr\xE8s est <vide>
-\def\skv_ifargtrue_i#1true#2\_nil{\skv_ifempty{#1}{\skv_ifargtrue_ii#2\_nil}\skv_second}
-\def\skv_ifargtrue_ii#1true#2\_nil{\skv_ifempty{#1#2}}
-
-% On proc\xE8de de m\xEAme pour tester "false"
-\def\skv_ifargfalse#1{\skv_ifargfalse_i#1false\_nil}
-\def\skv_ifargfalse_i#1false#2\_nil{\skv_ifempty{#1}{\skv_ifargfalse_ii#2\_nil}\skv_second}
-\def\skv_ifargfalse_ii#1false#2\_nil{\skv_ifempty{#1#2}}
-
-\def\showKV[#1]#2{%
-% Ecrire dans le fichier log "Key [<trousseau>]<cl\xE9>="
-	\immediate\write-1 {Key [#1]\skv_removeextremespaces{#2}=%
-		\skv_ifcsname{skv_[#1]_\skv_removeextremespaces{#2}}
-% si la <cl\xE9> est d\xE9finie, prendre le \meaning de la macro correspondante
-		{\expandafter\expandafter\expandafter\skv_show\expandafter
-		\meaning\csname skv_[#1]_\skv_removeextremespaces{#2}\endcsname}
-% Sinon, afficher
-		{not defined}%
-	}%
-}
-% Mange ce qui se trouve jusqu'\xE0 "->" dans le d\xE9veloppement de \meaning
-\def\skv_show#1->{}
-\skv_restorecatcode
-\endinput
-
-Versions :
- _____________________________________________________________________________
-| Version |    Date    | Changements                                          |
-|-----------------------------------------------------------------------------|
-|   0.1   | 08/08/2017 | Premi\xE8re version                                     |
-|-----------------------------------------------------------------------------|

Copied: trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.tex (from rev 44986, trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex)
===================================================================
--- trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.tex	2017-08-08 20:41:36 UTC (rev 44987)
@@ -0,0 +1,329 @@
+% !TeX encoding = ISO-8859-1
+% Ce fichier contient le code comment\xE9 de l'extension "simplekv"
+%
+% IMPORTANT : pour que les commentaires s'affichent correctement,
+%             ouvrir ce fichier avec l'encodage ISO-8859-1
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                    %
+\def\skvname                  {simplekv}                             %
+\def\skvver                     {0.1}                                %
+%                                                                    %
+\def\skvdate                 {2017/08/08}                            %
+%                                                                    %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% --------------------------------------------------------------------
+% 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 2005/12/01 or later.
+% --------------------------------------------------------------------
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Christian Tellechea
+% Copyright : Christian Tellechea 2017
+% email: unbonpetit at netc.fr
+%        Commentaires, suggestions et signalement de bugs bienvenus !
+%        Comments, bug reports and suggestions are welcome.
+% Copyright: Christian Tellechea 2017
+% --------------------------------------------------------------------
+% L'extension simplekv est compos\xE9e des 5 fichiers suivants :
+%   - code               : simplekv            (.tex et .sty)
+%   - manuel en fran\xE7ais : simplekv-fr         (.tex et .pdf)
+%   - fichier lisezmoi   : README
+% --------------------------------------------------------------------
+
+\expandafter\edef\csname skv_restorecatcode\endcsname{\catcode`\noexpand\_=\the\catcode`\_\relax}
+\catcode`\_11
+
+%################################################
+%################################################
+% Cette macro est \xE9quivalente \xE0 0 et sert notamment \xE0 stopper le d\xE9veloppement
+% de \romannumeral
+\chardef\skv_stop 0
+
+% D\xE9finition du quark, notamment ins\xE9r\xE9 \xE0 la fin d'une liste pour en reconnaitre
+% la fin et stopper la r\xE9cursivit\xE9
+\def\skv_quark{\skv_quark}
+
+% Voici les macros habituelles de s\xE9lection d'arguments
+\long\def\skv_first#1#2{#1}
+\long\def\skv_second#1#2{#2}
+
+% Voici la macro pour 1-d\xE9velopper ou 2-d\xE9velopper le 2e argument (le 1er \xE9tant
+% d\xE9pouill\xE9 des accolades)
+%     \skv_exparg{<a>}{<b>} devient <a>{<b>}
+%     \skv_eearg{<a>}{<b>} devient <a>{**<b>}
+\long\def\skv_exparg#1#2{\expandafter\skv_exparg_i\expandafter{#2}{#1}}%
+\long\def\skv_eearg#1#2{\expandafter\expandafter\expandafter\skv_exparg_i\expandafter\expandafter\expandafter{#2}{#1}}%
+\long\def\skv_exparg_i#1#2{#2{#1}}
+
+% Et la macro pour 1-d\xE9velopper le 2e argument (le 1er et le 2e argument sont
+% d\xE9pouill\xE9s des accolades)%
+%     \skv_expafter{<a>}{<b>} devient <a><*b>
+\long\def\skv_expafter#1#2{\expandafter\skv_expafter_i\expandafter{#2}{#1}}
+\long\def\skv_expafter_i#1#2{#2#1}
+
+% Enfin, la macro pour former le nom du 2e argument (le 1er est d\xE9pouill\xE9 des
+% accolades)
+%     \skv_argcsname{<a>}{<b>} devient <a>\<b>
+\def\skv_argcsname#1#{\skv_argcsname_i{#1}}
+\def\skv_argcsname_i#1#2{\skv_expafter{#1}{\csname#2\endcsname}}
+
+\def\skv_eaddtomacro#1#2{\skv_exparg{\skv_exparg{\def#1}}{\expandafter#1#2}}
+
+%################################################
+%################ macros de test ################
+%################################################
+% Voici quelques macros \xE0 s\xE9lection d'arguments pour les tests
+\def\skv_ifcsname#1{\ifcsname#1\endcsname\expandafter\skv_first\else\expandafter\skv_second\fi}
+\long\def\skv_ifx#1{\ifx#1\expandafter\skv_first\else\expandafter\skv_second\fi}
+\long\def\skv_ifempty#1{\skv_exparg\skv_ifx{\expandafter\relax\detokenize{#1}\relax}}
+
+% Ces macros sont utiles pour \skv_removeextremespaces, qui retire les
+% espaces extr\xEAmes de son argument
+%     Voir codes 320-324 (http://progtex.fr/wp-content/uploads/2014/09/code.txt)
+%     et pages 339-343 de "Apprendre \xE0 programmer en TeX"
+\long\def\skv_ifspacefirst#1{\expandafter\skv_ifspacefirst_i\detokenize{#10} \_nil}
+\long\def\skv_ifspacefirst_i#1 #2\_nil{\skv_ifempty{#1}}
+\expandafter\def\expandafter\skv_gobspace\space{}
+\def\skv_removefirstspaces{\romannumeral\skv_removefirstspaces_i}
+\long\def\skv_removefirstspaces_i#1{\skv_ifspacefirst{#1}{\expandafter\skv_removefirstspaces_i\expandafter{\skv_gobspace#1}}{\skv_stop#1}}
+\begingroup
+	\catcode0 12
+	\long\gdef\skv_removelastspaces#1{\romannumeral\skv_removelastspaces_i#1^^00 ^^00\_nil}
+	\long\gdef\skv_removelastspaces_i#1 ^^00{\skv_removelastspaces_ii#1^^00}
+	\long\gdef\skv_removelastspaces_ii#1^^00#2\_nil{\skv_ifspacefirst{#2}{\skv_removelastspaces_i#1^^00 ^^00\_nil}{\skv_stop#1}}
+\endgroup
+\long\def\skv_removeextremespaces#1{%
+	\romannumeral\expandafter\expandafter\expandafter\skv_removelastspaces\expandafter\expandafter\expandafter
+	{\expandafter\expandafter\expandafter\skv_stop\skv_removefirstspaces{#1}}%
+}
+
+%################################################
+%############## syst\xE8me cl\xE9/valeur ##############
+%################################################
+% Ceci est le bool\xE9en indiquant si la lecture de <cl\xE9s>=<valeurs> d\xE9finit les
+% <cl\xE9s> _par d\xE9faut_ ou qu'il s'agit d'une _red\xE9finition_ des <cl\xE9s> d\xE9j\xE0
+% existantes
+\newif\ifskv_default
+
+% macros chapeau appelant la m\xEAme macro avec le bool\xE9en pr\xE9alablement d\xE9fini
+\def\setKVdefault{\skv_defaulttrue\skv_readKV}
+\def\setKV{\skv_defaultfalse\skv_readKV}
+
+% L'argument obligatoire #1 est le nom du <trousseau> et #2 est l'ensemble
+% des <cl\xE9s>=<valeurs>
+\def\skv_readKV[#1]#2{%
+	\skv_ifempty{#2}
+% Si aucune <cl\xE9s>=<valeurs> alors qu'on d\xE9finit les <valeurs> par d\xE9faut,
+% message d'erreur et on s'arr\xEAte l\xE0
+		{\ifskv_default\errmessage{No key/val found, no default key/val defined}\fi}
+% Sinon, initialiser \xE0 <vide> la macro \skv_[<trousseau>] uniquement si on
+% cr\xE9\xE9 les <valeurs> par d\xE9faut
+		{\ifskv_default\skv_argcsname\let{skv_[#1]}\empty\fi
+% Puis on passe aux choses s\xE9rieuses, on va lire un par un tous les \xE9l\xE9ments
+% <cl\xE9>=<valeur> (contenus dans #2) en mettant le quark comme dernier couple
+% pour montrer la fin de la liste
+		\skv_readKV_i[#1]#2,\skv_quark,%
+		}%
+}
+
+\def\skv_readKV_i[#1]#2,{%
+% #2 est le premier couple "<cl\xE9>=<valeur>" de la liste qui reste \xE0 traiter :
+% tout d'abord, on se d\xE9barrasse des espaces extr\xEAmes
+	\skv_eearg{\def\__temp}{\skv_removeextremespaces{#2}}%
+% Si ce qui en r\xE9sulte est \xE9gal au <quark>,
+	\skv_ifx{\__temp\skv_quark}
+% alors, on a fini et on ne fait rien (fin du processus)
+		{}
+% Sinon, si ce qui en r\xE9sulte est vide (le couple "<cl\xE9>=<valeur>" \xE9tait donc
+% vide ou compos\xE9 d'un espace)
+		{\skv_ifx{\__temp\empty}
+% On a fini et on ne fait rien (fin du processus)
+			{}
+% dans le cas contraire, on va isoler la <cl\xE9> et la <valeur> du couple lu en
+% prenant soin de mettre \xE0 la fin "=<quark>" pour se pr\xE9munir du cas o\xF9
+% "<cl\xE9>=<valeur>" ne contient que la "<cl\xE9>" et pas de signe "=", ce qui
+% ferait planter la macro \xE0 arguments d\xE9limit\xE9s
+			{\expandafter\skv_find_kv\__temp=\skv_quark\_nil[#1]%
+			}%
+% Lorsque la <cl\xE9> et la <valeur> est trouv\xE9e et stock\xE9e, recommencer et aller
+% lire le prochain couple "<cl\xE9>=<valeur>"
+		\skv_readKV_i[#1]%
+		}%
+}
+
+% Voici la macro \xE0 arguments d\xE9limit\xE9s \xE0 qui on a transmis
+%     <cl\xE9>=<valeur>=<quark> (si <cl\xE9>=<valeur> est l'\xE9l\xE9ment lu)
+% ou
+%     <cl\xE9>=<quark> (si <cl\xE9> est seule)
+% et qui va isoler la <cl\xE9> de la <valeur>.
+\def\skv_find_kv#1=#2\_nil[#3]{%
+% #1 est ce qui se trouve avant le _premier_ signe "=" et
+% #2 est ce qui se trouve entre le premier signe "=" et le \_nil
+% Pour la <cl\xE9>, pas de probl\xE8me, c'est _obligatoirement_ ce qui est avant le
+% signe "=", que ce signe soit pr\xE9sent dans le couple lu ou pas puisqu'on y a
+% rajout\xE9 "=<quark>".
+% On \xE9limine les espaces extr\xEAmes pour obtenir la <cl\xE9> d\xE9finitive stock\xE9e dans
+% \__key (il faut 2-d\xE9velopper \skv_removeextremespaces pour qu'elle donne son
+% argument sans espace extr\xEAme)
+	\edef\__key{\detokenize\expandafter\expandafter\expandafter{\skv_removeextremespaces{#1}}}%
+% Pour la <valeur>, on lui \xF4te d'abord les espaces extr\xEAmes
+	\skv_eearg{\def\__val}{\skv_removeextremespaces{#2}}%
+	\skv_ifx{\__val\skv_quark}
+% Si elle est \xE9gale au <quark>, alors la <valeur> vaut "true"
+		{\def\__val{true}}%
+% Sinon, \xF4ter "=<quark>" de la fin de l'argument #2, \xE9liminer les espaces
+% extr\xEAmes de ce qui en r\xE9sulte et stocker le tout dans \__val (tout ceci est
+% effectu\xE9 par la macro \skv_find_val <valeur>=<quark>)
+		{\skv_find_val#2}%
+% Si on lit les <cl\xE9s>=<valeurs> par d\xE9faut,
+	\ifskv_default
+% assigner \xE0 la macro "\skv_[<trousseau>]_<cl\xE9>" la <valeur> trouv\xE9e
+		\skv_argcsname\let{skv_[#3]_\detokenize\expandafter{\__key}}\__val
+% Puis ajouter \xE0 la macro "\skv_[<trousseau>]", qui a \xE9t\xE9 pr\xE9alablement
+% initialis\xE9e \xE0 <vide> :
+%     \def\skv_[<trousseau>]_<cl\xE9>{<valeur>}
+		\skv_argcsname\skv_eaddtomacro{skv_[#3]}%
+			{\expandafter\def\csname skv_[#3]_\detokenize\expandafter{\__key}\expandafter\endcsname\expandafter{\__val}}%
+% C'est selon ce hashage que sont enregistr\xE9s les couples <cl\xE9>/<valeur> : les
+% <cl\xE9s> sont contenues dans les noms des macros tandis que les <valeurs> sont
+% les textes de remplacement de ces macros.
+% C'est rapide et simple :
+%    a)  pour trouver une <valeur> d'apr\xE8s sa <cl\xE9>, il suffit de d\xE9velopper la
+%        macro \skv_[<trousseau>]_<cl\xE9>
+%    b) pour red\xE9finir une <cl\xE9>, il suffit de red\xE9finir cette macro avec la
+%       nouvelle <valeur>
+%    c) il est facile de v\xE9rifier qu'une <cl\xE9> existe en v\xE9rifiant que la macro
+%       associ\xE9e est d\xE9finie, la primitive \ifcsname le fait tr\xE8s bien
+%    d) en revanche, on ne peut pas faire de recherche _inverse_ de fa\xE7on
+%       pratique : il est en effet plus difficile de trouver la (ou les) <cl\xE9>
+%       contenant une <valeur> donn\xE9e, mais cette limitation n'a pas grande
+%       importance ici (je ne sais pas si les autres syst\xE8mes de <cl\xE9>/<valeur>
+%       sont programm\xE9s de telle sorte que cela soit simple...)
+% Bref, la macro "\skv_[<trousseau>]" contient donc _toutes_ les d\xE9finitions
+% des macros d\xE9finissant les <cl\xE9s>/<valeurs> _par d\xE9faut_ et ex\xE9cuter 
+% "\skv_[<trousseau>]" remet donc toutes les <cl\xE9s> \xE0 leur <valeur> par d\xE9faut.
+	\else
+% Dans le cas o\xF9 on _lit_ des nouvelles <valeurs> pour des <cl\xE9s>
+		\skv_ifcsname{skv_[#3]_\__key}
+% Si la <cl\xE9> existe (ssi la macro "\skv_[<trousseau>]_<cl\xE9>" est d\xE9finie),
+% alors assigner la <valeur> \xE0 cette macro
+			{\skv_argcsname\let{skv_[#3]_\__key}\__val}%
+% Sinon, \xE9mettre un message d'erreur et ne rien faire de plus
+			{\errmessage{Key "\__key" is not defined: nothing is modified}}%
+	\fi
+}
+
+% Cette macro \xE0 qui on a transmis "<valeur>=<quark>" ne garde que <valeur>, en
+% \xF4te les espaces extr\xEAmes et stocke le r\xE9sultat dans \__val
+\def\skv_find_val#1=\skv_quark{\skv_eearg{\def\__val}{\skv_removeextremespaces{#1}}}
+
+% Cette macro remet toutes les <cl\xE9s> \xE0 leur <valeurs> par d\xE9faut en ex\xE9cutant
+% la macro "\skv_[<trousseau>]"
+\def\useKVdefault[#1]{%
+	\skv_ifcsname{skv_[#1]}
+		{\csname skv_[#1]\endcsname}
+% Si la macro "\skv_[<trousseau>]" n'existe pas, message d'erreur
+		{\errmessage{Undefined set of keys "#1"}}%
+}
+
+% Cette macro donne la <valeur> correspondant \xE0 la <cl\xE9> contenue dans #2
+\def\useKV[#1]#2{%
+% Avec \romannumeral, la <valeur> sera obtenue apr\xE8s _2_ d\xE9veloppements de
+% \useKV[<trousseau>]{<cl\xE9>}
+	\romannumeral\skv_ifempty{#2}
+% Si la <cl\xE9> est vide, message d'erreur (il ne peut y avoir de <valeur>
+% associ\xE9e \xE0 une <cl\xE9> vide)
+		{\skv_stop\errmessage{Key name missing}}
+		{\skv_ifcsname{skv_[#1]_\skv_removeextremespaces{#2}}
+% Si la macro "\skv_[<trousseau>]_<cl\xE9>" existe, 2-d\xE9velopper le \csname pour
+% avoir la <valeur>
+			{\expandafter\expandafter\expandafter\skv_stop\csname skv_[#1]_\skv_removeextremespaces{#2}\endcsname}
+% Sinon, message d'erreur
+			{\skv_stop\errmessage{Key "\skv_removeextremespaces{#2}" not defined}}%
+		}%
+}
+
+% Voici une macro purement d\xE9veloppable qui teste si #2 (la <cl\xE9> du <trousseau>
+% #1) est \xE9gale \xE0 "true" ou \xE0 "false" et selon l'issue, ex\xE9cute le 1er ou 2e
+% argument qui suit (arguments appel\xE9s <vrai> et <faux>)
+\def\ifboolKV[#1]#2{%
+% Cette macro donnera un des 2 arguments <vrai> ou <faux> en _2_ d\xE9veloppements
+% gr\xE2ce au \romannumeral
+	\romannumeral\skv_ifempty{#2}
+% Si la <cl\xE9> est vide, message d'erreur
+		{\skv_stop\errmessage{Key name missing}\skv_second}
+		{\skv_ifcsname{skv_[#1]_\skv_removeextremespaces{#2}}
+% Si la <cl\xE9> d\xE9barrass\xE9e de ses espaces extr\xEAmes existe, tester son contenu
+			{\skv_eearg\ifboolKV_i{\csname skv_[#1]_\skv_removeextremespaces{#2}\endcsname}}
+% Sinon, message d'erreur
+			{\skv_stop\errmessage{Key "\skv_removeextremespaces{#2}" not defined}\skv_second}%
+		}%
+}
+
+% Cette macro teste si #1, qui est une <valeur>, vaut "true" ou "false"
+\def\ifboolKV_i#1{%
+% Tester d'abord si elle vaut "true"
+	\skv_ifargtrue{#1}
+		{\expandafter\skv_stop\skv_first}
+		{\skv_ifargfalse{#1}
+% Puis si elle vaut "false"
+			{\expandafter\skv_stop\skv_second}
+% Si ni l'un ni l'autre, la <valeur> n'est pas un bool\xE9en acceptable
+			{\skv_stop\errmessage{Value "#1" is not a valid boolean}\skv_second}%
+		}%
+}
+
+% La macro \skv_ifargtrue{<argument>} teste de fa\xE7on purement d\xE9veloppable si
+% <argument> vaut "true" ou "false".
+% Pour cela, on transmet \xE0 \skv_ifargtrue_i l'argument "<argument>true" qui est
+% d\xE9limit\xE9 par \_nil
+\def\skv_ifargtrue#1{\skv_ifargtrue_i#1true\_nil}
+% Dans la macro \skv_ifargtrue_i, l'argument #1 est ce qui se trouve avant
+% "true" dans "<argument>true" :
+%     - s'il n'est pas vide, s\xE9lectionner l'argument <faux>
+%     - s'il est vide, cela signifie que <argument> commence par "true" ; il est
+%       donc de la forme "true<autre>"
+%       L'argument #2 est ce qui se trouve apr\xE8s "true" dans "true<autre>true",
+%       c'est donc "<autre>true".
+%       Pour \xEAtre s\xFBr que <autre> est <vide>, on transmet "<autre>true" \xE0
+%       \skv_ifargtrue_ii qui teste si la r\xE9union de ce qui est avant le
+%       premier "true" et ce qui est apr\xE8s est <vide>
+\def\skv_ifargtrue_i#1true#2\_nil{\skv_ifempty{#1}{\skv_ifargtrue_ii#2\_nil}\skv_second}
+\def\skv_ifargtrue_ii#1true#2\_nil{\skv_ifempty{#1#2}}
+
+% On proc\xE8de de m\xEAme pour tester "false"
+\def\skv_ifargfalse#1{\skv_ifargfalse_i#1false\_nil}
+\def\skv_ifargfalse_i#1false#2\_nil{\skv_ifempty{#1}{\skv_ifargfalse_ii#2\_nil}\skv_second}
+\def\skv_ifargfalse_ii#1false#2\_nil{\skv_ifempty{#1#2}}
+
+\def\showKV[#1]#2{%
+% Ecrire dans le fichier log "Key [<trousseau>]<cl\xE9>="
+	\immediate\write-1 {Key [#1]\skv_removeextremespaces{#2}=%
+		\skv_ifcsname{skv_[#1]_\skv_removeextremespaces{#2}}
+% si la <cl\xE9> est d\xE9finie, prendre le \meaning de la macro correspondante
+		{\expandafter\expandafter\expandafter\skv_show\expandafter
+		\meaning\csname skv_[#1]_\skv_removeextremespaces{#2}\endcsname}
+% Sinon, afficher
+		{not defined}%
+	}%
+}
+% Mange ce qui se trouve jusqu'\xE0 "->" dans le d\xE9veloppement de \meaning
+\def\skv_show#1->{}
+\skv_restorecatcode
+\endinput
+
+Versions :
+ _____________________________________________________________________________
+| Version |    Date    | Changements                                          |
+|-----------------------------------------------------------------------------|
+|   0.1   | 08/08/2017 | Premi\xE8re version                                     |
+|-----------------------------------------------------------------------------|

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2017-08-08 20:40:20 UTC (rev 44986)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2017-08-08 20:41:36 UTC (rev 44987)
@@ -1796,6 +1796,7 @@
  'seminar',     '\.bug|\.bg2|\.cls|\.sty|2up.tex',
  'shade',       'shade\.tex',  # not description.tex
  'shadethm',    '\.sth|' . $standardtex,
+ 'simplekv',	'simplekv\.tex|' . $standardtex,
  'simurgh',     '\.lua|' . $standardtex,
  'spanish',     'NULL',  # babel conflict
  'showexpl',    '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$',  # not cfg



More information about the tex-live-commits mailing list