texlive[44986] Master: simplekv (8aug17)

commits+karl at tug.org commits+karl at tug.org
Tue Aug 8 22:40:20 CEST 2017


Revision: 44986
          http://tug.org/svn/texlive?view=revision&revision=44986
Author:   karl
Date:     2017-08-08 22:40:20 +0200 (Tue, 08 Aug 2017)
Log Message:
-----------
simplekv (8aug17)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/tlpsrc/collection-plaingeneric.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/generic/simplekv/
    trunk/Master/texmf-dist/doc/generic/simplekv/README
    trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.pdf
    trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.tex
    trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex
    trunk/Master/texmf-dist/tex/generic/simplekv/
    trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.sty
    trunk/Master/tlpkg/tlpsrc/simplekv.tlpsrc

Added: trunk/Master/texmf-dist/doc/generic/simplekv/README
===================================================================
--- trunk/Master/texmf-dist/doc/generic/simplekv/README	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/simplekv/README	2017-08-08 20:40:20 UTC (rev 44986)
@@ -0,0 +1,21 @@
+___________________________________
+
+             L'extension
+               simplekv
+               
+                v0.1
+
+             8 aout 2017
+___________________________________
+
+Authors   : Christian Tellechea
+Maintainer: Christian Tellechea
+E-mail    : unbonpetit at netc.fr     (CT)
+            Commentaires, signalements de bugs et
+            suggestions bienvenus
+Licence   : Released under the LaTeX Project Public License v1.3c or
+            later, see http://www.latex-project.org/lppl.txt
+
+----------------------------------------------------------------------
+
+A simple key/value system for TeX.


Property changes on: trunk/Master/texmf-dist/doc/generic/simplekv/README
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.pdf	2017-08-08 20:38:58 UTC (rev 44985)
+++ trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.pdf	2017-08-08 20:40:20 UTC (rev 44986)

Property changes on: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.tex	2017-08-08 20:40:20 UTC (rev 44986)
@@ -0,0 +1,271 @@
+% !TeX encoding = ISO-8859-1
+% Ceci est la documentation du package "hlist"
+%
+% Fichier compil\xE9 avec pdflatex
+\documentclass[french,a4paper,10pt]{article}
+\usepackage[latin1]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[margin=2cm]{geometry}
+\usepackage[bottom]{footmisc}
+\usepackage{libertine,boites,tikz,enumitem,MnSymbol,babel,xspace,listings,simplekv}
+\usepackage[scaled=0.8]{luximono}
+\frenchbsetup{og=\xAB,fg=\xBB}
+\def\eTeX{\hbox{$\varepsilon$-\TeX}}
+\def\SKV{\texttt{\skvname}\xspace}
+\makeatletter
+\def\code{\expandafter\code at i\string}
+\def\code at i#1{%
+	\begingroup
+		\par\nobreak\medskip\parindent0pt
+		\leftskip.1\linewidth
+		\make at car@active\^^I{\leavevmode\space\space\space\space}%
+		\let\do\@makeother \dospecials
+		\ttfamily\small\@noligs
+		\make at car@active\<{\begingroup$\langle$\itshape}%
+		\make at car@active\>{$\rangle$\endgroup}%
+		\obeylines\obeyspaces
+		\def\code at ii##1#1{##1\par\medbreak\endgroup}%
+		\code at ii
+}
+\long\def\grab at toks#1\relax{\gdef\right at content{#1}}
+
+\newcommand\disable at lig[1]{%
+	\catcode`#1\active
+	\begingroup
+		\lccode`\~`#1\relax
+		\lowercase{\endgroup\def~{\leavevmode\kern\z@\string#1}}%
+}
+
+\newcommand\make at car@active[1]{%
+	\catcode`#1\active
+	\begingroup
+		\lccode`\~`#1\relax
+		\lowercase{\endgroup\def~}%
+}
+
+\newcommand\exemple{%
+	\begingroup
+	\parskip\z@
+	\exemple@}
+
+\newcommand\exemple@{%
+	\medbreak\noindent
+	\begingroup
+		\let\do\@makeother\dospecials
+		\make at car@active\ { {}}%
+		\make at car@active\^^M{\par\leavevmode}%
+		\make at car@active\^^I{\space\space}%
+		\make at car@active\,{\leavevmode\kern\z@\string,}%
+		\make at car@active\-{\leavevmode\kern\z@\string-}%
+		\make at car@active\>{\leavevmode\kern\z@\string>}%
+		\make at car@active\<{\leavevmode\kern\z@\string<}%
+		\@makeother\;\@makeother\!\@makeother\?\@makeother\:% neutralise frenchb
+		\exemple@@
+}
+
+\newcommand\exemple@@[1]{%
+	\def\@tempa##1#1{\exemple@@@{##1}}%
+	\@tempa
+}
+
+\newcommand\exemple@@@[1]{%
+	\xdef\the at code{#1}%
+	\endgroup
+		\begingroup
+			\fboxrule0.4pt \fboxsep=5pt
+			\let\breakboxparindent\z@
+			\def\bkvz at top{\hrule\@height\fboxrule}%
+			\def\bkvz at bottom{\hrule\@height\fboxrule}%
+			\let\bkvz at before@breakbox\relax
+			\def\bkvz at set@linewidth{\advance\linewidth\dimexpr-2\fboxrule-2\fboxsep\relax}%
+			\def\bkvz at left{\vrule\@width\fboxrule\kern\fboxsep}%
+			\def\bkvz at right{\kern\fboxsep\vrule\@width\fboxrule}%
+			\breakbox
+				\kern.5ex\relax
+				\begingroup
+					\ttfamily\small\the at code\par
+				\endgroup
+				\kern3pt
+				\hrule height0.1pt width\linewidth depth0.1pt
+				\vskip5pt
+				\newlinechar`\^^M\everyeof{\noexpand}\scantokens{#1}\par
+			\endbreakbox
+		\endgroup
+	\medbreak
+	\endgroup
+}
+\begingroup
+	\catcode`\<13 \catcode`\>13
+	\gdef\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
+		\bgroup
+			\verb at eol@error \let\do\@makeother \dospecials
+			\verbatim at font\@noligs
+			\catcode`\<13 \catcode`\>13 \def<{\begingroup$\langle$\itshape}\def>{\/$\rangle$\endgroup}%
+			\@ifstar\@sverb\@verb}
+\endgroup
+\def\longfrhlstdate at i#1/#2/#3\@nil{\number#3\relax\space \ifcase#2 \or janvier\or f\xE9vrier\or mars\or avril\or mai\or juin\or juillet\or aout\or septembre\or octobre\or novembre\or d\xE9cembre\fi\space#1}
+\edef\longfrhlstdate{\expandafter\longfrhlstdate at i\skvdate\@nil}
+\def\<#1>{$\langle$\textit{#1}$\rangle$}
+\makeatother
+
+\begin{document}
+\parindent=0pt
+\thispagestyle{empty}
+\begin{titlepage}
+	\begingroup
+		\centering
+		\null\vskip.25\vsize
+		{\large\bfseries L'extension pour \TeX/\LaTeX\par \Huge \skvname\par}
+		\bigbreak
+		v \skvver
+		\smallbreak
+		\longfrhlstdate
+		\vskip1.5cm
+		Christian \bsc{Tellechea}\par
+		\texttt{unbonpetit at netc.fr}\par
+	\endgroup
+	\vskip2cm
+	\leftskip=.2\linewidth \rightskip=.2\linewidth \small
+	Cette petite extension est une impl\xE9mentation d'un syst\xE8me dit  \xE0 \xABcl\xE9/valeurs\xBB pour \TeX{} ou \LaTeX. Aucune fioriture inutile n'a \xE9t\xE9 cod\xE9e, elle comporte juste l'essentiel.
+\end{titlepage}
+
+\section{Cl\xE9s, valeurs}
+Lorsqu'une macro doit recevoir des param\xE8tres dont le nombre n'est pas fixe ou connu, il est commode de proc\xE9der par \<cl\xE9s> et \<valeurs>. Beaucoup d'extensions allant en ce sens existent d\xE9j\xE0.
+
+Le but de celle-ci n'est pas de grossir le nombre d\xE9j\xE0 trop grand de ces extensions, c'est simplement un morceau de l'extension \texttt{hlist} qui a \xE9t\xE9 converti en extension car ce syst\xE8me \<cl\xE9>/\<valeurs> est \xE9galement utilis\xE9 par l'extension \texttt{scratch}.\medskip
+
+Voici bri\xE8vement les d\xE9finitions et les limitations des structures mises \xE0 disposition :
+
+\begin{itemize}
+	\item une \<cl\xE9> est un mot d\xE9signant un param\xE8tre; il est form\xE9 de pr\xE9f\xE9rence avec des caract\xE8res de code de cat\xE9gorie 11 (lettres), 12 (autres caract\xE8res sauf la virgule) et 10 (l'espace). On peut cependant y mettre des caract\xE8res ayant d'autres codes de cat\xE9gorie, dans la limitation de ce qui est admis dans la primitive \verb|\detokenize|;
+	\item la syntaxe pour assigner une \<valeur> \xE0 une \<cl\xE9> est : \hbox{\<cl\xE9>=\<valeur>};
+	\item les espaces qui pr\xE9c\xE8dent et qui suivent la \<cl\xE9> et la \<valeur> sont ignor\xE9s, mais \emph{pas ceux} qui se trouvent \xE0 l'int\xE9rieur de la \<cl\xE9> ou de la \<valeur>;
+	\item une \<valeur> est un \<code> arbitraire;
+	\item si une \<valeur> est entour\xE9e d'accolades, ces derni\xE8res seront retir\xE9es : \verb|<cl\xE9>=<valeur>| est donc \xE9quivalent \xE0 \verb|<cl\xE9>={<valeur>}|;
+	\item lorsque plusieurs couples de \<cl\xE9s>/\<valeurs> doivent \xEAtre sp\xE9cifi\xE9s, ils sont s\xE9par\xE9s les uns des autres par des virgules;
+	\item une virgule ne peut figurer dans une \<valeur> que si la virgule est dans un niveau d'accolades; par exemple, \verb|foo=1,5| n'est pas valide car la \<valeur> s'\xE9tend jusqu'au 1. Il faudrait \xE9crire \verb|foo={1,5}| pour sp\xE9cifier une valeur de \verb|1,5|;
+	\item lorsqu'une valeur est entour\xE9e de \emph{plusieurs} d'accolades, seul le niveau externe est retir\xE9;
+	\item les \<valeurs> sont stock\xE9es \emph{telles qu'elles sont lues} ; en particulier, aucun d\xE9veloppement n'est effectu\xE9;
+	\item les d\xE9finitions sont \emph{locales} : par cons\xE9quent, toute \<cl\xE9> d\xE9finie ou modifi\xE9e dans un groupe est restaur\xE9e \xE0 son \xE9tat ant\xE9rieur \xE0 la sortie du groupe;
+	\item des \<cl\xE9>/\<valeurs> destin\xE9es \xE0 une m\xEAme macro ou \xE0 un m\xEAme usage doivent \xEAtre regroup\xE9es dans un ensemble dont on choisit le nom. Un tel ensemble est appel\xE9 \<trousseau>.
+\end{itemize}
+
+\section{Commandes mises \xE0 disposition}
+
+\paragraph{La macro \texttt{\char`\\setKVdefault}}
+Cette commande est un pr\xE9alable \xE0 toute utilisation de \<cl\xE9s> puisqu'elle d\xE9finit un \<trousseau> contenant des \<cl\xE9s> et leurs \<valeurs> par d\xE9faut.
+
+On \xE9crit
+\begin{center} \verb|\setKVdefault[<trousseau>]{<cl\xE9 1>=<valeur 1>,<cl\xE9 2>=<valeur 2>,...,<cl\xE9 i>=<valeur i>}|
+\end{center}
+
+Il faut noter que
+\begin{itemize}
+	\item l'argument entre accolades contenant les \<cl\xE9s> et les \<valeurs> ne peut pas \xEAtre vide;
+	\item le nom du \<trousseau>, bien qu'entre crochet, est \emph{obligatoire}, mais il peut \xEAtre vide bien que cela ne soit pas conseill\xE9;
+	\item si plusieurs \<cl\xE9s> sont identiques, seule la derni\xE8re \<valeur> sera prise en compte;
+	\item les \<valeurs> peuvent \xEAtre bool\xE9ennes, auquel cas, elles \emph{doivent} \xEAtre \xAB\texttt{true}\xBB ou \xAB\texttt{false}\xBB en caract\xE8res de catcode 11;
+	\item si une \<valeur> est omise, elle est comprise comme \xE9tant \xAB\texttt{true}\xBB. Ainsi, \xE9crire
+	\code|\setKVdefault[foo]{mon bool}|
+	est \xE9quivalent \xE0
+	\code|\setKVdefault[foo]{mon bool = true}|
+	\item il est \emph{d\xE9conseill\xE9} d'ex\xE9cuter plusieurs fois \verb|\setKVdefault| pour le m\xEAme \<trousseau>. Si cela est indispensable, il convient de red\xE9finir \emph{toutes} les \<cl\xE9s> qui figuraient dans les pr\xE9c\xE9dents appels de \verb|\setKVdefault|.
+\end{itemize}
+
+\paragraph{La macro \texttt{\char`\\setKV}}
+Cette macro fonctionne selon les m\xEAmes principes et limitations que \verb|\setKVdefault|, sauf qu'elle red\xE9finit une ou plusieurs \<cl\xE9s> dont les \<valeurs> ont pr\xE9c\xE9demment \xE9t\xE9 d\xE9finies par \verb|\setKVdefault|.
+
+Si une \<cl\xE9> n'a pas \xE9t\xE9 pr\xE9d\xE9finie par \verb|\setKVdefault|, une erreur sera \xE9mise.
+
+\paragraph{La macro \texttt{\char`\\useKV}}
+Cette macro purement d\xE9veloppable renvoie la \<valeur> pr\xE9alablement associ\xE9e \xE0 une \<cl\xE9> dans un \<trousseau>:
+\code|\useKV[<trousseau>]{<cl\xE9>}|
+
+Il faut noter que
+\begin{itemize}
+	\item si la \<cl\xE9> n'a pas \xE9t\xE9 pr\xE9d\xE9finie par \verb|\setKVdefault|, une erreur sera \xE9mise;
+	\item si la \<cl\xE9> est bool\xE9enne, le texte \xAB\texttt{true}\xBB ou \xAB\texttt{false}\xBB sera renvoy\xE9;
+	\item il faut 2 d\xE9veloppements \xE0 \verb|\useKV[<trousseau>]{<cl\xE9>}| pour donner la \<valeur> associ\xE9e \xE0 la \<cl\xE9>.
+\end{itemize}
+
+\exemple|\setKVdefault[foo]{nombre = 5 , lettres= AB \textit{CD} , mon bool}
+a) \useKV[foo]{nombre}.\qquad   b) \useKV[foo]{lettres}.\qquad   c) \useKV[foo]{mon bool}.\par
+\setKV[foo]{lettres = X Y Z \textbf{123} }
+a) \useKV[foo]{nombre}.\qquad   b) \useKV[foo]{lettres}.\qquad   c) \useKV[foo]{mon bool}.|
+
+\paragraph{La macro \texttt{\char`\\useKVdefault}}
+L'ex\xE9cution de cette macro par \verb|\useKVdefault[<trousseau>]| r\xE9initialise toutes les \<cl\xE9s> du \<trousseau> aux \<valeurs> qui ont \xE9t\xE9 d\xE9finies lors de l'ex\xE9cution \verb|\setKVdefault|.
+
+\paragraph{La macro \texttt{\char`\\ifboolKV}}
+Cette macro permet, selon la valeur d'une \<cl\xE9 bool\xE9enne>, d'ex\xE9cuter un des deux \<codes> donn\xE9s. La syntaxe est
+\code|\ifboolKV[<trousseau>]{<cl\xE9>}{<code si "true">}{<code si "false>}|
+
+La macro est purement d\xE9veloppable, elle n\xE9cessite 2 d\xE9veloppements pour donner l'un des deux codes, et exige que la \<cl\xE9> soit bool\xE9enne sans quoi un message d'erreur est \xE9mis.
+
+\paragraph{La macro \texttt{\char`\\showKV}}
+Cette commande \xE9crit dans le fichier \texttt{log} la \<valeur> assign\xE9e \xE0 une \<cl\xE9> d'un \<trousseau>:
+\code|\showKV[<trousseau>]{<cl\xE9>}|
+
+Si la \<cl\xE9> n'est pas d\xE9finie, \xAB\texttt{not defined}\xBB est affich\xE9 dans le fichier log.
+
+\section{Un exemple d'utilisation}
+Voici comment on pourrait programmer une macro qui affiche un cadre sur une ligne. Pour cela les \<cl\xE9s> suivantes seront utilis\xE9es:
+\begin{itemize}
+	\item le bool\xE9en \texttt{inline} qui affichera le cadre dans le texte s'il est vrai et sur une ligne d\xE9di\xE9 s'il est faux;
+	\item \texttt{left code} et \texttt{right code} qui sont deux codes ex\xE9cut\xE9s avant et apr\xE8s le cadre si le bool\xE9en est faux (par d\xE9faut : \verb|\hfill| et \verb|\hfill| pour un centrage sur la ligne);
+	\item \texttt{sep} qui est une dimension mesurant la distance entre le texte et le cadre (par d\xE9faut \texttt{3pt});
+	\item \texttt{width} qui est la largeur des traits du cadre (par d\xE9faut \texttt{0.5pt}).
+\end{itemize}
+
+\exemple|\setKVdefault[frame]{inline , left code = \hfill, right code = \hfill, sep = 3pt, width=0.5pt }
+\newcommand\frametxt[2][]{%
+	\setKV[frame]{#1}% lit les arguments optionnels
+	\ifboolKV[frame]{inline}{}{\par\noindent\useKV[frame]{left code}}%
+	\fboxsep=\useKV[frame]{sep}\relax
+	\fboxrule=\useKV[frame]{width}\relax
+	\fbox{#2}%
+	\ifboolKV[frame]{inline}{}{\useKV[frame]{right code}\null\par}%
+}
+Un essai en ligne par d\xE9faut \frametxt{essai} puis un autre \frametxt[sep=5pt,width=2pt]{essai}
+et un dernier \frametxt[sep=0.5pt]{essai}.
+
+\useKVdefault[frame]% revenir au valeurs par d\xE9faut
+Un essai centr\xE9 \frametxt[inline = false]{essai centr\xE9}
+un autre fer \xE0 gauche \frametxt[left code={}]{essai \xE0 gauche}
+un dernier indent\xE9 \frametxt[left code=\hskip 5em, right code={}, sep=1pt, width=2pt]{essai indent\xE9}|
+
+
+\section{Le code}
+Le code ci-dessous est l'exact verbatim du fichier \verb|simplekv.tex| :
+
+\lstinputlisting[
+		language=TeX,
+		moretexcs={unless,ifcsname,ifdefined,detokenize,numexpr,dimexpr,glueexpr,unexpanded},
+		basicstyle=\small\ttfamily\color{black!25},
+		identifierstyle=\bfseries\color{white},%
+		backgroundcolor=\color{black!85},
+		keywordstyle=\bfseries\color{orange},
+		commentstyle=\color{cyan!66},
+		columns=fixed,
+		alsoletter={\_},
+		tabsize=2,
+		extendedchars=true,
+		showspaces=false,
+		showstringspaces=false,
+		numbers=left,
+		numberstyle=\tiny\ttfamily\color{black},
+		breaklines=true,
+		prebreak={\hbox{$\rhookswarrow$}},
+		breakindent=3em,
+		breakautoindent=true,
+		xleftmargin=1em,
+		xrightmargin=0pt,
+		lineskip=0pt,
+		numbersep=1em,
+		classoffset=1,
+		alsoletter={\_},
+		morekeywords={setKVdefault,setKV,useKVdefault,useKV,ifboolKV,},
+		keywordstyle=\bfseries\color{red!85!black},
+		classoffset=0,
+		]{simplekv.tex}
+\end{document}
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv-fr.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex	2017-08-08 20:40:20 UTC (rev 44986)
@@ -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                                     |
+|-----------------------------------------------------------------------------|


Property changes on: trunk/Master/texmf-dist/doc/generic/simplekv/simplekv.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.sty	2017-08-08 20:40:20 UTC (rev 44986)
@@ -0,0 +1,4 @@
+% !TeX encoding = ISO-8859-1
+\input simplekv.tex
+\ProvidesPackage{simplekv}[\skvdate\space v\skvver\space Simple keyval package (CT)]
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/generic/simplekv/simplekv.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2017-08-08 20:38:58 UTC (rev 44985)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2017-08-08 20:40:20 UTC (rev 44986)
@@ -558,7 +558,7 @@
     show2e showcharinbox showdim showexpl showhyphens showlabels showtags
     shuffle
     sidecap sidenotes sides signchart silence
-    simple-resume-cv simple-thesis-dissertation simplecd simplecv
+    simple-resume-cv simple-thesis-dissertation simplecd simplecv simplekv
     simpler-wick simplewick simplified-latex simurgh
     sitem siunitx
     skak skaknew skb skdoc skeycommand skeyval skmath skrapport skull

Modified: trunk/Master/tlpkg/tlpsrc/collection-plaingeneric.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-plaingeneric.tlpsrc	2017-08-08 20:38:58 UTC (rev 44985)
+++ trunk/Master/tlpkg/tlpsrc/collection-plaingeneric.tlpsrc	2017-08-08 20:40:20 UTC (rev 44986)
@@ -74,6 +74,7 @@
 depend resumemac
 depend schemata
 depend shade
+depend simplekv
 depend systeme
 depend tabto-generic
 depend termmenu

Added: trunk/Master/tlpkg/tlpsrc/simplekv.tlpsrc
===================================================================


More information about the tex-live-commits mailing list