% \iffalse meta-comment % -*- coding: iso-8859-15 -*- % -------------------------------------------------------------------- % % Copyright (C) 2004, 2008 by Josselin Noirel et Yvon Henel % % Y. Henel dit « le TeXnicien de surface » % % % -------------------------------------------------------------------- % % 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: % % % % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % -------------------------------------------------------------------- % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\def\fileversion{v1} %\def\filedate{2008/08/14} %\def\fileinfo{fichier drac.sty par J. Noirel et Y. Henel} %\ProvidesPackage{drac} % [\filedate\space\fileversion\space\fileinfo] % %<*driver> \documentclass[a4paper]{ltxdoc} \usepackage{drac} \usepackage{url,array,xspace} \usepackage[latin9]{inputenc} \usepackage[T1]{fontenc} \IfFileExists{lmodern.sty}{\usepackage{lmodern}}{} \usepackage{ifpdf} \usepackage{textcomp} \usepackage{calc} \let\cs=\relax \DeclareRobustCommand*{\cs}[1]{{\normalfont\ttfamily\char`\\#1}} \renewcommand*{\meta}[1]{{\normalfont\textlangle{\itshape #1\/}\textrangle}} \newcommand*{\fctt}{{\normalfont\ttfamily fr.comp.text.tex}} \makeatletter \DoNotIndex{\@tempa,\@tempb,\@tempc,\csname,\endcsname,\noexpand,\def,^^A \edef,\ifx,\else,\endinput,\expandafter,\fi,\let,\newcommand,\relax,^^A \string,\@ifstar} \makeatother \usepackage[english,frenchb]{babel} % Commentez la ligne suivante pour avoir un document avec le code commenté \OnlyDescription \EnableCrossrefs \CodelineIndex \RecordChanges \GlossaryPrologue{% \section*{{Changements}}} \IndexPrologue{\section*{Index}% 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.} \newcommand\BOP{\discretionary{}{}{}} \begin{document} \DocInput{drac-fr.dtx} \end{document} % % \fi % \CheckSum{72} % % \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 \~} % % \changes{v0}{2004/04/22}{A failli être la première version publique} % \changes{v0.1}{2004/05/17}{A manqué de peu d'être la première % version publique} % \changes{v0.1}{2004/05/17}{Ajout de \cs{ReDeclareRobActChar}} % \changes{v1}{2008/08/14}{1\iere version publique} % \GetFileInfo{drac.sty} % % \title{Le module \textsf{drac}\thanks{Ce document correspond au % fichier \textsf{drac}~\fileversion, du \filedate.}} % \author{Josselin Noirel et Yvon Henel} % % \maketitle % \begin{abstract} % Ce module définit \cs{DeclareRobustActChar} et % \cs{ReDeclareRobActChar}. % % On utilise \cs{DeclareRobustActChar} comme % \cs{DeclareRobustCommand} mais elle protège le caractère actif, % voir~\path{ltdefns.dtx} dans \path{/latex/base/}. Cela permet, par % exemple, d'écrire ce caractère dans un fichier auxiliaire sans % qu'il soit développé. Il est donc devenu \og robuste\fg au sens % des arguments \og mobiles\fg de \LaTeX. % % \cs{ReDeclareRobActChar} permet de redéfinir le caractère actif % défini préalablement par % \cs{Declare}\BOP|Robust|\BOP|Act|\BOP|Char| à la manière de % \cs{renewcommand}. % \end{abstract} % \begin{otherlanguage}{english} % \begin{abstract} % This package provides \cs{DeclareRobustActChar} and % \cs{Re}\BOP|Declare|\BOP|Rob|\BOP|Act|\BOP|Char| macros. % % You should have downloaded with this file a file % \path{drac-en.dtx} and a file \path{drac.pdf} which % give the English documentation of this package. % \end{abstract} % \end{otherlanguage} % \tableofcontents % % \section{Introduction} % \begingroup\footnotesize{} % Lorsqu'elle apparut pour la première fois, le \oldstylenums{8}~avril % \oldstylenums{2004}, sur \fctt{} dans le fil de discussion \og la % question à \oldstylenums{100}~euros\fg, le nom de la macro était % \cs{DeclareRobustActiveCharacter} qui avait l'avantage d'être % totalement descriptif mais l'inconvénient d'être long. Pour alléger % quelque peu le travail du codeur mais \emph{surtout} pour éviter un % joyeux bazar dans l'index de cette documentation, j'ai pris sur moi % de la renommer \cs{DeclareRobustActChar}. % % À la lecture du fil mentionné ci-dessus, on s'appercevra sans peine % que ce que je --- je c.-à-d. Y. Henel, \TeX nicien de surface --- % fis ce fut de passer commande d'un code que Josselin Noirel me % fournit très aimablement et tout aussi efficacement. % % Je fis mumuse un moment avec le code fourni par Josselin puis % quelques mois plus tard la vie m'asséna un de ces coups dont la % fréquentation assidue des classiques auraient du me prévenir mais, % pour citer un de ses fameux (pseudo?) proverbe chinois, \og % l'expérience n'éclaire que le chemin parcouru\fg. Ce qui fait que % même si Josselin, de son côté assez occupé avec la fin de ses % études, me fit parvenir, dans un courriel de février % \oldstylenums{2005}, une \oldstylenums{2}\ieme version dans laquelle % apparut \cs{ReDeclareRobActChar} dans un courriel de février % \oldstylenums{2005} je n'étais guère en état d'en tirer profit. % % Puis le temps a passé\dots j'ai sorti la tête de l'eau et Josselin % est parti vers d'autres cieux. % % Le code existe et fonctionne. Alors, plutôt que de le laisser moisir % dans un coin obscur de mon disque dur, et puisque j'ai passé % quelques heures à mettre à jour mes extensions, je me suis décidé à % lancer \texttt{drac} dans le vaste monde. Je me contente de fournir % l'emballage et porter le bébé dans mes bras velus jusqu'au serveur % CTAN le plus proche. % % On aura compris que je ne m'engage pas du tout à assurer la % maintenance de ce code si jamais le besoin s'en faisait % sentir. J'arrive à peu près à comprendre ce que fait Josselin en % suivant pas à pas ses explications mais je suis bien incapable de me % hausser à de telles hauteurs. Il est donc temps maintenant de céder % le clavier à Josselin. % % \hspace*{\stretch{4}}Le \TeX nicien de surface\hspace*{\stretch{1}} % \endgroup % % \section{Utilisation} % % % La macro \cs{DeclareRobustActChar} a la syntaxe habituelle des % \cs{newcommand} et cons½urs: elle admet une forme étoilée selon % que le caractère actif acceptera ou non des arguments \cs{long}s % (c.-à-d. un argument pourra comporter une fin de paragraphe); % ensuite vient le caractère actif; un nombre optionnel d'arguments, % un argument optionnel qui est la valeur optionnelle du premier % argument, enfin la définition proprement dite. Voilà les syntaxes % valides: ^^A % \begin{list}{}{\ttfamily\leftmargin=\leftmargini}\item % \cs{DeclareRobustActChar}\marg{caractère actif}[\(n\)]\%\\ % \ \ \oarg{valeur par défaut du premier argument}\marg{définition}\par % \cs{DeclareRobustActChar}\marg{caractère actif}[\(n\)]\marg{définition}\par % \cs{DeclareRobustActChar}\marg{caractère actif}\marg{définition}\par % \cs{DeclareRobustActChar}*\marg{caractère actif}[\(n\)]\%\\ % \ \ \oarg{valeur par défaut du premier argument}\marg{définition}\par % \cs{DeclareRobustActChar}*\marg{caractère actif}[\(n\)]\marg{définition}\par % \cs{DeclareRobustActChar}*\marg{caractère actif}\marg{définition} % \end{list} % ^^A % Suite à quoi le caractère actif pourra être utilisé dans les % arguments mobiles (dans les arguments de \cs{caption} par exemple) % et dans les autres cas qui requièrent des commandes robustes % (\cs{protected@edef}, \cs{protected@write}, etc.) % % De même \cs{ReDeclareRobActChar} a la syntaxe de \cs{renewcommand} % d'où les syntaxes possibles: % ^^A % \begin{list}{}{\ttfamily\leftmargin=\leftmargini}\item % \cs{ReDeclareRobActChar}\marg{caractère actif}[\(n\)]\%\\ % \ \ \oarg{valeur par défaut du premier argument}\marg{définition}\par % \cs{ReDeclareRobActChar}\marg{caractère actif}[\(n\)]\marg{définition}\par % \cs{ReDeclareRobActChar}\marg{caractère actif}\marg{définition}\par % \cs{ReDeclareRobActChar}*\marg{caractère actif}[\(n\)]\%\\ % \ \ \oarg{valeur par défaut du premier argument}\marg{définition}\par % \cs{ReDeclareRobActChar}*\marg{caractère actif}[\(n\)]\marg{définition}\par % \cs{ReDeclareRobActChar}*\marg{caractère actif}\marg{définition} % \end{list} % ^^A % \StopEventually{\PrintChanges\PrintIndex} % \section{Le code} % \begin{macro}{\DeclareRobustActChar} % Nous commençons par définir \cs{DeclareRobustActChar} (qui ne fait % pas grand-chose en réalité). % ^^A % \begin{macrocode} % \iffalse %<*package> % \fi \newcommand*{\DeclareRobustActChar}{ \@ifstar{% \def\@tempc{\newcommand*}\@declarerobustactchar}{% \def\@tempc{\newcommand}\@declarerobustactchar}% } % \end{macrocode} % \end{macro} % ^^A % \begin{macro}{\ReDeclareRobActChar} % Et dans la foulée nous définissons \cs{ReDeclareRobActChar} (qui, % comme la précédente, ne fait pas grand-chose mais légèrement % différemment). % ^^A % \begin{macrocode} \newcommand*{\ReDeclareRobActChar}{\@ifstar{% \def\@tempc{\renewcommand*}\@declarerobustactchar}{% \def\@tempc{\renewcommand}\@declarerobustactchar}% } % \end{macrocode} % ^^A % \cs{@ifstar} teste la présence d'une étoile. Selon le cas on % définit \cs{@tempc} en conséquence. \cs{@tempc} sera utilisé à % terme pour prendre en charge la définition. On appelle ensuite % \cs{@declarerobustactchar}. % \end{macro} % \begin{macro}{\@declarerobustactchar} % Vient la macro qui abat vraiment du travail: % \cs{@declarerobustactchar}. Elle prend un argument qui est le % caractère actif (qui est supposé être \emph{déjà} actif au moment de % l'appel à \cs{DeclareRobustActChar}). % ^^A % \begin{macrocode} \newcommand*{\@declarerobustactchar}[1]{% % \end{macrocode} % ^^A % On conserve les valeurs actuelles de \cs{protect} et % \cs{@typeset@protect} pour les restituer plus tard. % ^^A % \begin{macrocode} \let\@tempa=\protect \let\@tempb=\@typeset@protect % \end{macrocode} % ^^A % \cs{protect} et \cs{@typeset@protect} sont définis équivalents à % \cs{relax} pour qu'ils ne \og bougent\fg pas pendant le processus de % développement dans \cs{edef}. % ^^A % \begin{macrocode} \let\protect=\relax \let\@typeset@protect\relax % Devrait être le cas % \end{macrocode} % ^^A % On définit le caractère actif. Attention s'il n'est pas actif au % moment de l'utilisation de \cs{DeclareRobustActChar} on risque % fortement de voir \TeX{} râler à cause d'une commande % \og inaccessible\fg. Le \meta{caractère actif} prend comme % définition: % ^^A % \begin{flushleft}\begin{tabular}{@{}l@{}l@{}} % \meta{caractère actif} $\stackrel{\mathrm{def}}{\equiv}$ \hskip0pt & % \cs{ifx}\cs{protect}\cs{@typeset@protect} \\ % & \ttfamily\ \ \cs{expandafter}\cs{DRAC@real@\meta{caractère actif}} \\ % & \cs{else} \\ % & \ttfamily\ \ \cs{protect}\meta{caractère actif} \\ % & \cs{fi} \\ % \end{tabular}\end{flushleft} % ^^A % Le test \cs{ifx} permet de connaître si l'on est dans un contexte % d'argument mobile ou non. Le résultat du test est \og vrai\fg si ce % n'est pas le cas; alors \cs{DRAC@real@\meta{caractère actif}} est % exécutée: c'est la commande effectrice qui contiendra dans quelque % temps la \meta{définition} dont nous parlions plus haut. % Dans le cas où le test est \og faux\fg, étant dans un contexte % d'argument mobile on replace simplement le \meta{caractère actif} en % le \cs{protégeant}. % Le \cs{expandafter} est là pour faire disparaître la portion de code % \og \cs{else}\linebreak[0]\dots\linebreak[0]\cs{fi}\fg. % ^^A % \begin{macrocode} \edef#1{% \noexpand\ifx\protect\@typeset@protect \noexpand\expandafter \expandafter\noexpand \csname DRAC@real@\string#1\endcsname \noexpand\else % \noexpand\expandafter [JN : pas bon] \protect % \noexpand\expandafter [JN : idem] \noexpand#1% \noexpand\fi }% % \end{macrocode} % ^^A % Les valeurs initiales de \cs{protect} et \cs{@typeset@protect} sont % restituées. % ^^A % \begin{macrocode} \let\protect=\@tempa \let\@typeset@protect=\@tempb % \end{macrocode} % ^^A % Maintenant on définit avec \cs{newcommand} --- par l'intermédiaire % de \cs{@tempc}, vous souvenez-vous? --- la commande effectrice % \cs{DRAC@read@\meta{caractère actif}}. C'est l'utilisation de % \cs{newcommand} qui permet d'en propager la syntaxe. Mais on notera % que cela interdit notamment la redéfinition de la commande % (autrement dit il se pourrait que le package s'améliore encore). % ^^A % \begin{macrocode} \expandafter\@tempc\csname DRAC@real@\string#1\endcsname } % \end{macrocode} % ^^A % \og FIN\fg % ^^A % \begin{macrocode} \endinput % \end{macrocode} % \end{macro} % ^^A % \section{Papillons et limitations} % Pas de bogue connu à ce jour. Les limitations elles sont % nombreuses: ce package n'a pas de grande prétention. % % Bien que les macros ici définies puissent \emph{a priori} % fonctionner avec les commandes aussi, nous recommandons d'utiliser % \cs{DeclareRobustCommand} dans ce but. % \Finale % \iffalse % % \fi \endinput %%% Local Variables: %%% mode: doctex %%% TeX-master: t %%% fill-column: 70 %%% End: