% \CheckSum{482}
%
% \iffalse meta-comment
% Files `tabvar.dtx', `tabvar.ins' and `tabvar.mp'
%
% Copyright (C) Daniel Flipo 2003-2008 <Daniel.Flipo at univ-lille1.fr>
%
% All the files included in the `tabvar' distribution, including
% the font, may be distributed and/or modified under the conditions
% of the LaTeX Project Public License, either version 1.3 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.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This file has the LPPL maintenance status "maintained".
%
% NO PERMISSION is granted to produce or to distribute a
% modified version of this file under its original name.
%
% \fi
%
% \iffalse
%
%<*sty>
%%
%% Copyright (C) Daniel Flipo 2003-2008 <Daniel.Flipo at univ-lille1.fr>
%%
\NeedsTeXFormat{LaTeX2e}[1997/06/01]
\ProvidesFile{tabvar.sty}
%</sty>
%<*dtx>
\ProvidesFile{tabvar.dtx}
%</dtx>
%<*!cfg>
             [2008/10/23 v1.2 (Daniel Flipo)]
%</!cfg>
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage{tabvar}
\GetFileInfo{tabvar.dtx}
\RecordChanges
%\OnlyDescription
%
\usepackage{url}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{}
\usepackage[frenchb]{babel}
\newcommand*\file[1]{\textsf{#1}}
\setlength{\parindent}{0pt}
\begin{document}
\begin{center}
  \textbf{\Large Tableaux de variations : `tabvar'}\\[3mm]^^A\]
  Daniel \textsc{Flipo}\\
  \texttt{Daniel.Flipo\at univ-lille1.fr}
\end{center}
 \DocInput{tabvar.dtx}
\end{document}
%</driver>
%
% \fi
%
%  \section{Documentation}
%
%    L'extension \file{tabvar.dtx}\footnote{La version pr\'esent\'ee
%    ici porte le num\'ero \fileversion, derni\`ere modification le
%    \filedate.}, a pour but de faciliter la saisie des tableaux de
%    variations.
%
%    Elle s'appuie sur les extensions \file{array}, \file{colortbl},
%    et \file{varwidth}. Les fl\`eches sont prises dans une fonte
%    (type\,1) sp\'ecialement cr\'e\'ee par Michel~\bsc{Bovani}.
%    Un grand merci \`a Michel pour cette contribution et pour
%    ses remarques qui m'ont \'et\'e tr\`es utiles pour
%    am\'eliorer les versions pr\'eliminaires.
%
%    Une autre possibilit\'e est de faire appel, pour les fl\`eches,
%    \`a MetaPost : le fichier \file{tabvar.mp} permet de cr\'eer les
%    trois fl\`eches \file{tabvar.1}, \file{tabvar.2}, \file{tabvar.3}.
%    Ceci est une solution de repli pour ceux qui auraient du mal
%    \`a installer la fonte \file{tabvar.pfb}.
%
%  \subsection{Installation}
%
%    Assurez-vous que l'extension \file{varwidth.sty} est pr\'esente
%    sur votre syst\`eme, sinon r\'ecup\'erez-les sur CTAN :
%    cherchez par exemple la cha\^{\i}ne |varwidth|
%    sur \url{http://www.tex.ac.uk/CTANfind.html}
%
%    Les fichiers \file{tabvar.1}, \dots{} , \file{tabvar.3}
%    ainsi que \file{tabvar.sty} et \file{tabvar.cfg} doivent
%    \^etre plac\'es dans un r\'epertoire vu par \LaTeX.
%
%    Les fl\`eches sont prises dans la fonte type\,1 \file{tabvar.pfb}
%    \`a condition que celle-ci soit correctement install\'ee :
%    il est n\'ecessaire de placer le fichier \file{tabvar.pfb} dans
%    un r\'epertoire o\`u il sera pris en compte, par exemple, pour
%    respecter l'architecture TDS : |texmf/fonts/type1/public/tabvar|.
%    De m\^eme, son fichier de m\'etriques \file{tabvar.tfm} devra
%    \^etre mis par exemple dans |texmf/fonts/tfm/public/tabvar|.
%
%    Un ligne donnant acc\`es \`a cette fonte doit \^etre ajout\'ee
%    (voir \file{tabvar.map}) dans les fichiers |.map| utilis\'es
%    par le pilote PostScript (\file{psfonts.map}) et par pdf\TeX{}
%    (\file{pdftex.map}).
%    Ne pas oublier de mettre \`a jour les bases de donn\'ees ls-R
%    pour terminer (commande |mktexlsr| sous te\TeX{} ou \TeX{}Live).
%
%  \subsection{Utilisation}
%
%    L'environnement |tabvar| est une variante de l'environnement
%    |array|, adapt\'ee \`a la saisie de tableaux de variations.
%
%    Trois nouveaux types de colonnes, |C|, |L| et |R| sont
%    utilis\'es \`a la place des types classiques (|c|, |l| et |r|) ;
%    ils permettent de disposer du mat\'eriel sur plusieurs niveaux
%    dans un m\^eme ligne du tableau (ce sont des colonnes de type
%    |\parbox|).
%
%    Un quatri\`eme type de colonne, not\'e |N| sert pour les plages
%    o\`u la fonction est non d\'efinie. La colonne est enti\`erement
%    gris\'ee par d\'efaut, mais il est possible de choisir une autre
%    couleur (voir le fichier de configuration \file{tabvar.cfg}).
%
%    La saisie des lignes contenant les valeurs de la variable et les
%    signes des d\'eriv\'ees se fait exactement comme celles d'un
%    tableau |array|. Seules les lignes contenant les variations de
%    la ou des fonctions font appel \`a six commandes
%    particuli\`eres : |\croit|, |\decroit|, |\constante|,
%    |\niveau|, |\dbarre| et |\discont|.
%
%    \begin{itemize}
%
%      \item Les commandes |\croit|, |\decroit| et |\constante| ne
%        prennent pas d'argument, elles tracent les fl\`eches
%        montantes, descendantes ou horizontales.
%
%      \item |\niveau{|\emph{d\'epart}|}{|\emph{total}|}| prend
%        deux arguments : le niveau (hauteur) o\`u doit \^etre
%        positionn\'ee la premi\`ere valeur de la fonction et le
%        nombre total de niveaux qui seront utilis\'es dans la ligne.
%
%      \item |\dbarre| trace un double trait vertical dont la hauteur
%        est celle de la ligne du tableau ; elle indique les
%        discontinuit\'es de la fonction.
%
%      \item |\discont[|\emph{num}|]{|\emph{valeur\_gauche}|}{<|
%        ou |>}{|\emph{valeur\_droite}|}| peut
%        s'utiliser lorsque la fonction pr\'esente une
%        discontinuit\'e \`a la place de la double barre
%        traditionnelle ; elle prend trois arguments obligatoires :
%        les valeurs \`a gauche~$f_-$ et \`a droite~$f_+$ de la
%        fonction, s\'epar\'ees par un signe |<| ou |>| selon que
%        $f_-<f_+$ ou $f_->f_+$.
%        Enfin, l'argument optionnel, qui vaut~0 par d\'efaut,
%        permet d'intercaler \emph{num} niveaux suppl\'ementaires
%        entre les valeurs de~$f_-$ et~$f_+$ si n\'ecessaire.
%
%    \end{itemize}
%
%    Il est possible d'ajouter des filets d'alignement vertical en
%    utilisant la commande |\barre{}| qui requiert un argument
%    obligatoire, \'eventuellement vide : |\barre{}| trace un filet
%    vertical dont la hauteur est celle de la ligne du tableau.
%    Lorsqu'une valeur doit figurer sous le filet, on la passe en
%    argument de la commande (|\barre{0}| par exemple), ainsi cette
%    valeur sera centr\'ee sur le filet.  Ceci restreint \'evidemment
%    l'usage de la commande |\barre| aux colonnes de type \texttt{C}.
%    La couleur du filet (gris par d\'efaut) est param\'etrable, voir
%    le fichier de configuration \file{tabvar.cfg}. Cette solution a
%    \'et\'e pr\'ef\'er\'ee \`a des pointill\'es qui posent des
%    probl\`emes de raccordement d'une ligne \`a l'autre du tableau.
%
%    Le fichier \file{demo.pdf} (joint) propose plusieurs exemples,
%    accompagn\'es de leur code source, illustrant les utilisations
%    possibles de l'environnement |tabvar|.
%
% \StopEventually{\PrintChanges}
%
% \iffalse
%<*sty>
% \fi
%
%  \section{Le code}
%
%  \subsection{Options}
%
% \changes{tabvar-0.9}{2004/12/29}{Par d\'efaut, les fl\`eches
%    sont prises maintenant dans la fonte type 1 de Michel Bovani.}
%
% \changes{tabvar-0.9}{2005/02/05}{Ajout de deux options pour
%    le choix du type de fl\`eches (suggestion de Frank Stengel).}
%
%    Depuis la version~0.9, les fl\`eches utilis\'ees par d\'efaut
%    sont prises dans la fonte type\,1 de Michel Bovani.
%
%    Si cette fonte sp\'ecifique n'a pas pu \^etre correctement
%    install\'ee, on pourra d\'eclarer |\FlechesMPtrue| dans le
%    fichier \file{tabvar.cfg} ou dans le pr\'eambule, ou encore
%    utiliser l'option |FlechesMP| pour que les fl\`eches
%    MetaPost utilis\'ees \`a la place.
%
%    \begin{macrocode}
\newif\ifFlechesMP \FlechesMPfalse
\DeclareOption{FlechesMP}{\FlechesMPtrue}
\DeclareOption{FlechesPS}{\FlechesMPfalse}
\ProcessOptions
%    \end{macrocode}
%
%  \subsection{Identification, extensions requises}
%
%    Chargement des extensions utiles :
%
%    \begin{macrocode}
\RequirePackage{array}
\RequirePackage{colortbl}
\RequirePackage{varwidth}
\RequirePackage{ifthen}
%    \end{macrocode}
%
%  \subsection{Dessin des fl\`eches en MetaPost}
%
%    Le fichier \file{tabvar.mp} (joint) contient le dessin des
%    trois fl\`eches.
%
%    La commande |mpost -tex=latex tabvar| produit trois fichiers
%    \file{tabvar.1}\dots{} \file{tabvar.3} qui contiennent les
%    dessins des fl\`eches ; en PDF, il faut indiquer qu'il s'agit
%    de fichiers MetaPost.
%
%    \begin{macrocode}
\RequirePackage{graphicx}
\RequirePackage{ifpdf}
\ifpdf
  \input{supp-pdf}
  \DeclareGraphicsRule{*}{mps}{*}{}
\fi
%    \end{macrocode}
%
%    Les commandes |\FlecheCm|, |\FlecheDm| et |\FlecheHm| tracent
%    les trois types de fl\`eches MetaPost.
%
%    \begin{macrocode}
\newsavebox{\arup}
\newsavebox{\ardown}
\newsavebox{\arhor}
%    \end{macrocode}
%
%\changes{tabvar-1.2}{2008/10/23}{\cs{@ptsize} peut prendre des
%  valeurs n\'egatives (classes koma-script avec tailles inf\'erieures
%  \`a 10pt).  Utiliser \cs{f@size} � la place (patch propos\'e par
%  Ulrike Fisher, merci Ulrike).}
%
%    La mise \`a l'\'echelle des fl\`eches MetaPost se fait \`a partir
%    de la valeur de |\f@size| qui contient normalement la taille en
%    points de la police de base (10 en 10pt). Si la classe utilis\'ee
%    ne d\'efinit pas |\f@size|, on donne la valeur 10 \`a |\f@size|,
%    la valeur par d�faut de |\TVarrowscale| est alors 1.0 (�chelle 1),
%    l'utilisateur peut toujours red�finir lui-m�me |\TVarrowscale|
%    selon ses besoins.
%    \begin{macrocode}
\providecommand{\f@size}{10}
\newcommand{\TVarrowscale}{\strip@pt\dimexpr\f@size pt/10\relax}
\sbox{\arup}{\includegraphics[scale=\TVarrowscale]{tabvar.1}}
\sbox{\ardown}{\includegraphics[scale=\TVarrowscale]{tabvar.2}}
\sbox{\arhor}{\includegraphics[scale=\TVarrowscale]{tabvar.3}}
\newcommand{\FlecheCm}{\raisebox{.5ex}{\usebox{\arup}}}
\newcommand{\FlecheDm}{\raisebox{.5ex}{\usebox{\ardown}}}
\newcommand{\FlecheHm}{\raisebox{.5ex}{\usebox{\arhor}}}
%    \end{macrocode}
%
%  \subsection{Fl\`eches comme caract\`eres d'une fonte type\,1}
%
%    Les fl\`eches utilis\'ees par d\'efaut sont prises dans
%    la fonte type\,1 \og tvsymbols \fg{} de Michel Bovani.
%
%  \begin{macro}{\FlecheC}
%  \begin{macro}{\FlecheD}
%  \begin{macro}{\FlecheH}
%    Le trac\'e des trois types de fl\`eches est fait par les
%    commandes |\FlecheC|, |\FlecheD| et |\FlecheH|.  Il pourrait
%    sembler plus naturel de d\'efinir des commandes |\FlecheCp|,
%    |\FlecheDp| et |\FlecheHp| faisant appel \`a la fonte \og
%    tvsymbols \fg{} et de choisir au |\begin{document}| entre la
%    variante MetaPost et la variante type\,1 ; mais cette solution
%    consommerait syst\'ematiquement une fonte math\'ematique parmi
%    les 16 disponibles. Ici, la fonte \og tvsymbols \fg{} n'est pas
%    d\'eclar\'ee si on travaille avec les variantes MetaPost.
%
%    \begin{macrocode}
\AtBeginDocument{%
  \ifFlechesMP
    \newcommand{\FlecheC}{\FlecheCm}%
    \newcommand{\FlecheD}{\FlecheDm}%
    \newcommand{\FlecheH}{\FlecheHm}%
  \else
    \DeclareFontFamily{U}{tv}{}%
    \DeclareFontShape{U}{tv}{m}{n}{<->tabvar}{}%
    \DeclareSymbolFont{tvsymbols}{U}{tv}{m}{n}%
    \DeclareMathSymbol{\enearrow}{\mathrel}{tvsymbols}{"25}%
    \DeclareMathSymbol{\esearrow}{\mathrel}{tvsymbols}{"26}%
    \DeclareMathSymbol{\eastarrow}{\mathrel}{tvsymbols}{"21}%
    \newcommand{\FlecheC}{\ensuremath{\enearrow}}%
    \newcommand{\FlecheD}{\ensuremath{\esearrow}}%
    \newcommand{\FlecheH}{\ensuremath{\eastarrow}}%
  \fi}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \subsection{Positionnement vertical de \'el\'ements}
%
%    La variable |\TVextraheight|, dont la valeur par d\'efaut vaut
%    |.7\baselineskip| permet d'\'ecarter l\'eg\`erement les valeurs
%    maximales de la fonction, du filet horizontal sup\'erieur.
%
%    \begin{macrocode}
\newdimen\TVextraheight
\setlength{\TVextraheight}{.7\baselineskip}
%    \end{macrocode}
%
%  \begin{macro}{\niveau}
%    La commande |\niveau|, utilis\'ee uniquement dans les lignes
%    relatives aux valeurs des fonctions, permet d'initialiser les
%    valeurs des compteurs |\@niveaux| (nombre total de niveaux
%    utilis\'es dans la ligne) et |\@pos| (indicateur du niveau
%    courant). Elle active \'egalement le drapeau |\if@socle|
%    utilis\'e par la commande |\@socle|. Celle-ci place un filet
%    invisible de hauteur |\TVextraheight| et ajoute |\@pos - 1|
%    sauts de lignes (les colonnes sont align\'ees par le bas), ce
%    qui assure le positionnement vertical de l'\'el\'ement (valeur
%    de la fonction ou fl\`eche).
%    Le drapeau |\if@socle| devra \^etre mis localement \`a `faux'
%    dans certaines colonnes (cf. |\dbarre| et |discont|).
%    \begin{macrocode}
\newcount\@niveaux
\newcount\@pos
\newif\if@socle
\newcommand{\niveau}[2]{\global\@pos=#1 \global\@niveaux=#2
                        \global\@socletrue}
\newcommand{\@socle}{%
  \ifnum\@pos=1 \@soclefalse \fi
  \if@socle
    \rule{\z@}{\TVextraheight}%
    \@tempcnta=\@pos
    \advance\@tempcnta by -1
    \whiledo{\@tempcnta>0}{\TVnl \null \advance\@tempcnta by -1}%
  \fi}
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{Nouveaux types de colonnes}
%
%    Ces d\'efinitions n\'ecessitent les extensions |array| et
%    |varwidth|. L'environnement |varwidth|, comme |minipage|,
%    red\'efinit la commande |\\|.  On la renomme \`a l'int\'erieur
%    des environnements |varwidth|, de fa\c{c}on \`a \'eviter la
%    confusion entre passage \`a la ligne \`a l'int\'erieur d'une
%    colonne et passage \`a la ligne suivante du tableau :
%    |\TVnl| (commande interne) provoque un changement de ligne \`a
%    l'int\'erieur d'une colonne, l'utilisateur peut continuer \`a
%    utiliser |\\| pour terminer une ligne du tableau.
%    La commande |\TVtabularnewline|, d\'efinie dans l'environnement
%    |tabvar|, provoque un changement de ligne dans le tableau
%    (|\tabularnewline|) et affecte la valeur `vrai' au drapeau
%    |\ifreset@niveaux|, ce qui commande la r\'einitialisation des
%    compteurs |\@pos| et |\@niveaux| \`a la valeur~1.
%    Cette r\'einitialisation aura lieu \emph{apr\`es} que la
%    commande |\@socle| ait plac\'e les valeurs de la fonction et
%    les fl\`eches \`a la bonne hauteur.
%
%    \begin{macrocode}
\newif\ifreset@niveaux
\newcommand{\reset@niveaux}{%
  \ifreset@niveaux
    \global\@niveaux=1 \global\@pos=1 \global\@soclefalse
  \fi}
%    \end{macrocode}
%
% \changes{tabvar-1.0}{2006/03/14}{Ajout d'un param\`etre
%    \cs{TVmaxcolwidth} pour choisir la largeur maximale des colonnes
%    de type C, L, R, au lieu d'une valeur fixe (5em).}
%
%    On d\'efinit des variantes |C|, |L| et |R|, des colonnes |c|,
%    |l| et |r| : ce sont des \emph{minipage} align\'ees par le bas,
%    dont la largeur est celle de la ligne la plus longue, avec un
%    maximum de |\TVmaxcolwidth| fix\'e \`a 5em par d\'efaut, (voir la
%    documentation de l'extension \file{varwidth.sty}).
%
%    \begin{macrocode}
\newdimen\TVmaxcolwidth
\setlength{\TVmaxcolwidth}{5em}
\newcolumntype{C}{%
   >{\begin{varwidth}[b]{\TVmaxcolwidth}\let\TVnl=\\
     \let\\=\TVtabularnewline $}%
   c%
   <{\@socle \reset@niveaux
     $\@finalstrut\@arstrutbox\end{varwidth}}}
\newcolumntype{L}{%
   >{\begin{varwidth}[b]{\TVmaxcolwidth}\let\TVnl=\\
     \let\\=\TVtabularnewline $}%
   l%
   <{\@socle \reset@niveaux
     $\@finalstrut\@arstrutbox\end{varwidth}}}
\newcolumntype{R}{%
   >{\begin{varwidth}[b]{\TVmaxcolwidth}\let\TVnl=\\
     \let\\=\TVtabularnewline $}%
   r%
   <{\@socle \reset@niveaux
     $\@finalstrut\@arstrutbox\end{varwidth}}}
%    \end{macrocode}
%
%    On d\'efinit \'egalement un type |N| pour les domaines o\`u la
%    fonction n'est pas d\'efinie : la colonne est colori\'ee en
%    faisant appel \`a l'extension \file{colortbl}. La couleur
%    peut \^etre choisie par l'utilisateur, par exemple :\\
%    |\definecolor{TVcolor}{rgb}{0.66, 0.8, 0}| \\
%    donne un vert, voir \file{color.sty} pour la fa\c{c}on de
%    d\'efinir des couleurs.
%    \begin{macrocode}
\definecolor{TVcolor}{gray}{0.7}
\newdimen\TVarraycolsep
\newdimen\TVcolorLeftSep
\newdimen\TVcolorRightSep
\setlength{\TVcolorLeftSep}{\TVarraycolsep}
\setlength{\TVcolorRightSep}{\TVarraycolsep}
\newcolumntype{N}{%
   >{\columncolor{TVcolor}[\TVcolorLeftSep][\TVcolorRightSep]}
   c}
%    \end{macrocode}
%
%  \subsection{Commandes de saisie}
%
%    Les valeurs \`a afficher dans chaque ligne peuvent \^etre
%    saisies directement (|1.4|, |+|, |-|, etc.) comme dans un
%    tableau normal. Les lignes correspondant aux valeurs des
%    fonctions comportent plusieurs \'etages, nous disposons
%    deux compteurs, |\@niveaux| qui contient le nombre total
%    de niveaux (ou \'etages) utilis\'es dans la ligne, |\@pos|
%    qui indique le niveau courant.
%
%  \begin{macro}{\croit}
%  \begin{macro}{\decroit}
%  \begin{macro}{\constante}
%    Les commandes |\croit|,|\decroit|  et |\constante| tracent les
%    fl\`eches \`a la hauteur ad\'equate et mettent \`a jour le
%    compteur |\@pos|. Un message d'erreur est affich\'e lorsque
%    l'une de ces commandes fait sortir de la plage de niveaux
%    d\'eclar\'es par la commande |\niveau|.
%
%    \begin{macrocode}
\newcommand{\decroit}{\FlecheD
                      \global\advance\@pos by -1
                      \ifnum\@pos<1
                      \PackageError{tabvar.sty}%
                        {Les arguments la commande
                         \protect\niveau\space sont incorrects}%
                      \fi}
\newcommand{\croit}  {\raisebox{-\baselineskip}{\FlecheC}%
                      \global\advance\@pos by 1
                      \ifnum\@pos>\@niveaux
                      \PackageError{tabvar.sty}%
                        {Les arguments la commande
                         \protect\niveau\space sont incorrects}%
                      \fi}
\newcommand{\constante}{\FlecheH}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \changes{tabvar-1.1}{2007/05/07}{Ajout de la commande \cs{barre}.
%   Ajout de \cs{barre@dth} pour le calcul de la hauteur d'une
%   rang\'ee (utilis\'ee par \cs{barre} et \cs{dbarre}).}
%
%  \begin{macro}{\dbarre}
%    La commande |\dbarre| sert \`a tracer les doubles barres
%    La commande |\vline| ne peut pas \^etre utilis\'ee \`a cette fin
%    dans les environnements de type |\parbox|, car sa port\'ee
%    est limit\'ee \`a un interligne.
%
%    On calcule la hauteur exacte de la rang\'ee, dans les deux cas
%    |\@niveaux=1| et |\@niveaux>1|, |\@tempdimc| contient la hauteur
%    totale (\textit{totalheight}) et |\@tempdimc| la profondeur
%    (\textit{depth}).
%    \begin{macrocode}
\newcommand{\barre@dth}{%
   \ifnum\@niveaux=1
     \@tempdimc=\TVarraystretch\baselineskip
   \else
     \@tempcnta=\@niveaux
     \advance\@tempcnta by -1
     \@tempdimc=\@tempcnta\baselineskip
     \@tempdimb=\TVextraheight
     \ifdim\@tempdimb<.7\baselineskip
       \@tempdimb=.7\baselineskip
     \fi
     \advance\@tempdimc by \@tempdimb
     \advance\@tempdimc by \dp\@arstrutbox
   \fi
   \@tempdimb=\dp\@arstrutbox}
%    \end{macrocode}
%    On fait appel \`a |\rule| pour le trac\'e de |\dbarre|.
%    \begin{macrocode}
\newcommand{\dbarre}{%
   \barre@dth
   \rule[-\@tempdimb]{.5\p@}{\@tempdimc}%
   \kern 2\p@
   \rule[-\@tempdimb]{.5\p@}{\@tempdimc}%
   \@soclefalse}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\barre}
%    La commande |\barre| prend un argument obligatoire.
%    |\barre{}| trace un filet vertical centr\'e dans une colonne.
%    Lorsque l'argument est non vide, celui-ci est superpos\'e
%    (centr\'e) sur le filet. Le filet est trac\'e en gris
%    par d\'efaut (couleur param\'etrable).
%    \begin{macrocode}
\newsavebox{\tab@box}
\definecolor{TVbarrecolor}{gray}{0.7}
\newcommand{\barre}[1]{%
   \sbox{\tab@box}{\ensuremath{#1}}%
   \barre@dth
   \@tempcnta=\@niveaux
   \advance\@tempcnta by -\@pos
   \advance\@tempdimb by \@tempcnta\baselineskip
   \raisebox{-\@tempdimb}[0pt][0pt]{%
      \makebox[\wd\tab@box][c]{\color{TVbarrecolor}%
                               \rule{.5\p@}{\@tempdimc}}}%
   \kern-\wd\tab@box\usebox{\tab@box}%
}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\discont}
%    La commande |\discont| s'utilise lorsque la fonction pr\'esente
%    une discontinuit\'e, elle r\'eclame 3 arguments obligatoires :
%    le premier est la limite \`a gauche~$f_-$, le deuxi\`eme le signe
%    '<' ou '>', le troisi\`eme est la limite \`a droite~$f_+$.
%    \LaTeX{} ne peut pas toujours comparer facilement les valeurs
%    de $f_-$ et $f_+$ (penser \`a $f_-=\sqrt{e}$, $f_+=\pi/2$), le
%    deuxi\`eme argument pr\'ecise si $f_- < f_+$ ou si $f_- > f_+$.
%
%    En plus de ces 3 arguments obligatoires, un argument optionnel
%    (entier positif) permet d'\'ecarter verticalement les valeurs
%    $f_-$ et~$f_+$ ; la valeur de cet entier donne le nombre de
%    niveaux suppl\'ementaires \`a intercaler (0 par d\'efaut).
%
%    On commence par mesurer la largeur des deux arguments |#2| et
%    |#4| pour pouvoir les centrer ensuite dans une bo\^{\i}te de
%    largeur \'egale au maximum des deux largeurs.
%    Si cette disposition ne convient pas, on pourra toujours
%    ajouter un |\hfill| \`a droite o\`u \`a gauche de la valeur
%    \`a d\'eplacer.
%
%    \begin{macrocode}
\newcommand{\discont}[4][0]{%
     \settowidth{\@tempdimc}{\ensuremath{#2}}%
     \settowidth{\@tempdimb}{\ensuremath{#4}}%
     \ifdim\@tempdimc<\@tempdimb \@tempdimc=\@tempdimb\fi
     \rule{\z@}{\TVextraheight}%
     \@soclefalse
     \ifthenelse{\equal{#3}{<}}%
%    \end{macrocode}
%    Cas o\`u $f_- < f_+$ : on pose la valeur de~$f_+$ (|#4|), puis
%    on saute autant de lignes suppl\'ementaires qu'indiqu\'e dans
%    l'argument optionnel, ensuite on passe \`a la ligne et on pose
%    la valeur de~$f_-$ (|#2|), enfin on ajoute en dessous
%    |\@pos - 1| sauts de lignes pour positionner le tout en hauteur.
%    Il reste \`a ajuster le compteur~|\@pos| pour que la fl\`eche
%    suivante soit plac\'ee \`a la bonne hauteur.
%    \begin{macrocode}
     {\makebox[\@tempdimc]{\ensuremath{#4}}%
      \@tempcnta=#1
      \whiledo{\@tempcnta>0}{\TVnl \null \advance\@tempcnta by -1}%
      \TVnl
      \makebox[\@tempdimc]{\ensuremath{#2}}%
      \@tempcnta=\@pos
      \advance\@tempcnta by -1
      \whiledo{\@tempcnta>0}{\TVnl \null \advance\@tempcnta by -1}%
      \global\advance\@pos by 1
      \global\advance\@pos by #1
     }%
     {\ifthenelse{\equal{#3}{>}}%
%    \end{macrocode}
%    Cas o\`u $f_- > f_+$ : \textit{idem} en permutant $f_-$ et~$f_+$.
%    \begin{macrocode}
     {\makebox[\@tempdimc]{\ensuremath{#2}}%
      \@tempcnta=#1
      \whiledo{\@tempcnta>0}{\TVnl \null \advance\@tempcnta by -1}%
      \TVnl
      \makebox[\@tempdimc]{\ensuremath{#4}}%
      \@tempcnta=\@pos
      \advance\@tempcnta by -2
      \advance\@tempcnta by -#1
      \whiledo{\@tempcnta>0}{\TVnl \null \advance\@tempcnta by -1}%
      \global\advance\@pos by -1
      \global\advance\@pos by -#1
     }%
%    \end{macrocode}
%    Cas o\`u le deuxi\`eme argument n'est ni |<| ni |>| : erreur
%    \begin{macrocode}
     {\PackageError{tabvar.sty}%
        {Le second argument de \protect\discont\space doit \^etre
         \MessageBreak soit '<' soit '>'}}%
     }%
}
%    \end{macrocode}
%  \end{macro}
%
%  \subsection{Environnement `tabvar'}
%
%    L'environnement |tabvar| est un |array| o\`u sont red\'efinis
%    |\TVarraystretch|, |\TVarraycolsep| et |\tabularnewline|.
%
%  \begin{environment}{tabvar}
%    \begin{macrocode}
\newcommand{\TVarraystretch}{1.5}
\setlength{\TVarraycolsep}{1pt}
\newenvironment{tabvar}[1]
  {\renewcommand{\arraystretch}{\TVarraystretch}%
   \setlength{\arraycolsep}{\TVarraycolsep}%
   \global\@niveaux=1 \global\@pos=1 \global\@soclefalse
   \def\TVtabularnewline{\reset@niveauxtrue\tabularnewline}%
   \begin{array}{#1}}
  {\end{array}}
%    \end{macrocode}
%  \end{environment}
%
%    Chargement du fichier de pr\'ef\'erences, si il en existe un.
%    \begin{macrocode}
\InputIfFileExists{tabvar.cfg}
   {\typeout{loading tabvar.cfg}}
   {\typeout{tabvar.cfg not found, using default values}}
%    \end{macrocode}
% \iffalse
%</sty>
% \fi
%
%  \section{Fichier de configuration}
%
% \iffalse
%<*cfg>
% \fi
%    \begin{macrocode}
%% Fichier de configuration de l'extension `tabvar.sty'.
%%
%% D\'ecommenter la ligne suivante pour que les variantes MetaPost
%% des fl\`eches soient utilis\'ees \`a la place de la fonte tabvar.pfb.
%%
%%\FlechesMPtrue
%%
%% Ce param\`etre permet d'ajuster la hauteur des lignes
%% de `tabvar' correspondant aux variations d'une fonction ;
%% sa valeur par d\'efaut est :
%%
%%\setlength{\TVextraheight}{0.7\baselineskip}
%%
%% Valeur de \arraycolsep utilis\'ee dans `tabvar'.
%%
%%\setlength{\TVarraycolsep}{1pt}
%%
%% Valeur de \arraystretch utilis\'ee dans `tabvar'.
%%
%%\renewcommand{\TVarraystretch}{1.5}
%%
%% Largeur maximale des colonnes de type C, L ou R.
%%
%%\setlength{\TVmaxcolwidth}{5em}
%%
%% Exemples de d\'efinitions de couleurs pour les colonnes `N'
%% o\`u la fonction est non d\'efinie.
%%
%%\definecolor{TVcolor}{gray}{0.5}
%%\definecolor{TVcolor}{rgb}{0.33, 0.12, 0}
%%\definecolor{TVcolor}{cmyk}{0.91,0,0.88,0.12}
%%
%% Les valeurs suivantes assurent que les colonnes `N' sont
%% colori\'ees sur toute leur largeur.
%%
%%\setlength{\TVcolorLeftSep}{\TVarraycolsep}
%%\setlength{\TVcolorRightSep}{\TVarraycolsep}
%%
%% On peut ajuster comme ci-dessus la couleur des filets
%% tra\c{c}\'es par la commande \barre{}.
%%
%%\definecolor{TVbarrecolor}{gray}{0.7}
%    \end{macrocode}
% \iffalse
%</cfg>
% \fi
%
% \Finale
%
\endinput

%%% Local Variables:
%%% fill-column: 70
%%% coding: latin-1
%%% End: