% \iffalse meta-comment
%
% Copyright (C) 2018 by Antoine Missier <prenom.nom@ac-toulouse.fr>
% Version 0.1 : 05/01/2014
% Version 0.2 : 11/11/2014 ajouté option tikz
% Version 0.3 : 07/12/2014 ajouté environnement tablvar*
% Version 1.0 : 11/11/2018 macro \bblim, modif macros \barre et \ZIh, 
%    création des fichiers dtx et ins
% Version 1.1 : 12/04/2019 reprise README.md, \tvloop -> \varloop
%
% This file 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
% 2005/12/01 or later.
% Pour produire correctement l'index compiler avec
% makeindex -s gind.ist -o tablvar.ind tablvar.idx
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{tablvar.dtx}
%</driver>
%<*package> 
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{tablvar}   
    [22/04/2019 v1.1 .dtx tablvar file]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{tablvar}
\usepackage[Symbol]{upgreek}
\renewcommand\pi{\uppi}
\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}}
\DisableCrossrefs         
%\CodelineIndex
%\RecordChanges
\usepackage{hyperref}
\hypersetup{%
    colorlinks, 
    linkcolor=blue,
    pdftitle={tablvar}, 
    pdfsubject={LaTeX package}, 
    pdfauthor={Antoine Missier}
}
\begin{document}
  \DocInput{tablvar.dtx}
  %\PrintChanges
  %\PrintIndex
\end{document}
%</driver>
% \fi
%
% \CheckSum{2897}
%
% \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{v1.0}{11/11/2018}{Initial version}
%
% \GetFileInfo{tablvar.sty}
%
% \DoNotIndex{\begin,\end,\emph,\og,\fg,\vspace,\arraybackslash}
% \DoNotIndex{\RequirePackage,\DeclareOption,\ProcessOptions}
% \DoNotIndex{\@@pos,\@pos,\@tvlbox,\@tvrbox,\@arstrutbox,\@ZI,\@@ZI,\@ifstar}
% \DoNotIndex{\tikz,\usetikzlibrary,\fill,\draw,\psframe,\rnode,\node,\ncline}
% \DoNotIndex{\makebox,\raisebox,\smash,\hspace,\phantom}
% \DoNotIndex{\cmd,\oarg,\marg,\meta}
% \DoNotIndex{\hline,\\,\cellcolor,\[,\],\infty,\frac,\sqrt,\mathrm,\alpha}
% \DoNotIndex{\newcommand,\newenvironment,\renewcommand}
% \DoNotIndex{\newlength,\setlength,\newcounter,\setcounter,\stepcounter,\addtocounter}
% \DoNotIndex{\theligne,\thenoeud,\themaxdiscont,\thenumvr,\theZI,\theZIstar,\I,\Ix,\Iy}
% \DoNotIndex{\AtBeginDocument,\definecolor,\newsavebox,\sbox}
% \DoNotIndex{\ifthenelse,\boolean,\newboolean,\setboolean,\value,\or}
% \DoNotIndex{\ifdim,\global,\advance,\fi,\else,\relax,\kern,\vrule,\ht,\dp,\wd}
% 
% \title{L'extension \textsf{tablvar}\thanks{Ce document
%     correspond à \textsf{tablvar}~\fileversion, dernière modification le \filedate.}}
% \author{Antoine Missier \\ \texttt{prenom.nom@ac-toulouse.fr}}
% \date{22 avril 2019}
% \maketitle
% \tableofcontents
%
% \section{Introduction}
%
% Cette extension permet de construire des tableaux de variation (et de signes)
% de manière simple et intuitive.
% Bien que plusieurs autres extensions soient déjà dédiées à cette tâche
% \footnote{Mentionnons \textsf{tabvar} de Daniel Flipo et 
% \textsf{variations} de Christian Obrecht ou, plus complexes, 
% \textsf{tablor} de Guillaume Connan et \textsf{tkz-tab} de Alain Matthes.}, 
% nous avons voulu produire des tableaux de manière automatisée, 
% y compris pour des tableaux complexes,  
% mais avec de nombreuses possibilités de réglages et d'ajustements personnels
% et une haute qualité graphique, en particulier pour le dessin des flèches,
% en exploitant les fonctionnalités des extensions graphiques \textsf{pstricks} 
% (plus exactement \textsf{pst-node}) ou \textsf{tikz} pour 
% définir un \emph{graphe} de \emph{nœuds} reliés par des flèches,
% venant se \og superposer \fg{} au tableau lui-même.
%
% Le parti pris ici est d'utiliser la même syntaxe que les environnements 
% |array| (ou |tabular|) en laissant à \LaTeX\ le soin de faire 
% la composition du tableau et à l'extension graphique
% (\textsf{pstricks} ou \textsf{tikz}) celui
% de réaliser le dessin des flèches, automatisé et sans intervention de l'utilisateur.
% On a simplement besoin de préciser, à l'intérieur d'une commande |\variations|,
% ce qui est en haut et ce qui est en bas.
%
% Cette documentation donne une galerie d'exemples et décrit les commandes 
% fournies.
%
% L'extension possède deux options utilisées pour le tracé automatique des flèches : 
% |pstricks| (par défaut) ou |tikz| (|\usepackage[tikz]{tablvar}|).
% Pour l'option |pstricks|, il faut compiler avec latex + dvips + ps2pdf ; 
% pour l'option |tikz|, il faut compiler DEUX fois avec pdflatex 
% (la première fois les flèches ne sont pas correctement dessinées).
% Si on veut compiler avec l'option |pstricks| après avoir compilé avec |tikz|, 
% il faut, entre les deux, supprimer le fichier |.aux|, sinon la compilation plante.
%
% \section{Utilisation}
%
% \subsection{Tableaux de variations simples}
%
% Un tableau de variation (ou de signes) se définit par un environnement |tablvar|
% qui \emph{doit être en mode mathématiques} (comme |array|).
%
% Voici un premier tableau tout simple avec les commandes 
% \DescribeMacro{\haut} \DescribeMacro{\bas} \DescribeMacro{\mil}
% de positionnement naïves |\haut|, |\bas| et |\mil| (milieu).
%
%\[ 
%\begin{tablvar}{4}
%    \hline
%    x & -5 && -1 && 2 && 3 && 5 \\
%    \hline
%    f'(x) & & + & 0 & - & 0 & + & 0 & - & \\
%    \hline
%    \variations{ \mil{f(x)} & \bas{0} && \haut{2} && \bas{1} && 
%        \haut{4} && \bas{-3} }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\[
%\begin{tablvar}{4}
%    \hline
%    x & -5 && -1 && 2 && 3 && 5 \\
%    \hline
%    f'(x) & & + & 0 & - & 0 & + & 0 & - & \\
%    \hline
%    \variations{ \mil{f(x)} & \bas{0} && \haut{2} && \bas{1} && 
%        \haut{4} && \bas{-3} }
%    \hline
%\end{tablvar}
%\]
% \end{verbatim}
%
% \vspace{-3ex}
% \DescribeEnv{tablvar}
% L'argument obligatoire de l'environnement |tablvar| correspond au nombre 
% d'intervalles du tableau c'est-à-dire aussi au nombre de flèches (ici 4).
% Les délimiteurs |&| correspondent aux changements de colonnes 
% comme pour l'environnement |array|.
% Outre la 1ère colonne de légendes, il y a deux types de colonnes :
% des colonnes de \emph{valeurs}, de largeur variable en fonction de leur contenu et centrées,
% et des colonnes \emph{intervalles} de largeur fixe (|2.5em| par défaut).
%
% \DescribeEnv{tablvar\oarg{largeur}}
% L'environnement |tablvar| possède un paramètre optionnel pour modifier la
% largeur des colonnes intervalles.
% Voici un exemple avec un seul intervalle utilisant l'argument optionnel |4em|
% pour allonger la largeur de l'intervalle qui sinon apparaîtrait très étroit.
%
% \noindent
% \begin{minipage}[t]{8cm}
% \begin{verbatim}
%\[
%\begin{tablvar}[4em]{1}
%    \hline
%    x & -5 && +\infty \\
%    \hline
%    \variations{\mil{f(x)} & \haut{2} && 
%        \bas{-1} }
%    \hline
%\end{tablvar}
%\]
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{4.7cm}
%\[
%\begin{tablvar}[4em]{1}
%    \hline
%    x & -5 && +\infty \\
%    \hline
%    \variations{\mil{f(x)} & \haut{2} && \bas{-1}}
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
%
% \DescribeMacro{\pos}
% Les commandes |\haut| et |\bas| ne sont en fait que des alias d'une commande
% plus générale qui est \cmd{\pos}\oarg{opt}\marg{ligne}\marg{valeur}. Celle-ci place
% la \meta{valeur} sur la \meta{ligne} indiquée en créant un nœud pour les flèches.
% La ligne des $x$ et les lignes contenant dérivée
% ou tableau de signe ont pour indice 0.
% La partie variations contient par défaut 3 lignes numérotées 1, 2, 3
% \emph{du haut vers le bas} (dans le sens de l'écriture 
% et de la construction du tableau). 
% Le paramètre optionnel \meta{opt} 
% \footnote{Ce paramètre optionnel n'est pas implémenté et est sans effet pour l'option |tikz|.}
% permet d'ajuster le positionnement des flèches : 
% |c| (centered, par défaut), |b| (bottom) ou |t| (top).
% Comparer le positionnement des flèches dans les deux exemples suivants. 
%
% \DescribeMacro{\variations}
% C'est la commande |\variations| qui, une fois les nœuds définis,
% construit ensuite automatiquement les flèches.
%
% La commande |\mil|, utilisée pour la première colonne contenant $f(x)$,
% \DescribeMacro{\pos*} 
% est un alias reposant sur la commande plus générale \cmd{\pos*}\marg{ligne}\marg{valeur}
% qui se comporte comme |\pos| mais ne crée pas de nœud pour les flèches.\\
% \begin{minipage}[t]{7.4cm}
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\mil{f(x)} & \bas{2} &&
%        \haut{f(\frac12)} && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5.2cm}
%\[ 
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\mil{f(x)} & \bas{2} &&
%        \haut{f(\frac12)} && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
% \\[-1ex] Le même tableau avec les commandes |\pos| 
% et |\pos*| et l'option |t| pour le max.\\[-1ex]
% \begin{minipage}[t]{7.4cm}
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\pos*{2}{f(x)} & \pos{3}{2} &
%        &\pos[t]{1}{f(\frac12)} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5.2cm}
%\[
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\pos*{2}{f(x)} & \pos{3}{2} &
%        &\pos[t]{1}{f(\frac12)} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
%
% \DescribeMacro{\fleche}
% On peut modifier l'aspect des flèches en redéfinissant la macro |\fleche|
% grâce aux nombreuses options offertes par \textsf{pstricks} ou \textsf{tikz}. 
% Cette redéfinition sera locale si on la place dans l'environnement math du tableau.
% Ci-dessous des flèches plus fines, plus proches des nœuds et dont la pointe est
% plus effilée (codé ici pour pstricks uniquement).
%\[
%\ifthenelse{\boolean{tikz}}{}{
%     \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3,
%            arrowinset=0.5,nodesep=1.5pt]{->}}
%    }
%\begin{tablvar}{4}
%    \hline
%    x & -5 && 0 && 2 && 3 && 5 \\
%    \hline
%    \variations{ \pos*{2}{f(x)} & \pos{3}{-4} && \pos{2}{1} && \pos{2}{1} 
%        && \pos{1}{4} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
%\]
% Pour placer des nœuds de flèche au milieu, on doit utiliser |\pos{2}| et non |\mil|.
% \begin{verbatim}
%\[
% \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3,
%    arrowinset=0.5,nodesep=1.5pt]{->}}
%\begin{tablvar}{4}
%    \hline
%    x & -5 && 0 && 2 && 3 && 5 \\
%    \hline
%    \variations{ \pos*{2}{f(x)} & \pos{3}{-4} && \pos{2}{1} && \pos{2}{1} 
%        && \pos{1}{4} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{verbatim}
%
% \subsection{Tableaux de signes avec barres de séparation}
%
% \DescribeMacro{\barre}
% La macro |\barre|, présentée dans l'exemple ci-dessous, sert de séparateur 
% de colonne dans les tableaux de signe. Elle est bien sûr 
% facultative de même que la partie variations.
% Ici $f(x)=-4x^3+3x^2+18x-3$ et $f'(x)=6(x+1)(-2x+3)$.
%\[
%\begin{tablvar}{3}
%    \hline
%    x & -\infty && \makebox[2.5em]{$-1$} && 
%        \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\
%    \hline
%    x+1 & & - & \barre[0] & + & \barre & + & \\
%    \hline
%    -2x+3 & & + & \barre & + & \barre[0] & - & \\
%    \hline
%    \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\
%    \hline
%    \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} &&
%        \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% Les bornes des intervalles ont été placées
% dans des |\makebox|\oarg{largeur}|{$ $}|,
% sur la ligne des $x$, pour que les colonnes 
% soient plus équilibrées (ceci est affaire de goût).
% \begin{verbatim}
%\begin{tablvar}{3}
%    \hline
%    x & -\infty && \makebox[2.5em]{$-1$} && 
%        \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\
%    \hline
%    x+1 & & - & \barre[0] & + & \barre & + & \\
%    \hline
%    -2x+3 & & + & \barre & + & \barre[0] & - & \\
%    \hline
%    \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\
%    \hline
%    \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} &&
%        \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty}
%    }
%    \hline
%\end{tablvar}
%\end{verbatim}
%
% \subsection{Doubles barres et discontinuités}
%
% Une double barre s'obtient avec la commande |\bb|. \DescribeMacro{\bb}
% Pour ne pas tracer de flèche entre deux nœuds (en particulier pour éviter
% de traverser une double barre), on place la
% commande |\discont| entre les deux. \DescribeMacro{\discont}
%\[
%\begin{tablvar}{2}
%    \hline
%    x & -\infty && 0 && +\infty \\
%    \hline
%    -\frac{1}{x} & & + & \bb & - & \\
%    \hline
%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb
%        \discont \haut{+\infty} && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% La commande |\dfrac| provient de l'extension \textsf{amsmath} ou peut être redéfinie
% par |\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}}|.
%
% \smallskip
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & -\infty && 0 && +\infty \\
%    \hline
%    -\frac{1}{x} & & + & \bb & - & \\
%    \hline
%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb
%        \discont \haut{+\infty} && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \vspace{-1ex}
% La syntaxe ci-dessus pose problème lorsque les limites à gauche et à droite 
% d'une valeur interdite se trouvent sur des lignes différentes,
% ou que leur contenu n'a pas la même largeur, 
% car alors la double barre ne serait plus au centre de sa colonne
% et se trouverait décalée d'une ligne à l'autre.
%
% Une première solution est d'interrompre la double barre pour placer
% les limites qui resteront alors centrées au milieu de la colonne (mais il faut aimer).
%\[
%\begin{tablvar}[3em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} &&
%        \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}[3em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} &&
%        \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\bblim} 
% La commande |\bblim| résout le problème en gardant, sur chaque ligne, la double barre
% centrée dans sa colonne, avec des limites à gauche et à droite quelconques
% et quelles que soient les lignes où celles-ci sont positionnées.
% Elle prend 4 paramètres qui sont respectivement \meta{ligne} et \meta{limite}
% à gauche puis à droite de la double barre.
% Elle trace la double barre, place les limites et gère la discontinuité.
%\[
%\begin{tablvar}[2em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bblim{3}{-\infty}{1}{+\infty} && \bas{1} &&
%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}[2em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bblim{3}{-\infty}{1}{+\infty} && \bas{1} &&
%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Un autre exemple avec des limites de largeur assez différentes (placées ici sur la même ligne).
%\[
%\begin{tablvar}{3}
%    \hline
%    x & 0 &  & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\
%    \hline
%    f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\
%    \hline
%    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})} 
%        && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)}
%    }
%    \hline
%\end{tablvar}
%\]
% La colonne de valeurs du $\frac{\pi}{2}$ étant très large, 
% la position des signes \og $-$ \fg{}
% a été légèrement décalée avec la commande \LaTeX\ |\hspace| qui produit 
% un espacement horizontal positif ou négatif.
% \begin{verbatim}
%\begin{tablvar}{3}
%    \hline
%    x & 0 &  & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\
%    \hline
%    f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\
%    \hline
%    \variations{\mil{f(x)} & \pos{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})}     
%        && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% L'environnement |tablvar*| \DescribeEnv{tablvar*}
% sert à gérer correctement le positionnement 
% des doubles barres lorsqu'elles se trouvent aux extrémités.
% La différence avec |tablvar| est que les colonnes
% de valeurs des extrémités ne sont plus centrées mais alignées à gauche pour
% le 1ère et à droite pour la dernière.
%
%\[
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && 
%        \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
%\qquad
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb}
%        \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
%\]
% On observera l'utilisation de |\pos*| dans le second tableau,
% pour tracer une double barre, sauf sur la ligne 3 où on place $-\infty$.
% \begin{verbatim}
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && 
%        \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
%
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb}
%        \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
% \end{verbatim}
%
% Si par contre, à l'autre extrémité du tableau, les valeurs ont des largeurs
% assez différentes, leur alignement non centré peut être corrigé en utilisant
%  |\hspace|. Ci-dessous, de l'espace a été ajouté à droite du 1.\\
% \begin{minipage}[t]{7.7cm}
% \begin{verbatim}
%\begin{tablvar*}[3em]{1}
%    \hline
%    x & 0 && +\infty \\
%    \hline
%    \variations{ \mil{1-\dfrac{1}{x}} & \bb 
%        \bas{-\infty} && \haut{1\hspace{0.5em}}
%    }
%    \hline
%\end{tablvar*}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[
%\begin{tablvar*}[3em]{1}
%    \hline
%    x & 0 && +\infty \\
%    \hline
%    \variations{ \mil{1-\dfrac{1}{x}} & \bb 
%        \bas{-\infty} && \haut{1\hspace{0.5em}}
%    }
%    \hline
%\end{tablvar*}
%\]
% \end{minipage}
%
% \DescribeMacro{\tablvarinit}
% Enfin, pour personnaliser totalement la définition des colonnes,
% on peut revenir à l'environnement |array| plutôt que d'utiliser |tablvar|
% (il faut dans ce cas appeler |\tablvarinit| juste avant |\begin{array}|).
% Ce qui est essentiel dans cette extension est la macro |\variations|
% avec les commandes de positionnement
% et non l'environnement |tablvar| qui n'est qu'un |array| dans lequel
% on a fixé les définitions de colonnes (et initialisé des variables).
%
% \subsection{Valeurs remarquables}
%
% Nous appellerons \emph{valeur remarquable}, un valeur supplémentaire
% que l'on place dans un tableau de variation et qui ne correspond
% pas à un extremum.
% \medskip
%
% \DescribeMacro{\vr}
% Une première approche est de laisser les flèches de variations passer à travers
% ces valeurs remarquables.
% Pour chaque valeur remarquable, on place une commande |\vr| sur la ligne
% des $x$ et une commande |\vr| dans la partie variations. Les valeurs remarquables
% seront automatiquement reliées par des pointillés 
% (tracés réalisés dans la commande |\variations|).
%
% Voici un exemple avec le logarithme népérien où la valeur remarquable
% est placée dans la colonne intervalle.\\
% \begin{minipage}[t]{7.7cm}
% \begin{verbatim}
%\begin{tablvar*}[5em]{1}
%    \hline
%    x & 0 & \vr{1} & +\infty \\
%    \hline
%    \variations{ \mil{\ln x} & 
%        \bb \pos{3}{-\infty} & 
%        \vr{0} & \pos{1}{+\infty} }
%    \hline
%\end{tablvar*}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[
%\begin{tablvar*}[5em]{1}
%    \hline
%    x & 0 & \vr{1} & +\infty \\
%    \hline
%    \variations{ \mil{\ln x} & 
%        \bb \pos{3}{-\infty} & 
%        \vr{0} & \pos{1}{+\infty} }
%    \hline
%\end{tablvar*}
%\]
% \end{minipage}
%
% Un autre exemple avec deux valeurs remarquables, placées cette fois 
% dans des colonnes valeurs.
%\[ 
%\renewcommand{\tablvarstretch}{1}
%\begin{tablvar}[1.5em]{3}
%    \hline
%    x & -\infty && \vr{0} && \vr{1} && +\infty \\
%    \hline
%    \variations[4]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && 
%        \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\[
%\renewcommand{\tablvarstretch}{1}
%\begin{tablvar}[1.5em]{3}
%    \hline
%    x & -\infty && \vr{0} && \vr{1} && +\infty \\
%    \hline
%    \variations[4]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && 
%        \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{verbatim}
% \vspace{-4ex}
% \DescribeMacro{\variations\oarg{nblignes}}
% Ci-dessus, la partie variations a été composée sur 4 lignes grâce au paramètre
% optionnel de la commande |\variations|. Les lignes sont alors numérotées
% de 1 (haut) à 4 (bas).\\
% \DescribeMacro{\vr\oarg{ligne}}
% La commande |\vr| possède elle aussi un argument optionnel
% qui est la ligne sur laquelle placer la valeur remarquable,
% lorsqu'il s'agit de la partie variations (2 par défaut).\\
% \DescribeMacro{\tablvarstretch}
% À cause des 4 lignes de variations, la hauteur de lignes du tableau 
% a été réduite en modifiant le facteur
% |\tablvarstretch| (fixé à 1.2 par défaut), modification locale 
% car placée à l'intérieur de l'environnement math.\\
% \DescribeMacro{\vdecal}
% Enfin  la légende $\exp x$ a été placée en ligne 2 mais 
% décalée vers le bas, pour qu'elle se trouve centrée verticalement
% sachant qu'il y a 4 lignes de variations.
% Ceci s'obtient grâce à la commande |\vdecal| dont la syntaxe est
% \cmd{\vdecal}\marg{decal}\marg{contenu} où la valeur du décalage
% peut être positive (vers le haut) ou négative (vers le bas).
%
% \medskip
% On peut préférer que les flèches de variations s'interrompent sur
% les valeurs remarquables qui sont alors des nœuds.
% Voici un tableau qui présente simultanément les deux manières de traiter 
% les valeurs remarquables.
% La taille des flèches s'ajuste automatiquement.
% Bien entendu, on peut aussi ne pas tracer les pointillés mais placer
% quand même une valeur remarquable sur la flèche avec |\mil{0}|.
%\[
%\begin{tablvar*}{4}
%    \hline
%    x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && \frac{\pi}{2}\\
%    \hline
%    f'(x) && + && + & 0 & - && - & \bb \\
%    \hline
%    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \vr{0} &&
%        \pos[t]{1}{f(\frac{\pi}{6})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb
%    }
%    \hline
%\end{tablvar*}
%\]
% Si on choisit l'option |[t]| pour le max en ligne 1,
% il est alors nécessaire de choisir l'option |[b]| en ligne 3 pour conserver
% un positionnement correct du 0 sur la flèche.
% \begin{verbatim}
%\begin{tablvar*}{4}
%    \hline
%    x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && \frac{\pi}{2}\\
%    \hline
%    f'(x) && + && + & 0 & - && - & \bb \\
%    \hline
%    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \vr{0} &&
%        \pos[t]{1}{f(\frac{\pi}{6})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb
%    }
%    \hline
%\end{tablvar*}
% \end{verbatim}
%
% La commande |\vr| peut également servir à représenter des discontinuités 
% particulières, voir l'exemple ci-dessous avec la fonction définie par
%\[ 
%f(x)=\left\{
%\begin{array}{@{}cl}
%    \frac{\sin x}{x} &\mbox{si } x \neq 0 \\[1ex]
%    0 &\mbox{si } x= 0
%\end{array}
%\right. .
%\]
% \begin{minipage}[t]{7.5cm}
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & -\pi && \vr{0} && \pi \\
%    \hline
%    \variations{\mil{f(x)} & \bas{0} && 
%        \haut{ 1 \hspace{0.2em} } \discont
%        \vr[3]{0} \haut{ \hspace{0.2em} 1 }
%        && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[
%\begin{tablvar}{2}
%    \hline
%    x & -\pi && \vr{0} && \pi \\
%    \hline
%    \variations{\mil{f(x)} & \bas{0} && 
%        \haut{ 1 \hspace{0.2em} } \discont
%        \vr[3]{0} \haut{ \hspace{0.2em} 1 }
%        && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
%
% \medskip
% Voici un dernier exemple, traité de deux manières différentes,
% avec des valeurs remarquables dans deux tableaux conjoints. 
% Avec des nœuds c'est assez simple. 
%\[
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} && 
%        \pos{2}{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} && 
%        \bas{-1} && \haut{0} }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} &&
%        \pos{2}{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} &&
%        \bas{-1} && \haut{0} }
%    \hline
% \end{verbatim}
%
% \vspace{-2ex}
% \DescribeMacro{\noeud} \DescribeMacro{\vrconnect}
% Par contre, pour traiter ici les valeurs remarquables avec des pointillés, 
% la commande |\vr| ne permet pas connecter les valeurs sur $x$ avec celles du sinus dans
% le 2\ieme\ tableau, mais on peut le faire \og à la main\fg{} 
% en appelant les macros |\noeud| et |\vrconnect|.
%\[
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} &&
%        \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \mil{0} && \bas{-1} && 
%        \mil{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{\noeud{Y1}{1}} && 
%        \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} }
%    \hline
%\end{tablvar}
%\vrconnect{X1}{Y1}
%\vrconnect{X2}{Y2}
%\vrconnect{X3}{Y3}
%\]
% \begin{verbatim}
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} &&
%        \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \mil{0} && \bas{-1} && 
%        \mil{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{\noeud{Y1}{1}} && 
%        \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} }
%    \hline
%\end{tablvar}
%\vrconnect{X1}{Y1}
%\vrconnect{X2}{Y2}
%\vrconnect{X3}{Y3}
% \end{verbatim}
%
% \subsection{Zones interdites}
%
% Nous abordons pour finir le tracé de zones interdites où la fonction
% n'est pas définie. On peut dessiner ces zones interdites en couleur ou en hachures.
%
% \medskip
% Pour une zone interdite en couleur, on place la commande |\ZIc|
% \DescribeMacro{\ZIc}
% dans les intervalles que l'on veut colorer (signes ou variations).
% Un exemple avec la fonction $f$ définie par $f(x)=\frac{1}{\sqrt{x^2-1}}$.
% La zone grisée arrive toujours au contact des doubles barres. 
%\[
%\begin{tablvar}[4em]{3}
%    \hline
%    x & -\infty && \zbox{-1} && \zbox{1} && +\infty \\
%    \hline
%    -\frac{x}{\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc & 
%        \bb & \hspace{1.5em} - & \\
%    \hline
%    \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
%        \zbox[r]{\haut{+\infty}} \bb & \ZIc & 
%        \bb \zbox[l]{\haut{+\infty}} && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \DescribeMacro{\zbox}
% Plusieurs \og interventions\fg{} manuelles sont nécessaires.
% D'abord sur la ligne des $x$, il faut permettre aux bornes
% de déborder sur la colonne de la zone interdite.
% Pour cela on les place dans une |\zbox|.
% La commande \cmd{\zbox}\oarg{pos}\marg{contenu} 
% affiche son contenu mais considère la largeur comme nulle.
% Le 1\ier\ paramètre (optionnel) est le positionnement dans la boite : 
% |c| (par défaut), |l| (left) ou |r| (right).
% Ici |zbox| est aussi nécessaire pour annuler la largeur des
% boites contenant les $+\infty$ sinon la double barre ne serait
% plus au centre de sa colonne, en ligne 1, ce qui produirait
% un décalage avec les autres lignes.\\
% Enfin, les signes ont été décalés avec |\hspace|, pour améliorer
% leur centrage par rapport aux flèches.
% \begin{verbatim}
%\begin{tablvar}[4em]{3}
%    \hline
%    x & -\infty && \zbox{-1} && \zbox{1} && +\infty \\
%    \hline
%    -\frac{x}{\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc &
%        \bb & \hspace{1.5em} - & \\
%    \hline
%    \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
%        \zbox[r]{\haut{+\infty}} \bb & \ZIc & 
%        \bb \zbox[l]{\haut{+\infty}} && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Un autre exemple avec $f(x)=\sqrt{2x^2-1}$ où
% les doubles barres n'apparaissent que sur la dérivée.
%\[
%\begin{tablvar}[3em]{3}
%    \hline
%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
%        \zbox{\frac{\sqrt{2}}{2}} && +\infty \\
%    \hline
%    \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\
%    \hline
%    \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}}
%        & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}[3em]{3}
%    \hline
%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
%        \zbox{\frac{\sqrt{2}}{2}} && +\infty \\
%    \hline
%    \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\
%    \hline
%    \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}}
%        & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\ZIh}%
% Voyons à présent la réalisation de tableaux avec zones interdites hachurées.
% On place la commande |\ZIh| dans les intervalles que l'on veut hachurer.
%\[
%\begin{tablvar}{3}
%    \hline
%    x & -\infty & & \zbox{-\frac{\sqrt{2}}{2}}& &
%    \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\
%    \hline
%    f'(x) & & - & \bb & \ZIh & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} &
%        \ZIh & \bas{0} && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% Pour les mêmes raisons que précédemment, les |\zbox| sont toujours 
% nécessaires sur la ligne des $x$, mais plus pour les 0.
% \begin{verbatim}
%\begin{tablvar}{3}
%    \hline
%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
%        \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\
%    \hline
%    f'(x) && - & \bb & \ZIh & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} &
%        \ZIh & \bas{0} && \haut{+\infty} }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\ZIh\oarg{hauteur}}
% Les hachures s'ajustent automatiquement lorsque toutes les lignes 
% ont une hauteur standard.
% Si par contre des lignes sont plus hautes à cause de leur contenu,
% on doit ajouter de la hauteur avec \cmd{\ZIh}\oarg{hauteur} (réglage manuel).
%\[
%\begin{tablvar}[3.5em]{3}
%    \hline
%    x & -\infty & &\zbox{-1} &&\zbox{1} & & +\infty \\
%    \hline  
%    f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\
%    \hline
%    \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}}
%        & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2.4ex]
%        & \zbox{\bas{0}} \barre  && \haut{1}
%    }
%    \hline
%\end{tablvar}
%\]
% On remarquera ici l'utilisation de |\barre| dans la partie variations qui
% oblige à placer le 0 dans une |\zbox| sans quoi la barre serait décalée après le 0.
% \begin{verbatim}
%\begin{tablvar}[3.5em]{3}
%    \hline
%    x & -\infty & &\zbox{-1} && \zbox{1} && +\infty \\
%    \hline  
%    f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\
%    \hline
%    \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}}
%        & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2.4ex]
%        & \zbox{\bas{0}} \barre  && \haut{1}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Un exemple avec deux zones interdites, la fonction
% $f:x\longmapsto \sqrt{(x^2-1)(x^2-4)}$.
%{ \footnotesize
%\[ 
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\
%    \hline
%    2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre &&
%        \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre
%        & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}}
%        \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
%}
% La commande |\ZIh| \emph{ne doit pas être placée deux fois dans une même ligne de signe}
% car, sauf sur la dernière ligne des variations où elle trace les hachures, 
% son effet est simplement de cumuler la hauteur de la ligne.
% Et comme toutes les lignes de signes ont le même numéro 0, la commande |\ZIh|,
% dans la partie signes, ne sait pas sur quelle ligne elle se trouve
% et cumule la hauteur de ligne à chaque appel.
% \begin{verbatim}
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\
%    \hline
%    2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre &&
%        \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre
%        & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}}
%        \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\ZIh*}
% Lorsqu'on ne fait qu'un tableau de signes (sans variations), 
% il faut utiliser la commande |\ZIh*| pour déclencher le tracé des hachures.
% Celle-ci doit être placée sur la dernière ligne de chaque bloc de hachures.
% Sur les lignes précédentes, le |\ZIh| peut être placé n'importe où
%  (une seule fois par ligne).
%
%{ \footnotesize
%\[ 
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1}  && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre && \barre  &-& \barre[0] &+& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\
%    \hline
%\end{tablvar}
%\]
%}
% \begin{verbatim}
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1}  && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre & & \barre  &-& \barre[0] &+& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Si on veut tracer des rectangles de hachures sur des lignes non contiguës,
% il faut un appel à |\ZIh*| pour chaque rectangle.
%\[
%\begin{tablvar}{4} 
%    \hline 
%    x & -\infty && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && 
%        +\infty \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZIinit\ZIh* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}
%\]
% \smallskip
% \begin{verbatim}
%\begin{tablvar}{4}
%    \hline
%    x & -\infty && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && 
%        +\infty \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZIinit\ZIh* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}
% \end{verbatim}
% \vspace{-3ex}
% Ci-dessus, la commande \LaTeX\ |\phantom{0}| sur la ligne des $x$ permet de créer une
% boite fantôme de la largeur du 0, pour éviter que la largeur de la colonne
% valeur ne soit complètement nulle produisant un chevauchement inélégant
% des 0 sur les hachures.\\
% \DescribeMacro{\ZIinit}
% L'appel à |\ZIinit| sur la dernière ligne permet de ne pas
% conserver la hauteur cumulée lors du précédent appel à |\ZIh*|
% (en fait inutile ici car la 1ère zone hachurée ne fait qu'une seule ligne de haut).
%
% \medskip
% \DescribeMacro{\hachure}
% On ne peut pas dessiner des zones interdites hachurées
% sur plusieurs colonnes contiguës avec |\ZIh|,
% mais on peut alors utiliser la primitive graphique |\hachure| 
% pour définir manuellement le rectangle à hachurer.
%
%{ \footnotesize
%\[
%\begin{tablvar}{8}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} 
%        && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\
%    \hline
%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
%        \barre &+& \barre &+& \barre &+& \\
%    \hline
%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
%        \barre &-& \barre[0] &+& \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & & \hachure{-4em,-11.2ex}{4em,2.4ex} & & \bb &+&
%        \barre[0] &-& \bb & &  & & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont &&  &&
%        \bas{0} && \haut{2} && \bas{0} \discont &&
%        \pos*{3}{\hachure{-4em,12.5ex}{4em,-1.1ex}} && \bas{0} && 
%        \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
%}
% Si l'on ne dispose pas de ligne de signe pour placer la commande |\hachure|,
% on peut la placer sur la ligne des $x$ ou dans la partie variations mais
% il faut alors mettre celle-ci dans un |\pos*| sinon elle sera répétée pour chaque
% ligne des variations.
% \begin{verbatim}
%\begin{tablvar}{8}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} 
%        && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\
%    \hline
%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
%        \barre &+& \barre &+& \barre &+& \\
%    \hline
%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
%        \barre &-& \barre[0] &+& \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & & \hachure{-4em,-11.2ex}{4em,2.4ex} & & \bb &+&
%        \barre[0] &-& \bb & &  & & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont &&  &&
%        \bas{0} && \haut{2} && \bas{0} \discont &&
%        \pos*{3}{\hachure{-4em,12.5ex}{4em,-1.1ex}} && \bas{0} && 
%        \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}

% \section{Le code}

% \subsection{Extensions requises et options}

%    \begin{macrocode}
\RequirePackage{array}
\RequirePackage{ifthen}
\RequirePackage{multido}
\RequirePackage{colortbl}

\newboolean{tikz}
\DeclareOption{tikz}{\setboolean{tikz}{true}}
\DeclareOption{pstricks}{\setboolean{tikz}{false}} % valeur par défaut
\ProcessOptions \relax

\ifthenelse{\boolean{tikz}}{
    \RequirePackage{tikz}
    \usetikzlibrary{patterns}
    \newlength{\tikznode@below}
    }{
    \RequirePackage{pst-node}
}
%    \end{macrocode}

% \subsection{Les paramètres généraux}
%
% Dans cette section sont présentés tous les paramètres
% que l'on peut redéfinir pour modifier l'aspect des tableaux,
% mais qui n'ont en principe pas besoin d'être touchés.
%
% \begin{macro}{\intervalwidth}
% Définit la largeur par défaut des colonnes \og intervalles \fg,
% valeur prédéfinie à 2.5~em.
%    \begin{macrocode}
\newlength{\intervalwidth}
\setlength{\intervalwidth}{2.5em} % largeur des "intervalles"
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bordercolsep}
% Définit la largeur de l'espace extérieur des première et dernière colonnes de valeurs.
% Sa valeur par défaut a été réduite par rapport à la longueur \LaTeX\ standard 
%|\arraycolsep| afin que les valeurs des extrémités (souvent des $\infty$) 
% soient plus proches des lignes verticales de début et de fin.
%    \begin{macrocode}
\newlength{\bordercolsep} % largeur de l'espace inter-colonne
\setlength{\bordercolsep}{2pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\innercolsep}
% Définit la largeur entre les colonnes valeurs et les colonnes intervalles du tableau.
% Cette largeur a été ajustée pour que les zones interdites grisées avec |\cellcolor| 
% arrivent au contact de la double barre. 
%    \begin{macrocode}
\newlength{\innercolsep}
\setlength{\innercolsep}{4pt}
%    \end{macrocode}
% \end{macro}

%\begin{macro}{maxdiscount}
% La gestion de discontinuités permettant de ne pas relier les flèches l'une à l'autre
% se fait grâce à la commande |\discont|.
% Le compteur |maxdiscont| est fixé à 3 par défaut ; il faut l'augmenter si l'on veut
% produire un tableau de variation avec plus de 3 discontinuités.
%    \begin{macrocode}
\newcounter{maxdiscont}
\setcounter{maxdiscont}{3} % nb max de discontinuités
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tablvarstretch}
% Permet de régler la valeur relative de l'espacement vertical
% des lignes du tableau. La valeur par défaut est 1.2 (1 correspondant 
% à la valeur standard d'un environnement |array|).
% Placée dans un environnement math, elle sera locale à cet environnement.
%    \begin{macrocode}
\newcommand{\tablvarstretch}{1.2}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tvbarrewidth}
% Définit l'épaisseur des barres de séparation verticales coupant les 0 
% d'un tableau de signe : 0.5~pt par défaut.
%    \begin{macrocode}
\newlength{\tvbarrewidth}
\setlength{\tvbarrewidth}{0.5pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{tvbarrecolor}
% Définit la couleur des mêmes barres de séparation verticales.
%    \begin{macrocode}
\definecolor{tvbarrecolor}{gray}{0.7}
%    \end{macrocode}
% \end{macro}

% \subsection{Les commandes graphiques \textsf{pstricks/tikz}}
%
% Nous présentons ici les commandes graphiques permettant le dessin 
% des flèches,
% les pointillés des valeurs remarquables, les hachures des zones interdites.
% Celles-ci sont définies différemment s'il s'agit de l'option |tikz| ou |pstricks|
% (plus précisément liées à l'extension \textsf{pst-node}).
%
% \begin{macro}{\fleche}
% La commande \cmd{\fleche}\marg{noeud1}\marg{noeud2} possède deux paramètres
% qui sont les noms des nœuds à relier. 
% La création des nœuds est obtenue avec la commande |\noeud| appelée par |\pos| 
% et le tracé des flèches réalisé automatiquement par la commande |\variations|.
% Pour modifier l'aspect des flèches on peut redéfinir la commande.
%    \begin{macrocode}
\newcommand*{\fleche}[2]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,overlay]{\draw[->,>=stealth,
            line width=0.6pt] (#1) -- (#2);}
    }{
        \ncline[arrowsize=2pt 2,arrowinset=0.4,nodesep=3pt,
            linewidth=0.6pt]{->}{#1}{#2}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\vrconnect}
% La commande \cmd{\vrconnect}\marg{noeud1}\marg{noeud2}
% relie les nœuds définis par |\vr| (valeurs remarquables)
% et le tracé est réalisé automatiquement par la commande |\variations|.
% Par défaut : lignes en pointillés d'épaisseur 1~pt.
%    \begin{macrocode}
\newcommand*{\vrconnect}[2]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,overlay]{\draw[dotted,line width=1pt] 
            (#1) -- (#2);}
    }{
        \ncline[nodesep=5pt,linestyle=dotted,linewidth=1pt]{-}{#1}{#2}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\noeud}
% \cmd{\noeud}\oarg{pos}\marg{noeud}\marg{valeur}
% définit les nœuds des flèches et valeurs remarquables ; 
% le 1\ier\ paramètre optionnel correspond à l'option |t| (top), 
% |b| (bottom) ou |c| (centered, par défaut) permettant d'ajuster
% la manière dont la flèche arrive sur le nœud (sans effet pour |tikz|) ;
% le 2\ieme\ paramètre est le nom du nœud (qui est donné automatiquement 
% par les commandes de positionnement) ;
% le 3\ieme\ paramètre est la valeur affichée dans le tableau.
%    \begin{macrocode}
\newcommand*{\noeud}[3][c]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,baseline]{
            \node[anchor=base,inner sep=0,outer sep=4] (#2) {$#3$};
        } % l'option de placement (#1) n'est pas implémentée pour tikz
    }{
        \rnode[#1]{#2}{#3}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\hachure}
% Définition des hachures pour les zones interdites.
% La macro prend deux arguments qui sont des paires de longueurs,
% par exemple |\hachure{-3em,12ex}{3em,-1ex}|,
% représentant les extrémités du rectangle à hachurer
% par rapport à la position courante où la macro est appelée. 
%    \begin{macrocode}
\newcommand{\hachure}[2]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,overlay]{\fill[pattern=north east lines] 
            (#1) rectangle (#2);}
    }{
        \psframe[linestyle=none,fillstyle=vlines,hatchwidth=0.2pt,
            hatchsep=3pt](#1)(#2)
    }
}
%    \end{macrocode}
% \end{macro}

% \subsection{Longueurs et compteurs internes}
%
%   \begin{macrocode}
\newcounter{ligne} % numéro de ligne
\newcounter{noeud} % numéro du nœud
\newcounter{numvr} % numéro de la valeur remarquable
\newcounter{numdiscont} % numéro de la discontinuité
%    \end{macrocode}
%
% Un compteur est créé pour chaque discontinuité : |discont1|, |discont2|, etc.
% Le compteur |discont|\meta{i} contient le numéro du nœud précédant 
% la i-ème discontinuité.
% La flèche partant de ce nœud ne sera pas tracée.
% Il faut un compteur de plus que le nombre de discontinuités.
%    \begin{macrocode}
\AtBeginDocument{% car maxdiscont a pu être modifié dans le préambule
    \stepcounter{maxdiscont}
    % il faut un compteur de plus que le nb de discontinuités
    \multido{\I=1+1}{\themaxdiscont}{\newcounter{discont\I}}
}
%    \end{macrocode}

% Longueurs et compteurs pour la commande |\ZIh|.
%    \begin{macrocode}
\newlength{\ZIheight}
\newlength{\ZIdepth}
\newlength{\ZIwidth}
\newcounter{ZI} % numéro de la ZI
\newcounter{ZIstar} % numéro de ZI pour la commande \ZI*
\newcounter{ZIvarlignes} % dernière ligne des variations
%    \end{macrocode}

% \bigskip
% \subsection{Les environnements \texttt{tablvar} et \texttt{tablvar*}}
%
% Grâce à l'extension \textsf{array} nous pouvons définir un nouveau type de colonnes 
% pour les intervalles : |i|.
%    \begin{macrocode}
\newcolumntype{i}[1]{>{\centering\arraybackslash $}p{#1}<{$}}
    % nouveau type de colonne i pour les intervalles
%    \end{macrocode}

% \begin{macro}{\tablvarinit}
% \changes{v1.1}{13/04/2019}{ajouté \bslash extrarowheight}
% Cette commande d'initialisation des compteurs est appelée
% au début de chaque environnement |tablvar| ou |tablvar*|.
% Les redéfinitions de |\extrarowheight| et |\arraystretch| seront locales 
% dans l'environnement |tablvar|.
%    \begin{macrocode}
\newcommand{\tablvarinit}{
    \setlength{\extrarowheight}{0pt} % paramètre de l'extension array
    \renewcommand{\arraystretch}{\tablvarstretch} 
    \setcounter{ligne}{0}
    \setcounter{numvr}{0}
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIinit}
% Initialisation des longueurs et compteurs pour la commande |\ZIh|.
% Prend un argument (optionnel) qui est la largeur des colonnes intervalles
% (car il faut la sauvegarder dans |\ZIwidth|)
% et qui est passé automatiquement par |tablvar|.
%    \begin{macrocode}
\newcommand{\ZIinit}[1][\intervalwidth]{
    \setlength{\ZIheight}{0pt}
    \setlength{\ZIdepth}{0pt}
    \setlength{\ZIwidth}{#1}
    \setcounter{ZI}{0}
    \setcounter{ZIstar}{0}
    \setcounter{ZIvarlignes}{3} 
    % doit être non nul pour \ZIh si tableau de signe seul
}
%    \end{macrocode}
% \end{macro}

% \begin{environment}{tablvar}
% L'environnement |tablvar| : |\begin{tablvar}|\oarg{width}\marg{nbintervals}.
% Le 1\ier\ paramètre (optionnel) permet de régler la largeur des colonnes 
% intervalles (définie par |\intervalwidth|
% par défaut), le 2\ieme\ paramètre (obligatoire) est le nombre d'intervalles.
% Cet environnement n'est rien d'autre qu'un |array| dans lequel on a réglé
% les options de colonages.
% Les colonnes de valeurs sont de type |c| et les colonnes d'intervalles de type |i|.
%    \begin{macrocode}
\newenvironment{tablvar}[2][\intervalwidth]{
    \tablvarinit
    \ZIinit[#1]
    \begin{array}{%
        |c|@{\hspace{\bordercolsep}}%
        *{#2}{c@{\hspace{\innercolsep}}%
            i{#1}@{\hspace{\innercolsep}}%
        }%
        c@{\hspace{\bordercolsep}}|%
    }    
}{\end{array}}
%    \end{macrocode}
% \end{environment}

% \begin{environment}{tablvar*}
% L'environnement |tablvar*| est une variante de |tablvar| (même syntaxe)
% où la première et la dernière colonnes de valeurs sont alignées respectivement
% à gauche (|l|) et à droite (|r|).
% Ceci est utile lorsqu'il y a une double barre à l'une des extrémités.
%    \begin{macrocode}
\newcounter{nb@intervals}
\newenvironment{tablvar*}[2][\intervalwidth]{
    % environnement tablvar* , type l et r pour les extrémités
    \tablvarinit
    \ZIinit[#1]
    \setcounter{nb@intervals}{#2}
    \addtocounter{nb@intervals}{-1}
    \begin{array}{%
        |c|@{\hspace{\bordercolsep}}%
        l@{\hspace{\innercolsep}}%
        i{#1}@{\hspace{\innercolsep}}%
        *{\value{nb@intervals}}{
            c@{\hspace{\innercolsep}}%
            i{#1}@{\hspace{\innercolsep}}%
        }%
        r@{\hspace{\bordercolsep}}|%
    }
}{\end{array}}
%    \end{macrocode}
% \end{environment}

% \subsection{La commande \texttt{\textbackslash variations}}
%
% C'est ici qu'est la magie !
% 
% \begin{macro}{\varloop}
% \changes{v1.1}{12/04/2019}{tvloop -> varloop}
% La commande \cmd{\varloop}\marg{iter}\marg{code} répète \meta{code} (\meta{iter}$- 1$) fois
% (car la dernière ligne de variations doit subir un traitement particulier).
% Nous avons créé une variante de |\multido| (du package \textsf{multido}) car
% |\multido|, |\Multido| ou |\whiledo| plantent sur |\\| ou |\@arraycr|
% et la commande |\variations| a besoin d'utiliser une boucle dans un tableau.
% |\varloop| n'est autre qu'un |\ifthenelse| récursif.
%    \begin{macrocode}
\newcounter{loop@counter}    
\newcommand{\varloop}[2]{%
    \setcounter{loop@counter}{#1}
    \addtocounter{loop@counter}{-1}% on boucle 1 fois de moins que #1
    \ifthenelse{\value{loop@counter}=0}{}{%
        #2 \varloop{\value{loop@counter}}{#2}%
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\variations}
% \cmd{\variations}\oarg{nblignes}\marg{code} où \meta{nblignes} est le nombre
% de lignes pour les variations (3 par défaut) ;
% \meta{code} contient les séparateurs de colonnes et la composition des variations 
% grâce aux commandes de positionnement.\\
% Le principe est que l'on parcourt 3 fois (par défaut) le contenu de |\variations| ;
% à chaque itération, le compteur |ligne| est incrémenté, 
% le compteur |noeud| est remis à 0 puis incrémenté à chaque commande |\pos|,
% mais le contenu de |\pos| n'est affiché et le nœud n'est effectivement créé 
% que si la valeur du compteur |ligne| correspond à l'argument de ligne de |\pos|.\\
% Les flèches et pointillés sont dessinés à la fin, quand tous les nœuds sont créés,
% mais il faut les tracer avant le |\\| final, sinon la compilation plante !?
%    \begin{macrocode}
\newcommand*{\variations}[2][3]{% #1=nblignes (3 par défaut)
    % (ré)initialisation des compteurs
    \setcounter{ligne}{0} % nécessaire pour 2 parties variations
    \setcounter{numdiscont}{0}
    \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}}
    \setcounter{ZIvarlignes}{#1} % nécessaire pour \ZIh
    % boucle : on exécute le code #2 un nb de fois égal à (#1)-1
    \varloop{#1}{%
        \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
        % à chaque boucle on réinitialise certains compteurs
        \stepcounter{ligne} % le numéro de ligne est incrémenté
        #2 % les nœuds sont fabriqués par le code #2 (avec \pos et \vr)
        \\ % retour ligne
        }
    % dernière itération -> flèches tracées AVANT \\ sinon bug !?
    \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
    \stepcounter{ligne} #2    
    % tracé des flèches 
    \addtocounter{noeud}{-1} % 1 flèche de moins que le nb de nœuds
    \setcounter{numdiscont}{1}
    \multido{\Ix=1+1,\Iy=2+1}{\thenoeud}{
        \ifthenelse{\value{discont\thenumdiscont}=\Ix}{
            % on saute les discontinuités
            \stepcounter{numdiscont}}{
            % sinon on trace la flèche N1->N2 puis N2->N3, etc.
            \fleche{N\Ix}{N\Iy} 
        }
    }
    % tracé des pointillés pour les valeurs remarquables
    \multido{\Ix=1+1}{\thenumvr}{\vrconnect{X\Ix}{Y\Ix}}    
    \\ % dernier retour ligne du tableau
}
%    \end{macrocode}
% \end{macro}

% \subsection{Les commandes de positionnement}
%
% \begin{macro}{\pos}
% \cmd{\pos}\oarg{opt}\marg{ligne}\marg{valeur} 
% sert à positionner les valeurs dans la partie variations.
% \meta{ligne} désigne la ligne où il faut placer \meta{valeur} et produire le nœud
% (numéroté avec le compteur |noeud| et défini en appelant la commande |\noeud|).
% Les lignes de variations sont numérotées \emph{du haut vers le bas} 
% (et les lignes de signes portent toutes le numéro 0).
% Le 1\ier\ argument optionnel, |c| (centered, par défaut), |t| (top) ou |b| (bottom),
% est utilisé pour le positionnement des flèches.\\
% \DescribeMacro{\pos*}
% Dans la version étoilée, \cmd{\pos*}\marg{ligne}\marg{valeur}, la différence 
% est qu'aucun nœud n'est créé. Ceci est utile en particulier pour la colonne de base, 
% contenant les légendes.
%    \begin{macrocode}
\newcommand*{\@pos}[3][c]{
    \stepcounter{noeud}
    \ifthenelse{\theligne=#2}{
        \noeud[#1]{N\thenoeud}{#3}
    }{} % si ligne != #2, on ne fait rien
}
\newcommand*{\@@pos}[2]{\ifthenelse{\theligne=#1}{#2}{}}
\newcommand*{\pos}{\@ifstar{\@@pos}{\@pos}}
%    \end{macrocode}
% \end{macro}

% Voici quelques alias utiles qui peuvent être utilisés 
% à la place des commandes |\pos| et |\pos*|.
% \begin{macro}{\haut}
% \cmd{\haut}\marg{valeur} =  \cmd{\pos}|{1}|\marg{valeur}.
%    \begin{macrocode}
\newcommand*{\haut}{\pos{1}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bas}
% \cmd{\bas}\marg{valeur} =  \cmd{\pos}|{3}|\marg{valeur}.
%    \begin{macrocode}
\newcommand*{\bas}{\pos{3}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\mil}
% \cmd{\mil}\marg{valeur} =  \cmd{\pos*}|{2}|\marg{valeur}.
%    \begin{macrocode}
\newcommand*{\mil}{\pos*{2}}
%    \end{macrocode}
% \end{macro}

% Voici enfin deux macros qui permettent si besoin d'ajuster le positionnement
% (en plus des commandes \LaTeX\ |\hspace| ou |\makebox|).
% \begin{macro}{\zbox}
% Place son contenu dans une boite de largeur nulle : affiche le contenu
% mais considère que l'espace occupé est nul pour le calcul des largeurs de colonne.
% Sa syntaxe est :
% |\zbox|\oarg{pos}\marg{contenu} où \meta{opt} = |c| (par défaut), |l| (left) ou |r| (right).
%    \begin{macrocode}
\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\vdecal}
% Décalage vertical : \cmd{\vdecal}\marg{decal}\marg{contenu}, 
% le 1\ier\ paramètre est le décalage 
% (positif = vers le haut ou négatif = vers le bas), le second est le contenu à placer.
%    \begin{macrocode}
\newcommand*{\vdecal}[2]{\smash{\raisebox{#1}{$#2$}}}
%    \end{macrocode}
% |\smash| a pour effet d'annuler la hauteur de la boite afin de ne pas agrandir
% la ligne courante.
% \end{macro}

% \subsection{Barres, discontinuités et valeurs remarquables}
%
% \begin{macro}{\bb}
% La macro |\bb|, qui produit une double barre,
% provient de l'extension \textsf{variations} de Christian Obrecht
% |\def\bb{\vrule\kern1pt\vrule}|.
% Nous avons ajouté 1~pt d'espace avant et après, afin d'éviter le contact
% entre la double barre et les limites à gauche ou à droite.
%    \begin{macrocode}
\newcommand*{\bb}{\kern1pt\vrule\kern1pt\vrule\kern1pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\barre}
% La macro |\barre| permet de tracer une barre verticale
% pour marquer les séparations de colonne dans un tableau de signe, en passant
% à travers les 0. 
% Son aspect est contrôlé par les paramètres |\tvbarrewidth| et |\tvbarrecolor|.
% Sa syntaxe est :
% |\barre|\oarg{valeur} où, en général, on met 0 comme argument optionnel.
%    \begin{macrocode}
\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}
    \color{tvbarrecolor}
    \vrule width \tvbarrewidth
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\discont}
% Associe un numéro de nœud à un compteur de discontinuité
% (chaque discontinuité a son propre compteur).
% La flèche entre le nœud précédent |\discont| (enregistré dans le compteur)
% et le nœud suivant ne sera pas tracée.
%    \begin{macrocode}
\newcommand*{\discont}{
    \ifthenelse{\theligne=1}{ 
        % on ne compte les discontinuités qu'une seule fois, sur ligne 1
        \stepcounter{numdiscont}
        \setcounter{discont\thenumdiscont}{\thenoeud}
        }{}
    }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bblim}
% Sert à positionner correctement des limites à gauche et à droite 
% d'une double barre en conservant le centrage de la double barre.
% Cette macro trace la double barre, place les limites et appelle |\discont|.
% Le principe est que lorsqu'on place la plus large des deux valeurs 
% d'un côté de la double barre, on place une boite fantôme de même largeur 
% de l'autre côté ; quant à la plus étroite des deux valeurs, 
% elle est placée dans une |\zbox| qui annule sa largeur.
% Sa syntaxe est : \\
% |\bblim|\marg{ligne gauche}\marg{limite gauche}\marg{ligne droite}\marg{limite droite}
%    \begin{macrocode}
\newsavebox{\@tvlbox}
\newsavebox{\@tvrbox}
\newcommand{\bblim}[4]{
    \sbox{\@tvlbox}{$#2$}
    \sbox{\@tvrbox}{$#4$}
    \ifdim \wd\@tvlbox > \wd\@tvrbox
        \pos{#1}{#2} \bb\discont
        \zbox[l]{\pos{#3}{#4}} \pos*{#1}{\phantom{#2}}
    \else
        \pos*{#3}{\phantom{#4}} \zbox[r]{\pos{#1}{#2}}
        \bb\discont \pos{#3}{#4}
    \fi
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\vr}
% La commande |\vr| fabrique un nœud pour chaque valeur remarquable.
% Les nœuds sont désignés par X1, X2, \ldots\ sur la ligne des $x$
% et Y1, Y2, \ldots\ sur les lignes de variations.
% Sa syntaxe est : \cmd{\vr}\oarg{ligne}\marg{valeur}.
% Le paramètre optionnel \meta{ligne} vaut 2 par défaut pour Y, 
% et n'est pas pris en compte pour X (ligne 0),
% le second paramètre est la valeur à afficher.
% Les nœuds seront ensuite reliés par la commande |\vrconnect| 
% (appelée par |\variations|) en fonction de leur numéro.
%    \begin{macrocode}
\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf sur ligne 0
    \stepcounter{numvr}
    \ifthenelse{\theligne=0}{
        \noeud{X\thenumvr}{#2}
        }{
        \ifthenelse{\theligne=#1}{
            \noeud{Y\thenumvr}{#2}
        }{}
    }
}
%    \end{macrocode}
% \end{macro}

% \subsection{Zones interdites}
%
% \begin{macro}{\ZIc}
% Commande sans argument qui produit une zone interdite colorée.
% À placer dans les intervalles voulus. La densité de gris ou la couleur 
% peuvent être modifiées en redéfinissant la macro.
%    \begin{macrocode}
\newcommand{\ZIc}{\discont \cellcolor[gray]{0.7}}
%    \end{macrocode}
% \end{macro}

% La macro |\ZIh| \DescribeMacro{\ZIh} sert à produire une zone interdite hachurée.
% Le tracé des hachures n'est déclenché 
% que sur la dernière ligne des variations, les appels à |\ZIh| sur les lignes
% précédentes ne font que cumuler hauteur (|\ht|) et profondeur (|\dp|) de la ligne.
% Dans une ligne de signe, il ne faut qu'\emph{un seul appel} à |\ZIh|, 
% qui peut être placé n'importe où. 
% En effet, pour les lignes d'indice 0, la macro ne sait pas
% s'il y a eu un changement de ligne, donc elle cumule systématiquement la hauteur
% à chaque appel.
% Par contre, dans la partie variations, les |\ZIh| doivent être placés 
% autant de fois que nécessaire, dans les intervalles voulus.\\
% La macro possède un paramètre optionnel qui est un supplément de hauteur global,
% permettant de faire un ajustement fin si des lignes ont été agrandies 
% à cause de leur contenu (grandes fractions par exemple).\\
% Limitation : fonctionne moins bien avec tikz (sensible à la taille de police).
%
% La macro |ZIh*| \DescribeMacro{\ZIh*} 
% (appelée par |\ZIh| sur la dernière ligne des variations) 
% déclenche le tracé d'un rectangle de hachures en appelant la commande |\hachure|.
% Elle utilise les dimensions précédemment enregistrées dans les variables de dimension
% (par |\ZIh|). Dans un tableau de signes sans partie variations 
% elle doit être placée sur la dernière ligne à la place de |\ZIh|
% (pour les lignes précédentes).
%    \begin{macrocode}
\newcommand*{\@ZI}[1][0pt]{%
    \discont
    \ifthenelse{\theligne=\value{ZIvarlignes}}{\@@ZI[#1]}{%
        \ifthenelse{\theligne=0 \or \theZI=0}{%
            % on ne doit cumuler la hauteur qu'une fois par ligne
            % => une seule occurrence de la macro sur une ligne 0
            \global\advance\ZIheight by \ht\@arstrutbox
            \global\advance\ZIheight by \dp\@arstrutbox
        }{}
    }
    \stepcounter{ZI} % RAZ par \variations à chaque ligne
}

\newcommand*{\@@ZI}[1][0pt]{% \discont inutile ici
    \ifthenelse{\theZIstar=0}{% cumul des longueurs 1 seule fois
        \global\advance\ZIheight by \ht\@arstrutbox
        \global\advance\ZIheight by #1
        \global\advance\ZIdepth by \dp\@arstrutbox
        \global\advance\ZIwidth by \innercolsep
        \global\advance\ZIwidth by \innercolsep
        \global\advance\ZIwidth by 2pt % espace autour doubles barres
    }{}
    \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight}
    \stepcounter{ZIstar}
}

\newcommand{\ZIh}{\@ifstar{\@@ZI}{\@ZI}}
%    \end{macrocode}

% \Finale
\endinput
