% \iffalse meta comment
% File: booktabs.dtx Copyright (C) 1995 Simon Fear
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{booktabs}
%<package>         [1995/11/06 v1.00 publication quality tables]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{booktabs}
\usepackage[T1]{fontenc}       % ajouté par le traducteur
\usepackage[latin1]{inputenc}  % ajouté par le traducteur
\usepackage[frenchb]{babel}    % ajouté par le traducteur
	\title{Tableau de qualité pour la publication avec \LaTeX\thanks{Ce
	fichier est la version v1.00, dernière révision du 6 novembre
	1995.}\ \thanks{Traduit en fran\c{c}ais par Jean-Pierre Drucbert et
	Mathieu Goutelle le 2~mai~2001. Titre original <<~Publication quality
	tables in \LaTeX~>>.}}
 \author{Simon Fear\\University of Liverpool}
 \date{Printed \today}
 \MakeShortVerb{\=}
 \MakeShortVerb{\"}
\begin{document}
 \maketitle
 \DeleteShortVerb{\|}
 \DocInput{f-booktabs.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{319}
%
% \begin{abstract}
% Ce document décrit quelques commandes supplémentaires pour améliorer la
% qualité des tables en \LaTeX. Des conseils sont donnés ici pour dire ce
% qui constitue une <<~bonne\,\footnote{NdT : selon des règles
% d'esthétiques particulières, que Simon C. Fear préfère.}~>> table dans
% ce contexte.
% \end{abstract}
%
% \section{Introduction}
%
% Les commandes décrites ci-dessous doivent faciliter la production de
% tables telles qu'elles apparaissent (devraient apparaître) dans les
% livres et journaux scientifiques publiés. Ce qui distingue ces tables de
% celles que le \LaTeX{} normal est capable de produire est un espacement
% au dessus et au dessous des filets et des filets d'épaisseur variable.
% Ce qui les distingue encore plus des tables que beaucoup de gens
% produisent \emph{en fait} en utilisant \LaTeX{} est l'absence de filets
% verticaux et de filets doubles.
%
% Je dois faire une claire distinction entre ce que j'entends par une
% \emph{table formelle}, qui est un ensemble de valeurs et de labels dans
% des colonnes, et ce que j'appelle un \emph{tableau}, qui est le genre de
% choses présentées dans le manuel \LaTeX, et qui est de plus en plus
% commun comme sortie des systèmes de gestion ou de bases de données, avec
% en plus des icônes en abondance, et probablement de la couleur par
% dessus le marché. La mise en page d'un \emph{tableau} est déterminée
% (heureusement) de manière unique, étant donné un paquet de matériel que
% le concepteur essaie de combiner en une configuration significative.
% Mais la mise en page d'une \emph{table} a été définie littéralement
% depuis des siècles d'expérience et ne devrait être altérée que dans des
% circonstances vraiment extraordinaires.
%
% Pour illustrer mon propos, considérons ce tableau extrait du manuel
% \LaTeX{} (page~64 de l'ancienne édition):
%
% \begin{center}
% \begin{tabular}{||l|lr||} \hline
% gnats     & gram      & \$13.65 \\ \cline{2-3}
%           & each      & .01 \\ \hline
% gnu       & stuffed   & 92.50 \\ \cline{1-1} \cline{3-3}
% emu       &           & 33.33 \\ \hline
% armadillo & frozen    & 8.99 \\ \hline
% \end{tabular}
% \end{center}
%
% C'est un fatras d'informations qui est probablement présenté
% raisonnablement clairement ainsi (mais l'émeu est-il farci ou non?),
% Cependant, pour une table publiée, elle devrait certainement suivre les
% conseils donné plus bas sur cette page du manuel:
%
% \begin{center}
% \begin{tabular}{@{}llr@{}} \toprule
% \multicolumn{2}{c}{Item} \\ \cmidrule(r){1-2}
% Animal & Description & Price (\$)\\ \midrule
% Gnat  & per gram  & 13.65 \\
%       & each      & 0.01 \\
% Gnu   & stuffed   & 92.50 \\
% Emu   & stuffed   & 33.33 \\
% Armadillo & frozen & 8.99 \\ \bottomrule
% \end{tabular}
% \end{center}
%
% Vous pouvez notez que ceci en fait demande moins de travail pour mettre
% ceci en page sous forme de table formelle; nous n'avons plus à
% construire une nouvelle mise en page pour chaque table que nous faisons.
% Bien plus, nous pouvons être presque certains que les données ne
% pourront pas être mal lues (car le lecteur n'a pas à apprendre comment
% lire chacun parmi l'infinie variété des tableaux possibles).
%
% La table ci-dessus ne peut pas être produite en \LaTeX{} pur,
% malheureusement. Elle peut être mise en page comme elle devrait l'être,
% mais malgré tous nos efforts, l'utilisation de simples commandes
% =\hline= donne
%
% \begin{center}
% \begin{tabular}{@{}llr@{}} \hline
% \multicolumn{2}{c}{Item} \\ \cline{1-2}
% Animal & Description & Price (\$)\\ \hline
% Gnat  & per gram  & 13.65 \\
%       & each      & 0.01 \\
% Gnu   & stuffed   & 92.50 \\
% Emu   & stuffed   & 33.33 \\
% Armadillo & frozen & 8.99 \\ \hline
% \end{tabular}
% \end{center}
%
% Notez (si ce n'est pas déjà évident) qu'il n'y a pas assez d'espace
% entre la ligne du haut et le I majuscule de <<~Item~>>, et de même pour
% toutes les lignes: comparez avec la version précédente. De plus, les
% filets (c'est-à-dire les lignes) du haut et du bas dans la première
% version sont plus gras que le filet du milieu, qui à son tour est plus
% gras que le filet mineur en dessous de <<~Item~>>. Oui, je \emph{sais}
% que vous pouvez redéfinir =\doublerulesep= et ensuite utiliser
% =\hline\hline= pour obtenir quelque chose donnant presque le même
% effet, et vous pouvez utiliser des <<~struts~>> pour améliorer
% l'espacement. Mais ce sont des astuces et vous ne devriez pas avoir à
% vous soucier de telles choses. Le paquetage \texttt{booktabs} définit
% ses propres commandes pour que ces problèmes soient pris en compte
% automatiquement.
%
% En général, je voudrais dire que ce paquetage est sans intérêt pour ceux
% qui cherche une alternative à Pic\TeX{} pour traiter des tableaux
% sophistiqués. C'est plutôt un guide de style pour les auteurs d'articles
% et de livres scientifiques en ce qui concerne la mise en page des
% tables. Il n'est pas exagéré de dire que si vous ne pouvez pas créer une
% table en utilisant les commandes de ce paquetage, c'est que vous l'avez
% mal conçue.
%
% \subsection{Une note sur la terminologie}
%
% En typographie britannique, une <<~line~>> s'appelle toujours une
% <<~rule~>> (NdT : en typographie française, une <<~ligne~>> s'appelle
% toujours un <<~filet~>>). Peut-être en portant à confusion (pour des
% raisons historiques), l'<<~épaisseur~>> d'un filet est souvent appelée
% sa <<~largeur~>> (alors que n'importe qui d'autre l'appellerait sa
% <<~profondeur~>> ou <<~hauteur~>>, s'il pensait à un filet horizontal).
% Une <<~ligne noire épaisse~>> est appelée un <<~filet gras~>> (<<~heavy
% rule~>>). Cette terminologie (britannique) est utilisée dans la plupart
% des nouvelles commandes décrites ci-dessous. Au moins cela évite la
% confusion avec =\hline=.
%
% \subsection{La mise en page des tables formelles}
% Vous ne ferez pas de graves erreurs si vous vous rappelez à tout moment
% de deux simples commandements:
% \begin{enumerate}
%  \item Ne jamais, au grand jamais, utiliser de filets verticaux.
%  \item Ne jamais utiliser de filets doubles.
% \end{enumerate}
% Ces commandements peuvent sembler extrêmes mais en des années
% d'expérience je n'ai jamais trouvé un bon argument pour passer outre.
% Par exemple, si vous sentez que les informations dans la moitié gauche
% d'une table sont si différentes de celles de la droite qu'il faut les
% séparer par une ligne verticale, alors vous devriez plutôt utiliser deux
% tables. Le second commandement est très, très occasionnellement violé:
% j'ai travaillé pour un éditeur qui insistait pour placer un filet fin
% double au dessus d'une rangée de totaux. Mais ce n'aurait pas été mon
% choix.
%
% Il y a trois autres conseils que je pourrai citer ici car ils sont si peu
% connus en dehors des cercles des typographes et éditeurs professionnels:
% \begin{enumerate}
%      \item Placez les unités dans l'en-tête de la colonne (pas dans le corps de
%         la table).
%      \item Faites toujours précéder un point décimal (une virgule décimale en
%         français) par un chiffre; donc 0.1 (ou 0,1) et \emph{pas} simplement .1
%         (,1).
%      \item N'utilisez pas de signes <<~ditto~>> ou toute convention analogue
%         pour répéter une valeur précédente. Dans la plupart des cas, un blanc fait
%         aussi bien l'affaire. Sinon, répétez la valeur.
% \end{enumerate}
%
% Est-ce que c'est moi qui suis pédant? Ces derniers conseils sont de plus en
% plus souvent ignorés dans les travaux publiés. Pour moi, ceci montre
% simplement que la typographie est celle d'un amateur.
%
% De toute façon, que vous vouliez ou non suivre ces embellissements mineurs,
% si vous n'utilisez que les commandes suivantes dans vos tables formelles,
% votre lecteur sera reconnaissant. (Je répète que ces conseils ne sont pas
% seulement pour faire plaisir au pédant. Une structure de présentation
% améliorée commence par améliorer la pensée structurée).
%
% \section{Utilisation des nouvelles commandes}
%
% \DescribeMacro\toprule
% \DescribeMacro\midrule
% \DescribeMacro\bottomrule
% Dans les cas les plus simples une table commence par une =\toprule=, a une
% rangée simple d'en-têtes de colonnes, puis un filet de séparation appelé ici
% =\midrule=; après les colonnes de données nous terminons par une
% =\bottomrule=. La plupart des éditeurs de livres rendent les filets
% =\toprule= et =\bottomrule= plus gras (c'est-à-dire plus larges,
% ou plus sombres; c'est une question de notation) que le filet intermédiaire
% =\midrule=. Cependant, lorsque les tables sont en très petits
% caractères, il est parfois impossible de faire cette distinction, et de plus
% quelques journaux utilisent des filets qui sont tous de même épaisseur. Les
% commandes de filet de ce paquetage ont toutes une épaisseur par défaut qui
% peut être modifiée à l'intérieur du document (de préférence, mais pas
% obligatoirement, dans le préambule). Pour les filets du haut et du bas,
% c'est =\heavyrulewidth= et pour les filets intermédiaires c'est
% =\lightrulewidth= (ces commandes sont décrites complètement plus loin). Dans
% de très rares cas, vous pouvez utiliser les arguments optionnels des
% commandes de filet qui ont la syntaxe formelle suivante:
% \begin{quote}
%   "\toprule["\meta{largeur}"]" \\
%   "\midrule["\meta{largeur}"]" \\
%   "\bottomrule["\meta{largeur}"]"
% \end{quote}
% où \meta{largeur} est une dimension \TeX{} (par exemple 1pt, .4em, etc.).
%
% Toutes les commandes de filets décrites ici se placent immédiatement après
% la commande =\\= qui termine la rangée précédente (sauf bien sûr pour
% =\toprule=, qui se place juste après le début de l'environnement
% \texttt{tabular}); en d'autres termes, exactement là où le \LaTeX{} standard
% permet =\hline= ou =\cline=.
%
% \DescribeMacro\cmidrule
% Bien sûr plus souvent que nous le voudrions nous avons besoin d'un filet qui
% ne s'étend que sur certaines des colonnes, filet pour lequel nos utiliserons
% =\cmidrule= (analogue \`a la commande =\cline= de \LaTeX). En général, ce
% filet ne devrait pas recouvrir complètement les colonnes terminales, est
% ceci est en particulier le cas lorsque nous devons commencer une =\cmidrule=
% immédiatement après la fin d'une autre (les =\cline='s de \LaTeX{} se
% touchent si vous n'êtes pas extrêmement attentifs à =\extracolsep=). Donc
% vous voudrez en général utiliser les commandes optionnelles de
% raccourcissement (<<~trimming~>>), qui sont =(r)=, =(l)= et =(rl)= ou
% =(lr)=, qui indiquent si les extrémités droite et/ou gauche du filet doivent
% être rognées. Notez l'utilisation exceptionnelle de \emph{parenthèses} au
% lieu d'accolades ou de crochets pour cette commande, dont la syntaxe
% complète est
% \begin{quote}
%    "\cmidrule["\meta{largeur}"]("\meta{rognage}"){"$a$--$b$"}"
% \end{quote}
% où \meta{largeur} est encore une épaisseur optionnelle de filet (dont la valeur
% par défaut est ici =\cmidrulewidth=) et le dernier argument, qui n'est pas
% optionnel, donne les numéros des colonnes à englober.
%
% Un exemple d'utilisation de ces commandes est donné par le code utilisé pour
% produire l'exemple de table ci-dessus:
% \begin{verbatim}
% \begin{tabular}{@{}llr@{}} \toprule
% \multicolumn{2}{c}{Item} \\ \cmidrule(r){1-2}
% Animal & Description & Price (\$)\\ \midrule
% Gnat  & per gram  & 13.65 \\
%       & each      & 0.01 \\
% Gnu   & stuffed   & 92.50 \\
% Emu   & stuffed   & 33.33 \\
% Armadillo & frozen & 8.99 \\ \bottomrule
% \end{tabular}
% \end{verbatim}
%
% \DescribeMacro\addlinespace
% Occasionnellement nous désirons mettre un espacement supplémentaire entre
% certaines rangées d'une table; par exemple, avant la dernière rangée, si
% c'est un total (un espacement est ici préférable à une autre =\midrule=,
% selon mon opinion). Il suffit d'insérer
% \begin{quote}
%   "\addlinespace["\meta{largeur}"]"
% \end{quote}
% après le marqueur d'alignement =\\=. Il n'est pas mauvais de voir
% =\addlinespace= comme étant un filet blanc d'épaisseur \meta{largeur}.
% L'espacement par défaut est =\defaultaddspace= qui donne bien moins qu'un
% interligne complet (comme ce que vous obtiendriez en utilisant =\\ \\= à la
% fin de la ligne; ceci donne vraiment trop d'espace dans la plupart des cas).
%
% \section{Abus des nouvelles commandes}
% Il faut le reconnaître, cela ne marche pas tout seul, et il y a donc
% quelques conseils et des commandes supplémentaires pour les \TeX perts et
% les touche-à-tout.
%
% Les nouvelles commandes de filet ne sont pas garanties pour fonctionner avec
% =\hline= ou =\cline=, bien que celles-ci restent disponibles et inchangées.
% Je ne peut prévoir aucune raison pour vouloir les mélanger.
%
% Plus sérieusement, les filets engendrés par les nouvelles commandes ne sont
% pas garantis pour se connecter aux filets verticaux engendrés par des
% caractères =|= dans le préambule de la table. Ceci est une particularité
% (voir plus haut). Vous ne devriez pas utiliser de filets verticaux dans les
% tables, point final.
%
% \DescribeMacro\morecmidrules
% Si vous ne pouvez pas vous empêcher d'utiliser un filet double, même une
% construction aussi bizarre que =\toprule==\bottomrule==\midrule=
% fonctionnera sans provoquer de message d'erreur (tout comme vous pouviez
% utiliser une double =\hline=). Ces filets seront séparées de l'intervalle
% =\doublerulesep= du \LaTeX{} normal. Cependant si votre perversion va
% jusqu'à vouloir des =\cmidrule= doubles, vous aurez besoin de la commande
% supplémentaire =\morecmidrules= pour le faire correctement, car normalement
% deux commandes =\cmidrule= de suite est une construction parfaitement
% correcte demandant deux filets sur le même <<~filet de rangée~>>. Donc dans
% \begin{quote}
%   "\cmidrule{1-2}\cmidrule{1-2}"
% \end{quote}
% la seconde commande écrit un filet qui vient se placer exactement sur le
% premier; je suppose que vous vouliez
% \begin{quote}
%   "\cmidrule{1-2}\morecmidrules\cmidrule{1-2}"
% \end{quote}
% qui donne un filet double entre les colonne une et deux, séparés de
% =\cmidrulesep= (note: puisque qu'une =\cmidrule= donne un filet très fin, la
% valeur ordinaire =\doublerulesep= donnerait probablement un espacement trop
% grand). Il faut terminer une rangée complète de filets avant de mettre la
% commande =\morecmidrules=. Notez que =\morecmidrules= n'a aucun effet si
% elle ne suit pas immédiatement une =\cmidrule= (ie n'est donc pas une
% commande générale d'espacement).
%
% \DescribeMacro\specialrule
% Parler de ceci nous amène à l'abus de =\addlinespace= pour engendrer un
% espacement supplémentaire curieux entre des filets. Ne le faites pas (ce
% n'est cependant pas vraiment illégal). Utilisez plutôt
% \begin{quote}
%   "\specialrule{"\meta{largeur}"}{"\meta{espace au dessus}"}{"\meta{espace au dessous}"}"
% \end{quote}
% où il faut noter que les trois arguments sont obligatoires (je ne me suis
% pas soucié d'établir des valeurs par défaut). Si vous utilisez ceci
% fréquemment, vous n'avez pas compris le but et le contenu des conseils
% donnés plus haut. Note technique: aucun espacement n'est ajouté après un
% filet précédent, mais un filet suivant engendrera un espacement
% =\doublerulesep= au dessus de lui. Pourquoi lisez-vous cette section ?
%
% \section{Sommaire technique des commandes}
% Les nouvelles commandes de filets sont valides à l'intérieur de
% l'environnement \texttt{tabular} (et en fait aussi à l'intérieur de
% l'environnement \texttt{array} et de ses dérivés), dans toutes les versions
% de \LaTeX{} (vous devrez retirer la ligne
% \begin{quote}
%    "\ProvidesPackage{booktabs}"
% \end{quote}
% de =booktabs.sty= pour fonctionner sous \LaTeX{}2.09 et les versions
% antérieures), et entièrement compatible avec l'environnement \texttt{array}
% du paquetage \texttt{array} fourni avec \LaTeXe.
%
% Les commandes suivent la syntaxe de placement standard de =\hline=. Si des
% commandes de filets sont doublées, il est plus prudent de vérifier qu'il n'y
% a pas d'espace entre les commandes. (Dans de nombreux cas, l'oubli de cette
% règle de sécurité donnera le message étrange <<~=misplaced noalign{=~>>.)
% N'utilisez pas de filets doubles !
%
% Dans ce qui suit, un <<~filet~>> est l'une des commandes =\toprule=,
% =\midrule=, =\bottomrule=, =\cmidrule=, =\specialrule= ou =\addlinespace=.
% Notez en particulier la présence de la commande =\addlinespace= dans cette
% liste; et l'exclusion de =\hline= et =\cline=, qui donneront des résultats
% imprévisibles si vous les mélanger avec les premières.
%
% \begin{quote}
%   "\toprule["\meta{largeur}"]"
% \end{quote}
% Un filet de largeur \meta{largeur} (défaut =\heavyrulewidth=) avec
% =\belowrulesep= d'espacement vertical supplémentaire inséré en dessous de
% lui (sauf si il est suivi d'une autre commande de filet, auquel cas un
% espacement vertical =\doublerulesep= suit).
% \begin{quote}
%   "\midrule["\meta{largeur}"]"
% \end{quote}
% Un filet de largeur \meta{largeur} (défaut =\lightrulewidth=) avec un espacement
% =\aboverulesep= au dessus de lui (sauf si précédé d'un autre filet, auquel
% cas il en sera séparé de la quantité =\doublerulesep=) et avec un espacement
% =\belowrulesep= en dessous de lui (à moins qu'un autre filet suive).
% \begin{quote}
%   "\bottomrule["\meta{largeur}"]"
% \end{quote}
% Un filet de largeur \meta{largeur} (défaut =\heavyrulewidth=) avec un espacement
% =\aboverulesep= au dessus de lui (sauf s'il est précédé d'un autre filet,
% duquel il sera séparé de la quantité =\doublerulesep=) et avec un espacement
% =\belowrulesep= en dessous de lui (à moins qu'un autre filet le suive).
% L'espacement supplémentaire en dessous permet de laisser de l'espace pour
% des notes en bas de table.
% \begin{quote}
%   "\cmidrule["\meta{largeur}"]("\meta{rognage}"){"$a$--$b$"}"
% \end{quote}
% Un filet de largeur \meta{largeur} (défaut =\cmidrulewidth=) avec un espacement
% =\aboverulesep= au dessus de lui (sauf si il suit un autre =\cmidrule=,
% auquel cas il est sur le même alignement vertical; ou si il suit tout
% autre filet, séparé de =\doublerulesep=; ou si il suit =\morecmidrules=,
% séparé de =\cmidrulesep=), et avec l'espacement =\belowrulesep= en dessous
% de lui (à moins d'être suivi d'une autre =\cmidrule=, auquel cas le filet
% suivant est sur le même alignement vertical; ou si suivi de
% =\morecmdirules=, avec l'espacement =\cmidrulesep= en dessous).
%
% Le filet s'étend sur les colonnes $a$ à $b$. L'argument optionnel \meta{trim}
% qui se place entre parenthèses s'il est présent, peut être =r= pour rogner
% sur la droite, =l= pour rogner sur la gauche, ou les deux.
% \begin{quote}
%   "\addlinespace["\meta{largeur}"]"
% \end{quote}
% En fait considéré comme un filet de largeur nulle (donc invisible) sans
% espacement supplémentaire au dessus et un espacement \meta{largeur} (qui est par
% défaut =\defaultaddspace=) au dessous (si un autre filet suit, celui-ci sera
% séparé en plus de =\doublerulesep=). En pratique, n'utilisez cette commande
% que pour ajouter de l'espace entre des rangées dans le corps de la table.
% \begin{quote}
%   "\specialrule{"\meta{largeur}"}{"\meta{espace au dessus}"}{"\meta{espace au dessous}"}"
% \end{quote}
% Un filet de largeur \meta{largeur} (notez l'argument obligatoire) avec un
% \meta{espace au dessus} et un \meta{espace au dessous} (sauf si un autre filet
% suit, auquel cas la séparation sera encore augmentée de =\doublerulesep=).
% \begin{quote}
%   "\morecmidrules"
% \end{quote}
% Avertit \LaTeX{} qu'il faut commencer une nouvelle rangée de =\cmidrule=,
% séparée de la dernière par =\cmidrulesep=. N'a aucun effet en dehors de ce
% contexte.
%
% Les dimensions par défaut sont
% \begin{quote}
%   "\heavyrulewidth=.08em" \\
%   "\lightrulewidth=0.5em" \\
%   "\cmidrulewidth=0.3em" \\
%   "\belowrulesep=.65ex" \\
%   "\aboverulesep=.4ex" \\
%   "\defaultaddspace=.5em" \\
%   "\cmidrulekern=.25em"
% \end{quote}
% La dernière d'entre elles, =\cmidrulekern=, est la quantité dont une
% =\cmidrule= est rognée à chaque bout indiqué dans les options
% =()=. Dans la construction
% \begin{quote}
%   "\cmidrule(r){1-2}\cmidrule(l){3-4}"
% \end{quote}
% il y a un total de 0.5~em séparant les deux filets. Actuellement le seul
% moyen pour obtenir des effets spéciaux est de modifier comme il convient la
% valeur de =\cmidrulekern=; la valeur du raccourcissement n'est pas
% disponible sous forme d'argument dans le codage actuel de =\cmidrule=.
%
% L'usager peut modifier ces valeurs par défaut au vol en insérant simplement
% une commande exactement sous le format ci-dessus; la redéfinition restera
% effective pour le reste du document ou jusqu'à la prochaine redéfinition.
%
% \section{Support de \texttt{firsthline} et \texttt{lasthline}}
% Oui, d'une certaine manière, mais essentiellement non. Ceci ne s'applique
% pas en fait. Les commandes de ce paquetage ne sont pas faites pour faire de
% belles choses avec des boîtes; celles-ci sont des tableaux et non des
% tables. Vous ne voudrez jamais, jamais, placer une table formelle au milieu
% d'une ligne de texte.
%
% Cependant, si vous utilisez le paquetage \texttt{array}, les commandes ne
% sont pas altérées par le code présent (par exemple =\hline= et =\cline=
% restent actives).
%
% \section{Remerciements}
% Je\footnote{NdT : Simon Fear} suis grandement redevable bien sûr à DEK et
% Lamport ; l'argument optionnel et le code de =\cmidrule= notamment est
% copié et adapté de =latex.sty=. La documentation est massivement tirée de
% la description du package =dcolumn.dtx= de David Carlisle.
%
% Pour les tests et les encouragements...
%
% \StopEventually
%
% \section{Le code}
%
%   La version actuelle est définie au début du fichier par quelquechose
%   ressemblant à ça :
%    \begin{macrocode}
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{booktabs}
		  [\filedate\space version\fileversion]
%    \end{macrocode}
%
%   D'abord nous définissons les nouvelles dimensions décrites plus haut :
%    \begin{macrocode}
\newdimen\heavyrulewidth
\newdimen\lightrulewidth
\newdimen\cmidrulewidth
\newdimen\belowrulesep
\newdimen\aboverulesep
\newdimen\cmidrulesep
\newdimen\cmidrulekern
\newdimen\defaultaddspace
\heavyrulewidth=.08em
\lightrulewidth=.05em
\cmidrulewidth=.03em
\belowrulesep=.65ex
\aboverulesep=.4ex
\cmidrulesep=\doublerulesep
\cmidrulekern=.25em
\defaultaddspace=.5em
%    \end{macrocode}
%   et quelques compteurs internes, sans intérêt pour l'utilisateur :
%    \begin{macrocode}
\newcount\rulesflag
\newdimen\@cmidrulewidth
\newcount\@cmidla
\newcount\@cmidlb
\rulesflag=0
%    \end{macrocode}
%   qui seront décrits plus bas si besoin.
%
% \subsection{Filets en pleine largeur}
%
%   Nous plaçons le filet en pleine largeur dans un groupe =\noalign{}=, en
%   utilisant une grosse astuce ("\ifnum=0`}") pour faire croire à l'analyseur
%   que le nombre d'accolades est correct. L'accolade sera réellement
%   fermée après tout le traitement à la fin de la macro =\@endrule=.
%
% \begin{macro}{\toprule}
%    \begin{macrocode}
\def\toprule{\noalign{\ifnum0=`}\fi
	 \@ifnextchar[{\@toprule}{\@toprule[\heavyrulewidth]}}
%    \end{macrocode}
%   Cela tient compte de l'argument optionnel de =\toprule= : s'il y en a
%   un, il est passé à =\@toprule=, sinon l'appel est fait avec la taille
%   par défaut =\heavyrulewidth=.
%
%   Dans la suite, si =\rulesflag= a été défini (avec la valeur 1), nous
%   venons juste de créer un précédent filet qui avait été modifié
%   exceptionellement pour ne pas avoir un espacement normal après, donc
%   nous devons placer =\doublerulesep= avant ce =\toprule=; ensuite, nous
%   réinitialisons =\rulesflag= à zéro.
%   Note : nous ne pouvons pas juste ajouter toujours =\belowrulesep= après
%   un =\toprule=, parce que il pourrait y avoir un =\doublerulesep= entre
%   deux filets successifs. En revanche, nous pouvons interdire tout
%   simplement les files doubles !
%    \begin{macrocode}
\def\@toprule[#1]{\ifnum\rulesflag=1\vskip
	 \doublerulesep\global\rulesflag=0\fi
	 \hrule \@height#1\futurelet\@tempa\@endrule}
%    \end{macrocode}
%
%   À la troisième ligne au dessus, nous avons ajouter le filet et nous
%   appelons la routine de fin =\@endrules= avec =\@tempa= égal au
%   \emph{token} suivant le filet dans le document.
%    \begin{macrocode}
\def\@endrule{\ifx\@tempa\toprule\global\rulesflag=1%
	 \else\ifx\@tempa\midrule\global\rulesflag=1%
	 \else\ifx\@tempa\bottomrule\global\rulesflag=1%
	 \else\ifx\@tempa\cmidrule\global\rulesflag=1%
	 \else\ifx\@tempa\specialrule\global\rulesflag=1%
	 \else\ifx\@tempa\addlinespace\global\rulesflag=1%
	 \else\vskip \belowrulesep\fi\fi\fi\fi\fi\fi\ifnum0=`{\fi}}
%    \end{macrocode}
%   Ici, si la commande suivante est un autre filet ou un interligne (la
%   honte sur l'utilisateur !), nous avons initialisé =\rulesflag= à 1 sans
%   ajouter d'espace. Sinon, nous avons placé, après, l'espacement approrié.
% \end{macro}
%
% \begin{macro}{\midrule}
% \begin{macro}{\bottomrule}
%   Le code est presque le même que pour =\topriule=, sauf pour l'ajout de
%   l'espace suivant le filet.
%
%   Notons qu'en ce qui concerne la programmation, un =\bottomrule= est
%   simplement un =\midrule= large (mais l'utilisateur ne doit pas penser
%   de cette façon.
%    \begin{macrocode}
\def\midrule{\noalign{\ifnum0=`}\fi
	 \@ifnextchar[{\@midrule}{\@midrule[\lightrulewidth]}}
\def\@midrule[#1]{\ifnum\rulesflag=1\vskip
	 \doublerulesep\global\rulesflag=0
	 \else\vskip \aboverulesep\fi
	 \hrule \@height#1\futurelet\@tempa\@endrule}
\def\bottomrule{\noalign{\ifnum0=`}\fi
	 \@ifnextchar[{\@midrule}{\@midrule[\heavyrulewidth]}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\addlinespace}
%
%   Un =\addlinespace= est traité comme une ligne de largeur nulle, sans
%   espace avant et avec après l'espacement donné en argument (ou par
%   défaut). Notez que la ligne suivante sera ajouté après un espace
%   \emph{supplémentaire} de =\doublerulesep=. L'utilisateur n'est pas
%   encouragé à ajouter de l'espace avant/après les filets avec
%   =\addlinespace=. Si besoin, il devra utiliser =\specialrule=.
%    \begin{macrocode}
\def\addlinespace{\noalign{\ifnum0=`}\fi
	 \@ifnextchar[{\@addspace}{\@addspace[\defaultaddspace]}}
\def\@addspace[#1]{\ifnum\rulesflag=1\global\rulesflag=0\fi
	 \vskip #1\futurelet\@tempa\@endrule}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\specialrule}
%   Ceci est inclus avec une certaine appréhension puisque cela permet à
%   l'utilisateur de faire des choses stupides. Mais, un \emph{designer}
%   pourrait avoir besoin de ceci (ou d'une adaptation).
%
%   Notez qu'un =\toprule= suivant se comportera comme attendu (pas
%   d'espace supplémentaire avant), mais un =\midrule= ou un =\bottomrule=
%   ajoutera =\aboverulespace=, pendant que =\cmidrule= ajoutera
%   =\doublerulesep=. Pourquoi voudriez vous faire ceci de toute façon ?
%    \begin{macrocode}
\def\specialrule#1#2#3{\noalign{
	 \ifnum\rulesflag=1\global\rulesflag=0
	 \else\vskip #2\fi\hrule \@height#1\vskip #3}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Filets spéciaux}
%
% \begin{macro}{\cmidrule}
%    =\cmidrule= utilise =\rulesflag= d'une manière un peu différente. Il
%    est mis (ou laissé) à 1 si vous êtes au milieu d'une ligne de
%    =\cmidrule= ou si vous en commencez une nouvelle (avec
%    =\morecmidrules=). Sinon, si =\rulesflag= vaut zéro, nous faisons
%    précéder le filet par =\aboverulesep=.
%    \begin{macrocode}
\def\cmidrule{\noalign{\ifnum0=`}\fi
	 \@ifnextchar[{\@cmidrule}{\@cmidrule[\cmidrulewidth]}}
\def\@cmidrule[#1]{\@ifnextchar({\@@cmidrule[#1]}{\@@cmidrule[#1]()}}
\def\@@cmidrule[#1](#2)#3{\@@@cmidrule[#3]{#1}{#2}}
%    \end{macrocode}
%   Ce qui précède est du bidouillage pour initialiser les valeurs par défaut des
%   arguments optionnels manquants. Nous passons également à =\@@@cmidrule=
%   les arguments dans un ordre différent, c'est-à-dire =[a-b]=={largeur demandée}=
%   ={commandes de rognage}= (je ne parviens pas à me souvenir pourquoi j'ai
%   fait ça).
%    \begin{macrocode}
\def\@@@cmidrule[#1-#2]#3#4{\global\@cmidla#1\relax
	 \global\advance\@cmidla\m@ne
	 \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else
	 \global\let\@gtempa\@cmidruleb\fi
	 \global\@cmidlb#2\relax
	 \global\advance\@cmidlb-\@cmidla
%    \end{macrocode}
%   Cela a créé un un branchement conditionnel pour appeler la routine
%   appropriée, =\@cmidrulea= ou =\@cmidruleb=, selon que nous commençons
%   dans la première colonne ou non (quelle perte de temps !).
%    \begin{macrocode}
	 \global\@cmidrulewidth=#3
%    \end{macrocode}
%   Il s'agit soit de la valeur par défaut ou de la valeur passée en argument.
%
%   Maintenant, nous analysons les arguments (le cas échéant) :
%    \begin{macrocode}
	 \global\let\cmlkern@l\z@ \global\let\cmlkern@r\z@
	 \@tfor\@tempa :=#4\do{\global\expandafter\let
		  \csname cmlkern@\@tempa\endcsname\cmidrulekern}%
%    \end{macrocode}
%   Maintenant, il faut insérer l'espace au dessus si besoin, fermer le
%   =\noalign=, puis passer à la bonne routine de dessin du filet, définie plus
%   haut (=\let\@gtempa=) :
%    \begin{macrocode}
\ifnum\rulesflag=0\vskip \aboverulesep\fi\ifnum0=`{\fi}\@gtempa
%    \end{macrocode}
%   Maintenant, on ouvre un autre =\noalign= et on appelle la routine de
%   fin.
%    \begin{macrocode}
	 \noalign{\ifnum0=`}\fi\futurelet\@tempa\@xcmidrule}
%    \end{macrocode}
%
%   Ce code (appelé plus haut) dessine effectivement les filets :
%    \begin{macrocode}
\def\@cmidrulea{\multispan\@cmidla&\multispan\@cmidlb
	 \unskip\hskip \cmlkern@l\leaders\hrule \@height\@cmidrulewidth\hfill
	 \hskip \cmlkern@r\cr}
\def\@cmidruleb{\multispan\@cmidlb
	 \unskip\hskip \cmlkern@l\leaders\hrule \@height\@cmidrulewidth\hfill
	 \hskip \cmlkern@r\cr}
%    \end{macrocode}
%   Pour finir, la routine de fin. Si un autre =\cmidrule= suit, on supprime
%   l'espace vertical pour qu'il se chevauche et "\rulesflag=1" empêchera
%   d'ajouter de l'espace au dessus du suivant. Si =\morecimdrules= suit, on
%   ajoute =\cmidrulesep= (et on met encore =\rulesflag= à 1). Dans les autres
%   cas, il s'agit du dernier filet du groupe actuel et nous devons juste
%   ajouter l'espacement =\belowrulesep=.
%
%    Finalement, nous fermons le =\noalign=.
%    \begin{macrocode}
\def\@xcmidrule{\ifx\@tempa\cmidrule\vskip-\@cmidrulewidth
	 \global\rulesflag=1\else
	 \ifx\@tempa\morecmidrules\vskip \cmidrulesep
	 \global\rulesflag=1\else
	 \vskip \belowrulesep\global\rulesflag=0\fi\fi
	 \ifnum0=`{\fi}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\morecmidrules}
%   Il s'agit vraiment d'une fausse commande ; tout le travail a été fait plus
%   haut, dans la routine =\cmidrule=. Nous regardons un pas en avant pour voir
%   si un =\morecmidrules= suit l'actuel =\cmidrule=, et le cas échéant, on
%   active l'indicateur =\rulesflag=. Autrement, la commande =\morecmidrules=
%   en elle même ne fait rien.
%    \begin{macrocode}
\def\morecmidrules{\noalign{\relax}}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \Finale
%
