% \iffalse meta-comment 
% -*- coding: iso-8859-15 -*-
% --------------------------------------------------------------------
% 
% Copyright (C) 2004, 2008 by Josselin Noirel et Yvon Henel 
% 
% Y. Henel dit « le TeXnicien de surface » 
% <le.texnicien.de.surface@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: 
%
%    <URL: 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}[1999/12/01]
%<package>\def\fileversion{v1}
%<package>\def\filedate{2008/08/14}
%<package>\def\fileinfo{fichier drac.sty par J. Noirel et Y. Henel}
%<package>\ProvidesPackage{drac}
%<package>   [\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}
%</driver>
% \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
%</package>
% \fi
\endinput
%%% Local Variables: 
%%% mode: doctex
%%% TeX-master: t
%%% fill-column: 70
%%% End: 
