% \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} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \IfFileExists{lmodern.sty}{\usepackage{lmodern}}{} \usepackage{ifpdf} \usepackage{textcomp} \usepackage{calc, xspace} % c'est pour moi (TdS) ! \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[frenchb,english]{babel} % comment out the following line to obtain the full code with explanations \OnlyDescription \EnableCrossrefs \CodelineIndex \RecordChanges \newcommand\BOP{\discretionary{}{}{}} \begin{document} \DocInput{drac-en.dtx} \end{document} % % \fi % \CheckSum{68} % % \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}{Missed to be the 1st public version} % \changes{v0.1}{2004/05/17}{Almost have been the 1st public version} % \changes{v0.1}{2004/05/17}{Introduces \cs{ReDeclareRobActChar}} % \changes{v1}{2008/08/14}{First public version} % \GetFileInfo{drac.sty} % % \title{The \textsf{drac} package\thanks{This document corresponds to % the file \textsf{drac}~\fileversion, dated \filedate.}} % \author{Josselin Noirel and Yvon Henel} % % \maketitle % \begin{abstract} % This package provides \cs{DeclareRobustActChar} and % \cs{Re}\BOP|Declare|\BOP|Rob|\BOP|Act|\BOP|Char| macros. % % One uses \cs{DeclareRobustActChar} as \cs{DeclareRobustCommand} % but the macro \cs{protect}s the active character when it appears % in a moving argument, see~\path{ltdefns.dtx} in % \path{/latex/base/}. % % \cs{ReDeclareRobActChar} redefines the active character, % previously defined with \cs{DeclareRobustActChar}, the way % \cs{renewcommand} does for usual commands. % \end{abstract} % \begin{otherlanguage}{french} % \begin{abstract} % Ce module définit \cs{DeclareRobustActChar} et % \cs{ReDeclareRobActChar}. % % Vous devriez avoir obtenu, avec ce document, les fichiers % \path{drac-fr.dtx} et \path{drac-fr.pdf} qui donnent la version % française de cette documentation. % \end{abstract} % \end{otherlanguage} % % \tableofcontents % % \section{Introduction} % \begingroup\footnotesize{} % % When the macro appeared on \fctt{} in the thread ``la question à % 100~euros\footnote{The 100~euro question.}'', dated % \oldstylenums{8}th april \oldstylenums{2004}, its name was % \cs{DeclareRobustActiveCharacter} which had the advantage to be % totally descriptive but one drawback viz.\ it was really long. To % alleviate the pains of the typist but \emph{mainly} to avoid a % complete mess in the index of this document, I have taken it upon % myself to rename it \cs{DeclareRobustActChar}. % % When reading the above mentioned thread, one can easily see that I % ---{i\@. e\@.} Yvon Henel, \TeX nicien de surface--- just asked for % code which was provided, very friendly and efficiently, by Josselin % Noirel. % % I played a bit with Josselin's code but some months later life hit % me hard which would not have been a surprise if I had really % understood the classical wisdom I have been educated in during % my younger days. But ``the light, which experience gives, is a % lantern on the stern, which shines only on the waves behind us'' as % wrote Samuel Taylor Coleridge. Thence when Josselin, who was rather % busy as a student, sent me with an email in February % \oldstylenums{2005} a second version where \cs{ReDeclareRobActChar} % appeared I was in no state to benefit from it. % % Then time, the great healer, did fly\dots I'm back to the world and % Josselin has left for other shores. % % The code exists and works. So instead of leaving it to rot somewhere % on my hard disk and for I have spent somme hours to update my own % packages I have decided to launch \texttt{drac} on the vast ocean of % life. I just provide the wrapping and push the tiny thing on the % nearest CTAN server. % % I do suppose that one understood that I can't promise to maintain % the following code I hardly understand and that only because of the % comments given by Josselin. So now is the time to let Josselin be % at the helm\dots and the keyboard. % % \hspace*{\stretch{4}}Le \TeX nicien de surface\hspace*{\stretch{1}} % % \endgroup % % \section{Usage} % % This command has the usual syntax of the \cs{newcommand} and % friends: it accepts a starred form depending on wether the active % character accepts \cs{long} arguments (\emph{i.e.} an argument could % contain a paragraph ending) or not; next comes the active character; % an optionnal number of arguments, an optionnal argument which is the % optionnal value of the first argument, and then the actual % definition. Here are the valid syntaxes: % ^^A % \begin{list}{}{\ttfamily\leftmargin=\leftmargini}\item % \cs{DeclareRobustActChar}\marg{active character}[\(n\)]\%\\ % \ \ \oarg{default value of the first argument}\marg{definition}\par % \cs{DeclareRobustActChar}\marg{active character}[\(n\)]\marg{definition}\par % \cs{DeclareRobustActChar}\marg{active character}\marg{definition}\par % \cs{DeclareRobustActChar}*\marg{active character}[\(n\)]\%\\ % \ \ \oarg{default value of the first argument}\marg{definition}\par % \cs{DeclareRobustActChar}*\marg{active character}[\(n\)]\marg{definition}\par % \cs{DeclareRobustActChar}*\marg{active character}\marg{definition} % \end{list} % ^^A % Then one will be able to use the active character in moving % arguments (in the arguments of \cs{caption} for instance) and in % other cases which demand robust commands % (\cs{protected@edef},\cs{protected@write}, and so on). % % Similarly \cs{ReDeclareRobActChar} has the same syntax than % \cs{renewcommand} so here are the possible syntaxes: % ^^A % \begin{list}{}{\ttfamily\leftmargin=\leftmargini}\item % \cs{ReDeclareRobActChar}\marg{active character}[\(n\)]\%\\ % \ \ \oarg{default value of the first argument}\marg{definition}\par % \cs{ReDeclareRobActChar}\marg{active character}[\(n\)]\marg{definition}\par % \cs{ReDeclareRobActChar}\marg{active character}\marg{definition}\par % \cs{ReDeclareRobActChar}*\marg{active character}[\(n\)]\%\\ % \ \ \oarg{default value of the first argument}\marg{definition}\par % \cs{ReDeclareRobActChar}*\marg{active character}[\(n\)]\marg{definition}\par % \cs{ReDeclareRobActChar}*\marg{active character}\marg{definition} % \end{list} % ^^A % \StopEventually{\PrintChanges\PrintIndex} % % \section{The code} % \begin{macro}{\DeclareRobustActChar} % We begin whith the definition of \cs{DeclareRobustActChar} (which % does not make a lot in fact). % ^^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} % And immediately we define \cs{ReDeclareRobActChar} (which, as the % preceding one does not make a lot but slightly differently.) % ^^A % \begin{macrocode} \newcommand*{\ReDeclareRobActChar}{\@ifstar{% \def\@tempc{\renewcommand*}\@declarerobustactchar}{% \def\@tempc{\renewcommand}\@declarerobustactchar}% } % \end{macrocode} % ^^A % \cs{@ifstar} checks the presence of a star and \cs{@tempc} is % defined accordingly. \cs{@tempc} will in its time undertake the % definition. Then \cs{@declarerobustactchar} is summoned. % \end{macro} % \begin{macro}{\@declarerobustactchar} % Here comes the macro which does work: % \cs{@declarerobustactchar}. It takes an argument which is the % active character (which is supposed to be \emph{already} active % when\cs{DeclareRobustActChar} is called in). % ^^A % \begin{macrocode} \newcommand*{\@declarerobustactchar}[1]{% % \end{macrocode} % ^^A % The present values of \cs{protect} and \cs{@typeset@protect} are % preserved to be restored later. % ^^A % \begin{macrocode} \let\@tempa=\protect \let\@tempb=\@typeset@protect % \end{macrocode} % ^^A % \cs{protect} and \cs{@typeset@protect} are defined as equivalent to % \cs{relax} for them not to `move' during the process of expansion in % \cs{edef}. % ^^A % \begin{macrocode} \let\protect=\relax \let\@typeset@protect\relax % Should be the case % \end{macrocode} % ^^A % The active character is defined. Caution: if the character is not % active when one uses \cs{DeclareRobustActChar} there is a % considerable risk of making \TeX{} growls about an `inaccessible' % command. The \meta{active character} is defined as: % ^^A % \begin{flushleft}\begin{tabular}{@{}l@{}l@{}} % \meta{active character} $\stackrel{\mathrm{def}}{\equiv}$ \hskip0pt & % \cs{ifx}\cs{protect}\cs{@typeset@protect} \\ % & \ttfamily\ \ \cs{expandafter}\cs{DRAC@real@\meta{active character}} \\ % & \cs{else} \\ % & \ttfamily\ \ \cs{protect}\meta{active character} \\ % & \cs{fi} \\ % \end{tabular}\end{flushleft} % ^^A % The \cs{ifx} test enables us to know whether we are in the context % of a moving argument or not. The result of the test is `true' if it % is not the case; then \cs{DRAC@real@\meta{active character}} is % executed: it is the effecting command which will contain in some % time the \meta{definition} to which we were refering above. When % the test is `false', because we are in the context of a moving % argument we simply \cs{protect} the \meta{active character} and put % it back. The \cs{expandafter} is there to make the chunk of code % `\cs{else}\linebreak[0]\dots\linebreak[0]\cs{fi}' disappear. % ^^A % \begin{macrocode} \edef#1{% \noexpand\ifx\protect\@typeset@protect \noexpand\expandafter \expandafter\noexpand \csname DRAC@real@\string#1\endcsname \noexpand\else \protect \noexpand#1% \noexpand\fi }% % \end{macrocode} % ^^A % The initial values of \cs{protect} and \cs{@typeset@protect} are % restored. % ^^A % \begin{macrocode} \let\protect=\@tempa \let\@typeset@protect=\@tempb % \end{macrocode} % ^^A % Now we define with \cs{newcommand} ---~by means of \cs{@tempc}, do % you remember?~--- the effecting command \cs{DRAC@read@\meta{active % character}}. It is the use of \cs{newcommand} which enables us % to protect the syntax. But one will note that it prevents, in % particular, the redifinition of the command (in other words this % package might still be improved). % ^^A % \begin{macrocode} \expandafter\@tempc\csname DRAC@real@\string#1\endcsname } % \end{macrocode} % ^^A % ``THE END'' % ^^A % \begin{macrocode} \endinput % \end{macrocode} % \end{macro} % \iffalse % % \fi % ^^A % \section{Bugs and restrictions} % No known bugs at present. The restrictions are numerous: this % package has no pretence. % % It can \emph{a priori} work with commands as well but we advise you to % use \cs{DeclareRobustCommand} instead in such a case. % \Finale \endinput %%% Local Variables: %%% mode: doctex %%% TeX-master: t %%% fill-column: 70 %%% End: