diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/clefval/clefval.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/clefval/clefval.dtx')
-rw-r--r-- | macros/latex/contrib/clefval/clefval.dtx | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/macros/latex/contrib/clefval/clefval.dtx b/macros/latex/contrib/clefval/clefval.dtx new file mode 100644 index 0000000000..67bbea73a8 --- /dev/null +++ b/macros/latex/contrib/clefval/clefval.dtx @@ -0,0 +1,418 @@ +% \iffalse meta-comment +% -*- mode: LaTeX; coding: iso-8859-15 -*- +% +%%%% Copyright (C) 2004 by Josselin Noirel +%%%% and Yvon Henel <Yvon.Henel@wanadoo.fr> +%%%% -------------------------------------------------------- +% +% This file may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.2 +% 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.2 or later is part of all distributions of LaTeX +% version 1999/12/01 or later. +% \fi +% +% \iffalse +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\def\fileversion{v0} +%<package>\def\filedate{2004/05/22} +%<packfra>\def\fileinfo{d\'efinir et utiliser des paires cle/valeurs} +%<packeng>\def\fileinfo{define and use pair of key/values} +%<package>\ProvidesPackage{clefval} +%<package> [\filedate\space\fileversion\space\fileinfo] +%<*driver> +\documentclass[a4paper]{ltxdoc} +\usepackage[latin9]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{clefval} +\usepackage{xspace,url,multicol,ifthen} +\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{} +\usepackage[english,frenchb]{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} +%</driver> +% \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.} +% +% \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{Yvon.Henel@wanadoo.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} +% \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. On écrira donc +% \cs{TheKey}\LB\texttt{\{}\LB\cs{protect}|\(|\LB|2+3|\cs{protect}|\)|\LB\texttt{\}} si on +% ne veut pas d'ennuis ou, plus simplement, +% \cs{TheKey}\LB\texttt{\{}\LB|$|\LB|2+3|\LB|$|\LB\texttt{\}} \Sourire +% \EnAnglais +% Both arguments of \cs{TheKey} are `moving' as \LaTeX{} defines it and we have +% sometimes to protect them. +% +% So one will write +% \cs{TheKey}\LB\texttt{\{}\LB\cs{protect}|\(|\LB|2+3|\cs{protect}|\)|\LB\texttt{\}} +% to avoid troubles or, more easily, +% \cs{TheKey}\LB\texttt{\{}\LB|$|\LB|2+3|\LB|$|\LB\texttt{\}} \Sourire +% \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}[Avertissements/Warnings] +% Le module signale les définitions multiples d'une même clef et +% marque {\selectlanguage{english}\textbf{????}} 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{????} 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}} +% \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} +% \hspace*{\stretch{1}}Le \TeX nicien de surface. \hspace*{0.125\linewidth} +% \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 clef appelée existe. Si elle n'existe pas elle +% imprime {\selectlanguage{english}\textbf{????}} 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 ????}% +% \end{macrocode} +% \end{macro} +% \iffalse +%</package> +%<*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 +%</packfra> +%<*packeng> +% \fi +% \textsf{Warning messages in English } +% \begin{macrocode} +\@latex@warning{Value of `#2' on page \thepage\space undefined}% +% \end{macrocode} +% \iffalse +%</packeng> +%<*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 +%</package> +%<*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 +%</packfra> +%<*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 +%</packeng> +%<*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 +%</package> +% ^^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 +%</package> +% \fi +% \Finale \PrintChanges\PrintIndex +\endinput |