% \iffalse meta-comment
%
% Copyright (C) 2018-2024 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%
% 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.
% To get the index compile with
% makeindex -s gind.ist -o tablvar.ind tablvar.idx
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{tablvar.dtx}
%</driver>
%<*package> 
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{tablvar}   
    [2024/08/09 v2.1 Tables of signs and variations]
%</package>
%<*driver>
\documentclass{ltxdoc}
%\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{geometry} % pour ��viter certains changements avec XeLaTeX

\usepackage{tabvar}
\let\barreFlipo\barre \let\barre\relax \let\discont\relax
\usepackage{variations}
\def\bbObrecht{\vrule\kern1pt\vrule} \let\bb\relax
\let\variations\relax
\usepackage{tkz-tab}
\usepackage{pstricks}
\usepackage{tableau}

\usepackage[pstricks]{tablvar}
\usepackage[style=french,font=fcm]{lgrmath} % pour un joli pi droit
\usepackage[hyperindex=false]{hyperref}
\usepackage{sectsty}
\usepackage{makecell}
\usepackage{spacingtricks}
\usepackage{metalogo} % pour \LuaLaTeX et \XeLaTeX
\usepackage{mflogo} % pour metapost
\usepackage{colortbl}

\frenchsetup{StandardListSpacing=true}
\geometry{textwidth=355pt,vmarginratio=1:1,hmarginratio=3:2} % voisin de ltxdoc
\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}}
\newcommand\e{\mathrm{e}}
\newcommand\TikZ{\textnormal{Ti}\emph{k}\textnormal{Z}}
\newcommand\chline{\arrayrulecolor{cyan}\hline\arrayrulecolor{black}}
\definecolor{darkbrown}{rgb}{0.5,0.1,0.1}
\allsectionsfont{\color{darkbrown}}
\hypersetup{%
    bookmarksopen=true,
    bookmarksopenlevel=2,
    colorlinks, 
    linkcolor=blue,
    citecolor=red,
    pdftitle={tablvar}, 
    pdfsubject={LaTeX package}, 
    pdfauthor={Antoine Missier}
}
\DisableCrossrefs         
%\CodelineIndex
%\RecordChanges
\begin{document}
  \DocInput{tablvar.dtx}
  %\PrintChanges
  %\PrintIndex
\end{document}
%</driver>
% \fi
%
% \CheckSum{828}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \changes{v0.1}{05/01/2014}{Version initiale personnelle}
% \changes{v0.2}{11/11/2014}{Ajout de l'option tikz}
% \changes{v0.3}{07/12/2014}{Ajout de l'environnement tablvar*}
% \changes{v1.0}{11/11/2018}{Premi��re version publi��e, cr��ation de fichiers dtx et ins}
% \changes{v1.0}{11/11/2018}{Nouvelle marcro bblim, changements dans les macros barre et ZIh}
% \changes{v1.1}{12/04/2019}{Reprise README.md, tvloop -> varloop}
% \changes{v1.2}{05/05/2019}{Modifications mineures dans la documentation}
% \changes{v1.2}{02/06/2019}{Augmentation du facteur arraystretch par d��faut de 1.2 �� 1.4}
% \changes{v2.0}{03/09/2023}{
%    - Options g��r��es par xkeyval, 
%    - tablvarstretch pass�� de 1.4 �� 1.6}
% \changes{v2.0}{30/10/2023}{Calcul de la colonne pour la gestion des ZI}
% \changes{v2.0}{05/11/2023}{
%    - Nouvelles macros limg, limd, posvr,
%    - nouveaux types de colonnes pour les valeurs}
% \changes{v2.0}{20/11/2023}{Comparatif avec les autres extensions}
% \changes{v2.0}{25/11/2023}{Calcul de hauteur de la 1��re colonne pour l'ajustement des ZI}
% \changes{v2.0}{02/12/2023}{
%    - Nouveaux param��tres firstcolsep, extleft, extright,
%    - mise �� 0 du param��tre innercolsep}
% \changes{v2.0}{14/12/2023}{Reprise de la doc}
% \changes{v2.0}{15/12/2023}{Option tikz ou pstricks en fonction du compilateur}
% \changes{v2.0}{16/12/2023}{Nouveau param��tre limsep}
% \changes{v2.0}{20/12/2023}{Macro bas et mil valables pour un nb quelconque de lignes}
% \changes{v2.0}{22/12/2023}{Macros @pos -> tv@pos, @@pos -> tv@@pos}
% \changes{v2.1}{23/07/2024}{
%    - Calcul de hauteur automatique de la colonne de l��gende :
%      * nouveaux param��tres rowtopsep et rowbottomsep
%      * tv@saveheight -> tv@setheight
%    - option pstricks possible avec LuaLaTeX + luapstricks,
%    - am��lioration du calcul de position de la macro mil,
%    - nouvelles macros limg*, limd* et bblim*
%    - exemple plus sophistiqu�� pour bblim}
%
% \GetFileInfo{tablvar.sty}
% 
% \title{L'extension \textsf{tablvar}\thanks{Ce document
%     correspond �� \textsf{tablvar}~\fileversion, derni��re modification le 09/08/2024.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
% \date{9 ao��t 2024}
% \maketitle
% \tableofcontents
%
% \section{Introduction}
%
% Cette extension permet de construire des tableaux de variations 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}~\cite{TABV} de Daniel Flipo et 
% \textsf{variations}~\cite{VARI} de Christian Obrecht ou, plus ��labor��s, 
% \textsf{tablor}~\cite{TABLOR} de Guillaume Connan et \textsf{tkz-tab}~\cite{TKZ} 
% de Alain Matthes.
% Nous pr��sentons un comparatif �� la section \ref{comparatif}}, 
% nous pensons que \textsf{tablvar} poss��de quelques avantages :
% une syntaxe simple, une haute qualit�� graphique, une vari��t�� de positionnements
% et de r��glages, une documentation soign��e.
% Les dessins, pour les fl��ches ou les zones interdites, sont obtenus
% en exploitant les fonctionnalit��s des extensions graphiques PSTricks 
% (plus exactement \textsf{pst-node}) ou \TikZ.
% Les fl��ches sont r��alis��es �� partir d'un \emph{graphe} de \emph{n��uds} 
% venant se \og superposer \fg{} au tableau lui-m��me.
%
% Le parti pris 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
% (PSTricks ou \TikZ) celui
% de r��aliser le dessin des fl��ches, automatis�� et sans intervention de l'utilisateur.
% On a simplement besoin de pr��ciser, dans une commande |\variations|,
% ce qui est en haut et ce qui est en bas.
%
% \medskip
% L'extension poss��de deux options, utilis��es pour le trac�� automatique des fl��ches : 
% |pstricks| ou |tikz|, que l'on invoque dans le pr��ambule �� l'appel de l'extension :
% |\usepackage[tikz]{tablvar}|.
% Lorsque l'option n'est pas pr��cis��e, l'extension choisira \texttt{tikz}
% pour un mode de sortie PDF direct (avec pdf\LaTeX\ ou \LuaLaTeX),
% \texttt{pstricks} sinon (avec \LaTeX\ > dvips > ps2pdf ou \XeLaTeX).
% Pour l'option |tikz|, il faut compiler \emph{deux fois},
% la premi��re fois les fl��ches ne sont pas correctement dessin��es
% (un message de compilation le rappelle).
%
% \medskip
% Cette documentation donne une galerie d'exemples, d��crit les commandes 
% fournies ainsi que diff��rentes possibilit��s de r��glages et d'ajustements personnels.
%
% \section{Utilisation}
%
% \subsection{Tableaux de variations simples}
%
% \DescribeEnv{tablvar}
% Un tableau de variations (ou de signes) se d��finit par un environnement |tablvar|
% qui \emph{doit ��tre en mode math��matique} (comme |array|).
%
% \medskip
% 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}
%
% 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 premi��re colonne de \emph{l��gendes}, il y a deux types de colonnes :
% des colonnes de \emph{valeurs}, de largeur fixe (\texttt{2em} par d��faut) et centr��es,
% et des colonnes \emph{intervalles} de largeur fixe (\texttt{3em} par d��faut)
% \footnote{Une dimension peut ��tre exprim��e cm, pt, etc. 
% Le \texttt{em} correspond �� la largeur du \og m \fg dans la fonte utilis��e. 
% Cette unit�� �� l'avantage de s'ajuster lorsqu'on change de fonte
% sans avoir besoin de modifier le code. L'unit�� de m��me type utilis��e pour les hauteurs
% est le \texttt{ex}, hauteur du \og x \fg.}.
% La longueur des fl��ches s'ajuste en fonction de la taille des valeurs 
% qu'elles relient et ne sont pas contraintes �� rester �� l'int��rieur des colonnes intervalles.
% Lorsqu'une valeur est trop large, elle d��borde automatiquement 
% dans les colonnes intervalles sans alt��rer 
% les largeurs de colonne.
%
% \medskip
% \DescribeMacro{\pos}
% Les commandes |\haut| et |\bas| reposent sur une macro
% 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
% et tableau de signes ont pour indice 0.
% Les lignes de la partie variations sont 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 \texttt{tikz}.}
% permet d'ajuster le positionnement des fl��ches : 
% |c| (centered, par d��faut), |b| (bottom) ou |t| (top).
%
% \medskip
% \DescribeMacro{\pos*} 
% La commande |\mil|, utilis��e pour le $f(x)$ dans la premi��re colonne,
% repose, elle, 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.
%
% Le second tableau de l'exemple ci-dessous est obtenu avec le code suivant
% qui utilise les commandes |\pos| 
% �� la place de |\haut| et |\bas| (avec l'option |t| pour le max)
% et |\pos*| �� la place de |\mil|. Comparer le positionnement des fl��ches. 
%\[ 
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac{1}{2} & & +\infty \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\mil{f(x)} & \bas{2} && 
%        \haut{f(\frac{1}{2})} && \bas{0}}
%    \hline
%\end{tablvar}
% \hspace{3.8em}
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac{1}{2} & & +\infty \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\pos*{2}{f(x)} & \pos{3}{2} && 
%        \pos[t]{1}{f(\frac{1}{2})} && \pos{3}{0}}
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\[\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac{1}{2} & & +\infty \\
%    \hline
%    f'(x) & & + & 0 & - & \\ 
%    \hline
%    \variations{ \pos*{2}{f(x)} & \pos{3}{2} && 
%        \pos[t]{1}{f(\frac{1}{2}} && \pos{3}{0} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
% \hypertarget{intervalwidth}{}
%
% \medskip
% \DescribeEnv{tablvar\oarg{largeur}}\DescribeMacro{intervalwidth}
% L'environnement |tablvar| accepte un argument optionnel qui r��gle  
% la largeur des colonnes intervalles.
% L'on peut aussi passer diverses options avec la syntaxe \emph{cl��=valeur},
% par exemple la largeur des colonnes intervalles peut ��galement se r��gler avec 
% \texttt{intervalwidth=}\meta{largeur}
% (voir section \ref{options} pour la liste d��taill��e des options).
% 
% \DescribeMacro{\variations\oarg{nblignes}}
% C'est la commande |\variations| qui se charge de la construction des fl��ches
% en fonction du positionnement des valeurs.
% Un param��tre optionnel permet de d��finir 
% un nombre arbitraire de lignes pour les variations (3 par d��faut).
%
% Voici un exemple avec un seul intervalle, utilisant l'argument optionnel \texttt{4em}
% de \texttt{tablvar}, afin d'allonger un peu la largeur de l'intervalle,
% et une partie variations construite uniquement sur 2 lignes.
% La commande |\mil| positionne automatiquement son contenu 
% avec un d��calage vertical ad��quat.
%
% \noindent
% \begin{minipage}[t]{8cm}
% \begin{verbatim}
%\[\begin{tablvar}[4em]{1}
%    \hline
%    x & -5 && +\infty \\
%    \hline
%    \variations[2]{ \mil{f(x)} & \haut{2} && 
%        \bas{-1} }
%    \hline
%\end{tablvar} \]
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{4.2cm}
%\[\begin{tablvar}[4em]{1}
%    \hline
%    x & -5 && +\infty \\
%    \hline
%    \variations[2]{\mil{f(x)} & \haut{2} && \bas{-1}}
%    \hline
%\end{tablvar}\]
% \end{minipage}
% \hypertarget{colvalwidth}{}
%
% \DescribeMacro{colvalwidth}
% La largeur des colonnes de valeurs est fix��e par d��faut �� \texttt{2em},
% ce qui est l��g��rement plus large qu'un infini avec un signe. 
% Lorsque toutes les valeurs sont ��troites, on peut ��ventuellement
% diminuer la largeur des colonnes intervalles pour ��viter des espaces larges sur les 
% bords du tableau.
% Il est cependant rarement utile de modifier cette valeur. 
%\[\begin{tablvar}[colvalwidth=1em,intervalwidth=3.5em]{4}
%    \hline
%    x & 0 && 1 && 2 && 3 && 5 \\
%    \hline
%    \variations{ \pos*{2}{f(x)} & \pos{3}{0} && \pos{2}{1} && \pos{2}{1} 
%        && \pos{1}{4} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}\]
% Pour placer des n��uds de fl��ches au milieu (sur la ligne 2),
% on doit utiliser |\pos{2}| et non |\mil|.
% Lorsqu'il y a une autre option dans l'environnement \texttt{tablvar}, 
% il faut utiliser la syntaxe compl��te
% \texttt{intervalwidth=...} pour modifier la largeur des colonnes intervalles.
% \begin{verbatim}
%\[\begin{tablvar}[colvalwidth=1em,intervalwidth=3.5em]{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 signes. Elle est bien s��r 
% facultative et poss��de un param��tre optionnel pour placer un 0 sur la barre.
% Voici un exemple avec
% \[ f(x)=-4x^3+3x^2+18x-3 \quad\mbox{et}\quad f'(x)=6(x+1)(-2x+3).\]
%\[\begin{tablvar}[3.5em]{3}
%    \hline
%    x & -\infty && -1 && \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{\makecell{\mbox{Variations} \\ \mbox{de }f}} & 
%        \haut{+\infty} && \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty} }
%    \hline
%\end{tablvar}\]
%
% La l��gende \og Variations de $f$ \fg est compos��e avec une coupure de ligne gr��ce ��
% la commande |\makecell| de l'extension \textsf{makecell}~\cite{MKCELL} d'Olga Lapko.
% \begin{verbatim}
%\[\begin{tablvar}{3}
%    \hline
%    x & -\infty && -1 && \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{\makecell{\mbox{Variations} \\ \mbox{de }f}} & 
%        \haut{+\infty} && \bas{-14} && \haut{\frac{69}{4}} && 
%        \bas{-\infty} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% \subsection{Doubles barres, discontinuit��s et limites}
%
% \DescribeMacro{\bb} 
% Une double barre s'obtient avec la commande |\bb|. 
%
% \DescribeMacro{\discont}
% La commande |\discont| emp��che le dessin d'une fl��che entre deux n��uds,
% en particulier pour ��viter de traverser une double barre. 
% On peut en placer jusqu'�� 4.
%
% \medskip
% 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}{2}
%    \hline
%    x & -\infty && 2 &&  +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{x-2}} & \pos{2}{0} && \bas{-\infty} 
%        \pos*{2}{\bb} \discont \haut{+\infty} && \pos{2}{0}  }
%    \hline
%\end{tablvar}\]
% \begin{verbatim}
%\[\begin{tablvar}{2}
%    \hline
%    x & -\infty && 2 &&  +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{x-2}} & \pos{2}{0} && \bas{-\infty} 
%        \pos*{2}{\bb} \discont \haut{+\infty} && \pos{2}{0}  }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% \hypertarget{firstcolsep}{}
% \DescribeMacro{\limg} \DescribeMacro{\limd}
% Les macros |\limg|\oarg{pos}\marg{ligne}\marg{valeur} et
% |\limd|\oarg{pos}\marg{lgn}\marg{val}
% offrent une solution plus ��l��gante pour placer des limites �� gauche ou �� droite.
% L'option de positionnement \meta{pos} correspond �� celle de la macro |\pos|
% (\texttt{c}, \texttt{t} ou \texttt{b}).
%
% \DescribeMacro{\limg*}\DescribeMacro{\limd*}
% Les variantes ��toil��es |\limg*| et |\limd*| sont des alias :
% |\limg*{+}| signifie |\limg{1}{+\infty}|,
% |\limg*{-}| correspond �� |\limg{|$n$|}{-\infty}| 
% (pour une partie variations sur $n$ lignes),
% de m��me pour |\limd*|.
% Tout autre argument que \texttt{+} ou \texttt{-} g��n��re un message d'erreur.
%
% \DescribeMacro{firstcolsep}
% La colonne de l��gende peut ��tre ��largie en ajoutant de l'espace �� ses extr��mit��s
% avec l'option \texttt{firstcolsep} (dont la valeur par d��faut est \texttt{5pt}).
%\[\begin{tablvar}[firstcolsep=10pt,intervalwidth=4em]{2}
%    \hline
%    x & -\infty && 0 && +\infty \\
%    \hline
%    -\frac{1}{x} & & + & \bb & - & \\
%    \hline
%    \variations{ \mil{\e^{\frac{1}{x}}} & \haut{1} && \limg{3}{0} \bb
%        \discont \limd*{+} && \bas{1} }
%    \hline
%\end{tablvar}\]
%
% \begin{verbatim}
%\[\begin{tablvar}[firstcolsep=10pt,intervalwidth=4em]{2}
%    \hline
%    x & -\infty && 0 && +\infty \\
%    \hline
%    -\frac{1}{x} & & + & \bb & - & \\
%    \hline
%    \variations{ \mil{\e^{\frac{1}{x}}} & \haut{1} && \limg{3}{0} \bb
%        \discont \limd*{+} && \bas{1} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
% \vspace{-2ex}
% La macro |\e| compose le nombre d'Euler $\e$ en romain,
% comme c'est la r��gle pour les constantes math��matiques 
% (cf. \textsf{mismath}~\cite{MIS} ou \textsf{frenchmath}~\cite{FR}).
%
% \bigskip
% \DescribeMacro{\bblim}\DescribeMacro{\bblim*}
% Sauf sur les bords du tableau ou lorsqu'il y a une zone interdite, 
% les doubles barres sont en g��n��ral accompagn��es �� la fois d'une limite �� gauche
% et d'une limite �� droite. La commande |\bblim| permet alors d'all��ger la syntaxe.
% Elle prend 4 arguments qui sont dans l'ordre \meta{ligne} et \meta{limite}
% �� gauche puis �� droite de la double barre.
% Cette macro trace la double barre, place les limites et cr��e une discontinuit��.
% C'est un alias de 
% |\limg|\marg{ligne}\marg{valeur}|\bb\discont\limd|\marg{ligne}\marg{valeur}.
% La seule diff��rence est que |\bblim| ne poss��de pas d'option de positionnement
% des n��uds comme |\limg| et |\limd|. La forme ��toil��e offre une syntaxe
% encore plus l��g��re lorsque les deux limites sont infinies :
% |\bblim*{-}{+}| correspond �� |\bblim{3}{-\infty}{1}{+\infty}| 
% (lorsqu'il y a 3 lignes de variations).
%
%\[\begin{tablvar}{5}
%    \hline
%    x & -\infty && -2 && 0 && 1 && 2 && +\infty \\
%    \hline
%    \variations{ \mil{\dfrac{\e^{\frac{1}{x}}}{x-2}} & \haut{0} && 
%        \bas{-\frac{1}{4}\e^{-\frac{1}{2}}} && \bblim{1}{0}{3}{-\infty} && 
%        \haut{-\e} && \bblim*{-}{+} && \bas{0} }
%    \hline
%\end{tablvar}\]
% \begin{verbatim}
%\[\begin{tablvar}{5}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\dfrac{\e^{\frac{1}{x}}}{x-2}} & \haut{0} &&
%        \bas{-\frac{1}{4}\e^{-\frac{1}{2}}} && \bblim{1}{0}{3}{-\infty} && 
%        \haut{-\e} && \bblim*{-}{+} && \bas{0} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
% \hypertarget{bordercolsep}{}\hypertarget{limsep}{}
%
% \DescribeMacro{bordercolsep}\DescribeMacro{limsep}
% Le param��tre \texttt{bordercolsep} g��re l'espace �� gauche de la premi��re colonne 
% de valeurs et �� droite de la derni��re (\texttt{2pt} par d��faut), 
% \texttt{limsep} permet d'ajouter de l'espace entre une double barre et une limite 
% (\texttt{1pt} par d��faut). Il est rarement utile de les modifier,
% sauf si on pr��f��re plus de blanc.
% On peut y compris leur donner des valeurs n��gatives si l'on veut s'approcher
% davantage des filets verticaux, par exemple \texttt{limsep=-1.5pt} 
% am��nerait au contact de la double barre).
%\[\begin{tablvar}[bordercolsep=4pt,limsep=3pt]{3}
%    \hline
%    x & -\infty && 0 && 1 && +\infty \\
%    \hline
%    f'(x) & & + & \bb & - & 0 & + & \\
%    \hline
%    \variations{ \mil{x\e^{\frac{1}{x}}} & \bas{-\infty} && 
%        \bblim{1}{0}{1}{+\infty} && \bas{\e} & & \haut{+\infty} }
%    \hline
%\end{tablvar}\]
% \begin{verbatim}
%\[\begin{tablvar}[bordercolsep=4pt,limsep=3pt]{3}
%    \hline
%    x & -\infty && 0 && 1 && +\infty \\
%    \hline
%    f'(x) & & + & \bb & - & 0 & + & \\
%    \hline
%    \variations{ \mil{x\e^{\frac{1}{x}}} & \bas{-\infty} && 
%        \bblim{1}{0}{1}{+\infty} && \bas{\e} & & \haut{+\infty} }
%    \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
% la premi��re et �� droite pour la derni��re.
%
%\[\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \bb\limd*{-} && \haut{-1} && 
%        \bas{-\infty} }
%    \hline
%\end{tablvar*}
%\quad
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb}
%        \bas{-\infty} && \haut{-1} && \bas{-\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\limd*{-} && \haut{-1} && 
%        \bas{-\infty} }
%    \hline
%\end{tablvar*}
%\quad
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb}
%        \bas{-\infty} && \haut{-1} && \bas{-\infty} }
%    \hline
%\end{tablvar*}\]
% \end{verbatim}
%
% \hypertarget{ext}{}
% \DescribeMacro{extleft}\DescribeMacro{extright}
% Dans \texttt{tablvar*}, si, �� une extr��mit�� sans double barre,
% les valeurs ont des largeurs vraiment diff��rentes 
% leur alignement vers le bord peut ��tre in��l��gant.
% L'environnement \texttt{tablvar} poss��de des options qui permettent 
% de choisir un alignement �� gauche ou �� droite de mani��re s��par��e pour
% chaque extr��mit��.
% Il s'agit des options \texttt{extleft} pour aligner la premi��re colonne �� gauche
% et \texttt{extright}
% pour aligner la derni��re colonne �� droite
% (alors que \texttt{tablvar*} impose les deux).  
% Ci-dessous, on n'a utilis�� que l'option \texttt{extleft}
% \footnote{En fait \texttt{extleft} et \texttt{extright} sont des cl��s bool��ennes,
% la valeur \texttt{=true} ��tant facultative.}
% pour ��viter que le 1 ne soit coll�� au bord droit 
% et qu'il garde un bon centrage par rapport �� $+\infty$.
%
% \noindent\begin{minipage}[t]{7.4cm}
% \begin{verbatim}
%\[\begin{tablvar}[extleft]{1}
%    \hline
%    x & 0 && +\infty \\
%    \hline
%    \variations[2]{ \mil{1-\dfrac{1}{x}}
%        & \bb \limd*{-} && \haut{1} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[\begin{tablvar}[extleft]{1}
%    \hline
%    x & 0 && +\infty \\
%    \hline
%    \variations[2]{ \mil{1-\dfrac{1}{x}}
%        & \bb \limd*{-} && \haut{1} }
%    \hline
%\end{tablvar}\]
% \end{minipage}
%
% \subsection{Valeurs remarquables}
%
% Nous appellerons \emph{valeur remarquable}, un valeur particuli��re
% que l'on place dans un tableau de variations et qui sera reli��e par des pointill��s
% �� son ant��c��dent.
% \medskip
%
% \DescribeMacro{\vr}
% Une premi��re approche est placer ces valeurs remarquables par dessus
% les fl��ches de variations.
% Pour relier ces valeurs remarquables �� leurs ant��c��dents par des pointill��s 
% (trac��s r��alis��s dans la commande |\variations|), on place une commande |\vr| 
% sur la ligne des $x$ et une commande |\vr| dans la partie variations.
%
% Voici un exemple o�� la valeur remarquable
% est plac��e dans la colonne intervalle.\\
% \begin{minipage}[t]{7.4cm}
% \begin{verbatim}
%\[\begin{tablvar*}[6em]{1}
%    \hline
%    x & 0 & \vr{1} & +\infty \\
%    \hline
%    \variations{ \mil{\ln x} & 
%        \bb \limd*{-} & \vr{0} &
%        \pos[t]{1}{+\infty} }
%    \hline
%\end{tablvar*}\]
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[\begin{tablvar*}[6em]{1}
%    \hline
%    x & 0 & \vr{1} & +\infty \\
%    \hline
%    \variations{ \mil{\ln x} & 
%        \bb \limd*{-} & \vr{0} & 
%        \pos[t]{1}{+\infty} }
%    \hline
%\end{tablvar*}\]
% \end{minipage}
%
% Un autre exemple avec deux valeurs remarquables, plac��es cette fois 
% dans des colonnes valeurs. Il y a alors 3 colonnes intervalles et
% la partie variations est compos��e sur 4 lignes.
%\[\begin{tablvar}[stretch=1.2,intervalwidth=1em]{3}
%    \hline
%    x & -\infty && \vr{0} && \vr{1} && +\infty \\
%    \hline
%    \variations[4]{ \mil{\exp x} & \bas{0} && 
%        \vr[3]{1} && \vr{\e} && \haut{+\infty} }
%    \hline
%\end{tablvar}\]
% \begin{verbatim}
%\[\begin{tablvar}[stretch=1.2,intervalwidth=1em]{3}
%    \hline
%    x & -\infty && \vr{0} && \vr{1} && +\infty \\
%    \hline
%    \variations[4]{ \mil{\exp x} & \bas{0} && 
%        \vr[3]{1} && \vr{\e} && \haut{+\infty} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% \hypertarget{stretch}{}
% \vspace{-\baselineskip}
% Comme la partie |\variations| est compos��e sur 4 lignes, 
% les lignes sont num��rot��es de 1 (haut) �� 4 (bas).
% La commande |\mil| op��re automatiquement un d��calage vertical appropri��.
%
% \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 (ligne 2 par d��faut).
%
% \DescribeMacro{stretch}
% �� cause des 4 lignes de variations, nous avons utilis�� l'option 
% \texttt{stretch} \label{stretch}
% qui est un facteur d'��lasticit�� verticale, afin de diminuer la hauteur des lignes
% du tableau 
% \footnote{On peut aussi utiliser ce param��tre pour agrandir la hauteur des lignes
% mais l'effet sera global pour tout le tableau. 
% Malheureusement un ajustement automatique des hauteurs, 
% comme propos�� dans l'extension \textsf{cellspace}~\cite{CELLSP} 
% de Josselin Noirel, ne fonctionne pas pour les barres et doubles barres,
% mais, si l'on souhaite agrandir sp��cifiquement une ligne,
% on peut utiliser les commandes \texttt{\bslash cstrut} ou \texttt{\bslash vstrut}
% de l'extension \textsf{spacingtricks} (voir exemples page \pageref{vstrut}).}.
% Sa valeur par d��faut est de \texttt{1.6}, nous l'avons ramen��e dans cet exemple
% �� \texttt{1.2}, la valeur standard des environnements \texttt{array} ��tant de \texttt{1}.
%
% \medskip
% On peut pr��f��rer que les fl��ches de variations ne passent pas �� travers
% les valeurs remarquables (qui doivent alors ��tre aussi des n��uds pour les fl��ches).
% L'exemple qui suit pr��sente un tableau utilisant simultan��ment  
% les deux mani��res de traiter les valeurs remarquables. 
% La taille des fl��ches s'ajuste automatiquement.
% Le second z��ro correspond �� la fois �� un n��ud pour les fl��ches 
% et �� une valeur remarquable (n��ud pour les pointill��s).
%
% \DescribeMacro{\posvr}
% La commande |\vr| est inop��rante
% lorsqu'elle est imbriqu��e avec une commande |\pos| (qui produit les n��uds).
% Nous fournissons pour cet usage la commande |\posvr|\oarg{opt}\marg{ligne}\marg{valeur},
% o�� les 3 param��tres sont exactement les m��mes que ceux de |\pos|
% (le premier ��tant le param��tre optionnel \texttt{c}, \texttt{t}
% ou \texttt{b} pour le positionnement des fl��ches).
%
%\[\begin{tablvar}[extright,intervalwidth=2em]{4}
%    \hline
%    x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \vr{\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})} && \posvr{2}{0} &&
%        \pos[b]{3}{-\infty}\bb }
%    \hline
%\end{tablvar}\]
%
% L'option |[t]| pour le max en ligne 1
% est ici combin��e avec l'option |[b]| en ligne 3 et permet de conserver
% un positionnement correct du 0 sur la fl��che.
%
% Pour placer la derni��re valeur, on aurait pu utiliser |\limg[b]{3}{-\infty}|,
% mais ici |\pos[b]{3}{-\infty}| convient aussi �� cause de l'option \texttt{extright} 
% qui produit un alignement au fer �� droite de la derni��re colonne.
% \begin{verbatim}
%\[\begin{tablvar}[extright,intervalwidth=2em]{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})} && \posvr{2}{0} &&
%        \pos[b]{3}{-\infty}\bb }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% \DescribeMacro{\vrconnect}
% C'est la macro graphique |\vrconnect| qui g��re le trac�� de ces traits pointill��s.
% Elle peut ��tre red��finie pour changer leur aspect 
% (voir le code section \ref{graph}).
%
% On peut aussi placer les z��ros sur les fl��ches, sans pointill��s,
% auquel cas, on n'a pas besoin de |\vr| ou |\posvr|, il suffit
% d'utiliser |\pos*{2}{0}| (ou |\mil{0}|) pour le premier z��ro de l'exemple pr��c��dent
% et |\pos{2}{0}| pour le second.
%
% \medskip
% La commande |\vr| peut ��galement servir �� repr��senter des discontinuit��s 
% particuli��res, comme dans l'exemple suivant 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]{6.7cm}
% \begin{verbatim}
%\[\begin{tablvar}{2}
%    \hline
%    x & -\pi && \vr{0} && \pi \\
%    \hline
%    \variations{\mil{f(x)} & \bas{0} && 
%        \limg{1}{1}\hspace{2pt}\discont
%        \vr[3]{0}\hspace{2pt}\limd{1}{1}
%        && \bas{0} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
% \end{minipage}
% \hfill
% \begin{minipage}[t]{5.5cm}
%\[\begin{tablvar}{2}
%    \hline
%    x & -\pi && \vr{0} && \pi \\
%    \hline
%    \variations{\mil{f(x)} & \bas{0} && 
%        \limg{1}{1}\hspace{2pt}\discont
%        \vr[3]{0}\hspace{2pt}\limd{1}{1}
%        && \bas{0} }
%    \hline
%\end{tablvar}\]
% \end{minipage}
%
% \medskip
% Voici un dernier exemple, avec deux tableaux conjoints.
%
%\[\begin{tablvar}{4}
%    \hline
%    x & 0 && \vr{\frac{\pi}{2}} && \vr{\pi} &&
%        \vr{\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} && \posvr{1}{1} && 
%        \vr{0} && \posvr{3}{-1} && \haut{0} }
%    \hline
%\end{tablvar}\]
% \begin{verbatim}
%\[\begin{tablvar}{4}
%    \hline
%    x & 0 && \vr{\frac{\pi}{2}} && \vr{\pi} &&
%        \vr{\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} && \posvr{1}{1} && 
%        \vr{0} && \posvr{3}{-1} && \haut{0} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% \subsection{Zones interdites}
%
% Nous abordons pour finir le trac�� de zones interdites, c'est-��-dire
% d'intervalles o�� la fonction n'est pas d��finie. 
% On peut dessiner ces zones interdites en hachures ou en couleur.
%
% \medskip
% \DescribeMacro{\ZI}
% Lorsque l'on veut d��finir une zone interdite, on place la commande |\ZI|
% dans les cellules correspondantes. La discontinuit�� des fl��ches est automatique.
%
%\[\begin{tablvar}{3}
%    \hline
%    x & -\infty & & -1 & & 1 & & +\infty \\
%    \hline  
%    f'(x) && \hspace{-0.5em} + & \bb & \ZI & \bb & - & \\
%    \hline
%    \variations{ \pos*{2}{\sqrt{\dfrac{x-1}{x+1}}}
%        & \bas{1} && \limg{1}{+\infty} \bb & \ZI
%        & \bas{0} \barre && \haut{1} }
%    \hline
%\end{tablvar}\]
%
% \begin{verbatim}
%\[\begin{tablvar}{3}
%    \hline
%    x & -\infty & & -1 & & 1 & & +\infty \\
%    \hline  
%    f'(x) && \hspace{-0.5em} + & \bb & \ZI & \bb & - & \\
%    \hline
%    \variations{ \pos*{2}{\sqrt{\dfrac{x-1}{x+1}}}
%        & \bas{1} && \limg{1}{+\infty} \bb & \ZI
%        & \bas{0} \barre && \haut{1} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% \vspace{-\baselineskip}
% Le |\hspace{-0.5em}| devant \texttt{+} a pour effet de d��caler le $+$  affich��
% vers la gauche afin de le recentrer.
% En effet, les macros |\limg| et |\limd| placent les valeurs dans des bo��tes de largeur
% nulle (gr��ce �� la commande |\zbox|, voir section \ref{cmd-pos}). 
% De ce fait, le contenu d'une colonne valeur (qui a une largeur fixe) 
% peut d��border en largeur 
% et empi��ter sur la colonne intervalle contigu��. 
% C'est le cas ici avec le $+\infty$.
%
% Pour la l��gende de la fonction, nous aurions pu utiliser |\mil| �� la place de |\pos*{2}|.
% La diff��rence est que |\mil| affiche son contenu dans une bo��te de hauteur nulle
% et n'agrandit donc pas la ligne correspondante du tableau. Avec |\pos*{2}|,
% la seconde ligne des variations est l��g��rement plus haute. 
% \hypertarget{ZItype}{}
% 
% \medskip
% \DescribeMacro{ZItype}
% Le type de rendu est d��fini par l'option \texttt{ZItype} qui peut prendre
% deux valeurs : \texttt{c}, pour une zone interdite color��e, ou \texttt{h} (par d��faut),
% pour une zone interdite hachur��e.
%
%\[\begin{tablvar}[ZItype=c,intervalwidth=3.5em]{3}
%    \hline
%    x & -\infty && -1 && 1 && +\infty \\
%    \hline
%    -\frac{x}{\strut\sqrt{x^2-1}^3} &&  + & \bb & \ZI & \bb & - & \\
%    \hline
%    \variations{\pos*{2}{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
%        \limg*{+} \bb & \ZI & 
%        \bb \limd*{+} && \bas{0} }
%    \hline
%\end{tablvar}\]
%
% Dans la l��gende de la deuxi��me ligne, le d��nominateur a ��t�� l��g��rement
% agrandi en hauteur, gr��ce �� la commande \LaTeX\ |\strut|, afin d'��viter que
% l'exposant 3 de la racine carr��e n'arrive au contact de la
% barre de fraction (mais ceci n'a rien �� voir en fait avec les tableaux de variations).
% \begin{verbatim}
%\[\begin{tablvar}[ZItype=c,intervalwidth=3.5em]{3}
%    \hline
%    x & -\infty && -1 && 1 && +\infty \\
%    \hline
%    -\frac{x}{\strut\sqrt{x^2-1}^3} &&  + & \bb & \ZI & \bb & - & \\
%    \hline
%    \variations{\pos*{2}{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
%        \limg*{+} \bb & \ZI & 
%        \bb \limd*{+} && \bas{0} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
% \hypertarget{ZIcolor}{} 
%
% \vspace{-\baselineskip}
% \DescribeMacro{ZIcolor}
% Pour une zone interdite color��e, la couleur peut ��tre modifi��e avec l'option 
% \texttt{ZIcolor}. On peut utiliser les noms de couleur pr��d��finis
% ou cr��er son propre nom de couleur,
% par exemple |\definecolor{redblue}{rgb}{0.1,0.3,0.7}|
% \footnote{Le rectangle color�� est affich�� en transparence 
% afin de laisser voir les traits sous-jacents. 
% Il arrive que la compilation \LaTeX\ + dvips + ps2pdf
% n'affiche pas cette transparence, 
% ce qui semble ��tre d�� �� un bug dans certaines versions de Ghostscript.
% Dans ce cas une solution peut ��tre de compiler avec \XeLaTeX\ ou \LuaLaTeX\
% (si \textsf{luapstricks} est install�� sur votre distribution).
% La compilation pdf\LaTeX\ avec l'option \texttt{tikz} ne pose pas ce probl��me.}
%
%\[\begin{tablvar}[ZItype=c,ZIcolor=green,ZIaddwidth=1pt]{3}
%    \hline
%    x & -\infty && -\frac{\sqrt{2}}{2} && \frac{\sqrt{2}}{2} && +\infty \\
%    \hline
%    \frac{2x}{\sqrt{2x^2-1}} \cstrut{2.5ex} && - & \bb & \ZI & \bb & + & \\
%    \hline
%    \variations{ \mil{\sqrt{2x^2-1}} & \haut{+\infty} && \bas{0} \barre
%        & \ZI & \bas{0} \barre && \haut{+\infty} }
%    \hline
%\end{tablvar}\]
% 
% Ici nous avons agrandi sp��cifiquement la seconde ligne, contenant la fraction
% avec radical, gr��ce �� la commande |\cstrut|
% de l'extension \textsf{spacingtricks}~\cite{SPA}.
% Cette commande permet de garantir une \emph{profondeur} et une \emph{hauteur} donn��es,
% sym��triques de part et d'autre de la ligne de centrage math��matique.
% \label{vstrut}\hypertarget{ZIaddwidth}{}
%
% \DescribeMacro{ZIaddwidth}
% L'option \texttt{ZIaddwidth} permet d'ajuster finement la largeur
% des zones interdites. On a ajout�� \texttt{1pt} ce qui donne un rendu un peu meilleur
% lorsque la zone interdite est encadr��e de barres simples et non de double barres.
% \begin{verbatim}
%\[\begin{tablvar}[ZItype=c,ZIcolor=green,ZIaddwidth=1pt]{3}
%    \hline
%    x & -\infty && -\frac{\sqrt{2}}{2} && \frac{\sqrt{2}}{2} && +\infty \\
%    \hline
%    \frac{2x}{\sqrt{2x^2-1}} \cstrut{2.5ex} && - & \bb & \ZI & \bb 
%        & + & \\
%    \hline
%    \variations{ \mil{\sqrt{2x^2-1}} & \haut{+\infty} && \bas{0} \barre
%        & \ZI & \bas{0} \barre && \haut{+\infty} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% lorsque des extrema de grande taille sont plac��s dans la partie \emph{variations}, 
% il est n��cessaire de modifier la hauteur des lignes, 
% pour ��viter de toucher le filet horizontal (au-dessus ou en-dessous)
% \footnote{L'extension \textsf{tabularray}~\cite{TABUL} de Jianrui Lyu permettrait
% ��ventuellement une gestion automatis��e des hauteurs de ligne 
% dans une possible version future.}.
% Cette modification peut se faire 
% avec l'option \texttt{stretch} ou avec |\vstrut|\oarg{depth}\marg{height}
% qu'il faut placer \emph{dans la colonne de l��gendes} pour 
% que |\ZI| prenne en compte sa hauteur.
% Dans l'exemple suivant, \texttt{stretch=2.2} aurait donn�� le m��me r��sultat
% mais une ligne des $x$ plus haute.
%
%\[\begin{tablvar}[4em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{f(x)} \vstrut[2ex]{4.5ex} & \haut{+\infty} && 
%        \limg{3}{-\infty} \bb & \ZI & \bb \limd{3}{-\infty} && 
%        \haut{\dfrac{\e^{-1}}{2}} && \bas{0} }
%    \hline
%\end{tablvar}\]
% \begin{verbatim}
%\[\begin{tablvar}[4em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{f(x)} \vstrut[2ex]{4.5ex} & \haut{+\infty} && 
%        \limg{3}{-\infty} \bb & \ZI & \bb \limd{3}{-\infty} && 
%        \haut{\dfrac{\e^{-1}}{2}} && \bas{0} }
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% On peut cr��er jusqu'�� 4 zones interdites sur des colonnes diff��rentes,
% comme pour les discontinuit��s.
% Voici un tableau contenant deux zones interdites, avec
% \[ f(x)= \sqrt{(x^2-1)(x^2-4)}
% \quad\mbox{et}\quad
% f'(x) = \frac{x(2x^2-5)}{f(x)}.\]
%{ \small
%\[\begin{tablvar}[2.5em]{6}
%    \hline
%    x & -\infty && -2 && -1 && 0 && 1 && 2 && +\infty \\
%    \hline
%    x & &-& \barre & \ZI & \barre &-& \barre[0] &+& \barre & \ZI & \barre &+& \\
%    \hline
%    2x^2-5 & &+& \barre & \ZI & \barre &-& \barre &-& \barre & \ZI &
%        \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & \ZI & \bb &+& \barre[0] &-& \bb & \ZI & \bb &+& \\
%    \hline
%    \variations{ \mil{f(x)} & \haut{+\infty} && \bas{0} \barre
%        & \ZI & \bas{0} \barre && \haut{2} && \bas{0}
%        \barre & \ZI & \bas{0} \barre && \haut{+\infty} }
%    \hline
%\end{tablvar}\]
%}
% \begin{verbatim}
%{ \small \[\begin{tablvar}[2em]{6}
%    \hline
%    x & -\infty && -2 && -1 && 0 && 1 && 2 && +\infty \\
%    \hline
%    x & &-& \barre & \ZI & \barre &-& \barre[0] &+& \barre & \ZI & 
%        \barre &+& \\
%    \hline
%    2x^2-5 & &+& \barre & \ZI & \barre &-& \barre &-& \barre & \ZI &
%        \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & \ZI & \bb &+& \barre[0] &-& \bb & \ZI & \bb &+& \\
%    \hline
%    \variations{ \mil{f(x)} & \haut{+\infty} && \bas{0} \barre
%        & \ZI & \bas{0} \barre && \haut{2} && \bas{0}
%        \barre & \ZI & \bas{0} \barre && \haut{+\infty} }
%    \hline
%\end{tablvar}\] }
% \end{verbatim}
%
% \DescribeMacro{\hachure} 
% Lorsque l'on dessine des zones interdites hachur��es
% sur plusieurs colonnes contigu��s, 
% les hachures ne seront en g��n��ral pas jointives. 
% Pour pallier cela, on peut
% utiliser la primitive graphique |\hachure| 
% qui permet de d��finir manuellement le rectangle �� hachurer.
% L'exemple suivant montre les deux solutions.
%
%{ \footnotesize
%\[ \begin{tablvar}[intervalwidth=1.8em,ZIaddwidth=1pt]{8}
%    \hline
%    x & -\infty && -2 && -\sqrt{\frac{5}{2}} && -1
%        && 0 && 1 && \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 & \ZI & \barre & \ZI & \bb &+& 
%        \barre[0] &-& \bb & & & & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0}\barre & \ZI & 
%        \barre & \ZI & \bas{0}\barre && \haut{2} && \bas{0}\barre \discont
%        && \pos*{3}{\hachure{-4.3em,16.4ex}{4.3em,-1.4ex}} && 
%        \bas{0}\barre && \haut{+\infty} }
%    \hline
%\end{tablvar} \] }
%
% La commande |\hachure| peut ��tre plac��e o�� l'on veut
% dans le tableau, il suffit de donner les coordonn��es du rectangle vis�� ��
% partir de la position courante (r��glage manuel).
% Dans la partie variations, il faut mettre la commande |\hachure| dans un |\pos*|, 
% sinon elle sera r��p��t��e pour chaque ligne des variations.
% Ce probl��me de discontinuit�� des lignes ne se pose pas avec des zones interdites color��es.
% \begin{verbatim}
%{ \footnotesize
%\[ \begin{tablvar}[intervalwidth=1.8em,ZIaddwidth=1pt]{8}
%    \hline
%    x & -\infty && -2 && -\sqrt{\frac{5}{2}} && -1
%        && 0 && 1 && \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 & \ZI & \barre & \ZI & \bb &+& 
%        \barre[0] &-& \bb & & & & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0}\barre & \ZI & 
%        \barre & \ZI & \bas{0}\barre && \haut{2} && \bas{0}\barre \discont
%        && \pos*{3}{\hachure{-4.3em,16.4ex}{4.3em,-1.4ex}} && 
%        \bas{0}\barre && \haut{+\infty} }
%    \hline
%\end{tablvar} \] }
% \end{verbatim}
%
% \medskip
% \DescribeMacro{\ZI*}
% Dans un tableau de signes sans partie variations, 
% il faut utiliser la commande |\ZI*| pour d��clencher le trac�� des hachures
% (ou de la zone color��e)
% \footnote{La commande \texttt{\bslash ZI} ne d��clenche le trac�� que sur 
% la derni��re ligne des variations et pas dans les lignes de signes ;
% les occurrences de \texttt{\bslash ZI} qui pr��c��dent ne font que cumuler la hauteur.}.
% Celle-ci doit ��tre plac��e sur la derni��re ligne de chaque bloc de hachures
% \footnote{Un appel �� \texttt{\bslash ZI*} dans chaque cellule ne permettrait pas
% de garantir la continuit�� des hachures.}.
%
%\[\begin{tablvar}{4} 
%    \hline 
%    x & -\infty && -1 && 1 && 2 && +\infty \\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZI & \barre[0] & + & \barre & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}\]
% \begin{verbatim}
%\[\begin{tablvar}{4} 
%    \hline 
%    x & -\infty && -1 && 1 && 2 && +\infty \\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZI & \barre[0] & + & \barre & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% Pour tracer des rectangles de hachures ou des zones color��es
% sur des lignes non contigu��s, dans un tableau de signes,
% il faut un appel �� |\ZI*| pour d��clencher le trac�� de chaque rectangle.
%
%\[\begin{tablvar}{4} 
%    \hline 
%    x & -\infty && -1 && 1 && 
%        2 && +\infty \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZI* & \barre[0] & + & \barre & + & \\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}\]
%
% \begin{verbatim}
%\[\begin{tablvar}{4} 
%    \hline 
%    x & -\infty && -1 && 1 && 2 && +\infty \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZI* & \barre[0] & + & \barre & + & \\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}\]
% \end{verbatim}
%
% \subsection{Options et r��glages}\label{options}
%
% Comme indiqu�� dans l'introduction, l'extension \textsf{tablvar} poss��de deux options,
% \texttt{pstricks} ou \texttt{tikz}, pour choisir la m��thode graphique
% utilis��e. Ce sont les seules options reconnues �� l'appel |\usepackage|.
%
% \medskip
% \DescribeMacro{\tablvarset\marg{keyval}}
% Mais les environnements \texttt{tablvar} et \texttt{tablvar*} poss��dent ��galement 
% un jeu de param��tres qui peuvent ��tre d��finis de mani��re globale,
% ou locale dans un environnement (ou un groupe |{...}|),
% soit en utilisant des variables sp��cifiques, 
% soit (depuis la version 2.0) avec la commande |\tablvarset|\marg{keyval}, 
% bas��e sur le m��canisme \emph{cl��=valeur}.
%
% \DescribeEnv{tablvar\oarg{keyval}}\DescribeEnv{tablvar*\oarg{keyval}}
% Ces param��tres peuvent aussi ��tre r��gl��s localement,
% ind��pendamment des valeurs globales, 
% en tant qu'options d'un environnement 
% \texttt{tablvar}\oarg{keyval}\marg{num}
% (ou \texttt{tablvar*}), avec la m��me syntaxe \emph{cl��=valeur}.
%
% \medskip
% Le tableau suivant r��sume les options disponibles, pr��cise leur valeur par d��faut
% et les variables de r��glage sp��cifiques (longueurs, bool��ens, etc.)  
% auxquelles elles sont associ��es et qui peuvent aussi ��tre modifi��es directement.
% Les liens hypertextes (en bleu) renvoient vers un exemple dans la documentation.
%
% \begin{center}\ttfamily
% \setlength{\extrarowheight}{1pt}
% \begin{tabular}{lcl}
%    \hline
%    \textsf{Option} & \textsf{Valeur par d��faut} & 
%    \textsf{Variable associ��e} \\
%    \hline
%    \hyperlink{intervalwidth}{intervalwidth} & 3em & |\intervalwidth| \\
%    \hyperlink{colvalwidth}{colvalwidth} & 2em & |\colvalwidth| \\
%    \hyperlink{firstcolsep}{firstcolsep} & 5pt & |\firstcolsep| \\
%    \hyperlink{bordercolsep}{bordercolsep} & 2pt & |\bordercolsep| \\
%    \hyperlink{limsep}{limsep} & 1pt & |\limsep| \\
%    \chline
%    \hyperlink{stretch}{stretch} & 1.6 & |\tablvarstretch| \\
%    \chline
%    \hyperlink{ext}{extleft} & false & extleft \\
%    \hyperlink{ext}{extright} & false & extright \\
%    \chline
%    \hyperlink{ZItype}{ZItype} & h & |\ZItype| \\
%    \hyperlink{ZIcolor}{ZIcolor} & gray & ZIcolor \\
%    \hyperlink{ZIaddwidth}{ZIaddwidth} & 0pt & |\ZIaddwidth| \\
%    \hline
% \end{tabular}
% \end{center}
% Le premier groupe de param��tres ci-dessus g��re les largeurs de colonnes 
% et les espacements horizontaux :
% \begin{description}
% \item[\texttt{intervalwidth}] r��gle la largeur des colonnes \og intervalles\fg.
% \item[\texttt{colvalwidth}] d��finit la largeur des colonnes de valeurs ;
% il est rarement utile de modifier ce param��tre car lorsqu'une valeur est trop
% large, elle peut d��border dans les colonnes intervalles adjacentes ;
% la valeur par d��faut est l��g��rement plus grande qu'un infini avec un signe.
% \item[firstcolsep] d��finit l'espace de s��paration par rapport aux filets verticaux
% autour de la premi��re colonne (l��gendes).
% \item[bordercolsep] d��finit l'espace de s��paration �� gauche de la premi��re
% et �� droite de la derni��re colonne de valeurs, par rapport aux filets verticaux.
% \item[limsep] r��gle l'espace de s��paration �� gauche ou �� droite d'une limite.
% \end{description}
% La hauteur des lignes se r��gle avec :
% \begin{description}
% \item[stretch] qui est un facteur d'��lasticit�� verticale agissant sur toutes
% les lignes du tableau
% \footnote{Pour augmenter la hauteur d'une ligne particuli��re, on pourra utiliser la 
% commande \texttt{\textbackslash vstrut}\oarg{depth}\marg{height} 
% (du package \textsf{spacingtricks}~\cite{SPA}),
% o�� \meta{depth} d��signe la \emph{profondeur} et \meta{height} la \emph{hauteur}
% minimales �� atteindre par rapport �� la ligne de \emph{base},
% ou encore \texttt{\bslash cstrut}\marg{height} qui garantit une hauteur minimale
% en-dessous et au-dessus de la ligne de centrage math��matique.} ; 
% une valeur de 1 correspond �� la valeur standard 
% d'un environnement \texttt{array}.
% \end{description}
% Les deux param��tres suivants r��glent l'alignement des valeurs dans les colonnes
% aux extr��mit��s du tableau :
% \begin{description}
% \item[extleft] aligne les valeurs �� gauche dans la premi��re colonne ; 
% l'effet est ad��quat lorsqu'il y a une double barre �� l'extr��mit�� gauche.
% \item[extright] aligne les valeurs �� droite dans la derni��re colonne,
% ad��quat pour une double barre �� l'extr��mit�� droite ;
% l'environnement \texttt{tablvar*} fixe \texttt{extleft}
% et \texttt{extright} �� \texttt{true}.
% \end{description}
% Enfin le dernier groupe de param��tres g��re l'aspect des zones interdites :
% \begin{description}
% \item[ZYtype] peut prendre deux valeurs : \texttt{h} pour une zone interdite hachur��e
% ou \texttt{c} pour une zone interdite color��e.
% \item[ZIcolor] d��finit la couleur des zones interdites color��es qui doit ��tre
% un nom de couleur d��j�� d��finie ; ce param��tre
% est sans effet si \texttt{ZItype=h}.
% \item[ZIaddwidth] permet de jouer sur un r��glage fin de la largeur des zones interdites ;
% la mani��re dont les zones interdites arrivent au contact des barres ou double barres
% peut s'ajuster en faisant varier cette valeur (de $\pm$\texttt{1pt}).
% \end{description}
%
% \medskip
% \DescribeEnv{\texttt{tablvar}\oarg{largeur}}
% L'argument optionnel des 
% environnements \texttt{tablvar} et \texttt{tablvar*} peut ��galement ��tre
% une simple dimension (�� condition qu'il n'y ait aucune autre option),
% qui sera alors interpr��t��e
% comme la largeur donn��e �� \texttt{intervalwidth}.
%
% \medskip
% Le rendu des commandes graphiques peut ��galement ��tre modifi��,
% en red��finissant ces commandes, en particulier |\fleche|, |\vrconnect| et |\hachure|
% gr��ce aux nombreuses options offertes par PSTricks ou \TikZ.
% C'est le cas aussi de l'aspect des filets et barres du tableau qui sont d��finis
% par les commandes |\tvrulewidth| (\texttt{0.4pt} par d��faut), 
% |\tvbarrewidth| (\texttt{0.5pt} par d��faut),
% \texttt{tvbarrecolor} (|{gray}{0.7}| par d��faut)
% et |\bbrulewidth| (\texttt{0.4pt} par d��faut). 
% Cette red��finition sera locale si on la place dans l'environnement math du tableau.
%
% Ci-dessous des fl��ches plus grasses, plus proches des n��uds et dont la pointe est
% plus effil��e, cod�� ici pour PSTricks 
% (voir le code section \ref{graph} pour les commandes \TikZ).
% L'��paisseur des filets du tableau et des barres a ��t�� doubl��e, la 
% couleur de la barre traversant 0 a ��t�� modifi��e
% et les infinis ont ��t�� \og coll��s\fg aux bords avec \texttt{bordercolsep=-1pt}.
% \[ \renewcommand{\fleche}{\ncline[linewidth=0.8pt,arrowsize=2pt 3,
%        arrowinset=0.5,nodesep=2pt]{->}}
% \setlength{\tvrulewidth}{0.8pt}
% \setlength{\bbrulewidth}{0.8pt}
% \setlength{\tvbarrewidth}{1pt}
% \definecolor{tvbarrecolor}{named}{cyan}
%\begin{tablvar}[intervalwidth=4em,bordercolsep=-1pt]{3}
%    \hline
%    x & -\infty && -2 && 0 && +\infty \\
%    \hline
%    -\frac{x+2}{x^4} && - & \barre[0] & +  & \bb & - & \\
%    \hline
%    \variations{\mil{\e^{\frac{x+1}{\vstrut{1.2ex} x^2}}} & \haut{1} &&
%        \bas{\e^{-\frac{1}{4}}} && \bblim*{+}{+} && \bas{1} }
%    \hline
%\end{tablvar} \]
% \begin{verbatim}
%\[ \renewcommand{\fleche}{\ncline[linewidth=0.8pt,arrowsize=2pt 3,
%       arrowinset=0.5,nodesep=1.5pt]{->}}
%\setlength{\tvrulewidth}{0.8pt}
%\setlength{\bbrulewidth}{0.8pt}
%\setlength{\tvbarrewidth}{1pt}
%\definecolor{tvbarrecolor}{named}{cyan}
%\begin{tablvar}[intervalwidth=4em,bordercolsep=-1pt]{3}
%    \hline
%    x & -\infty && -2 && 0 && +\infty \\
%    \hline
%    -\frac{x+2}{x^4} && - & \barre[0] & +  & \bb & - & \\
%    \hline
%    \variations{\mil{\e^{\frac{x+1}{\vstrut{1.2ex} x^2}}} & \haut{1} && 
%        \bas{\e^{-\frac{1}{4}}} && \bblim*{+}{+} && \bas{1} }
%    \hline
%\end{tablvar} \]
% \end{verbatim}
%
% Enfin deux autres param��tres de type longueur |\rowtopsep| et |\rowbottomsep|
% garantissent un espace minimum (de \texttt{2pt} par d��faut) 
% entre les filets horizontaux et le contenu des cellules, pour la colonne des l��gendes.
% 
% \subsection{Nouveaut��s depuis la version 2.0}
%
% La version 2.0 pr��sente de nombreuses nouveaut��s :
% \begin{itemize}
% \item \emph{Il n'y a plus d'option par d��faut} �� l'appel de l'extension.
% C'��tait \texttt{pstricks} dans les versions pr��c��dentes.
% Dor��navant, si aucune option n'est pr��cis��e, l'extension choisira elle-m��me
% en fonction du compilateur utilis��, donc \texttt{tikz} pour pdf\LaTeX\
% qui ne supporte pas le code PSTricks.
%
% \item \emph{Les colonnes de valeurs ont des largeurs fixes} (\texttt{2em} \emph{par d��faut)}
% et non plus variables en fonction du contenu, comme c'��tait le cas jusqu'�� la version
% 1.2. L'avantage est d'am��liorer le centrage pour les signes,
% lorsque les colonnes de valeurs ont des largeurs tr��s diff��rentes,
% et surtout d'��viter le recours �� des |\zbox| pour les colonnes de valeurs
% bordant les zones interdites.
%
% \item Le param��tre |\innercolsep| qui g��re l'espacement entre les colonnes valeurs 
% et les colonnes intervalles, valait \texttt{4pt}
% et a ��t�� fix�� �� \texttt{0pt} car, en l'absence de filets verticaux,
% il ne sert plus �� rien avec les colonnes �� largeur fixe.
% Mais, en contrepartie, \emph{la valeur par d��faut de} |\intervalwidth| 
% \emph{a ��t�� augment��e de} \texttt{2.5em} \emph{��} \texttt{3em}.
%
% \item Les r��glages peuvent d��sormais ��tre effectu��s, 
% avec la syntaxe \emph{cl�� = valeur} et la commande |\tablvarset|, 
% ou comme options des environnements \texttt{tablvar} et \texttt{tablvar*}. 
%
% \item Un nouveau param��tre |\firstcolsep| (ou l'option \texttt{firstcolsep})
% permet d'��largir la colonne des l��gendes.
%
% \item Deux options permettent d'aligner de mani��re diff��renci��e
% la premi��re colonne de valeurs �� gauche (\texttt{extleft}) 
% \emph{ou} la derni��re �� droite (\texttt{extright}) contrairement 
% �� l'environnement \texttt{tablvar*} qui fait obligatoirement les deux.
%
% \item Le param��tre |\tablvarstetch| (g��r�� par l'option \texttt{stretch})
% a ��t�� augment�� de \texttt{1.4} �� \texttt{1.6}.
%
% \item Une nouvelle macro |\posvr| permet de d��finir conjointement 
% un n��ud pour les fl��ches \emph{et} pour les valeurs remarquables.
%
% \item Deux nouvelles macros |\limg| et |\limd| g��rent d��sormais le bon positionnement
% des limites �� gauche et �� droite, en particulier au bord des doubles barres 
% (en plus de |\bblim|) et surtout au bord des zones interdites.
% Le recours explicite �� |\zbox| n'est plus n��cessaire.
%
% \item Un nouveau param��tre |\limsep| permet d'ajuster la proximit�� des
% limites avec les doubles barres.
%
% \item Les zones interdites sont, �� pr��sent, d��finies par une unique commande |\ZI|,
% avec une option \texttt{ZItype}. Les anciennes commandes |\ZIh|, pour les zones
% interdites hachur��es, ou |\ZIc|, pour les zones interdites color��es, ne sont plus utiles,
% mais elles ont ��t�� conserv��es et permettraient, par exemple, de dessiner
% dans un m��me tableau une zone interdite hachur��e et une autre color��e,
% m��me si cela ne viendrait �� l'esprit de personne.
%
% \item Il n'y a, en principe, plus besoin d'ajustement de hauteur des zones interdites
% avec un param��tre optionnel |\ZI|\oarg{height}, lorsque des contenus de grande hauteur
% sont plac��s dans la colonne des l��gendes. 
% N��anmoins ce param��tre a (pour l'instant) ��t�� conserv��,
% pour faire ��ventuellement de micro-ajustements.
%
% \item On peut d��sormais r��gler l'��paisseur des filets verticaux et double barres
% avec |\tvrulewidth| et |\bbrulewidth|.
%
% \item Le type de colonne \texttt{i}, utilis�� pour les colonnes intervalles,
% est maintenant interne �� l'environnement \texttt{tablvar} 
% et il n'y a donc plus de risque d'incompatibilit�� avec une autre extension
% qui utiliserait ce m��me identifiant comme type de colonne.
% De nouveaux types de colonnes ont ��t�� d��finis pour les valeurs et l��gendes,
% mais sont ��galement internes �� l'environnement \texttt{tablvar}.
%
% \item Les macros |\bas| et |\mil| peuvent �� pr��sent ��tre utilis��es
% m��me lorsque le nombre de lignes de variations est diff��rent de 3.
% Dans ce cas, commande |\mil| calcule automatiquement le d��calage vertical ;
% l'utilisateur n'a plus besoin d'un appel explicite �� |\vdecal|.
% \end{itemize}
%
% Dans la version 2.1 :
% \begin{itemize}
% \item Ont ��t�� ajout��s deux nouveaux param��tres |\rowtopsep| et |\rowbottomsep| 
% pour garantir un espace minimum (de \texttt{2pt} par d��faut)
% entre les filets horizontaux et le contenu pour la colonne des l��gendes.
% \item 
% Il est d��sormais possible d'utiliser l'option \texttt{pstricks} avec \LuaLaTeX, 
% si \textsf{luapstricks} est install�� sur votre distribution.
% \item Le calcul du d��calage vertical de la commande |\mil| a ��t�� am��lior��,
% dans le cas d'un nombre pair de lignes de variations.
% \item Les nouvelles commandes ��toil��es |\limg*|, |\limd*| et |\bblim*|
% permettent une ��criture simplifi��e de |\limg|, |\limd| et |\bblim|,
% pour des limites $\infty$.
% \end{itemize}
% \medskip
% Des probl��mes de composition peuvent appara��tre avec des tableaux
% r��alis��s ant��rieurement �� la version 2.0, en particulier
% pour les limites au bord des doubles barres, 
% lorsque l'on n'utilise ni |\bblim|, ni \texttt{tablvar*}.
% S'il appara��t une limite positionn��e par dessus une double barre,
% il suffit de remplacer les |\zbox| utilis��es ant��rieurement par |\limg| ou |\limd|.
% D'autre part, les ajouts de hauteur qui peuvent avoir ��t�� utilis��s comme argument 
% optionnel de |\ZIh| ou |\ZIh*| sont �� ��liminer.
%
% \subsection{Comparatif avec les autres extensions}\label{comparatif}
%
% Le d��p��t d'archives CTAN (Comprehensive \TeX\ Archive Network) contient
% quelques autres extensions d��di��es �� la r��alisation de tableaux de variations,
% dans la rubrique \og Maths tabvar \fg.
% Nous les d��crivons ici bri��vement.
% \begin{description}
% \item[tableaux] de Nicolas Kisselhoff~\cite{TABL}. 
% Propose un pseudo-code PSTricks, 
% certainement plus commode que d'��crire toutes les commandes PSTricks.
% Attention l'extension doit ��tre appel��e avec |\usepackage{tableau}|, sans \texttt{x}.
% Voici un exemple repris de la doc de \textsf{tableaux} avec le code en suivant.
%\newpsstyle{hachured}{fillstyle=hlines,hatchwidth=0.2pt,hatchsep=2pt}
%\setlength{\TabTitreL}{1cm}
%
%\begin{MonTableau}{1}{9}{1.5}
%\psframe[style=hachured,linestyle=none](.3,1)(.45,0)
% 
%\TabNewCol{0}
%\rTabPut{Br}{-.15}{.25}{$x$}
%\rTabPut{Br}{-.15}{.40}{$f(x)$}
% 
%\TabNewCol{0}
%\rTabPut{Bl}{.15}{.25}{$0$}
%\rTabPut{Bl}{.15}{.60}{$\frac{3}{2}$}
% 
%\TabNewCol{.30}
%\rTabPut{B}{0}{.25}{$1$}
%\rTabPut{Br}{-.15}{.80}{$+\infty$}
%\psline[style=TabDblBarre](.3,0)(.3,1)
% 
%\TabNewCol{.45}
%\rTabPut{B}{0}{.25}{$\frac{3}{2}$}
%\rTabPut[2]{B}{0}{.10}{\TabZ}
% 
%\TabNewCol{1}
%\rTabPut{Br}{-.15}{.25}{$+\infty$}
%\rTabPut{Br}{-.15}{.40}{$1$}
% 
%\TabFleche{B1}{C1}
%\TabFleche{D1}{E1}
%\end{MonTableau}
%
% \begin{verbatim}
%\newpsstyle{hachured}{fillstyle=hlines,hatchwidth=0.2pt,hatchsep=2pt}
%\setlength{\TabTitreL}{1cm}
%
%\begin{MonTableau}{1}{9}{1.5}
%\psframe[style=hachured,linestyle=none](.3,1)(.45,0)
%
%\TabNewCol{0}
%\rTabPut{Br}{-.15}{.25}{$x$}
%\rTabPut{Br}{-.15}{.40}{$f(x)$}
%
%\TabNewCol{0}
%\rTabPut{Bl}{.15}{.25}{$0$}
%\rTabPut{Bl}{.15}{.60}{$\frac{3}{2}$}
%
%\TabNewCol{.30}
%\rTabPut{B}{0}{.25}{$1$}
%\rTabPut{Br}{-.15}{.80}{$+\infty$}
%\psline[style=TabDblBarre](.3,0)(.3,1)
%
%\TabNewCol{.45}
%\rTabPut{B}{0}{.25}{$\frac{3}{2}$}
%\rTabPut[2]{B}{0}{.10}{\TabZ}
%
%\TabNewCol{1}
%\rTabPut{Br}{-.15}{.25}{$+\infty$}
%\rTabPut{Br}{-.15}{.40}{$1$}
%
%\TabFleche{B1}{C1}
%\TabFleche{D1}{E1}
%\end{MonTableau}
% \end{verbatim}
%
% \item[tabvar] de Daniel Flipo~\cite{TABV},
% l'auteur, entre-autres de \textsf{babel-french},
% extension bien connue de tous les utilisateurs francophones de \LaTeX.
% Permet de r��aliser des tableaux plut��t symboliques.
% Voici un tableau simple et son code \textsf{tabvar}. \\
% \begin{minipage}[t]{7.5cm}
% \begin{verbatim}
%\[\begin{tabvar}{|C|CCCCR|}
%    \hline
%    x & 0 & & \frac{1}{2} & & 1 \\ 
%    \hline
%    f���(x) && + & \barre{0} & - & \\ 
%    \hline
%    \niveau{1}{2}\TVcenter{f(x)} & 0 & \croit
%        & \frac{1}{4} & \decroit & 0 \\ 
%    \hline
%\end{tabvar}\]
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{4.2cm}
%\[\begin{tabvar}{|C|CCCCR|}
%    \hline
%    x & 0 & & \frac{1}{2} & & 1 \\ 
%    \hline
%    f'(x) && + & \barreFlipo{0} & - & \\ 
%    \hline
%    \niveau{1}{2}\TVcenter{f(x)} & 0 & \croit
%        & \frac{1}{4} & \decroit & 0 \\ 
%    \hline
%\end{tabvar}\]
% \end{minipage}
%
% \item[variations] de Christian Obrecht~\cite{VARI}. Extension vraiment simple d'usage, 
% qui a l'avantage d'avoir une documentation tr��s courte.
% Voici un exemple repris de la doc de \textsf{variations}
% (|\mI| et |\pI| d��signent $-\infty$ et $+\infty$).
%\[\bvariations
%    x & \mI &&& 0 &&& \pI \\
%    \filet
%    -\frac{1}{x^2} && - && \bbObrecht && - & \\
%    \filet
%    \m{\dfrac{1}{x}} & \h0 & \d & \mI & \bbObrecht & \h\pI & \d & 0 \\
%\evariations\]
% \begin{verbatim}
%\[\begin{variations}
%    x & \mI &&& 0 &&& \pI \\
%    \filet
%    -\frac{1}{x^2} && - && \bb && - & \\
%    \m{\dfrac{1}{x}} & \h{0} & \d & \mI & \bb & \h{\pI} & \d & 0 \\
%\end{variations}\]
% \end{verbatim}
% \item[tablor] de Guillaume Connan~\cite{TABLOR}.
% Permet d'automatiser de mani��re pouss��e la composition \emph{et la conception} du tableau 
% gr��ce �� la librairie de calcul formel \textsf{Giac/Xcas} (qui doit ��tre install��e).
% Il suffit de renseigner l'expression de la fonction, l'intervalle souhait��, 
% les ��ventuelles valeurs interdites. Voici par exemple le code
% pour le tableau de la fonction $g: t \mapsto \frac{t^2}{t^2-1}$ sur $[-10, +\infty[$,
% avec variations et signe de la d��riv��e, tr��s synth��tique !
% \begin{verbatim}
%\begin{TV}
%TV([-10,+infinity],[-1,1],"g","t",x^2/(x^2-1),1,n,\tv)
%\end{TV}
% \end{verbatim}
% \vspace{-\baselineskip}
% On peut aussi d��finir un tableau avec simplement deux listes, les ant��c��dents
% et les images, et \textsf{tablor} prend en charge les zones interdites 
% (mais pas la continuit�� des hachures de cellules contigu��s).
% On pourra consulter la documentation pour de jolis exemples.
%
% Pour fonctionner, \textsf{tablor} utilise \textsf{tableauVariations.mp} 
% de Fr��d��ric Mazoit~\cite{VARMP} qui compose le tableau en \textlogo{METAPOST}.
% \textsf{Xcas} oblige �� compiler en mode \texttt{shell-escape} 
% pour autoriser les sorties de la compilation \TeX.
%
% \item[tkz-tab] d'Alain Matthes~\cite{TKZ}.
% Une tr��s belle extension qui fait a peu pr��s tout ce que fait \textsf{tablvar} 
% et m��me un peu plus : par exemple tangentes horizontales sur les extrema, 
% cellules en couleur.
% Un de ses principaux b��n��fices par rapport �� \textsf{tablvar} est de ne pas n��cessiter
% de double compilation
% \footnote{La double compilation avec \textsf{tablvar} n'est cependant n��cessaire 
% qu'avec l'option \texttt{tikz}.}.
% Signalons quand m��me quelques avantages de \textsf{tablvar} :
% \begin{itemize}
% \item avec \textsf{tkz-tab}, un tableau n'est pas globalement en mode math��matique, 
% il faut donc mettre les |$| du mode math autour de chaque valeur,
% \item et les hauteurs de ligne doivent ��tre pr��cis��es de mani��re explicite et
% uniquement cm (unit�� fixe qui ne s'ajuste pas �� la fonte),
% \item \textsf{tablvar} offre la possibilit�� de mettre des valeurs par dessus les fl��ches,
% \item dans \textsf{tkz-tab}, les double barres aux extr��mit��s du tableau 
% sont assez ��loign��es des filets, ce qui laisse un blanc important sur les bords.
% \end{itemize}
% Voici un exemple illustrant ce dernier point, avec son code. 
% Pour comparer, le tableau obtenu avec \textsf{tablvar}
% a ��t�� plac�� dessous avec son code en suivant.
% \begin{verbatim}
%\begin{center}\begin{tikzpicture}
%    \tkzTabInit[lgt=1.5,espcl=1.8,deltacl=0.4]%
%        {$x$/0.75, $\ln x - x$/2.2}{0, 1, $+\infty$}
%    \tkzTabVar{D-/$-\infty$ , +/$-1$  , -/$-\infty$}
%\end{tikzpicture}\end{center}
% \end{verbatim}
%
%\begin{center}\begin{tikzpicture}
%    \tkzTabInit[lgt=1.5,espcl=1.8,deltacl=0.4]%
%        {$x$/0.75, $\ln x - x$/2.2}{0, 1, $+\infty$}
%    \tkzTabVar{D-/$-\infty$ , +/$-1$  , -/$-\infty$}
%\end{tikzpicture}\end{center}
%\[\begin{tablvar*}{2}
%    \hline
%    x & 0 & & 1 & & +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \bb\bas{-\infty} && \haut{-1} && \bas{-\infty} }
%    \hline
%\end{tablvar*}\]
% \begin{verbatim}
%\[\begin{tablvar*}{2}
%    \hline
%    x & 0 & & 1 & & +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \bb\bas{-\infty} && \haut{-1} && 
%        \bas{-\infty} }
%    \hline
%\end{tablvar*}\]
% \end{verbatim}
%
% \vspace{-\baselineskip}
% On remarquera que les r��glages \textsf{tablvar} sont automatiques et ne n��cessitent
% aucune option (si ce n'est l'appel �� la version ��toil��e \texttt{tablvar*}).
% \end{description}
%
% \StopEventually{}
%
% \section{Le code}
%
% \subsection{Extensions requises et options du package}
%
%    \begin{macrocode}
\RequirePackage{array}
\RequirePackage{ifthen}
\RequirePackage{multido}
\RequirePackage{xkeyval}
\RequirePackage{iftex}

\newif\iftv@tikz % false par d��faut
\DeclareOption{tikz}{\tv@tikztrue}
\newif\iftv@pstricks
\DeclareOption{pstricks}{\tv@pstrickstrue}
\ProcessOptions \relax

\iftv@pstricks
    \ifpdf
        \ifluatex
            \PackageInfo{tablvar}{Option 'pstricks' works 
                with luapstricks}
        \else
            \PackageError{tablvar}{Don't use the 'pstricks' option with
                PDF output mode}{Use 'tikz' option or change the engine}
        \fi
    \else
        \PackageInfo{tablvar}{Option 'pstricks' is used}
    \fi
\else\iftv@tikz
    \AtEndDocument{\PackageWarningNoLine{tablvar}{Option 'tikz' is used.
        \MessageBreak
        Maybe rerun to draw the arrows correctly}
    }
\else\ifpdf
    \AtEndDocument{\PackageWarningNoLine{tablvar}{Output is in PDF mode, 
        I'm using the 'tikz' option.
        \MessageBreak
        Maybe rerun to draw the arrows correctly}
    }
    \tv@tikztrue
\else
    \PackageWarningNoLine{tablvar}{Output is in DVI mode,
        I'm using the 'pstricks' option}
    \tv@pstrickstrue
\fi\fi\fi
    
\iftv@tikz
    \RequirePackage{tikz}
    \usetikzlibrary{patterns}
    \usetikzlibrary{patterns.meta}% pour le param��trage des hachures
\else % pstricks=true
    \RequirePackage{pst-node}
\fi
%    \end{macrocode}

% \subsection{Les param��tres g��n��raux}\label{param}
%
% Dans cette section sont pr��sent��s tous les param��tres
% que l'on peut red��finir pour modifier l'aspect des tableaux.
%
% \begin{macro}{\intervalwidth}
% D��finit la largeur par d��faut des colonnes \og intervalles \fg,
% valeur pr��d��finie �� \texttt{3em}.
%    \begin{macrocode}
\newlength{\intervalwidth}
\setlength{\intervalwidth}{3em} % largeur des "intervalles"
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\colvalwidth}
% D��finit la largeur des colonnes de valeurs,
% valeur pr��d��finie �� \texttt{2em}. 
%    \begin{macrocode}
\newlength{\colvalwidth}
\setlength{\colvalwidth}{2em} % largeur des colonnes de valeurs
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\firstcolsep}
% D��finit l'espace de s��paration autour de la premi��re colonne (l��gendes),
% valeur pr��d��finie �� \texttt{5pt}, qui est la valeur par d��faut dans les tableaux \LaTeX.
%    \begin{macrocode}
\newlength{\firstcolsep}
\setlength{\firstcolsep}{5pt} % valeur LaTeX par d��faut
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bordercolsep}
% D��finit l'espace de s��paration aux extr��mit��s du tableau, pour les premi��re
% et derni��re colonnes de valeurs, pr��d��finie �� \texttt{2pt}. 
% 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 filets verticaux bordant le tableau.
%    \begin{macrocode}
\newlength{\bordercolsep}
\setlength{\bordercolsep}{2pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\limsep}
% R��gle l'espace avant une limite �� droite et apr��s une limite �� gauche, 
% utilis�� dans les macros |\limg|, |\limd| et |\bblim|. 
% La macro |\bb| composant la double barre comprend
% d��j�� \texttt{1.5pt} d'espace autour des traits verticaux. 
% La macro |\limsep| ajoute \texttt{1pt} par d��faut. 
% Si on r��gle ce param��tre �� \texttt{-1.5pt}, on ��limine l'espace
% cr���� par |\bb| et on arrive au contact du filet de la double barre.
%    \begin{macrocode}
\newlength{\limsep}
\setlength{\limsep}{1pt}
%    \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 \texttt{1.6} (1 correspondant 
% �� la valeur standard d'un environnement |array|).
%    \begin{macrocode}
\newcommand{\tablvarstretch}{1.6}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZItype}
% D��finit le type de zone interdite, \texttt{h} pour \og hachur��e \fg ou 
% \texttt{c} pour \og color��e \fg (\texttt{h} par d��faut).
%    \begin{macrocode}
\newcommand{\ZItype}{h}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{ZIcolor}
% D��finit la couleur des zones interdites, \og color��es \fg (gris par d��faut).
%    \begin{macrocode}
\definecolor{ZIcolor}{named}{gray}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIaddwidth}
% D��finit une largeur suppl��mentaire (positive ou n��gative)
% �� ajouter �� la largeur des zones interdites, par exemple \texttt{1pt}
% pour arriver au contact du trait de |\barre|. 
%    \begin{macrocode}
\newlength{\ZIaddwidth}
\setlength{\ZIaddwidth}{0pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tablvarset}
% Les param��tres pr��c��dents peuvent ��tre modifi��s avec |\setlength|, |\setboolean|, 
% |\renewcommand| ou |\definecolor|, mais ils peuvent ��galement ��tre g��r��es 
% avec le m��canisme \emph{cl��=valeur},
% gr��ce �� l'extension \textsf{xkeyval}~\cite{XKEY} de Hendri Adriaens.
% Nous avons fait le choix de ne pas en faire
% des options de l'extension \textsf{tablvar} elle-m��me, mais de fournir
% une commande sp��ciale, |\tablvarset|, pour r��gler ces options.
% La couleur d��finie par l'option \texttt{ZIcolor} doit ��tre une couleur \og nomm��e \fg. 
%    \begin{macrocode}
\define@key{tablvar}{intervalwidth}{\setlength{\intervalwidth}{#1}}
\define@key{tablvar}{colvalwidth}{\setlength{\colvalwidth}{#1}}
\define@key{tablvar}{firstcolsep}{\setlength{\firstcolsep}{#1}}
\define@key{tablvar}{bordercolsep}{\setlength{\bordercolsep}{#1}}
\define@key{tablvar}{limsep}{\setlength{\limsep}{#1}}
\define@key{tablvar}{stretch}{\renewcommand{\tablvarstretch}{#1}}
\define@boolkey{tablvar}[]{extleft}[true]{} % false si non appel��
\define@boolkey{tablvar}[]{extright}[true]{}
\define@choicekey{tablvar}{ZItype}{h,c}{\renewcommand{\ZItype}{#1}}
\define@key{tablvar}{ZIcolor}{\definecolor{ZIcolor}{named}{#1}}
\define@key{tablvar}{ZIaddwidth}{\setlength{\ZIaddwidth}{#1}}

\newcommand\tablvarset[1]{\setkeys{tablvar}{#1}}
%    \end{macrocode}
% D'autres param��tres, pr��sent��s ci-dessous, qui n'ont, en principe, 
% pas vocation �� ��tre modifi��s, ne sont pas g��r��s par |\tablvarset|.
% \end{macro}

% \begin{macro}{\tvrulewidth}
% D��finit l'��paisseur des filets du tableau (\texttt{0.4pt} par d��faut).
%    \begin{macrocode}
\newlength{\tvrulewidth}
\setlength{\tvrulewidth}{0.4pt}
%    \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 : \texttt{0.5pt} 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.
% La valeur par d��faut |{gray}{0.7}| correspond �� un niveau de gris.
% On peut red��finir la couleur par une couleur nomm��e
% |\definecolor{named}|\marg{couleur}
% ou selon un mod��le comme rgb, cmyk ou gray : |\definecolor{tvbarrecolor}{rgb}|\marg{x, x, x}.
%    \begin{macrocode}
\definecolor{tvbarrecolor}{gray}{0.7}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bbrulewidth}
% D��finit l'��paisseur des traits verticaux d'une double barre.
%    \begin{macrocode}
\newlength{\bbrulewidth}
\setlength{\bbrulewidth}{0.4pt}
%    \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�� fix��e �� \texttt{0pt}, 
% car l'augmenter est ��quivalent �� augmenter |\intervalwidth|
% de la m��me longueur, vu qu'il n'y a pas de filet de s��paration entre les colonnes
% de valeurs et les colonnes intervalles.
%    \begin{macrocode}
\newlength{\innercolsep}
\setlength{\innercolsep}{0pt}
%    \end{macrocode}
% \end{macro}

%\begin{macro}{maxdiscount}
% La gestion de discontinuit��s permettant de ne pas relier certains n��uds cons��cutifs
% se fait gr��ce �� la commande |\discont|.
% Le compteur |maxdiscont| est fix�� �� 4 par d��faut ; on peut l'augmenter (dans le pr��ambule)
% si l'on veut produire un tableau de variations avec plus de 4 discontinuit��s.
%    \begin{macrocode}
\newcounter{maxdiscont}
\setcounter{maxdiscont}{4} % nb max de discontinuit��s
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\rowtopsep}
% Cette longueur d��finit l'espace minimal entre le filet vertical sup��rieur et le contenu,
% pour les cellules de la colonne des l��gendes. 
% Elle ne s'applique pas pour les lignes de variations 
% puisque, dans la colonne des l��gendes, seule la ligne 
% \og milieu \fg est cens��e poss��der un contenu.
%    \begin{macrocode}
\newlength{\rowtopsep}
\setlength{\rowtopsep}{2pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\rowbottomsep}
% Cette longueur d��finit l'espace minimal entre le filet vertical inf��rieur et le contenu,
% pour les cellules de la colonne des l��gendes. 
% Elle ne s'applique pas pour les lignes de variations.
%    \begin{macrocode}
\newlength{\rowbottomsep}
\setlength{\rowbottomsep}{2pt}
%    \end{macrocode}
% \end{macro}

% \subsection{Les commandes graphiques PSTricks/\TikZ} \label{graph}
%
% 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{n��ud1}\marg{n��ud2} 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 est r��alis�� automatiquement par la commande |\variations|.
% Pour modifier l'aspect des fl��ches on peut red��finir la commande |\fleche|.
%    \begin{macrocode}
\newcommand*{\fleche}[2]{
    \iftv@tikz
        \tikz[remember picture,overlay]{\draw[->,>=stealth,
            line width=0.6pt] (#1) -- (#2);}
    \else
        \ncline[arrowsize=2pt 2,arrowinset=0.4,nodesep=3pt,
            linewidth=0.6pt]{->}{#1}{#2}
    \fi
}
%    \end{macrocode}
% \end{macro}

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

% \begin{macro}{\noeud}
% \cmd{\noeud}\oarg{pos}\marg{n��ud}\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 
% (pas impl��ment�� avec l'option |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]{
    \iftv@tikz
        % fonctionne mal avec autre chose que 'anchor=base'
        \tikz[remember picture,baseline]{% surtout pas de overlay ici
            \node[anchor=base,inner sep=0pt,outer sep=4pt] at (0,0) (#2) 
                {$#3$};}
    \else
        \rnode[#1]{#2}{#3}
    \fi
}
%    \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.
% Pour l'option \texttt{tikz}, on aurait pu simplifier la macro
% en utilisant |\fill[pattern=north east lines]| mais, en utilisant
% la biblioth��que \texttt{patterns.meta}, on peut obtenir des hachures
% plus ��l��gantes, correspondant �� celles de l'option \texttt{pstricks}.
%    \begin{macrocode}
\newcommand*{\hachure}[2]{
    \iftv@tikz
        \tikz[remember picture,overlay]{%
            \fill[pattern={Lines[distance=3pt,angle=135,line width=0.2pt]}]
            (#1) rectangle (#2);}
    \else
        \psframe[linestyle=none,fillstyle=vlines,hatchwidth=0.2pt,
            hatchsep=3pt](#1)(#2)
    \fi
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIcouleur}
% Trace une zone interdite en couleur, m��mes arguments que |\hachure|.
%    \begin{macrocode}
\newcommand*{\ZIcouleur}[2]{
    \iftv@tikz
        \tikz[remember picture,overlay]{\fill[color=ZIcolor,opacity=0.3]
            (#1) rectangle (#2);}
    \else
        \psframe[linestyle=none,fillstyle=solid,opacity=0.3,
            fillcolor=ZIcolor](#1)(#2)
    \fi
}
%    \end{macrocode}
% \end{macro}

% \subsection{Longueurs et compteurs internes}
%
%   \begin{macrocode}
\newcounter{var@ligne} % num��ro de ligne des variations
\newcounter{var@noeud} % num��ro du n��ud des variations
\newcounter{numvr} % num��ro de la valeur remarquable
\newcounter{nb@intervals} % nombre de colonnes "intervalles"
\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}

% La commande |\mil| positionne son contenu sur la colonne |mil@row|,
% et r��alise un d��calage vertical de |\mil@shift| 
% si le nombre de lignes de variations est pair.
% Pour cela nous avons besoin d'une variable de dimension et d'un compteur.
%    \begin{macrocode}
\newlength\mil@shift
\newcounter{mil@row}
%    \end{macrocode}

% Pour g��rer correctement les zones interdites, avec la commande |\ZI|, 
% de nombreuses variables, longueurs et compteurs, sont n��cessaires.
% On peut cr���� des zones interdites sur 4 colonnes diff��rentes maximum
% (on ne peut pas augmenter cette valeur sans revoir le code).
% Pour chacune, la hauteur des lignes est cumul��e dans les variables 
% |\ZIheighti|, \ldots, |\Ziheightiv|,
% et le num��ro de colonne \og intervalle \fg correspondant est enregistr��
% dans un compteur |ZI1|, \ldots, |ZI4|. La variable |\ZIheight| permet de renvoyer
% la hauteur de la ZI courante pour le calcul final avant trac�� des hachures.
% Les param��tres qui suivent sont ��galement d��di��s �� la gestion des dimensions 
% et au trac�� des zones interdites, 
% �� l'exception de |\tv@cellbox| qui sert aussi �� la gestion des colonnes de valeurs.
%    \begin{macrocode}
\newcounter{maxZI} % nb max de ZI
\setcounter{maxZI}{4}
\newlength{\ZIheight}
\newlength{\ZIheighti}
\newlength{\ZIheightii}
\newlength{\ZIheightiii}
\newlength{\ZIheightiv}
\newlength{\ZIdepth}
\newlength{\ZIwidth}
\newcounter{nbZI} % nombre de ZI utilis��es
\newcounter{numZI} % num��ro de ZI courant
\newcounter{nbvarlignes} % nombre de lignes des variations
\multido{\I=1+1}{\themaxZI}{\newcounter{ZI\I}}
\newcounter{tv@icol} % num��ro de colonne "intervalle"
\newcounter{tv@row} % num��ro de ligne du tableau
\newsavebox{\tv@cellbox}
\newlength{\tv@cellheight}
\newlength{\tv@celldepth}
%    \end{macrocode}

% \bigskip
% \subsection{Les environnements \texttt{tablvar} et \texttt{tablvar*}}
%
% \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|.
% On retire 1 �� |nb@intervals| �� cause de la mani��re dont on appelle les colonnes
% dans \texttt{tablvar} (voir plus bas).
% Les red��finitions de |\extrarowheight| et |\arraystretch| seront locales 
% �� l'environnement |tablvar|.
% L'instruction |\setcounter{var@ligne}{0}| est n��cessaire ici et pas seulement
% dans la partie variations car le compteur est utilis�� par |\ZI| dans les lignes de signes.
%    \begin{macrocode}
\newcommand*{\tablvarinit}[1]{
    \setlength{\extrarowheight}{0pt} % param��tre de l'extension array
    \renewcommand{\arraystretch}{\tablvarstretch}
    \setlength{\arrayrulewidth}{\tvrulewidth}
    \setcounter{var@ligne}{0}
    \setcounter{numvr}{0}
    \setcounter{tv@row}{0}
    \setcounter{nb@intervals}{#1}
    \addtocounter{nb@intervals}{-1}
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIinit}
% Initialisation des longueurs et compteurs qui peuvent ��tre utilis��s par |\ZI|.
% Le compteur \texttt{nbvarlignes} doit ��tre non nul pour un tableau de signe seul.
%    \begin{macrocode}
\newcommand{\ZIinit}{
    \global\ZIheighti=0pt
    \global\ZIheightii=0pt
    \global\ZIheightiii=0pt
    \global\ZIheightiv=0pt
    \setcounter{nbZI}{0}
    \multido{\I=1+1}{\themaxZI}{\setcounter{ZI\I}{0}}
    \setcounter{nbvarlignes}{3}
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tv@setheight}
% Cette macro sert �� calculer la hauteur et la profondeur d'une cellule,
% qui seront enregistr��es dans des variables globales afin que la commande |\ZI|
% puisse les r��cup��rer.
% Elle est appel��e �� chaque \og sortie \fg de cellule de la colonne de l��gendes
% gr��ce �� la d��finition d'un nouveau type de colonne \texttt{A} (voir macro |\tvcoltypes|).
% La hauteur de la bo��te de cellule |\@arstrutbox| ne donne pas 
% la hauteur r��elle de la ligne, car celle-ci peut ��tre calibr��e
% par d'autres cellules de la m��me ligne
% \footnote{L'utilisation d'un type de colonne permettant un ajustement automatique
% de la hauteur tel que fourni par l'extension 
% \textsf{cellspace}~\cite{CELLSP} de Josselin Noirel
% ne fonctionne pas ici : les barres et double barres ne sont pas correctement dessin��es ;
% mais l'on pourra peut-��tre envisager une ��volution gr��ce �� l'extension
% \textsf{tabularray}~\cite{TABUL} de Jianrui Lyu.}.
%
% L'id��e ici est de comparer la hauteur de |\@arstrutbox|
% avec la hauteur dans la 1\iere colonne de l��gendes, sur la m��me ligne,
% car c'est en g��n��ral elle qui contient des ��l��ments de grande hauteur.
% ��videmment si l'on place un contenu de grande hauteur ailleurs, dans une colonne de valeurs
% et non dans la colonne de l��gendes, le calcul ne fonctionnera pas. 
% Mais dans ce cas, l'extension \textsf{array} g��re de toute fa��on mal les hauteurs de ligne
% et le contenu de la cellule agrandie va toucher le filet horizontal.
% La solution est alors de placer un |\vstrut| ou |\cstrut| dans la colonne
% de l��gendes pour augmenter sa hauteur qui, de ce fait, sera bien enregistr��e
% par |\tv@setheight|.
%    \begin{macrocode}
\newcommand\tv@setheight{%
    \global\tv@cellheight=\ht\tv@cellbox
    \ifthenelse{\value{var@ligne}=0}{
        \global\advance\tv@cellheight by \rowtopsep}{}
    \ifdim \tv@cellheight < \ht\@arstrutbox
        \global\tv@cellheight = \ht\@arstrutbox
    \fi
    \global\tv@celldepth=\dp\tv@cellbox
    \ifthenelse{\value{var@ligne}=0}{
        \global\advance \tv@celldepth by \rowbottomsep}{}
    \ifdim \tv@celldepth < \dp\@arstrutbox
        \global\tv@celldepth = \dp\@arstrutbox
    \fi
    \vrule height \tv@cellheight depth \tv@celldepth width 0pt
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tvcoltypes}
% % Gr��ce �� l'extension \textsf{array}, nous pouvons d��finir 3 nouveaux types de colonnes :
% \texttt{A} pour la colonne des l��gendes
% (1\iere colonne), \texttt{i} pour les colonnes intervalles et |v|\marg{pos}
% pour les colonnes de valeurs. L'argument \meta{pos} peut prendre les valeurs
% \texttt{c} (centr��), \texttt{l} (align�� au fer �� gauche) ou \texttt{r} 
% (align�� au fer �� droite). En faire un param��tre optionnel ne fonctionne pas ici.
% Les colonnes d'intervalles sont en fait du type \texttt{p}, 
% paragraphe centr��, avec une largeur |\intervalwidth|
% et incr��mentent le compteur interne \texttt{tv@icol}. 
% La premi��re colonne de l��gende, 
% remet �� z��ro le compteur \texttt{tv@col} et incr��mente le compteur de ligne
% \texttt{tv@row}.
%
% La commande |\tvcoltypes| est appel��e au d��but de chaque environnement
% \texttt{tablvar} et, de ce fait, ces types de colonnes ne sont reconnus
% qu'�� l'int��rieur d'un \texttt{tablvar} et ne cr��ent pas d'incompatibilit��s
% avec d'autres extensions qui utiliseraient les m��mes lettres comme type de colonne.
%    \begin{macrocode}
\newcommand{\tvcoltypes}{
    % type de colonne A pour les l��gendes �� gauche du tableau
    \newcolumntype{A}{%
        >{\setcounter{tv@icol}{0}\stepcounter{tv@row}\begin{lrbox}%
            \tv@cellbox $}%
        c%
        <{$\end{lrbox}\usebox{\tv@cellbox}\tv@setheight}}
    % type de colonne i pour les intervalles
    \newcolumntype{i}{>{\stepcounter{tv@icol}
        \centering\arraybackslash$}p{\intervalwidth}<{$}}
    % type de colonne v pour les valeurs
    \newcolumntype{v}[1]{% un argument optionnel ne fonctionne pas ici
        >{\ifthenelse{\value{tv@row}=1}{\begin{lrbox}\tv@cellbox $}{}}%
        ##1%
        <{\ifthenelse{\value{tv@row}=1}{$\end{lrbox}%
            \makebox[\colvalwidth][##1]{\usebox\tv@cellbox}}{}}}
}
%    \end{macrocode}
% \end{macro}

% \begin{environment}{tablvar}
% La syntaxe de |tablvar| est : |\begin{tablvar}|\oarg{options}\marg{nbintervals}.
% Le 1\ier\ param��tre optionnel permet de r��gler les options sous la forme \emph{cl��=valeur}
% ou bien on peut y placer un unique argument dimensionnel qui repr��sente alors
% la largeur des colonnes intervalles.
% Le 2\ieme\ param��tre (obligatoire) est le nombre d'intervalles.
% Fondamentalement, cet environnement n'est rien d'autre qu'un |array| 
% dans lequel, apr��s avoir effectu�� les initialisations, 
% on a choisi les bons types de colonnes.
%
% On commence par prendre en compte les options gr��ce �� |\setkeys*| fourni par l'extension
% \textsf{xkeyval}.  La version ��toil��e de |\setkeys|
% a l'avantage de ne pas produire d'erreur lorsqu'une cl�� n'est pas reconnue
% (celle-ci est pass��e �� |\XKV@rm|). On l'interpr��te
% \footnote{Un message d'erreur de dimension erron��e
% peut donc signifier que l'on s'est tromp�� dans l'orthographe d'une cl��.}
% alors comme une dimension pour le param��tre |\intervalwidth|.
% 
% Les colonnes de valeurs sont de type |c| (centr��) par d��faut mais
% les bool��ens \texttt{extleft} et \texttt{extright} permettent de diff��rencier
% l'alignement dans la premi��re colonne de valeur (type \texttt{B} comme begin)
% ou la derni��re (type \texttt{E} comme end).
%    \begin{macrocode}
\newenvironment{tablvar}[2][]{%
    \setkeys*{tablvar}{#1} % fourni par xkeyval
    \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi
    \tvcoltypes   
    \ifextleft\newcolumntype{B}{v{l}}\else\newcolumntype{B}{v{c}}\fi
    \ifextright\newcolumntype{E}{v{r}}\else\newcolumntype{E}{v{c}}\fi
    \tablvarinit{#2}
    \ZIinit
    \begin{array}{%
        |@{\hspace{\firstcolsep}}%
        A@{\hspace{\firstcolsep}}%
        |@{\hspace{\bordercolsep}}%
        B@{\hspace{\innercolsep}}%
        i@{\hspace{\innercolsep}}%
        *{\value{nb@intervals}}{
            v{c}@{\hspace{\innercolsep}}%
            i@{\hspace{\innercolsep}}%
        }%
        E@{\hspace{\bordercolsep}}|%
    }
}{\end{array}}
%    \end{macrocode}
% \end{environment}
%
% \begin{environment}{tablvar*}
% L'environnement |tablvar*| est une variante de |tablvar| (m��me syntaxe)
% o�� les premi��re et derni��re colonnes de valeurs sont align��es respectivement
% au fer �� gauche (|l|) et �� droite (|r|).
% L'appel �� |\setkeys*| enregistre les param��tres optionnels 
% dans les variables correspondantes qui seront donc utilis��s par \texttt{tablvar},
% mais \texttt{extleft} et \texttt{extright} seront fix��s.
%    \begin{macrocode}
\newenvironment{tablvar*}[2][]{%
    \setkeys*{tablvar}{#1} % fourni par xkeyval
    \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi
    \begin{tablvar}[extleft,extright]{#2}
}{\end{tablvar}}
%    \end{macrocode}
% \end{environment}
%
% \subsection{La commande \texttt{\textbackslash variations}}
%
% \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 des variations doit subir un traitement particulier).
% Nous avons cr���� notre propre commande de boucle car les usuelles
% |\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}
% La syntaxe est \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 commandes de positionnement
% et les s��parateurs de colonnes |&|. \\
% Le principe est que l'on parcourt \meta{nblignes} fois
% le contenu de |\variations| ;
% �� chaque it��ration, le compteur |var@ligne| est incr��ment��, 
% le compteur |var@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 |var@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 !
% Le compteur |var@ligne| doit ��tre remis �� 0 au cas o�� il y a plusieurs parties variations.
% Cette remise �� z��ro s'effectue �� la fin au cas o�� on mettrait des lignes de signes
% apr��s une ligne variations.
%    \begin{macrocode}
\newcommand*{\variations}[2][3]{% #1=nblignes (3 par d��faut)
    % (r��)initialisation des compteurs
    \setcounter{nbvarlignes}{#1}
    \setcounter{numdiscont}{0}
    \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}}
    % boucle : on ex��cute le code #2 un nb de fois ��gal �� (#1)-1
    \varloop{#1}{%
        \setcounter{var@noeud}{0}\setcounter{numvr}{0}
        % �� chaque tour de boucle on r��initialise les compteurs de n��uds
        \stepcounter{var@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{var@noeud}{0}\setcounter{numvr}{0}
    \stepcounter{var@ligne} #2
    % trac�� des fl��ches
    \addtocounter{var@noeud}{-1} % 1 fl��che de moins que le nb de n��uds
    \setcounter{numdiscont}{1}
    \multido{\Ix=1+1,\Iy=2+1}{\thevar@noeud}{
        \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}}
    \setcounter{var@ligne}{0}
    \\ % dernier retour ligne du tableau
}
%    \end{macrocode}
% \end{macro}

% \subsection{Les commandes de positionnement}
%
% \label{cmd-pos}
% \begin{macro}{\valpos}
% \cmd{\valpos}\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 |var@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.
% La macro |\valpos| sert de macro sous-jacente �� la macro |\pos|.
%    \begin{macrocode}
\newcommand*{\valpos}[3][c]{
    \stepcounter{var@noeud}
    \ifthenelse{\thevar@ligne=#2}{
        \noeud[#1]{N\thevar@noeud}{#3}
    }{} % si ligne != #2, on ne fait rien
}
%    \end{macrocode}
% \end{macro}

% \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 ne pas alt��rer le calcul de la
% largeur de colonne.
% Cette macro est similaire �� |\mathclap| de l'extension \textsf{mathtools}~\cite{TOOLS}.
% 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}

% \DescribeMacro{\pos}
% Dans |\pos|, si l'option \texttt{extleft} est activ��e, la premi��re colonne
% de valeurs, celle o�� le compteur des colonnes intervalles, |\tv@icol|, est encore �� 0,
% est align��e au fer �� gauche : l'option de positionnement \texttt{l} (left)
% est enregistr��e dans |\val@@pos|.
% Si c'est \texttt{extright} qui est activ��e, la derni��re colonne de valeurs
% est align��e au fer �� droite (option de positionnement |\val@@pos=r|).
% On se trouve dans cette derni��re colonne, lorsque le compteur des colonnes intervalles 
% a d��pass�� \texttt{nb@intervals} qui contient le nombres d'intervalles $-1$.
%
% \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 toute premi��re colonne
% contenant la l��gende ou pour positionner une valeur par dessus une fl��che.
% Il n'y a pas lieu de se pr��occuper de l'alignement, sauf si on voulait positionner
% une valeur aux extr��mit��s sans la relier par des fl��ches, auquel cas on pourrait
% utiliser |\zbox|\oarg{pos} dans |\pos*|.
% Les anciennes commandes internes |\@pos| et |@@pos| ont ��t�� remplac��es par |\tv@pos|
% et |\tv@@pos|, pour ��viter un conflit avec la macro |\@pos| d��j�� utilis��e
% par Daniel Flipo dans \textsf{tabvar}.
%    \begin{macrocode}
\newcommand*{\tv@pos}[3][c]{
    \def\val@@pos{c}
    \ifextleft
        \ifthenelse{\thetv@icol=0}{\def\val@@pos{l}}{}
    \fi
    \ifextright
        \ifthenelse{\thetv@icol>\thenb@intervals}{\def\val@@pos{r}}{}
    \fi
    \zbox[\val@@pos]{\valpos[#1]{#2}{#3}}
}
\newcommand*{\tv@@pos}[2]{\ifthenelse{\thevar@ligne=#1}{#2}{}}
\newcommand*{\pos}{\@ifstar{\tv@@pos}{\tv@pos}}
%    \end{macrocode}

% Voici les commandes de positionnement plus abstraites qui peuvent ��tre utilis��s 
% �� la place des commandes |\pos| et |\pos*|.
%
% \begin{macro}{\haut}
% \cmd{\haut}\marg{valeur} place \meta{valeur} sur la premi��re ligne des variations.
% L'option de |\pos| n'est pas prise en charge.
%    \begin{macrocode}
\newcommand*{\haut}{\pos{1}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bas}
% \cmd{\bas}\marg{valeur} place \meta{valeur} sur la derni��re ligne des variations.
% L'option de |\pos| n'est pas prise en charge.
%    \begin{macrocode}
\newcommand*{\bas}{\pos{\value{nbvarlignes}}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\vdecal}
% La macro \cmd{\vdecal}\marg{decal}\marg{contenu} permet de r��aliser un d��calage
% vertical :  
% 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.
% Elle est utilis��e en particulier par |\mil|.
%    \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 ainsi quelque soit le d��calage, le tableau ne bouge pas
% (on pourrait m��me faire sortir le contenu �� afficher du tableau).
% \end{macro}

% \begin{macro}{\mil}
% Pour un nombre $n$ impair de lignes de variations,
% la commande |\mil|\marg{valeur} positionne \meta{valeur} sur la ligne $\frac{n+1}{2}$
% de la partie variations. Cela correspond bien �� la ligne du milieu :
% ligne 2 lorsqu'il y a 3 lignes.
% Par contre si $n$ est pair, on place \meta{valeur} sur la ligne $\frac{n}{2}$ mais avec
% un d��calage vertical n��gatif (vers le bas) gr��ce �� |\vdecal|.
% Ce d��calage correspond �� une profondeur de cellule augment�� de \texttt{0.5ex}
% (��cart entre la ligne de base du texte et la ligne de centrage math��matique).
% Le r��sultat de ce calcul est stock�� dans la variable de dimension |\mil@shift|.
% Au cas o�� l'on ne serait pas satisfait du r��sultat de |\mil|, on pourrait alors r��gler
% le d��calage manuellement avec 
%|\pos*|\marg{ligne}|{\vdecal|\marg{decal}\marg{contenu}|}|.
%    \begin{macrocode}
\newcommand*{\mil}[1]{%
    \setcounter{mil@row}{\value{nbvarlignes}}
    \ifthenelse{\isodd{\value{nbvarlignes}}}{
        \addtocounter{mil@row}{1}
        \divide\value{mil@row} by 2
        \pos*{\themil@row}{\smash{#1}}
    }{
        \divide\value{mil@row} by 2
        \mil@shift = \dp\@arstrutbox
        \advance\mil@shift by 0.5ex       
        \pos*{\themil@row}{\vdecal{-\mil@shift}{#1}}
    }
}
%    \end{macrocode}
% \end{macro}

% \subsection{Barres, discontinuit��s, limites et valeurs remarquables}
%
% \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 principe, on met 0 comme argument optionnel ou rien.
% Le |\hspace{-0.5\tvbarrewidth}| sert �� obtenir un centrage parfait du |\vrule|
% en particulier si on souhaite un trait ��pais.
%    \begin{macrocode}
\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}%
    \color{tvbarrecolor}%
    \hspace{-0.5\tvbarrewidth}\vrule width \tvbarrewidth}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bb}
% La macro |\bb|, qui produit une double barre,
% reprend celle de l'extension \mbox{\textsf{variations}} de Christian Obrecht :
% |\def\bb{\vrule\kern1pt\vrule}|.
% Nous avons ajout�� \texttt{1.5pt} d'espace avant et apr��s, afin d'aligner au mieux
% la double barre avec un 0 sur la ligne des $x$, lorsque la double barre
% se trouve �� une extr��mit��.
% L'��paisseur de la double barre a ��t�� param��tr��e par |\bbrulewidth|.
%    \begin{macrocode}
\newcommand*{\bb}{%
    \kern1.5pt\vrule width \bbrulewidth\kern1pt
    \vrule width \bbrulewidth\kern1.5pt}
%    \end{macrocode}
% \end{macro}

% \DescribeMacro{\limg}\DescribeMacro{\limd}
% Les macros |\limg| et |\limd| servent �� positionner des limites �� gauche ou �� droite,
% en particulier aux bords des double barres.
% Le premier param��tre, optionnel, pr��cise l'option de positionnement (\texttt{c},
% \texttt{l} ou \texttt{r}) et le second \emph{obligatoire} et le num��ro de ligne,
% enfin le troisi��me est la valeur �� placer.
%
% \DescribeMacro{\limg*}\DescribeMacro{\limd*}
% Les versions ��toil��es n'acceptent comme argument que \texttt{+} ou \texttt{-}, 
% |\limg*{+}| correspond �� |\limg{1}{+\infty}|,
% |\limg*{-}| correspond �� |\limg{|$n$|}{-\infty}| (pour une partie variations
% sur $n$ lignes et de m��me pour |\limd*|.
%    \begin{macrocode}
\newcommand*{\@limg}[3][c]{%
    \zbox[r]{\valpos[#1]{#2}{#3\hspace{\limsep}}}}
\newcommand*{\@limd}[3][c]{%
    \zbox[l]{\valpos[#1]{#2}{\hspace{\limsep}#3}}}
\newcommand*{\@@limg}[1]{%
    \ifthenelse{\equal{#1}{+}}{\@limg{1}{+\infty}}{
    \ifthenelse{\equal{#1}{-}}{\@limg{\value{nbvarlignes}}{-\infty}}{
        \PackageError{tablvar}{Invalid argument for \string\limg*}
            {Only + or - are valid arguments for \string\limg*}
    }}
}
\newcommand*{\@@limd}[1]{%
    \ifthenelse{\equal{#1}{+}}{\@limd{1}{+\infty}}{
    \ifthenelse{\equal{#1}{-}}{\@limd{\value{nbvarlignes}}{-\infty}}{
        \PackageError{tablvar}{Invalid argument for \string\limd*}
            {Only + or - are valid arguments for \string\limd*}
    }}
}
\newcommand{\limg}{\@ifstar{\@@limg}{\@limg}}
\newcommand{\limd}{\@ifstar{\@@limd}{\@limd}}
%    \end{macrocode}

% \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{\thevar@ligne=1}{
        % on ne compte les discontinuit��s qu'une seule fois, sur ligne 1
        \ifthenelse{\thenumdiscont=0}{
            \ifthenelse{\thevar@noeud > 0}{% pas avant le 1er n��ud
                \stepcounter{numdiscont}
                \setcounter{discont\thenumdiscont}{\thevar@noeud}
            }{}
        }{% on ne compte pas 2 fois la m��me discontinuit��
            \ifthenelse{\thevar@noeud > \value{discont\thenumdiscont}}{      
                \stepcounter{numdiscont}
                \setcounter{discont\thenumdiscont}{\thevar@noeud}
            }{}
        }
    }{}
}
%    \end{macrocode}
% \end{macro}

% \DescribeMacro{\bblim}\DescribeMacro{\bblim*}
% Ces macros servent �� positionner des limites �� gauche \emph{et} �� droite 
% d'une double barre.
% Elles tracent la double barre, placent les limites et appellent |\discont|.\\
% La syntaxe de |\bblim| est : \\
% |\bblim|\marg{ligne gauche}\marg{limite gauche}\marg{ligne droite}\marg{limite droite}.\\
% La syntaxe de|\bblim*| reprend celle de |\limg*| et |\limd*| :
% |\bblim*|\marg{+$\vert$-}\marg{+$\vert$-}.
%    \begin{macrocode}
\newcommand*{\@bblim}[4]{\limg{#1}{#2}\bb\discont\limd{#3}{#4}}
\newcommand*{\@@bblim}[2]{\limg*{#1}\bb\discont\limd*{#2}}
\newcommand*{\bblim}{\@ifstar{\@@bblim}{\@bblim}}
%    \end{macrocode}

% \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 si tv@row=1
    \stepcounter{numvr}
    \ifthenelse{\thetv@row=1}{\noeud{X\thenumvr}{#2}}{
        \ifthenelse{\thevar@ligne=#1}{\noeud{Y\thenumvr}{#2}}{}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\posvr}
% Malheureusement, on ne peut pas imbriquer une commande |\vr| et une commande |\pos|
% l'une dans l'autre. Mais on peut en fait imbriquer une commande |\noeud| dans une autre.
% Ici ce ne sont pas les |\ifthenelse| contenues dans les commandes |\vr| ou |\pos|
% qui posent probl��me, mais les |\stepcounter| qui ne sont pas support��s �� l'int��rieur
% d'une commande |\noeud|. Nous avons donc cr���� la commande |\posvr| pour placer une
% valeur dans la partie variations qui soit �� la fois un n��ud pour les fl��ches
% et pour les pointill��s de valeur remarquable.
% Sa syntaxe est la m��me que celle de la commande |\pos|.
%    \begin{macrocode}
\newcommand*{\posvr}[3][c]{%
    \stepcounter{numvr}
    \tv@pos[#1]{#2}{\noeud{Y\thenumvr}{#3}}}
%    \end{macrocode}
% \end{macro}

% \subsection{Zones interdites}
%
% La gestion des zones interdites n��cessite quelques sophistications algorithmiques car
% il faut ne dessiner un rectangle de hachures qu'une seule fois
% pour un ensemble de cellules superpos��es, sinon les hachures ne seront pas jointives.
% Pour les zones interdites color��es, on utilisera les m��mes macros qui donnent
% un ajustement id��al.
%
% Une zone interdite poss��de un num��ro et chaque appel de |\ZI| va cumuler la hauteur
% de cellule jusqu'au trac��, d��clench�� par |\ZI*|.
% On doit v��rifier si une zone interdite non trac��e existe d��j�� dans la m��me colonne,
% sinon on en cr��e une nouvelle.
%
% \begin{macro}{\ZIfind}
% On cherche s'il existe d��j�� une zone interdite (non trac��e) pour la m��me
% colonne, auquel cas on renvoie son num��ro (dans \texttt{numZI}), sinon on renvoie 0.
% Les ZI sont indic��es par un compteur |ZI1|, |ZI2|, |ZI3| ou |ZI4|
% qui contient le num��ro de la colonne intervalle �� laquelle cette ZI appartient.
% Le compteur \texttt{nbZI} contient le nombre de ZI actives d��j�� cr����es.
% On rep��re l'indice de ZI
% en comparant la valeur du compteur |ZI\I| avec le num��ro
% de la colonne intervalle courante. 
%    \begin{macrocode}
\newcommand\ZIfind{% calcule numZI
   \setcounter{numZI}{0}
    \multido{\I=1+1}{\thenbZI}{% il existe d��j�� des ZI �� la m��me colonne
        \ifthenelse{\value{ZI\I}=\value{tv@icol}}{
            \setcounter{numZI}{\I}
        }{}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZInew}
% Cr���� une nouvelle zone interdite en lui affectant un num��ro (indice)
% et m��morise le num��ro de 
% la colonne intervalle o�� cette ZI est cr����e.
% Si le num��ro de colonne (intervalle) courante ne correspond
% �� aucune ZI enregistr��e dans les compteurs |ZI\I|
% alors on incr��mente le compteur \texttt{nbZI} et on enregistre ce num��ro
% de colonne dans le compteur de |ZI\thenbZI| correspondant.
% Si jamais on d��passe 4, le nombre max de ZI possibles,
% |\ZInew| va g��n��rer une erreur en appelant |ZI\thenumZI| qui n'existe pas.
% Par contre, si une ZI de la m��me colonne a d��j�� ��t�� trac��e pr��c��demment 
% (cela ne peut arriver que dans les tableaux de signes), 
% le num��ro de ZI de cette colonne sera remis �� 0
% par |\ZIreset| (voir macro suivante) auquel cas on r��cup��re son indice
% pour cr��er cette nouvelle ZI.
%    \begin{macrocode}
\newcommand\ZInew{
    \multido{\I=1+1}{\thenbZI}{% on cherche s'il y a des ZI\I=0
        \ifthenelse{\value{ZI\I}=0}{\setcounter{numZI}{\I}}{}
    }
    \ifthenelse{\value{numZI}>0}{}{
        % si pas de ZI disponible il faut augmenter nbZI
        \stepcounter{nbZI}
        \setcounter{numZI}{\value{nbZI}}
    }
    \setcounter{ZI\thenumZI}{\value{tv@icol}}
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIreset}
% |\ZIreset| est appel��e lors du trac�� d'une zone interdite dans la partie signe,
% afin de lib��rer l'indice de ZI correspondant qui pourra ��tre r��affect�� plus bas
% dans la m��me colonne. Son argument obligatoire est l'indice de ZI �� remettre �� 0.
% Son r��le est aussi de remettre �� 0, la hauteur de cette ZI nouvellement cr����e.
%    \begin{macrocode}
\newcommand*\ZIreset[1]{
    \ifnum #1 > 0 \setcounter{ZI#1}{0} \fi
    \ifnum #1 = 1
        \global\ZIheighti=0pt
    \else \ifnum #1 = 2
        \global\ZIheightii=0pt
    \else \ifnum #1 = 3
        \global\ZIheightiii=0pt
    \else \ifnum #1 = 4
        \global\ZIheightiv=0pt
    \fi\fi\fi\fi
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIaddheight}
% La macro |\ZI@addheight| sert �� cumuler la hauteur et la profondeur de la ligne
% courante dans une des 4 variables de dimension |\ZIheighti|, \ldots, |\ZIheightiv|
% correspondant �� la zone interdite appelante.
% On r��cup��re hauteur et profondeur qui ont ��t�� enregistr��s dans
% les variables globales |\tv@cellheight| et |\tv@celldepth|,
% par la colonne de l��gendes de la m��me ligne.
% Le num��ro de la ZI (son indice) est pass�� en argument.
%    \begin{macrocode}
\newcommand*\ZIaddheight[1]{
    \ZIheight=0pt
    \advance\ZIheight by \tv@cellheight
    \advance\ZIheight by \tv@celldepth
    \advance\ZIheight by 0.5\arrayrulewidth
    \ifnum #1 = 1
        \global\advance\ZIheighti by \ZIheight
    \else \ifnum #1 = 2
        \global\advance\ZIheightii by \ZIheight
    \else \ifnum #1 = 3
        \global\advance\ZIheightiii by \ZIheight
    \else \ifnum #1 = 4
        \global\advance\ZIheightiv by \ZIheight
    \fi\fi\fi\fi
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIgetheight}
% On r��cup��re, avant le trac��, la hauteur globale de la ZI 
% (dont le num��ro est donn�� en argument) dans la variable |\ZIheight|.
%    \begin{macrocode}
\newcommand*\ZIgetheight[1]{%
    \ifnum #1=1
        \global\ZIheight=\ZIheighti
    \else \ifnum #1 = 2
        \global\ZIheight=\ZIheightii
    \else \ifnum #1 = 3
        \global\ZIheight=\ZIheightiii
    \else \ifnum #1 = 4
        \global\ZIheight=\ZIheightiv
    \fi\fi\fi\fi
}
%    \end{macrocode}
% \end{macro}
% \DescribeMacro{\ZI}
% La macro |\ZI| est �� placer dans les cellules o�� l'on souhaite produire une zone interdite.
% Elle ne d��clenche le trac�� des hachures que sur la derni��re ligne des variations
% (par un appel �� |\ZI*|). 
%
% On cr��e une discontinuit�� puis on r��cup��re l'indice de ZI (\texttt{numZI})
% gr��ce �� |\ZIfind|. Si |\ZIfind| renvoie 0, aucune ZI active n'existe
% pour la colonne intervalle courante, auquel cas on cr��e un nouvelle ZI avec |\ZInew|.
% Et enfin on cumule la hauteur de la ligne de cette ZI gr��ce �� |\ZIaddheight|.
% 
% La macro poss��de un param��tre optionnel |\ZI|\oarg{hauteur}
% qui est un suppl��ment de hauteur global.
% Celui-ci n'est, en principe, plus n��cessaire, mais nous l'avons conserv�� pour
% des raisons de compatibilit�� avec les versions ant��rieures �� \textsf{tablvar} 2.0.
% Ce param��tre permettrait ��ventuellement de faire un ajustement fin de la hauteur.
%
% \medskip
% \DescribeMacro{\ZI*} 
% C'est en fait la macro |ZI*| qui d��clenche le trac�� de la zone interdite
% en appelant la commande |\hachure| ou la commande |\ZIcouleur|
% en fonction de l'option \texttt{ZItype}.
% Elle utilise la hauteur cumul��e, pr��c��demment enregistr��e dans la variable de dimension
% correspondant �� la ZI (par les commandes |\ZI| plac��s dans la m��me colonne).
% Dans la macro |\variations|, |\ZI*| est en fait appel��e par |ZI| 
% sur la derni��re ligne des variations, sans que l'utilisateur n'ait �� intervenir.
% 
% Par contre, dans un tableau de signes sans partie variations 
% il faut placer explicitement des |\ZI*| �� la place des |\ZI|, au moment
% o�� l'on souhaite d��clencher le trac�� des hachures, sur la derni��re ligne 
% d'un bloc de hachures.
% La commande |\ZI*| poss��de le m��me argument optionnel |ZI*|\oarg{hauteur}. 
%    \begin{macrocode}
\newcommand*{\@ZI}[1][0pt]{%
    \discont
    \ifthenelse{\thevar@ligne=\value{nbvarlignes}}{\@@ZI[#1]}{%
        \ZIfind
        \ifnum \thenumZI = 0 \ZInew \fi
        \ZIaddheight{\thenumZI}
    }
}

\newcommand*{\@@ZI}[1][0pt]{
    \discont
    \ZIfind
    \ifnum \thenumZI > 0 \ZIgetheight{\thenumZI} \else \ZIheight=0pt \fi
    \advance\ZIheight by \tv@cellheight
    \advance\ZIheight by 0.5\arrayrulewidth
    \advance\ZIheight by #1
    \ZIdepth = \tv@celldepth 
    \ZIwidth = \intervalwidth
    \advance\ZIwidth by 2\innercolsep
    \advance\ZIwidth by \colvalwidth
    \advance\ZIwidth by -1pt % au bord des double barres
    \advance\ZIwidth by \ZIaddwidth
    \ifthenelse{\equal{\ZItype}{h}}{
        \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight}
    }{
        \ZIcouleur{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight}
    }
    \ZIreset{\thenumZI}
}

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

% \DescribeMacro{\ZIh}\DescribeMacro{\ZIc}
% Nous avons conserv�� les noms des anciennes macros |\ZIh| et |ZIc|
% pour les zones interdites hachur��es ou color��es pour des raisons de compatibilit��,
% mais elles sont d��sormais bas��es sur |\ZI| ou |\ZI*| (en fait sur |\@ZI| ou |\@@ZI|).
% La macro |\ZIh| poss��de toujours une version ��toil��e |\ZIh*| pour le trac�� des hachures
% dans les lignes de signe, |\ZIc| n'en poss��dait pas.
%    \begin{macrocode}
\newcommand*{\ZIc}[1][0pt]{\renewcommand{\ZItype}{c}\@@ZI[#1]}
\newcommand{\ZIh}{\renewcommand{\ZItype}{h}\ZI}
%    \end{macrocode}
%
% \bigskip
% \begin{thebibliography}{15}
% \begin{raggedright}
% \bibitem{TABL} \emph{Tableaux}, Nicolas Kisselhoff, CTAN.
% \bibitem{TABV} \emph{Tableaux de variations : \textsf{���tabvar���}}, Daniel Flipo, 
% CTAN, v1.8 16/07/2022.
% \bibitem{VARI} \emph{L'extension \textsf{variations}}, Christian Obrecht, 
% CTAN, v0.3 13/09/2006.
% \bibitem{TABLOR} \emph{\textsf{tablor.sty} La machine �� cr��er des tableaux 
% de signes et de variations}, Guillaume Connan, CTAN, v4.07 09/05/2010.
% \bibitem{VARMP} \emph{\textsf{tableauVariations} -- Variation tables in 
% \textlogo{METAPOST}}, Fr��d��ric Mazoit, CTAN, 2005.
% \bibitem{TKZ} \emph{\textsf{Tkz-Tab}}, Alain Matthes, CTAN,
% v2.12c 29/04/2020.
% \bibitem{ARRAY} \emph{A new implementation of LATEX���s \textsf{tabular} and \textsf{array} 
% environment}, Frank Mittelbach, David Carlisle, CTAN, v2.5g revised 16/10/2023.
% \bibitem{MKCELL} \emph{The \textsf{makecell} package}, Olga Lapko, CTAN, v0.1e 03/08/2009.
% \bibitem{CELLSP} \emph{The \textsf{cellspace} package}, Josselin Noirel, CTAN, 
% v1.9.0 04/01/2022.
% \bibitem{TABUL} \emph{\textsf{Tabularray} Typeset Tabulars and Arrays with \LaTeX3},
% Jianrui Lyu, CTAN, v2023A, 01/03/2023.
% v1.9.0 04/01/2022. 
% \bibitem{SPA} \emph{The \textsf{spacingtricks} package}, Antoine Missier, 
% CTAN, v1.7 28/07/2023.
% \bibitem{XKEY} \emph{The \textsf{xkeyval} package}, Hendri Adriaens,
% CTAN, v2.9 16/06/2022.
% \bibitem{TOOLS} \emph{The \textsf{mathtools} package}, Morten H��gholm, Lars Madsen,
% CTAN, v1.23 17/01/2020.
% \bibitem{MIS} Miscellaneous mathematical macros -- The \emph{\textsf{mismath} package},
% Antoine Missier, CTAN, v3.1 16/06/2024.
% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}, Antoine Missier, 
% CTAN, v3.1 07/05/2024.
% \end{raggedright}
% \end{thebibliography}
% \Finale
\endinput