% \iffalse meta-comment % %%%% Copyright (C) 2004, 2020 by Josselin Noirel %%%% and Yvon Henel aka Le TeXnicien de surface %%%% -------------------------------------------------------- % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % 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 % % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e} %\def\fileversion{v0.1} %\def\filedate{2020/07/27} %\def\fileinfo{d\'efinir et utiliser des paires cle/valeurs} %\def\fileinfo{define and use pair of key/values} %\ProvidesPackage{clefval} % [\filedate\space\fileversion\space\fileinfo] %<*driver> \documentclass[a4paper]{ltxdoc} \usepackage[T1]{fontenc} \usepackage{clefval} \usepackage{xspace,url,multicol,ifthen} \IfFileExists{lmodern.sty}{\usepackage{lmodern}}{} \usepackage[english, main=french]{babel} % commentez la ligne suivante pour avoir un document avec le code % \OnlyDescription % comment out the preceding line to obtain the full code % with explanations in French only, sorry. \EnableCrossrefs \CodelineIndex \RecordChanges \makeatletter %%% quelques redéfinition de commande de la classe ltxdoc.cls ou de %%% l'extension doc.sty pour une documentation en français. \GlossaryPrologue{\section*{{Changements -- Changes}}\markboth{{Changements -- Changes}}{{Changements -- Changes}}} \IndexPrologue{\section*{Index}\markboth{Index}{Index}% \begin{Morciau}\selectlanguage{french} Les nombres en italique renvoient à la page où l'entrée est décrite ; les nombres soulignés renvoient à la ligne de code de la définition ; les nombres en caractères romains renvoient à la ligne de code où l'entrée est utilisée.\EnAnglais Numbers written in italic refer to the page where the corresponding entry is described; numbers underlined refer to the code line of the definition; numbers in roman refer to the code line where the entry is used.\end{Morciau}} \renewcommand{\SpecialMainEnvIndex}[1]{% \@bsphack\special@index{% #1\actualchar {\string\ttfamily\space#1}(environnement)% \encapchar main}% \special@index{environnements:\levelchar{% \string\ttfamily\space#1}\encapchar main}\@esphack} \makeatother \def\generalname{Général} %%% fin de la francisation \setlength{\columnseprule}{0.5pt} \setlength{\multicolsep}{6pt plus 2.0pt minus 1.5pt} \def\FraTitre{\relax} \def\EngTitre{\relax} \newcommand{\TraiteTitre}[1]{\TraiteTitreAux#1/Z} \def\TraiteTitreAux#1/#2/Z{\def\FraTitre{\TitreMorciau{#1}}% \ifthenelse{\equal{#2}{}}{\def\LarGuMent{#1}}{\def\LarGuMent{#2}} \def\EngTitre{\TitreMorciau{\LarGuMent}}} \newcommand{\TitreMorciau}[1]{% \noindent\textbf{#1}\par\noindent\ignorespaces} \newenvironment{Morciau}[1][ZXZXZ]{\raggedcolumns\begin{multicols}{2}% \selectlanguage{french}% \ifthenelse{\equal{#1}{ZXZXZ}}{\relax}{\TraiteTitre{#1}\FraTitre}}% {\end{multicols}} \newcommand{\EnAnglais}{\columnbreak\mbox{} \par\selectlanguage{english}\EngTitre} \newcommand{\NomDeModule}[1]{\texttt{#1.sty}\xspace} \newcommand{\fctt}{\texttt{fr.comp.text.tex}\xspace} \newcommand{\Sourire}{\texttt{;-)}\xspace} \newcommand{\LB}{\linebreak[2]} %%% fin de la personalisation \begin{document} \DocInput{clefval.dtx} \end{document} % % \fi % % \CheckSum{76} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \GetFileInfo{clefval.sty} % % \changes{v0}{2004/05/20}{1\iere version % publique. \textit{\foreignlanguage{english}{1st public version.}}} % \changes{v0.1}{2020/07/27}{Amélioration du message d'erreur dans le % document. \textit{\foreignlanguage{english}{Improved error message % in document.}}} % \changes{v0.1}{2020/07/27}{Version permettant l'utilisation du % codage utf-8 avec \texttt{pdflatex}, \texttt{lualatex} et % \texttt{xelatex}. \textit{\foreignlanguage{english}{This version can % be used in utf-8 encoded source with \texttt{pdflatex}, % \texttt{lualatex} and \texttt{xelatex}.}}} % % \DoNotIndex{\newcommand, \renewcommand, \providecommand,^^A % \def, \let,\csname, \endcsname, \afterassignment,^^A % \long, \global, \gdef, \edef, \xdef, \null, \write,^^A % \newenvironment,\renewenvironment, \expandafter, \relax,^^A % \protect, \begingroup, \endgroup, \bgroup, \egroup^^A % \DeclareOption, \ExecuteOptions, \RequirePackage,^^A % \ProcessOptions, \newif, \fi, \if, \or, \ifnum, \ifcase,\ifx,^^A % \ifvmode, \@ifundefined, \@bsphack, \@esphack,^^A % \nobreak, \if@nobreak, \@onlypreamble, \@unexpandable@protect,^^A % \space, \string, \AtBeginDocument, \AtEndDocument,^^A % \bfseries, \reset@font, \nfss@text, \',^^A % \@latex@warning, \@latex@warning@no@line,^^A % \@testdef, \@namedef, \reserved@a,^^A % \else, \@ctrerr, \text,\textup, \value, \thepage, \@auxout} % % \title{Le module\thanks{Ce document correspond au fichier % \textsf{clefval}~\fileversion, du \filedate.}\hspace{2cm} % The package\thanks{This document corresponds to the file % \textsf{clefval}~\fileversion, dated \filedate.}\\ % \textsf{clefval}} % % \author{Le \TeX nicien de % surface\thanks{\texttt{le.texnicien.de.surface@yvon-henel.fr}}\and % Josselin Noirel} % % \maketitle % % \section{Introduction} % \label{secIntro} % \noindent\textbf{Description}\DescribeMacro{\TheKey}\DescribeMacro{\TheValue} % \begin{Morciau}[Macros~publiques/Public~Macros] % Deux macros \cs{TheKey} et \cs{TheValue} pour définir puis utiliser % des paires clef/valeur. % \EnAnglais % Two macros \cs{TheKey} and \cs{TheValue} to define then use pairs % of key/value. % \end{Morciau} % \begin{Morciau}[Syntaxe/Syntax] % \cs{TheKey}\marg{clé}\marg{valeur} pour définir la \emph{valeur} % associée à la \emph{clé}, ne produit pas de texte ; % \cs{TheValue}\marg{clé} pour insérer la \emph{valeur} associée à la % \emph{clé}. % \EnAnglais % \cs{TheKey}\marg{key}\marg{value} to define the \emph{value} % associated to the \emph{key}, does not produce text ; % \cs{TheValue}\marg{key} to insert the \emph{value} linked to the % \emph{key}. % \end{Morciau} % % % \subsection{Version 0.1} % % \begin{Morciau} % Edd \textsc{Barrett}, le 27 juillet 2020, a signalé sur % \texttt{stackexchange} un problème lié à l'utilisation de % \texttt{clefval}. C'est lui, également, qui a fourni un ECM et % trouvé la cause dudit problème: la présence d'un espace insécable % dans le fichier codé en \texttt{iso-8859-15} entrainait l'arrêt de % \LaTeX{} avec le message: % \EnAnglais % On the 27th July 2020, Edd \textsc{Barrett} wrote on % \texttt{stackexchange} about a problem linked to the use of % \texttt{clefval}. He also wrote a MCE and found the cause of the % said problem: an unbreakable space in the file encoded in % \texttt{iso-8859-15} forced \LaTeX{} to stop with the following % error message: % \end{Morciau} % % \texttt{Package inputenc Error: Invalid UTF-8 byte "A0.} % % \begin{Morciau} % Comme tout le travail avait été fait, il m'a été facile de % corriger l'erreur dans le code. J'en ai profité pour faire % apparaître, \emph{dans le document}, un message d'erreur plus % explicite nommant la clé indéfinie et pour moderniser un peu cette % extension. % \EnAnglais % As all the work was already done I easily wrote the correction in % the code. I've taken the opportunity to make appear, \emph{in the % document}, a more explicit error message in case of undefined key % and to modernise a bit this package. % \end{Morciau} % % \section{Utilisation -- Usage} % % \begin{Morciau}[Procédé/Process] % Le procédé mis en œuvre par ce module est le même que celui des % références classiques de \LaTeX{} avec \cs{label} et \cs{ref}. Il % faut donc deux compilations pour en voir l'effet. % \EnAnglais % \texttt{clefval} uses the process which \LaTeX's \cs{label} and \cs{ref} % use. You must therefore compile twice to obtain the full effect. % \end{Morciau} % \begin{Morciau} % Lors de la 1\iere compilation, \cs{TheKey}\LB|{clé}|\LB|{valeur}| écrit, % dans le fichier \texttt{aux}, \cs{newkey}\LB|{clé}|\LB|{valeur}|. |clé| et % |valeur| sont développés à moins qu'ils ne soient protégés soit pour avoir % été déclarés robustes (voir \cs{DeclareRobustCommand}) soit pour avoir été % protégés (voir \cs{protect}) par vous. % \EnAnglais % During the 1st run of \LaTeX, \cs{TheKey}\LB|{key}|\LB|{value}| writes % \cs{newkey}\LB|{key}|\LB|{value}| in the \texttt{aux} file. |key| % and |value| are expanded unless they are protected since they have been % declared robust (see \cs{DeclareRobustCommand}) or since they have been % protected (see \cs{protect}) by you. % \end{Morciau} % \begin{Morciau} % Lors de la 2\ieme compilation, après lecture du fichier \texttt{aux}, % \cs{TheValue}|{clé}| écrit |valeur|. % \EnAnglais % During the 2nd run, the \texttt{aux} file having been read, % \cs{TheValue}|{key}| writes |value|. % \end{Morciau} % \begin{Morciau}[Attention/Caution] % Les deux arguments de \cs{TheKey} sont \og mobiles \fg au sens de \LaTeX{} % et il faudra donc parfois les protéger. % \EnAnglais % Both arguments of \cs{TheKey} are `moving' as \LaTeX{} defines it and we have % sometimes to protect them. % \end{Morciau} % % \begin{Morciau} % Par ailleurs, les arguments ne doivent pas contenir de saut de % paragraphe (\cs{par}) ---~ou tout autre truc interdit dans les % arguments d'une commande qui n'est pas \cs{long}. % \EnAnglais % In addition the arguments must not contain end of paragraph % (\cs{par}) ---~or any other thingummy which is forbidden in the % arguments of a macro which is not \cs{long}. % \end{Morciau} % % \begin{Morciau}[Exemples/Examples] % On peut écrire % \EnAnglais % On can write % \end{Morciau} % % {\centering \TheKey{clou}{$2+5=7$}|\TheKey{clou}{$2+5=7$}| % \TheKey{glue}{\(2+6=8\)}|\TheKey{glue}{\(2+6=8\)}| % \par} % % \begin{Morciau} % puis \EnAnglais then % \end{Morciau} % % {\centering |\TheValue{clou}|, |\TheValue{glue}|\par} % % \begin{Morciau} % pour obtenir \EnAnglais to obtain % \end{Morciau} % % {\centering \TheValue{clou}, \TheValue{glue}.\par} % % \begin{Morciau} % On peut utiliser |$2+3$| comme clé --- même si on ne voit pas % pourquoi on le ferait --- mais \textbf{pas} |\(2+3\)|. Ce qui % tient à la manière dont les commandes |\(| et |\)| ont été % robustifiées. \emph{Ce n'est pas un bogue mais une fonctionnalité.} % \EnAnglais % On can use |$2+3$| as a key ---and I don't say that one should--- % but \textbf{not} |\(2+3\)|. That is due to the way the macros |\(| % and |\)| have been robustified. \emph{It's not a bug but a feature.} % \end{Morciau} % % % \begin{Morciau}[Avertissements/Warnings] % Le module signale les définitions multiples d'une même clef et % marque {\selectlanguage{english}\textbf{[?? clou ??]}} là où l'on utilise % \cs{TheValue}\LB|{clou}| alors que |clou| n'est pas définie comme % clef. En cas d'erreur, le fichier \texttt{log} contient la ligne : % \EnAnglais % The package warns about multiple definitions of the same key and % writes \textbf{[?? kew ??]} where one used \cs{TheValue}\LB|{kew}| whereas % |kew| was not defined as a key. In case of error, the \texttt{log} % file contains the line: % \end{Morciau} % \noindent\hspace*{\stretch{1}}\texttt{LaTeX Warning: There were undefined % references.}\hspace*{\stretch{1}} % % \vspace{\baselineskip} % % \begin{Morciau}[Remarque/Remark] % Josselin \textsc{Noirel} est intervenu efficacement, tant sur \fctt % que par courriel, pour corriger les modifications que j'avais fait % subir au code tiré de \texttt{ltxref} et \texttt{ltfiles}. C'est % pour sa contribution décisive qu'il est cité comme co-auteur de ce % module. Qu'il trouve là l'expression de ma profonde gratitude. % % Cependant, j'assume l'entière responsabilité de la rédaction de % cette documentation et de sa traduction ainsi que la paternité de % l'idée d'utiliser le mécanisme des \cs{label} pour accéder à un % \texttt{hashage} rudimentaire. % \EnAnglais % Josselin \textsc{Noirel} has efficiently helped me, on \fctt and by % email, to correct the hack I have made in the code taken from % \texttt{ltxref} and \texttt{ltfiles}. For he made that decisive % contribution, he is mentionned here as a co-author of this % package. May he find there the expression of my deep gratefulness. % % Howerver I take the entire responsability for the writing of the % present documentation and its English translation and I do recognise % having fathered the idea of using the \cs{label} mecanism to obtain % a rudimentary \texttt{hash}. % \end{Morciau} % % \vspace{\baselineskip} % % \begin{Morciau}[Version 0.1/Version 0.1] % Cette version est compatible avec un fichier codé en utf-8 compilé % avec \texttt{pdflatex}, \texttt{lualatex} ou \texttt{xelatex} % d'après mes --- quelques --- essais. Si ce n'était pas le cas, % n'hésitez pas à me signaler le problème. % \EnAnglais % This version is usable with a utf-8 encoded source run through % \texttt{pdflatex}, \texttt{lualatex} or \texttt{xelatex} as it % appears from my ---not very numerous--- trials. If it was not the % case don't hesitate to contact me. % \end{Morciau} % % \hspace*{\stretch{1}}Le \TeX nicien de % surface. \hspace*{0.125\linewidth} % % \vspace{2\baselineskip} % % \begingroup % \small % \hspace*{\stretch{1}}\textbf{In memoriam Énola Néra}\hspace*{\stretch{1}} % % \begin{Morciau} % Gentille chienne aimante et fidèle, compagne de plus de 10 ans que % son cœur a laché le 27 juillet 2020. % \EnAnglais % Kind, loving and faithfull bitch, companion of more than 10 years % whose heart stopped on the 27th July 2020. % \end{Morciau} % \endgroup % % \StopEventually{} % \section{Le code} % \label{secCode} % % Le code comporte des balises utilisable par \texttt{DocStrip} avec % lesquelles on peut produire une version francisée ou une version % anglaise de \NomDeModule{clefval}. Voir la documentation de % \texttt{DocStrip} pour de plus amples renseignements. % % On dit boujour, en français ou en anglais suivant la manière dont on % a créé \NomDeModule{clefval}. Puis on entre dans le vif du % sujet. % % Le code a d'abord été repris de \texttt{ltxref} mais j'avais % quelques ennuis avec les avertissements concernant les clefs non % définies ou définies plusieurs fois. Josselin Noirel a bien voulu % répondre à mon appel au secours sur \fctt. Le code qui suit est donc % la correction par Josselin de mes modifications du code de % \texttt{ltxref}, moyennant quoi, je signe \Sourire % % \iffalse %<*package> % \fi % \begin{macro}{\@setTheValue} % Le code est copié sur celui de |\@setref| dans % \texttt{ltxref}. Cette macro est appelée par \cs{TheValue}. Elle % vérifie que la \meta{clef} appelée existe. Si elle n'existe pas elle % imprime {\selectlanguage{english}\textbf{[?? \meta{clef} ??]}} et place un % avertissement dans le \texttt{log}. Sinon elle rend son premier % argument. % % On utilise |\G@refundefinedtrue| pour provoquer le message d'erreur % \og There were undefined references \fg. Un peu sybillin pour ce qui % nous concerne, il a l'avantage d'être reconnu par au moins % \texttt{emacs} plus \texttt{Auctex} et d'indiquer qu'il faut % relancer la compilation. % \begin{macrocode} \newcommand*{\@setTheValue}[2]{% \ifx#1\relax \protect\G@refundefinedtrue \nfss@text{\reset@font\bfseries[?? #2 ??]}% % \end{macrocode} % \end{macro} % \iffalse % %<*packfra> % \fi % \textsf{Messages d'avertissement en français} % \begin{macrocode} \@latex@warning{Valeur de #2 en page \thepage\space non d\'efinie}% % \end{macrocode} % \iffalse % %<*packeng> % \fi % \textsf{Warning messages in English } % \begin{macrocode} \@latex@warning{Value of `#2' on page \thepage\space undefined}% % \end{macrocode} % \iffalse % %<*package> % \fi % \begin{macrocode} \else #1\null \fi} % \end{macrocode} % \begin{macro}{\TheValue} % Le code est copié sur celui de |\ref| dans \texttt{ltxref}. Si % l'argument de \cs{TheValue} est une clef valide, on obtient la % valeur référencée par cette clef. % \begin{macrocode} \newcommand*{\TheValue}[1]{\expandafter\@setTheValue\csname V@#1\endcsname{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\@newk@ey} % Le code est copié sur celui de |\@newl@bel| dans \texttt{ltxref}. % \begin{macrocode} \newcommand*{\@newk@ey}[3]{{% \@ifundefined{#1@#2}% {\relax}% {\gdef \@multiplekeys {% % \end{macrocode} % \end{macro} % \iffalse % %<*packfra> % \fi % \textsf{Messages d'avertissement en français} % \begin{macrocode} \@latex@warning@no@line{Des clefs sont d\'efinies plusieurs fois.}}% \@latex@warning@no@line{La clef #2 est d\'efinie plusieurs fois}}% % \end{macrocode} % \iffalse % %<*packeng> % \fi % \textsf{Warning messages in English } % \begin{macrocode} \@latex@warning@no@line{There were multiply-defined keys.}}% \@latex@warning@no@line{Key `#2' multiply defined}}% % \end{macrocode} % \iffalse % %<*package> % \fi % \begin{macrocode} \global\@namedef{#1@#2}{#3}}} % \end{macrocode} % \begin{macro}{\newkey} % On opère ici une puissante magie qui fait que tout marche comme % attendu \Sourire % \begin{macrocode} \def\newkey{\@newk@ey V} \@onlypreamble\@newk@ey \AtEndDocument{\let\@newk@ey=\@testdef} % \end{macrocode} % \end{macro} % \iffalse % % ^^A fin du code de Josselin Noirel %<*package> % \fi % À partir d'ici votre serviteur s'est débrouillé tout seul pour % modifier le code des bases de \LaTeX. % % \begin{macro}{\@protected@write} % Le code est copié sur celui de |\protected@write| défini dans % \texttt{ltfiles}. On n'a besoin que d'un seul argument qui est écrit % dans le fichier |\@auxout| c-à-d. le fichier \texttt{aux}. % La macro prend soin de ce qui est protégé soit de manière définitive % pour avoir été défini par \cs{DeclareRobustCommand} et ses petits % amis, soit pour être précédé de \cs{protect} comme on doit le faire % parfois pour les arguments \og mobiles \fg (\emph{moving % argument}). % \begin{macrocode} \long\def \@protected@write#1{% \begingroup \let\protect\@unexpandable@protect \edef\reserved@a{% \write\@auxout{#1}}% \reserved@a \endgroup \if@nobreak\ifvmode\nobreak\fi\fi } % \end{macrocode} % \end{macro} % \begin{macro}{\@multiplekeys} % En mettant |\@multiplekeys| à \cs{relax}, on s'assure qu'il n'y aura % pas de hurlements alors que rien n'est encore défini et donc encore % moins défini plusieurs fois \Sourire % \begin{macrocode} \let \@multiplekeys \relax % \end{macrocode} % \end{macro} % \begin{macro}{\TheKey} % Le code remprend celui de \cs{label} mais il nous faut deux % arguments, le 1\ier pour la clef, le 2\textsuperscript{nd} pour la % valeur associée. % \begin{macrocode} \def\TheKey#1#2{{\@bsphack \@protected@write{\string\newkey{#1}{#2}}% \@esphack}} % \end{macrocode} % \end{macro} % \iffalse % % \fi % \Finale \PrintChanges\PrintIndex \endinput