<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% !TeX TS-program = lualatex
% !TeX encoding = UTF-8
% Ceci est la documentation du package "simplekv"
\documentclass[french,a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=2cm]{geometry}
\usepackage[bottom]{footmisc}
\usepackage{libertine,boites,tikz,enumitem,babel,xspace,listings,simplekv,hyperref}
\usepackage[scaled=0.8]{GoMono}
\frenchbsetup{og=Â«,fg=Â»}
\def\eTeX{\hbox{$\varepsilon$-\TeX}}
\def\SKV{\texttt{\skvname}\xspace}
\makeatletter
\def\code{\expandafter\code@i\string}
\def\code@i#1{%
	\begingroup
		\par\nobreak\medskip\parindent0pt
		\leftskip.1\linewidth
		\make@car@active\^^I{\leavevmode\space\space\space\space}%
		\let\do\@makeother \dospecials
		\ttfamily\small\@noligs
		\make@car@active\&lt;{\begingroup$\langle$\itshape}%
		\make@car@active\&gt;{\/$\rangle$\endgroup}%
		\obeylines\obeyspaces
		\def\code@ii##1#1{##1\par\medbreak\endgroup}%
		\code@ii
}
\long\def\grab@toks#1\relax{\gdef\right@content{#1}}

\newcommand\disable@lig[1]{%
	\catcode`#1\active
	\begingroup
		\lccode`\~`#1\relax
		\lowercase{\endgroup\def~{\leavevmode\kern\z@\string#1}}%
}

\newcommand\make@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@car@active\ { {}}%
		\make@car@active\^^M{\par\leavevmode}%
		\make@car@active\^^I{\space\space}%
		\make@car@active\,{\leavevmode\kern\z@\string,}%
		\make@car@active\-{\leavevmode\kern\z@\string-}%
		\make@car@active\&gt;{\leavevmode\kern\z@\string&gt;}%
		\make@car@active\&lt;{\leavevmode\kern\z@\string&lt;}%
		\@makeother\;\@makeother\!\@makeother\?\@makeother\:% neutralise frenchb
		\exemple@@
}

\newcommand\exemple@@[1]{%
	\def\@tempa##1#1{\exemple@@@{##1}}%
	\@tempa
}

\newcommand\exemple@@@[1]{%
	\xdef\the@code{#1}%
	\endgroup
		\begingroup
			\fboxrule0.4pt \fboxsep=5pt
			\let\breakboxparindent\z@
			\def\bkvz@top{\hrule\@height\fboxrule}%
			\def\bkvz@bottom{\hrule\@height\fboxrule}%
			\let\bkvz@before@breakbox\relax
			\def\bkvz@set@linewidth{\advance\linewidth\dimexpr-2\fboxrule-2\fboxsep\relax}%
			\def\bkvz@left{\vrule\@width\fboxrule\kern\fboxsep}%
			\def\bkvz@right{\kern\fboxsep\vrule\@width\fboxrule}%
			\breakbox
				\kern.5ex\relax
				\begingroup
					\ttfamily\small\the@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`\&lt;13 \catcode`\&gt;13
	\gdef\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
		\bgroup
			\verb@eol@error \let\do\@makeother \dospecials
			\verbatim@font\@noligs
			\catcode`\&lt;13 \catcode`\&gt;13 \def&lt;{\begingroup$\langle$\itshape}\def&gt;{\/$\rangle$\endgroup}%
			\@ifstar\@sverb\@verb}
\endgroup
\def\longfrhlstdate@i#1/#2/#3\@nil{\number#3\relax\space \ifcase#2 \or janvier\or fÃ©vrier\or mars\or avril\or mai\or juin\or juillet\or aout\or septembre\or octobre\or novembre\or dÃ©cembre\fi\space#1}
\edef\longfrhlstdate{\expandafter\longfrhlstdate@i\skvdate\@nil}
\def\&lt;#1&gt;{$\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@netc.fr}\par
	\endgroup
	\vskip2cm
	\leftskip=.2\linewidth \rightskip=.2\linewidth \small
	Cette petite extension est une implÃ©mentation d'un systÃ¨me dit  Ã&nbsp; Â«\&lt;clÃ©s&gt;/\&lt;valeurs&gt;Â» pour \TeX{} ou \LaTeX. Elle comporte juste l'essentiel, aucune fioriture inutile n'a Ã©tÃ© codÃ©e et aucune extension tierce n'est nÃ©cessaire Ã&nbsp; son fonctionnement.
\end{titlepage}

Cette petite extension se veut minimaliste. Trop sans doute puisqu'on ne la juge pas au niveau d'autres, jugÃ©es plus Â« \href{https://tex.stackexchange.com/questions/560014/}{sÃ©rieuses}\footnote{C'est ainsi que Joseph Wright, qu'il ne faut prier pour me savonner la planche, la qualifie. C'est que sur TeX.stackexchange, on est entre-soi, c'est-Ã&nbsp;-dire entre experts raisonnables qui savent de quoi ils parlent. On fait mine de s'Ã©tonner et on rÃ©primande, tel un enfant qui ne sait pas ce qu'il fait, un utilisateur qui vient s'enquÃ©rir du fonctionnement de simplekv ! Ce genre de sous-package est mal vu et indÃ©sirable lÃ&nbsp; bas, il faut vite faire rentrer dans le rang la brebis Ã©garÃ©e.}.Â»

Quoiqu'il en soit, simplekv a le mÃ©rite d'exister et se place Ã&nbsp; l'opposÃ© des usines Ã&nbsp; gaz que l'on peut trouver dans cet exercice de style. Elle est Ã©crite en \TeX{}, fonctionne donc sous tous les moteurs et ne requiert aucun package.

\section{ClÃ©s, valeurs}
Lorsqu'une macro doit recevoir des paramÃ¨tres dont le nombre n'est pas fixe ou connu, il est commode de procÃ©der par \&lt;clÃ©s&gt; et \&lt;valeurs&gt;.
\medskip
Voici briÃ¨vement les dÃ©finitions et les limitations des structures mises Ã&nbsp; disposition :

\begin{itemize}
	\item une \&lt;clÃ©&gt; est un mot dÃ©signant un paramÃ¨tre; il est formÃ© de prÃ©fÃ©rence avec des caractÃ¨res de code de catÃ©gorie 11 (lettres), 12 (autres caractÃ¨res sauf la virgule et le signe \verb|=|) et 10 (l'espace). On peut cependant y mettre des caractÃ¨res ayant d'autres codes de catÃ©gorie, dans la limitation de ce qui est admis dans la primitive \verb|\detokenize|; une \&lt;clÃ©&gt;, mÃªme si cela revÃªt peu de signification, peut Ãªtre vide;
	\item la syntaxe pour assigner une \&lt;valeur&gt; Ã&nbsp; une \&lt;clÃ©&gt; est : \hbox{\&lt;clÃ©&gt;=\&lt;valeur&gt;};
	\item les espaces qui prÃ©cÃ¨dent et qui suivent la \&lt;clÃ©&gt; et la \&lt;valeur&gt; sont ignorÃ©s, mais \emph{pas ceux} qui se trouvent Ã&nbsp; l'intÃ©rieur de la \&lt;clÃ©&gt; ou de la \&lt;valeur&gt;;
	\item une \&lt;valeur&gt; est un \&lt;code&gt; arbitraire;
	\item si une \&lt;valeur&gt; est entourÃ©e d'accolades, ces derniÃ¨res seront retirÃ©es : \verb|&lt;clÃ©&gt;=&lt;valeur&gt;| est donc Ã©quivalent Ã&nbsp; \verb|&lt;clÃ©&gt;={&lt;valeur&gt;}|;
	\item lorsqu'une valeur est entourÃ©e de \emph{plusieurs} imbrications d'accolades, seul le niveau externe est retirÃ© et donc \verb|&lt;clÃ©&gt;={{&lt;valeur&gt;}}| est compris comme \verb|&lt;clÃ©&gt;={&lt;valeur&gt;}|; (un bug antÃ©rieur Ã&nbsp; la version 0.2a faisait que ce dernier point n'Ã©tait pas vrai)
	\item lorsque plusieurs couples de \&lt;clÃ©s&gt;/\&lt;valeurs&gt; doivent Ãªtre spÃ©cifiÃ©s, ils sont sÃ©parÃ©s les uns des autres par des virgules;
	\item une virgule ne peut figurer dans une \&lt;valeur&gt; que si la virgule est entre accolades; par exemple, \verb|foo=1,5| n'est pas valide car la \&lt;valeur&gt; s'Ã©tend jusqu'au 1. Il faudrait Ã©crire \verb|foo={1,5}| pour spÃ©cifier une valeur de \verb|1,5|;
	\item les \&lt;valeurs&gt; sont stockÃ©es \emph{telles qu'elles sont lues} ; en particulier, aucun dÃ©veloppement n'est effectuÃ©;
	\item les dÃ©finitions sont \emph{locales} : par consÃ©quent, toute \&lt;clÃ©&gt; dÃ©finie ou modifiÃ©e dans un groupe est restaurÃ©e Ã&nbsp; son Ã©tat antÃ©rieur Ã&nbsp; la sortie du groupe;
	\item des \&lt;clÃ©&gt;/\&lt;valeurs&gt; destinÃ©es Ã&nbsp; une mÃªme macro ou Ã&nbsp; un mÃªme usage doivent Ãªtre regroupÃ©es dans un ensemble dont on choisit le nom. Un tel ensemble est appelÃ© \&lt;trousseau&gt;.
\end{itemize}

\section{Commandes mises Ã&nbsp; disposition}

\paragraph{Les macros \texttt{\char`\\setKV} et \texttt{\char`\\setKVdefault}}
Ces commandes dÃ©finissent des \&lt;clÃ©s&gt; et leur assignent des \&lt;valeurs&gt; dans un \&lt;trousseau&gt;. La seule diffÃ©rence entre les deux macros est que \verb|\setKVdefault|, en plus d'assigner les \&lt;valeurs&gt; aux \&lt;clÃ©s&gt;, les sauvegarde en vue d'une restauration ultÃ©rieure avec \verb|\restoreKV|.

On Ã©crit
\code|\setKV[&lt;trousseau&gt;]{&lt;clÃ© 1&gt;=&lt;valeur 1&gt;,&lt;clÃ© 2&gt;=&lt;valeur 2&gt;,...,&lt;clÃ© n&gt;=&lt;valeur n&gt;}|

Il faut noter que
\begin{itemize}
	\item un ensemble \&lt;clÃ©&gt;=\&lt;valeur&gt; rÃ©duit Ã&nbsp; 0 caractÃ¨re aprÃ¨s suppression des espaces est ignorÃ©;
	\item lors de la lecture des \&lt;clÃ©s&gt;/\&lt;valeurs&gt;, la virgule et le signe Ã©gal doivent avoir un catcode de 12 sans quoi ils ne seront pas compris comme frontiÃ¨res entre \&lt;clÃ©s&gt; et \&lt;valeurs&gt; et ne joueront pas leur rÃ´le;
	\item le nom du \&lt;trousseau&gt;, bien qu'entre crochets, est \emph{obligatoire}, mais il peut Ãªtre vide bien que cela ne soit pas conseillÃ©;
	\item les espaces autour du nom du \&lt;trousseau&gt; ne sont \emph{pas} retirÃ©s et donc le trousseau Â«\verb|foo|Â» n'est pas le mÃªme que le trousseau Â«\verb*|foo |Â»
	\item si une mÃªme \&lt;clÃ©&gt; figure plusieurs fois, la \&lt;valeur&gt; retenue sera celle de la derniÃ¨re assignation;
	\item les \&lt;valeurs&gt; peuvent Ãªtre boolÃ©ennes auquel cas, elles \emph{doivent} Ãªtre Â«\texttt{true}Â» ou Â«\texttt{false}Â» en caractÃ¨res de catcode 11;
	\item si une \&lt;valeur&gt; est omise, elle est comprise comme Ã©tant Â«\texttt{true}Â». Ainsi, Ã©crire
		\code|\setKV[foo]{mon bool}|
	est Ã©quivalent Ã&nbsp;
		\code|\setKV[foo]{mon bool = true}|
\end{itemize}

\paragraph{La macro \texttt{\char`\\useKV}}
Cette macro purement dÃ©veloppable renvoie la \&lt;valeur&gt; prÃ©alablement associÃ©e Ã&nbsp; une \&lt;clÃ©&gt; dans un \&lt;trousseau&gt;:
	\code|\useKV[&lt;trousseau&gt;]{&lt;clÃ©&gt;}|

Il faut noter que
\begin{itemize}
	\item si la \&lt;clÃ©&gt; n'a pas Ã©tÃ© dÃ©finie, une erreur sera Ã©mise (un bug faisait que ce n'Ã©tait pas le cas avant la version 0.2a);
	\item si la \&lt;clÃ©&gt; est boolÃ©enne, le texte Â«\texttt{true}Â» ou Â«\texttt{false}Â» sera renvoyÃ©;
	\item il faut 2 dÃ©veloppements Ã&nbsp; \verb|\useKV[&lt;trousseau&gt;]{&lt;clÃ©&gt;}| pour donner la \&lt;valeur&gt; associÃ©e Ã&nbsp; la \&lt;clÃ©&gt;.
\end{itemize}

\exemple|\setKV[foo]{nombre = 5 , lettres= AB \textit{CD} , mon bool}
a) \useKV[foo]{nombre}.\qquad   b) \useKV[foo]{lettres}.\qquad   c) \useKV[foo]{mon bool}.

\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`\\restoreKV}}
La macro \verb|\restoreKV[&lt;trousseau&gt;]| rÃ©initialise toutes les \&lt;clÃ©s&gt; du \&lt;trousseau&gt; aux \&lt;valeurs&gt; qui ont Ã©tÃ© dÃ©finies lors de l'exÃ©cution \verb|\setKVdefault|. La macro \verb|\useKVdefault[&lt;trousseau&gt;]| lui est Ã©quivalente.

\paragraph{La macro \texttt{\char`\\ifboolKV}}
Cette macro permet, selon la valeur d'une \&lt;clÃ© boolÃ©enne&gt;, d'exÃ©cuter un des deux \&lt;codes&gt; donnÃ©s. La syntaxe est
	\code|\ifboolKV[&lt;trousseau&gt;]{&lt;clÃ©&gt;}{&lt;code si "true"&gt;}{&lt;code si "false&gt;}|

La macro est purement dÃ©veloppable, elle nÃ©cessite 2 dÃ©veloppements pour donner l'un des deux codes, et exige que la \&lt;clÃ©&gt; soit boolÃ©enne sans quoi un message d'erreur est Ã©mis.

\paragraph{La macro \texttt{\char`\\showKV}}
Cette commande Ã©crit dans le fichier \texttt{log} la \&lt;valeur&gt; et le \&lt;code&gt; assignÃ©s Ã&nbsp; une \&lt;clÃ©&gt; d'un \&lt;trousseau&gt;:
	\code|\showKV[&lt;trousseau&gt;]{&lt;clÃ©&gt;}|

Si la \&lt;clÃ©&gt; n'est pas dÃ©finie, Â«\texttt{not defined}Â» est affichÃ© dans le fichier log. Il en est de mÃªme pour le \&lt;code&gt;.

\section{Code}
En plus d'une \&lt;valeur&gt;, un \&lt;code&gt; arbitraire peut Ãªtre assignÃ© Ã&nbsp; n'importe quelle \&lt;clÃ©&gt;. Pour ce faire, on Ã©crit
\begin{center} \verb|\defKV[&lt;trousseau&gt;]{&lt;clÃ© 1&gt;=&lt;code 1&gt;,&lt;clÃ© 2&gt;=&lt;code 2&gt;,...,&lt;clÃ© n&gt;=&lt;code n&gt;}|
\end{center}
Chaque \&lt;code&gt; peut contenir Â«\verb|#1|Â» qui reprÃ©sente la \&lt;valeur&gt; de la \&lt;clÃ©&gt;. Ce \&lt;code&gt; est exÃ©cutÃ© lorsque une \&lt;valeur&gt; est assignÃ©e Ã&nbsp; la \&lt;clÃ©&gt; avec \verb|\setKV|, \verb|\setKVdefault| ou \verb|\restoreKV|.
\bigbreak

Ainsi dÃ©clarer
	\code|\defKV[x]{ mykey = \def\foo{\textbf{#1}}|
va dÃ©finir une macro \verb|\foo| dÃ¨s que la \&lt;clÃ©&gt; Â«\texttt{mykey}Â» va Ãªtre dÃ©finie (ou redÃ©finie) et donc, si l'on Ã©crit
	\code|\setKV[x]{ mykey = bonjour }|
le code qui est exÃ©cutÃ© en coulisses est
	\code|\def\foo{\textbf{bonjour}}|

\exemple|\defKV[x]{ mykey = \def\foo{\textbf{#1}} }
\setKV[x]{ mykey = bonjour }% dÃ©finition
1) \meaning\foo\par
2) \useKV[x]{ mykey }

\setKV[x]{ mykey = hello }% redÃ©finition
3) \meaning\foo\par
4) \useKV[x]{ mykey }|

La macro \verb|\testboolKV| permet de tester, par exemple dans un \&lt;code&gt;, si son argument est Â«trueÂ» ou Â«falseÂ»
	\code|\testboolKV{&lt;argument&gt;}{&lt;code si true&gt;}{&lt;code si false&gt;}|

La macro est purement dÃ©veloppable, elle nÃ©cessite 2 dÃ©veloppements pour donner l'un des deux codes, et exige que l'\&lt;argument&gt; soit boolÃ©en sans quoi un message d'erreur est Ã©mis.

\exemple|\defKV[x]{ x = \def\test{\testboolKV{#1}{test positif}{test nÃ©gatif}}}
\setKV[x]{ x = true}
1) \test

\setKV[x]{ x= false}
2) \test|
Toute autre valeur que Â«\verb|true|Â» ou Â«\verb|false|Â» gÃ©nÃ¨rera un message d'erreur.

\section{Un exemple d'utilisation}
Voici comment on pourrait programmer une macro qui affiche un cadre sur une ligne, grÃ¢ce Ã&nbsp; la macro \verb|\fbox| et l'environnement \verb|center| de \LaTeX. Pour cela les \&lt;clÃ©s&gt; suivantes seront utilisÃ©es:
\begin{itemize}
	\item le boolÃ©en \texttt{inline} qui affichera le cadre dans le texte s'il est vrai et sur une ligne dÃ©diÃ© s'il est faux;
	\item \texttt{sep} qui est une dimension mesurant la distance entre le texte et le cadre (par dÃ©faut \texttt{3pt});
	\item \texttt{width} qui est la largeur des traits du cadre (par dÃ©faut \texttt{0.5pt});
	\item \texttt{style} qui contient le code exÃ©cutÃ© avant le texte.
\end{itemize}

Une premiÃ¨re faÃ§on de faire, sans recours Ã&nbsp; \verb|\defKV|;
\exemple|\setKVdefault[frame]{
	sep        = 3pt,
	line width = 0.5pt,
	style      = \bfseries,
	inline
	}
\newcommand\frametxt[2][]{%
	\restoreKV[frame]% revenir au valeurs par dÃ©faut
	\setKV[frame]{#1}% lit les arguments optionnels
	\fboxsep = \useKV[frame]{sep}
	\fboxrule= \useKV[frame]{line width}
	\ifboolKV[frame]{inline}
		{}
		{\begin{center}}%
	\fbox{\useKV[frame]{style}#2}%
	\ifboolKV[frame]{inline}
		{}
		{\end{center}}%
}
Un essai en ligne par dÃ©faut \frametxt{essai} puis un autre \frametxt[sep=5pt,line width=2pt]{essai}
et un dernier \frametxt[sep=1pt,style=\itshape]{essai}.

Un essai hors ligne : \frametxt[inline = false, style=\bfseries\color{red}]{essai centrÃ©}|

Dans l'exemple repris ci-dessous et grÃ¢ce Ã&nbsp; \verb|\defKV|, on stocke tous les paramÃ¨tres lors de leur assignation. Il y a bien moins de verbositÃ© dans le code de \verb|frametxt| ce qui le rend plus lÃ©ger et plus lisible.

\exemple|\defKV[frame]{%
	sep        = {\fboxsep = #1 },
	line width = {\fboxrule= #1 },
	inline     = \testboolKV{#1}
                    {\def\hookpre{}\def\hookpost{}}
                    {\def\hookpre{\begin{center}}\def\hookpost{\end{center}}},
	style      = \def\fstyle{#1}
}
\setKVdefault[frame]{
	sep        = 3pt,
	line width = 0.5pt,
	style      = \bfseries,
	inline
	}
\newcommand\frametxt[2][]{%
	\restoreKV[frame]% revenir au valeurs par dÃ©faut
	\setKV[frame]{#1}% lit les arguments optionnels
	\hookpre
	\fbox{\fstyle #2}%
	\hookpost
}
Un essai en ligne par dÃ©faut \frametxt{essai} puis un autre \frametxt[sep=5pt,line width=2pt]{essai}
et un dernier \frametxt[sep=1pt,style=\itshape]{essai}.

Un essai hors ligne : \frametxt[inline = false, style=\bfseries\color{red}]{essai centrÃ©}|

\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,expanded},
		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{$\hookleftarrow$}},
		breakindent=3em,
		breakautoindent=true,
		xleftmargin=1em,
		xrightmargin=0pt,
		lineskip=0pt,
		numbersep=1em,
		classoffset=1,
		alsoletter={\_},
		morekeywords={setKVdefault,setKV,useKVdefault,useKV,ifboolKV,defKV,testboolKV,showKV},
		keywordstyle=\bfseries\color{red!85!black},
		classoffset=0,
		]{simplekv.tex}
\end{document}</pre></body></html>