texlive[69212] Master/texmf-dist: tablvar (24dec23)

commits+karl at tug.org commits+karl at tug.org
Sun Dec 24 22:27:15 CET 2023


Revision: 69212
          https://tug.org/svn/texlive?view=revision&revision=69212
Author:   karl
Date:     2023-12-24 22:27:15 +0100 (Sun, 24 Dec 2023)
Log Message:
-----------
tablvar (24dec23)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/tablvar/README.md
    trunk/Master/texmf-dist/doc/latex/tablvar/tablvar.pdf
    trunk/Master/texmf-dist/source/latex/tablvar/tablvar.dtx
    trunk/Master/texmf-dist/source/latex/tablvar/tablvar.ins
    trunk/Master/texmf-dist/tex/latex/tablvar/tablvar.sty

Modified: trunk/Master/texmf-dist/doc/latex/tablvar/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/tablvar/README.md	2023-12-24 21:26:52 UTC (rev 69211)
+++ trunk/Master/texmf-dist/doc/latex/tablvar/README.md	2023-12-24 21:27:15 UTC (rev 69212)
@@ -5,9 +5,9 @@
 
 - A complete and easy to use package for typesetting pretty tables of signs and variations according to French usage.
 - The syntax is similar to that of the array environment and uses intuitive position commands.
-- Arrows are automatically drawn (with PSTricks by default or TikZ in option).
-- Macros are provided for drawing double bars, single bars crossing the zeros, areas where the function is not defined or placing special values.
-- Several features of variation tables can be customized.
+- Arrows are automatically drawn (with PSTricks or TikZ).
+- Macros are provided for drawing double bars, single bars crossing the zeros, intervals where a function is not defined or for placing special values.
+- Several features of variations tables can be customized.
 
 
 ## Documentation
@@ -18,7 +18,7 @@
 ## Installation
 
 - run LaTeX on tablvar.ins, you obtain the file tablvar.sty,
-- if then you run LaTeX + dvips + ps2pdf on tablvar.dtx you get the file tablvar.pdf which is also in the archive,
+- if then you run XeLaTeX or LaTeX + dvips + ps2pdf on tablvar.dtx you get the file tablvar.pdf which is also in the archive,
 - put the files tablvar.sty and tablvar.pdf in your TeX Directory Structure.
 
 

Modified: trunk/Master/texmf-dist/doc/latex/tablvar/tablvar.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/tablvar/tablvar.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/tablvar/tablvar.dtx	2023-12-24 21:26:52 UTC (rev 69211)
+++ trunk/Master/texmf-dist/source/latex/tablvar/tablvar.dtx	2023-12-24 21:27:15 UTC (rev 69212)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-% Copyright (C) 2018-2019 by Antoine Missier <antoine.missier at ac-toulouse.fr>
+% Copyright (C) 2018-2023 by Antoine Missier <antoine.missier at 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
@@ -22,7 +22,7 @@
 %<*package> 
 \NeedsTeXFormat{LaTeX2e}[2005/12/01]
 \ProvidesPackage{tablvar}   
-    [2019/07/01 v1.2 .dtx tablvar file]
+    [2023/12/23 v2.0 .dtx tablvar file]
 %</package>
 %<*driver>
 \documentclass{ltxdoc}
@@ -30,22 +30,44 @@
 \usepackage[T1]{fontenc}
 \usepackage[french]{babel}
 \usepackage{lmodern}
-\usepackage{tablvar}
-\usepackage[Symbol]{upgreek}
-\renewcommand\pi{\uppi}
+\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]{tablvar}
+\usepackage[style=french,font=fcm]{lgrmath} % pour un joli pi droit
+\usepackage{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}}}
-\DisableCrossrefs         
-%\CodelineIndex
-%\RecordChanges
-\usepackage{hyperref}
+\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{%
     colorlinks, 
     linkcolor=blue,
+    citecolor=red,
     pdftitle={tablvar}, 
     pdfsubject={LaTeX package}, 
     pdfauthor={Antoine Missier}
 }
-\newcommand\tikz{{\fontfamily{cmr}Ti{\em k}Z}}
+\DisableCrossrefs         
+%\CodelineIndex
+%\RecordChanges
 \begin{document}
   \DocInput{tablvar.dtx}
   %\PrintChanges
@@ -54,7 +76,7 @@
 %</driver>
 % \fi
 %
-% \CheckSum{2825}
+% \CheckSum{752}
 %
 % \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
@@ -76,64 +98,102 @@
 % \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.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 at pos, @@pos -> tv@@pos}
 %
 % \GetFileInfo{tablvar.sty}
+%
+% \DoNotIndex{\@@ZI,\tv@@pos,\tv at pos,\@ZI,\@arstrutbox,\@ifstar,\\}
+% \DoNotIndex{\addtocounter,\advance,\arraybackslash}
+% \DoNotIndex{\begin,\boolean,\centering,\color,\DeclareOption,\def}
+% \DoNotIndex{\define at boolkey,\defin at key,\dp,\draw,\else,\empty,\end}
+% \DoNotIndex{\fi,\fill,\global,\hspace,\ht}
+% \DoNotIndex{\I,\if,\ifdim,\ifnum,\ifthenelse,\Ix,\Iy,\kern}
+% \DoNotIndex{\makebox,\MessageBreak,\multido,\ncline,\newboolean,}
+% \DoNotIndex{\newcommand,\newcounter,\newenvironment,\newlength,\newsavebox}
+% \DoNotIndex{\node,\PackageWarningNoLine,\ProcessOptions,\psframe}
+% \DoNotIndex{\raisebox,\relax,\renewcommand,\RequirePackage,\rnode}
+% \DoNotIndex{\sbox,\setboolean,\setcounter,\setlength,\stepcounter}
+% \DoNotIndex{\TikZ,\tvanchor,\usetikzlibrary,\value,\wd}
+% \DoNotIndex{\ZIheight,\ZIheighti,\ZIheightii,\ZIheightiii,\ZIheightiv,\ZIdepth,\ZIwidth}
 % 
 % \title{L'extension \textsf{tablvar}\thanks{Ce document
-%     correspond à \textsf{tablvar}~\fileversion, dernière modification le 01/07/2019.}}
+%     correspond à \textsf{tablvar}~\fileversion, dernière modification le 23/12/2023.}}
 % \author{Antoine Missier \\ \texttt{antoine.missier at ac-toulouse.fr}}
-% \date{1\ier\ juillet 2019}
+% \date{23 décembre 2023}
 % \maketitle
 % \tableofcontents
 %
 % \section{Introduction}
 %
-% Cette extension permet de construire des tableaux de variation (et de signes)
+% 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} de Daniel Flipo et 
-% \textsf{variations} de Christian Obrecht ou, plus complexes, 
-% \textsf{tablor} de Guillaume Connan et \textsf{tkz-tab} de Alain Matthes.}, 
-% nous avons voulu produire des tableaux de manière automatisée, 
-% y compris pour des tableaux complexes,  
-% mais avec de nombreuses possibilités de réglages et d'ajustements personnels
-% et une haute qualité graphique, en particulier pour le dessin des flèches,
+% \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\ pour 
-% définir un \emph{graphe} de \emph{nœuds} reliés par des flèches,
+% (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 ici est d'utiliser la même syntaxe que les environnements 
+% 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
+% (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, à l'intérieur d'une commande |\variations|,
+% On a simplement besoin de préciser, dans une commande |\variations|,
 % ce qui est en haut et ce qui est en bas.
 %
-% L'extension possède deux options utilisées pour le tracé automatique des flèches : 
-% |pstricks| (par défaut) ou |tikz| (|\usepackage[tikz]{tablvar}|).
-% Pour l'option |pstricks|, il faut compiler avec \texttt{LaTeX + dvips + ps2pdf} ; 
-% pour l'option |tikz|, il faut compiler DEUX fois avec \texttt{pdfLaTeX} 
-% (la première fois les flèches ne sont pas correctement dessinées).
-% Si on veut compiler avec l'option |pstricks| après avoir compilé avec |tikz|, 
-% il faut supprimer le fichier |.aux|, sinon la compilation plante.
+% \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 compilateur PDF (comme pdf\LaTeX\ ou \LuaLaTeX), \texttt{pstricks} sinon
+% (typiquement \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).
 %
-% Cette documentation donne une galerie d'exemples et décrit les commandes 
-% fournies.
+% \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}
 %
-% Un tableau de variation (ou de signes) se définit par un environnement |tablvar|
+% % \DescribeEnv{tablvar}
+% Un tableau de variations (ou de signes) se définit par un environnement |tablvar|
 % qui \emph{doit être en mode mathématiques} (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).
@@ -151,8 +211,7 @@
 %\end{tablvar}
 %\]
 % \begin{verbatim}
-%\[
-%\begin{tablvar}{4}
+%\[\begin{tablvar}{4}
 %    \hline
 %    x & -5 && -1 && 2 && 3 && 5 \\
 %    \hline
@@ -161,177 +220,165 @@
 %    \variations{ \mil{f(x)} & \bas{0} && \haut{2} && \bas{1} && 
 %        \haut{4} && \bas{-3} }
 %    \hline
-%\end{tablvar}
-%\]
+%\end{tablvar}\]
 % \end{verbatim}
 %
-% \vspace{-3ex}
-% \DescribeEnv{tablvar}
 % L'argument obligatoire de l'environnement |tablvar| correspond au nombre 
 % d'intervalles du tableau c'est-à-dire aussi au nombre de flèches (ici 4).
 % Les délimiteurs |&| correspondent aux changements de colonnes 
 % comme pour l'environnement |array|.
-% Outre la 1ère colonne de légendes, il y a deux types de colonnes :
-% des colonnes de \emph{valeurs}, de largeur variable en fonction de leur contenu et centrées,
-% et des colonnes \emph{intervalles} de largeur fixe (|2.5em| par défaut).
+% 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.}.
+% Les flèches ne sont pas contraintes à rester à l'intérieur des colonnes intervalles
+% mais s'ajustent par rapport à la taille effective des valeurs qu'elles relient.
+% Lorsqu'une valeur est trop large, elle déborde automatiquement 
+% dans les colonnes intervalles sans altérer 
+% les largeurs de colonne.
 %
-% \DescribeEnv{tablvar\oarg{largeur}}
-% L'environnement |tablvar| possède un paramètre optionnel pour modifier la
-% largeur des colonnes intervalles.
-% Voici un exemple avec un seul intervalle utilisant l'argument optionnel |4em|
-% pour allonger la largeur de l'intervalle qui sinon apparaîtrait très étroit.
-%
-% \noindent
-% \begin{minipage}[t]{8cm}
-% \begin{verbatim}
-%\[
-%\begin{tablvar}[4em]{1}
-%    \hline
-%    x & -5 && +\infty \\
-%    \hline
-%    \variations{\mil{f(x)} & \haut{2} && 
-%        \bas{-1} }
-%    \hline
-%\end{tablvar}
-%\]
-% \end{verbatim}
-% \end{minipage}
-% \begin{minipage}[t]{4.7cm}
-%\[
-%\begin{tablvar}[4em]{1}
-%    \hline
-%    x & -5 && +\infty \\
-%    \hline
-%    \variations{\mil{f(x)} & \haut{2} && \bas{-1}}
-%    \hline
-%\end{tablvar}
-%\]
-% \end{minipage}
-%
+% \medskip
 % \DescribeMacro{\pos}
-% Les commandes |\haut| et |\bas| ne sont en fait que des alias d'une commande
+% 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
-% ou tableau de signe ont pour indice 0.
-% La partie variations contient par défaut 3 lignes numérotées 1, 2, 3
-% \emph{du haut vers le bas} (dans le sens de l'écriture 
-% et de la construction du tableau). 
-% Le paramètre optionnel \meta{opt} 
-% \footnote{Ce paramètre optionnel n'est pas implémenté et est sans effet pour l'option |tikz|.}
+% 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).
-% Comparer le positionnement des flèches dans les deux exemples suivants. 
 %
-% \DescribeMacro{\variations}
-% C'est la commande |\variations| qui, une fois les nœuds définis,
-% construit ensuite automatiquement les flèches.
+% \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.
 %
-% La commande |\mil|, utilisée pour la première colonne contenant $f(x)$,
-% \DescribeMacro{\pos*} 
-% est un alias reposant sur la commande plus générale \cmd{\pos*}\marg{ligne}\marg{valeur}
-% qui se comporte comme |\pos| mais ne crée pas de nœud pour les flèches.\\
-% \enlargethispage{1ex}
-% \begin{minipage}[t]{7.4cm}
-% \begin{verbatim}
+% 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 & & \frac12 & & 1 \\
+%    x & 0 & & \frac{1}{2} & & +\infty \\
 %    \hline
 %    f'(x) & & + & 0 & - & \\
 %    \hline
-%    \variations{\mil{f(x)} & \bas{2} &&
-%        \haut{f(\frac12)} && \bas{0}
-%    }
+%    \variations{\mil{f(x)} & \bas{2} && 
+%        \haut{f(\frac{1}{2})} && \bas{0}}
 %    \hline
 %\end{tablvar}
-% \end{verbatim}
-% \end{minipage}
-% \begin{minipage}[t]{5.2cm}
-%\[ 
+% \hspace{3.8em}
 %\begin{tablvar}{2}
 %    \hline
-%    x & 0 & & \frac12 & & 1 \\
+%    x & 0 & & \frac{1}{2} & & +\infty \\
 %    \hline
 %    f'(x) & & + & 0 & - & \\
 %    \hline
-%    \variations{\mil{f(x)} & \bas{2} &&
-%        \haut{f(\frac12)} && \bas{0}
-%    }
+%    \variations{\pos*{2}{f(x)} & \pos{3}{2} && 
+%        \pos[t]{1}{f(\frac{1}{2})} && \pos{3}{0}}
 %    \hline
 %\end{tablvar}
 %\]
-% \end{minipage}
-% \\
-% Le même tableau avec les commandes |\pos| 
-% et |\pos*| et l'option |t| pour le max.\\[-1ex]
-% \begin{minipage}[t]{7.4cm}
 % \begin{verbatim}
-%\begin{tablvar}{2}
+%\[\begin{tablvar}{2}
 %    \hline
-%    x & 0 & & \frac12 & & 1 \\
+%    x & 0 & & \frac{1}{2} & & +\infty \\
 %    \hline
-%    f'(x) & & + & 0 & - & \\
+%    f'(x) & & + & 0 & - & \\ 
 %    \hline
-%    \variations{\pos*{2}{f(x)} & \pos{3}{2} &
-%        &\pos[t]{1}{f(\frac12)} && \pos{3}{0}
-%    }
+%    \variations{ \pos*{2}{f(x)} & \pos{3}{2} && 
+%        \pos[t]{1}{f(\frac{1}{2}} && \pos{3}{0} }
 %    \hline
-%\end{tablvar}
+%\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]{5.2cm}
-%\[
-%\begin{tablvar}{2}
+% \begin{minipage}[t]{4.2cm}
+%\[\begin{tablvar}[4em]{1}
 %    \hline
-%    x & 0 & & \frac12 & & 1 \\
+%    x & -5 && +\infty \\
 %    \hline
-%    f'(x) & & + & 0 & - & \\
+%    \variations[2]{\mil{f(x)} & \haut{2} && \bas{-1}}
 %    \hline
-%    \variations{\pos*{2}{f(x)} & \pos{3}{2} &
-%        &\pos[t]{1}{f(\frac12)} && \pos{3}{0}
-%    }
-%    \hline
-%\end{tablvar}
-%\]
+%\end{tablvar}\]
 % \end{minipage}
+% \hypertarget{colvalwidth}{}
 %
-% \DescribeMacro{\fleche}
-% On peut modifier l'aspect des flèches en redéfinissant la macro |\fleche|
-% grâce aux nombreuses options offertes par PSTricks ou \tikz. 
-% Cette redéfinition sera locale si on la place dans l'environnement math du tableau.
-% Ci-dessous des flèches plus fines, plus proches des nœuds et dont la pointe est
-% plus effilée (codé ici pour pstricks uniquement).
-%\[
-%\ifthenelse{\boolean{tikz}}{}{
-%     \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3,
-%            arrowinset=0.5,nodesep=1.5pt]{->}}
-%    }
-%\begin{tablvar}{4}
+% \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 & -5 && 0 && 2 && 3 && 5 \\
+%    x & 0 && 1 && 2 && 3 && 5 \\
 %    \hline
-%    \variations{ \pos*{2}{f(x)} & \pos{3}{-4} && \pos{2}{1} && \pos{2}{1} 
+%    \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èche au milieu, on doit utiliser |\pos{2}| et non |\mil|.
+%\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}
-%\[
-% \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3,
-%    arrowinset=0.5,nodesep=1.5pt]{->}}
-%\begin{tablvar}{4}
+%\[\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}
-%    }
+%        && \pos{1}{4} && \pos{3}{0} }
 %    \hline
-%\end{tablvar}
-%\]
+%\end{tablvar}\]
 % \end{verbatim}
 %
 % \subsection{Tableaux de signes avec barres de séparation}
@@ -338,14 +385,13 @@
 %
 % \DescribeMacro{\barre}
 % La macro |\barre|, présentée dans l'exemple ci-dessous, sert de séparateur 
-% de colonne dans les tableaux de signe. Elle est bien sûr 
-% facultative de même que la partie variations.
-% Ici $f(x)=-4x^3+3x^2+18x-3$ et $f'(x)=6(x+1)(-2x+3)$.
-%\[
-%\begin{tablvar}{3}
+% 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 && \makebox[2.5em]{$-1$} && 
-%        \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\
+%    x & -\infty && -1 && \frac{3}{2} && +\infty \\
 %    \hline
 %    x+1 & & - & \barre[0] & + & \barre & + & \\
 %    \hline
@@ -353,21 +399,17 @@
 %    \hline
 %    \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\
 %    \hline
-%    \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} &&
-%        \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty}
-%    }
+%    \variations{ \mil{\makecell{\mbox{Variations} \\ \mbox{de }f}} & 
+%        \haut{+\infty} && \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty} }
 %    \hline
-%\end{tablvar}
-%\]
-% Les bornes des intervalles ont été placées
-% dans des |\makebox|\oarg{largeur}|{$ $}|,
-% sur la ligne des $x$, pour que les colonnes 
-% soient plus équilibrées (ceci est affaire de goût).
+%\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}
+%\[\begin{tablvar}{3}
 %    \hline
-%    x & -\infty && \makebox[2.5em]{$-1$} && 
-%        \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\
+%    x & -\infty && -1 && \frac{3}{2} && +\infty \\
 %    \hline
 %    x+1 & & - & \barre[0] & + & \barre & + & \\
 %    \hline
@@ -375,146 +417,144 @@
 %    \hline
 %    \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\
 %    \hline
-%    \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} &&
-%        \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty}
-%    }
+%    \variations{ \mil{\makecell{\mbox{Variations} \\ \mbox{de }f}} & 
+%        \haut{+\infty} && \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty} }
 %    \hline
-%\end{tablvar}
-%\end{verbatim}
+%\end{tablvar}\]
+% \end{verbatim}
 %
-% \subsection{Doubles barres et discontinuités}
+% \subsection{Doubles barres, discontinuités et limites}
 %
-% Une double barre s'obtient avec la commande |\bb|. \DescribeMacro{\bb}
-% Pour ne pas tracer de flèche entre deux nœuds (en particulier pour éviter
-% de traverser une double barre), on place la
-% commande |\discont| entre les deux. \DescribeMacro{\discont}
-%\[
-%\begin{tablvar}{2}
+% \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 && 0 && +\infty \\
+%    x & -\infty && 0 &&  +\infty \\
 %    \hline
-%    -\frac{1}{x} & & + & \bb & - & \\
+%    \variations{\mil{\e^{\frac{1}{x}}} & \haut{1} &&
+%        \bas{0} \pos*{2}{\bb} \discont \haut{+\infty} && \bas{1}  }
 %    \hline
-%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb
-%        \discont \haut{+\infty} && \bas{0}
-%    }
+%\end{tablvar}\]
+% La macro |\e| compose le nombre d'Euler $\e$ en romain (forme droite),
+% comme c'est la règle pour les constantes mathématiques 
+% (cf. \textsf{mismath}~\cite{MIS} ou \textsf{frenchmath}~\cite{FR}).
+% \begin{verbatim}
+%\[\begin{tablvar}{2}
 %    \hline
-%\end{tablvar}
-%\]
-% La commande |\dfrac| provient de l'extension \textsf{amsmath} ou peut être redéfinie
-% par |\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}}|.
+%    x & -\infty && 0 &&  +\infty \\
+%    \hline
+%    \variations{\mil{\e^{\frac{1}{x}}} & \haut{1} &&
+%        \bas{0} \pos*{2}{\bb} \discont \haut{+\infty} && \bas{1}  }
+%    \hline
+%\end{tablvar}\]
+% \end{verbatim}
 %
-% \smallskip
-% \begin{verbatim}
-%\begin{tablvar}{2}
+% \hypertarget{firstcolsep}{}
+% \DescribeMacro{\limg} \DescribeMacro{\limd}
+% Les macros |\limg|\oarg{pos}\marg{ligne}\marg{valeur} 
+% et |\limd|\oarg{pos}\marg{ligne}\marg{valeur}
+% 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}).
+%\[\begin{tablvar}[firstcolsep=10pt,intervalwidth=4em]{2}
 %    \hline
 %    x & -\infty && 0 && +\infty \\
 %    \hline
 %    -\frac{1}{x} & & + & \bb & - & \\
 %    \hline
-%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb
-%        \discont \haut{+\infty} && \bas{0}
-%    }
+%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \limg{1}{+\infty} \bb
+%        \discont \limd{1}{+\infty} && \bas{0} }
 %    \hline
-%\end{tablvar}
-% \end{verbatim}
+%\end{tablvar}\]
 %
-% \vspace{-1ex}
-% La syntaxe ci-dessus pose problème lorsque les limites à gauche et à droite 
-% d'une valeur interdite se trouvent sur des lignes différentes,
-% ou que leur contenu n'a pas la même largeur, 
-% car alors la double barre ne serait plus au centre de sa colonne
-% et se trouverait décalée d'une ligne à l'autre.
-%
-% Une première solution est d'interrompre la double barre pour placer
-% les limites qui resteront alors centrées au milieu de la colonne (mais il faut aimer).
-%\[
-%\begin{tablvar}[3em]{4}
+% \DescribeMacro{firstcolsep}
+% Ci-dessus la colonne de légende a été é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{verbatim}
+%\[\begin{tablvar}[firstcolsep=10pt,intervalwidth=4em]{2}
 %    \hline
-%    x & -\infty && -1 && 0 && 1 && +\infty \\
+%    x & -\infty && 0 && +\infty \\
 %    \hline
-%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
-%        \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} &&
-%        \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0}
-%    }
+%    -\frac{1}{x} & & + & \bb & - & \\
 %    \hline
-%\end{tablvar}
-%\]
-% \begin{verbatim}
-%\begin{tablvar}[3em]{4}
+%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \limg{1}{+\infty}  \bb
+%        \discont \limd{1}{+\infty} && \bas{0} }
 %    \hline
-%    x & -\infty && -1 && 0 && 1 && +\infty \\
-%    \hline
-%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
-%        \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} &&
-%        \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0}
-%    }
-%    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
 %
-% \DescribeMacro{\bblim} 
-% La commande |\bblim| résout le problème en gardant, sur chaque ligne, la double barre
-% centrée dans sa colonne, avec des limites à gauche et à droite quelconques
-% et quelles que soient les lignes où celles-ci sont positionnées.
-% Elle prend 4 paramètres qui sont respectivement \meta{ligne} et \meta{limite}
+% \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.
-% Elle trace la double barre, place les limites et gère la discontinuité.
-%\[
-%\begin{tablvar}[2em]{4}
+% 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|.
+%\[\begin{tablvar}{4}
 %    \hline
 %    x & -\infty && -1 && 0 && 1 && +\infty \\
 %    \hline
 %    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
 %        \bblim{3}{-\infty}{1}{+\infty} && \bas{1} &&
-%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0}
-%    }
+%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0} }
 %    \hline
-%\end{tablvar}
-%\]
+%\end{tablvar}\]
 % \begin{verbatim}
-%\begin{tablvar}[2em]{4}
+%\[\begin{tablvar}{4}
 %    \hline
 %    x & -\infty && -1 && 0 && 1 && +\infty \\
 %    \hline
 %    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
 %        \bblim{3}{-\infty}{1}{+\infty} && \bas{1} &&
-%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0}
-%    }
+%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0} }
 %    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
+% \hypertarget{bordercolsep}{}\hypertarget{limsep}{}
 %
-% Un autre exemple avec des limites de largeur assez différentes (placées ici sur la même ligne).
-%\[
-%\begin{tablvar}{3}
+% \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ène au contact de la double barre).
+%\[\begin{tablvar}[bordercolsep=4pt,limsep=3pt]{3}
 %    \hline
-%    x & 0 &  & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\
+%    x & -\infty && 0 && 1 && +\infty \\
 %    \hline
-%    f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\
+%    f'(x) & & + & \bb & - & 0 & + & \\
 %    \hline
-%    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})} 
-%        && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)}
-%    }
+%    \variations{ \mil{x\e^{\frac{1}{x}}} & \bas{-\infty} && 
+%        \bblim{1}{0}{1}{+\infty} && \bas{\e} & & \haut{+\infty} }
 %    \hline
-%\end{tablvar}
-%\]
-% La colonne de valeurs du $\frac{\pi}{2}$ étant très large, 
-% la position des signes \og $-$ \fg{}
-% a été légèrement décalée avec la commande \LaTeX\ |\hspace| qui produit 
-% un espacement horizontal positif ou négatif.
+%\end{tablvar}\]
 % \begin{verbatim}
-%\begin{tablvar}{3}
+%\[\begin{tablvar}[bordercolsep=4pt,limsep=3pt]{3}
 %    \hline
-%    x & 0 &  & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\
+%    x & -\infty && 0 && 1 && +\infty \\
 %    \hline
-%    f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\
+%    f'(x) & & + & \bb & - & 0 & + & \\
 %    \hline
-%    \variations{\mil{f(x)} & \pos{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})}     
-%        && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)}
-%    }
+%    \variations{ \mil{x\e^{\frac{1}{x}}} & \bas{-\infty} && 
+%        \bblim{1}{0}{1}{+\infty} && \bas{\e} & & \haut{+\infty} }
 %    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
 %
 % L'environnement |tablvar*| \DescribeEnv{tablvar*}
@@ -522,790 +562,1277 @@
 % des doubles barres lorsqu'elles se trouvent aux extrémités.
 % La différence avec |tablvar| est que les colonnes
 % de valeurs des extrémités ne sont plus centrées mais alignées à gauche pour
-% le 1ère et à droite pour la dernière.
+% la première et à droite pour la dernière.
 %
-%\[
-%\begin{tablvar*}{2}
+%\[\begin{tablvar*}{2}
 %    \hline
 %    x & 0 && 1 && +\infty \\
 %    \hline
-%    \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && 
-%        \pos{3}{-\infty} }
+%    \variations{ \mil{\ln x -x} & \bb\limd{3}{-\infty} && \haut{-1} && 
+%        \bas{-\infty} }
 %    \hline
 %\end{tablvar*}
-%\qquad
+%\quad
 %\begin{tablvar*}{2}
 %    \hline
 %    x & 0 && 1 && +\infty \\
 %    \hline
 %    \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb}
-%        \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} }
+%        \bas{-\infty} && \haut{-1} && \bas{-\infty} }
 %    \hline
-%\end{tablvar*}
-%\]
+%\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}
+%\[\begin{tablvar*}{2}
 %    \hline
 %    x & 0 && 1 && +\infty \\
 %    \hline
-%    \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && 
-%        \pos{3}{-\infty} }
+%    \variations{ \mil{\ln x -x} & \bb\limd{3}{-\infty} && \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}
-%        \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} }
+%        \bas{-\infty} && \haut{-1} && \bas{-\infty} }
 %    \hline
-%\end{tablvar*}
+%\end{tablvar*}\]
 % \end{verbatim}
+% \hypertarget{ext}{}
 %
-% Si par contre, à l'autre extrémité du tableau, les valeurs ont des largeurs
-% assez différentes, leur alignement non centré peut être corrigé en utilisant
-%  |\hspace|. Ci-dessous, de l'espace a été ajouté à droite du 1.\\
-% \begin{minipage}[t]{7.7cm}
+% \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.7cm}
 % \begin{verbatim}
-%\begin{tablvar*}[3em]{1}
+%\[\begin{tablvar}[extleft,intervalwidth=4em]{1}
 %    \hline
 %    x & 0 && +\infty \\
 %    \hline
 %    \variations{ \mil{1-\dfrac{1}{x}} & \bb 
-%        \bas{-\infty} && \haut{1\hspace{0.5em}}
-%    }
+%        \limd{3}{-\infty} && \haut{1} }
 %    \hline
-%\end{tablvar*}
+%\end{tablvar}\]
 % \end{verbatim}
 % \end{minipage}
 % \begin{minipage}[t]{5cm}
-%\[
-%\begin{tablvar*}[3em]{1}
+%\[\begin{tablvar}[extleft,intervalwidth=4em]{1}
 %    \hline
 %    x & 0 && +\infty \\
 %    \hline
 %    \variations{ \mil{1-\dfrac{1}{x}} & \bb 
-%        \bas{-\infty} && \haut{1\hspace{0.5em}}
-%    }
+%        \limd{3}{-\infty} && \haut{1} }
 %    \hline
-%\end{tablvar*}
-%\]
+%\end{tablvar}\]
 % \end{minipage}
 %
-% \DescribeMacro{\tablvarinit}
-% Enfin, pour personnaliser totalement la définition des colonnes,
-% on peut revenir à l'environnement |array| plutôt que d'utiliser |tablvar|
-% (il faut dans ce cas appeler |\tablvarinit| juste avant |\begin{array}|).
-% Ce qui est essentiel dans cette extension est la macro |\variations|
-% avec les commandes de positionnement
-% et non l'environnement |tablvar| qui n'est qu'un |array| dans lequel
-% on a fixé les définitions de colonnes (et initialisé des variables).
-%
 % \subsection{Valeurs remarquables}
 %
-% Nous appellerons \emph{valeur remarquable}, un valeur supplémentaire
-% que l'on place dans un tableau de variation et qui ne correspond
-% pas à un extremum.
+% 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 de laisser les flèches de variations passer à travers
-% ces valeurs remarquables.
-% Pour chaque valeur remarquable, on place une commande |\vr| sur la ligne
-% des $x$ et une commande |\vr| dans la partie variations. Les valeurs remarquables
-% seront automatiquement reliées par des pointillés 
-% (tracés réalisés dans la commande |\variations|).
+% 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 avec le logarithme népérien où la valeur remarquable
+% Voici un exemple où la valeur remarquable
 % est placée dans la colonne intervalle.\\
 % \begin{minipage}[t]{7.7cm}
 % \begin{verbatim}
-%\begin{tablvar*}[5em]{1}
+%\[\begin{tablvar*}[6em]{1}
 %    \hline
 %    x & 0 & \vr{1} & +\infty \\
 %    \hline
 %    \variations{ \mil{\ln x} & 
-%        \bb \pos{3}{-\infty} & 
-%        \vr{0} & \pos{1}{+\infty} }
+%        \bb \limd{3}{-\infty} & \vr{0} &
+%        \pos[t]{1}{+\infty} }
 %    \hline
-%\end{tablvar*}
+%\end{tablvar*}\]
 % \end{verbatim}
 % \end{minipage}
 % \begin{minipage}[t]{5cm}
-%\[
-%\begin{tablvar*}[5em]{1}
+%\[\begin{tablvar*}[6em]{1}
 %    \hline
 %    x & 0 & \vr{1} & +\infty \\
 %    \hline
 %    \variations{ \mil{\ln x} & 
-%        \bb \pos{3}{-\infty} & 
-%        \vr{0} & \pos{1}{+\infty} }
+%        \bb \limd{3}{-\infty} & \vr{0} & 
+%        \pos[t]{1}{+\infty} }
 %    \hline
-%\end{tablvar*}
-%\]
+%\end{tablvar*}\]
 % \end{minipage}
 %
 % Un autre exemple avec deux valeurs remarquables, placées cette fois 
-% dans des colonnes valeurs.
-%\[ 
-%\renewcommand{\tablvarstretch}{1.2}
-%\begin{tablvar}[1.5em]{3}
+% 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]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && 
-%        \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty}
-%    }
+%    \variations[4]{ \mil{\exp x} & \bas{0} && 
+%        \vr[3]{1} && \vr{\e} && \haut{+\infty} }
 %    \hline
-%\end{tablvar}
-%\]
+%\end{tablvar}\]
 % \begin{verbatim}
-%\renewcommand{\tablvarstretch}{1.2}
-%\begin{tablvar}[1.5em]{3}
+%\[\begin{tablvar}[stretch=1.2,intervalwidth=1em]{3}
 %    \hline
 %    x & -\infty && \vr{0} && \vr{1} && +\infty \\
 %    \hline
-%    \variations[4]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && 
-%        \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty}
-%    }
+%    \variations[4]{ \mil{\exp x} & \haut{0} && 
+%        \vr[3]{1} && \vr{\e} && \bas{+\infty} }
 %    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
-% \vspace{-2ex}
-% \DescribeMacro{\variations\oarg{nblignes}}
-% Ci-dessus, la partie variations a été composée sur 4 lignes grâce au paramètre
-% optionnel de la commande |\variations|. Les lignes sont alors numérotées
-% de 1 (haut) à 4 (bas).\\
+%
+% \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 (2 par défaut).\\
-% \DescribeMacro{\tablvarstretch}
-% À cause des 4 lignes de variations, la hauteur de lignes du tableau 
-% a été réduite en modifiant le facteur
-% |\tablvarstretch| (fixé à 1.4 par défaut), modification locale 
-% car placée à l'intérieur de l'environnement math
-% \footnote{On peut utiliser ce paramètre pour agrandir la hauteur des lignes
-% mais l'effet sera global pour tout le tableau. Si l'on souhaite agrandir
-% spécifiquement une ligne on peut utiliser la commande \texttt{\bslash vstrut}
-% de l'extension \textsf{spacingtricks}. Malheureusement un ajustement automatique
-% comme proposé dans l'extension \textsf{arraycols} ne fonctionne pas,
-% à cause des doubles barres.}.\\
-% \DescribeMacro{\vdecal}
-% Enfin  la légende $\exp x$ a été placée en ligne 2 mais 
-% décalée vers le bas, pour qu'elle se trouve centrée verticalement
-% sachant qu'il y a 4 lignes de variations.
-% Ceci s'obtient grâce à la commande |\vdecal| dont la syntaxe est
-% \cmd{\vdecal}\marg{decal}\marg{contenu} où la valeur du décalage
-% peut être positive (vers le haut) ou négative (vers le bas).
+% 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 s'interrompent sur
-% les valeurs remarquables qui sont alors des nœuds.
-% Voici un tableau qui présente simultanément les deux manières de traiter 
-% les valeurs remarquables.
+% 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 suivant présente un tableau utilisant simultanément  
+% les deux manières de traiter les valeurs remarquables. 
 % La taille des flèches s'ajuste automatiquement.
-% Bien entendu, on peut aussi ne pas tracer les pointillés mais placer
-% quand même une valeur remarquable sur la flèche avec |\mil{0}|.
-%\[
-%\begin{tablvar*}{4}
+% 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} && \alpha_2 && \frac{\pi}{2}\\
+%    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})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb
-%    }
+%        \pos[t]{1}{f(\frac{\pi}{6})} && \posvr{2}{0} &&
+%        \pos[b]{3}{-\infty}\bb }
 %    \hline
-%\end{tablvar*}
-%\]
-% Si on choisit l'option |[t]| pour le max en ligne 1,
-% il est alors nécessaire de choisir l'option |[b]| en ligne 3 pour conserver
+%\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.
 % \begin{verbatim}
-%\begin{tablvar*}{4}
+%\[\begin{tablvar}[extright,intervalwidth=2em]{4}
 %    \hline
-%    x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && \frac{\pi}{2}\\
+%    x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && 
+%        \frac{\pi}{2} \\
 %    \hline
 %    f'(x) && + && + & 0 & - && - & \bb \\
 %    \hline
 %    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \vr{0} &&
-%        \pos[t]{1}{f(\frac{\pi}{6})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb
-%    }
+%        \pos[t]{1}{f(\frac{\pi}{6})} && \posvr{2}{0} &&
+%        \pos[b]{3}{-\infty}\bb }
 %    \hline
-%\end{tablvar*}
+%\end{tablvar}\]
 % \end{verbatim}
 %
+% \vspace{-\baselineskip}
+% \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, voir l'exemple ci-dessous avec la fonction définie par
-%\[ 
-%f(x)=\left\{
+% 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]{7.5cm}
+%\right. .\]
+% \begin{minipage}[t]{6.5cm}
 % \begin{verbatim}
-%\begin{tablvar}{2}
+%\[\begin{tablvar}{2}
 %    \hline
 %    x & -\pi && \vr{0} && \pi \\
 %    \hline
 %    \variations{\mil{f(x)} & \bas{0} && 
-%        \haut{ 1 \hspace{0.2em} } \discont
-%        \vr[3]{0} \haut{ \hspace{0.2em} 1 }
-%        && \bas{0}
-%    }
+%        \limg{1}{1}\hspace{2pt}\discont
+%        \vr[3]{0}\hspace{2pt}\limd{1}{1}
+%        && \bas{0} }
 %    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
 % \end{minipage}
-% \begin{minipage}[t]{5cm}
-%\[
-%\begin{tablvar}{2}
+% \hfill
+% \begin{minipage}[t]{5.5cm}
+%\[\begin{tablvar}{2}
 %    \hline
 %    x & -\pi && \vr{0} && \pi \\
 %    \hline
 %    \variations{\mil{f(x)} & \bas{0} && 
-%        \haut{ 1 \hspace{0.2em} } \discont
-%        \vr[3]{0} \haut{ \hspace{0.2em} 1 }
-%        && \bas{0}
-%    }
+%        \limg{1}{1}\hspace{2pt}\discont
+%        \vr[3]{0}\hspace{2pt}\limd{1}{1}
+%        && \bas{0} }
 %    \hline
-%\end{tablvar}
-%\]
+%\end{tablvar}\]
 % \end{minipage}
 %
 % \medskip
-% Voici un dernier exemple, traité de deux manières différentes,
-% avec des valeurs remarquables dans deux tableaux conjoints. 
-% Avec des nœuds c'est assez simple. 
-%\[
-%\begin{tablvar}{4}
-%    \hline
-%    x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\
-%    \hline
-%    \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} && 
-%        \pos{2}{0} && \haut{1} }
-%    \hline
-%    \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} && 
-%        \bas{-1} && \haut{0} }
-%    \hline
-%\end{tablvar}
-%\]
-% \begin{verbatim}
-%\begin{tablvar}{4}
-%    \hline
-%    x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\
-%    \hline
-%    \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} &&
-%        \pos{2}{0} && \haut{1} }
-%    \hline
-%    \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} &&
-%        \bas{-1} && \haut{0} }
-%    \hline
-% \end{verbatim}
+% Voici un dernier exemple, avec deux tableaux conjoints.
 %
-% \vspace{-2ex}
-% \DescribeMacro{\noeud} \DescribeMacro{\vrconnect}
-% Par contre, pour traiter ici les valeurs remarquables avec des pointillés, 
-% la commande |\vr| ne permet pas connecter les valeurs sur $x$ avec celles du sinus dans
-% le 2\ieme\ tableau, mais on peut le faire \og à la main\fg{} 
-% en appelant les macros |\noeud| et |\vrconnect|.
-%
-%\[
-%\begin{tablvar}{4}
+%\[\begin{tablvar}{4}
 %    \hline
-%    x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} &&
-%        \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\
+%    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} && \haut{\noeud{Y1}{1}} && 
-%        \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} }
+%    \variations{ \mil{\sin x} & \bas{0} && \posvr{1}{1} && 
+%        \vr{0} && \posvr{3}{-1} && \haut{0} }
 %    \hline
-%\end{tablvar}
-%\vrconnect{X1}{Y1}
-%\vrconnect{X2}{Y2}
-%\vrconnect{X3}{Y3}
-%\]
+%\end{tablvar}\]
 % \begin{verbatim}
-%\begin{tablvar}{4}
+%\[\begin{tablvar}{4}
 %    \hline
-%    x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} &&
-%        \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\
+%    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} && \haut{\noeud{Y1}{1}} && 
-%        \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} }
+%    \variations{ \mil{\sin x} & \bas{0} && \posvr{1}{1} && 
+%        \vr{0} && \posvr{3}{-1} && \haut{0} }
 %    \hline
-%\end{tablvar}
-%\vrconnect{X1}{Y1}
-%\vrconnect{X2}{Y2}
-%\vrconnect{X3}{Y3}
+%\end{tablvar}\]
 % \end{verbatim}
 %
 % \subsection{Zones interdites}
 %
-% Nous abordons pour finir le tracé de zones interdites où la fonction
-% n'est pas définie. On peut dessiner ces zones interdites en couleur ou en hachures.
+% 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
-% Pour une zone interdite en couleur, on place la commande |\ZIc|
-% \DescribeMacro{\ZIc}
-% dans les intervalles que l'on veut colorer (signes ou variations).
-% Un exemple avec la fonction $f$ définie par $f(x)=\frac{1}{\sqrt{x^2-1}}$.
-% La zone grisée arrive toujours au contact des doubles barres. 
-%\[
-%\begin{tablvar}[4em]{3}
+% \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 && \zbox{-1} && \zbox{1} && +\infty \\
+%    x & -\infty & & -1 & & 1 & & +\infty \\
+%    \hline  
+%    f'(x) && \hspace{-0.5em} + & \bb & \ZI & \bb & - & \\
 %    \hline
-%    -\frac{x}{\strut\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc & 
-%        \bb & \hspace{1.5em} - & \\
+%    \variations{ \pos*{2}{\sqrt{\dfrac{x-1}{x+1}}}
+%        & \bas{1} && \limg{1}{+\infty} \bb & \ZI
+%        & \bas{0} \barre && \haut{1} }
 %    \hline
-%    \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
-%        \zbox[r]{\haut{+\infty}} \bb & \ZIc & 
-%        \bb \zbox[l]{\haut{+\infty}} && \bas{0}
-%    }
-%    \hline
-%\end{tablvar}
-%\]
-% \DescribeMacro{\zbox}
-% Plusieurs \og interventions\fg{} manuelles sont nécessaires.
-% D'abord sur la ligne des $x$, il faut permettre aux bornes
-% de déborder sur la colonne de la zone interdite.
-% Pour cela on les place dans une |\zbox|.
-% La commande \cmd{\zbox}\oarg{pos}\marg{contenu} 
-% affiche son contenu mais considère la largeur comme nulle.
-% Le 1\ier\ paramètre (optionnel) est le positionnement dans la boite : 
-% |c| (par défaut), |l| (left) ou |r| (right).
-% Ici |zbox| est aussi nécessaire pour annuler la largeur des
-% boites contenant les $+\infty$ sinon la double barre ne serait
-% plus au centre de sa colonne, en ligne 1, ce qui produirait
-% un décalage avec les autres lignes.\\
-% La deuxième ligne avec la racine cubique a été agrandie grâce à la commande \LaTeX\ |\strut|.
-% Enfin, les signes ont été décalés avec |\hspace|, pour améliorer
-% leur centrage par rapport aux flèches.
+%\end{tablvar}\]
+%
 % \begin{verbatim}
-%\begin{tablvar}[4em]{3}
+%\[\begin{tablvar}{3}
 %    \hline
-%    x & -\infty && \zbox{-1} && \zbox{1} && +\infty \\
+%    x & -\infty & & -1 & & 1 & & +\infty \\
+%    \hline  
+%    f'(x) && \hspace{-0.5em} + & \bb & \ZI & \bb & - & \\
 %    \hline
-%    -\frac{x}{\strut\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc &
-%        \bb & \hspace{1.5em} - & \\
+%    \variations{ \pos*{2}{\sqrt{\dfrac{x-1}{x+1}}}
+%        & \bas{1} && \limg{1}{+\infty} \bb & \ZI
+%        & \bas{0} \barre && \haut{1} }
 %    \hline
-%    \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
-%        \zbox[r]{\haut{+\infty}} \bb & \ZIc & 
-%        \bb \zbox[l]{\haut{+\infty}} && \bas{0}
-%    }
-%    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
 %
-% Un autre exemple avec $f(x)=\sqrt{2x^2-1}$ où
-% les doubles barres n'apparaissent que sur la dérivée.
-%\[
-%\begin{tablvar}[3em]{3}
+% \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 && \zbox{-\frac{\sqrt{2}}{2}} &&
-%        \zbox{\frac{\sqrt{2}}{2}} && +\infty \\
+%    x & -\infty && -1 && 1 && +\infty \\
 %    \hline
-%    \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\
+%    -\frac{x}{\strut\sqrt{x^2-1}^3} &&  + & \bb & \ZI & \bb & - & \\
 %    \hline
-%    \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}}
-%        & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty}
-%    }
+%    \variations{\pos*{2}{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
+%        \limg{1}{+\infty} \bb & \ZI & 
+%        \bb \limd{1}{+\infty} && \bas{0} }
 %    \hline
-%\end{tablvar}
-%\]
+%\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}[3em]{3}
+%\[\begin{tablvar}[ZItype=c,intervalwidth=3.5em]{3}
 %    \hline
-%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
-%        \zbox{\frac{\sqrt{2}}{2}} && +\infty \\
+%    x & -\infty && -1 && 1 && +\infty \\
 %    \hline
-%    \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\
+%    -\frac{x}{\strut\sqrt{x^2-1}^3} &&  + & \bb & \ZI & \bb & - & \\
 %    \hline
-%    \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}}
-%        & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty}
-%    }
+%    \variations{\pos*{2}{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
+%        \limg{1}{+\infty} \bb & \ZI & 
+%        \bb \limd{1}{+\infty} && \bas{0} }
 %    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
+% \hypertarget{ZIcolor}{} 
 %
-% \DescribeMacro{\ZIh}%
-% Voyons à présent la réalisation de tableaux avec zones interdites hachurées.
-% On place la commande |\ZIh| dans les intervalles que l'on veut hachurer.
-%\[
-%\begin{tablvar}{3}
+% \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 la solution est de compiler avec \XeLaTeX.
+% 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 & & \zbox{-\frac{\sqrt{2}}{2}}& &
-%    \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\
+%    x & -\infty && -\frac{\sqrt{2}}{2} && \frac{\sqrt{2}}{2} && +\infty \\
 %    \hline
-%    f'(x) & & - & \bb & \ZIh & \bb & + & \\
+%    \frac{2x}{\sqrt{2x^2-1}} \cstrut{2.5ex} && - & \bb & \ZI & \bb & + & \\
 %    \hline
-%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} &
-%        \ZIh & \bas{0} && \haut{+\infty}
-%    }
+%    \variations{ \mil{\sqrt{2x^2-1}} & \haut{+\infty} && \bas{0} \barre
+%        & \ZI & \bas{0} \barre && \haut{+\infty} }
 %    \hline
-%\end{tablvar}
-%\]
-% Pour les mêmes raisons que précédemment, les |\zbox| sont toujours 
-% nécessaires sur la ligne des $x$, mais plus pour les 0.
+%\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}{3}
+%\[\begin{tablvar}[ZItype=c,ZIcolor=green,ZIaddwidth=1pt]{3}
 %    \hline
-%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
-%        \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\
+%    x & -\infty && -\frac{\sqrt{2}}{2} && \frac{\sqrt{2}}{2} && +\infty \\
 %    \hline
-%    f'(x) && - & \bb & \ZIh & \bb & + & \\
+%    \frac{2x}{\sqrt{2x^2-1}} \cstrut{2.5ex} && - & \bb & \ZI & \bb 
+%        & + & \\
 %    \hline
-%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} &
-%        \ZIh & \bas{0} && \haut{+\infty} }
+%    \variations{ \mil{\sqrt{2x^2-1}} & \haut{+\infty} && \bas{0} \barre
+%        & \ZI & \bas{0} \barre && \haut{+\infty} }
 %    \hline
-%\end{tablvar}
+%\end{tablvar}\]
 % \end{verbatim}
 %
-% \DescribeMacro{\ZIh\oarg{hauteur}}
-% Les hachures s'ajustent automatiquement lorsque toutes les lignes 
-% ont une hauteur standard.
-% Si par contre des lignes sont plus hautes à cause de leur contenu,
-% on doit ajouter de la hauteur avec \cmd{\ZIh}\oarg{hauteur} (réglage manuel).
-%\[
-%\begin{tablvar}[3.5em]{3}
+% Si des extrema de grande taille sont placés dans la partie 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 permettra
+% éventuellement une gestion automatisée des hauteurs de ligne dans une version future.}.
+% Cette modification peut se faire 
+% avec \texttt{stretch} ou avec |\vstrut|\oarg{depth}\marg{height}
+% \emph{qu'il faut placer dans la toute 1\iere colonne} pour 
+% que |\ZI| prenne en compte sa hauteur.
+% Dans l'exemple suivant, \texttt{stretch=2.2} aurait donné le même résultat pour 
+% les variations mais une ligne des $x$ plus haute.
+%
+%\[\begin{tablvar}[4em]{4}
 %    \hline
-%    x & -\infty & &\zbox{-1} &&\zbox{1} & & +\infty \\
-%    \hline  
-%    f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\
+%    x & -\infty && -1 && 0 && 1 && +\infty \\
 %    \hline
-%    \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}}
-%        & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2ex]
-%        & \zbox{\bas{0}} \barre  && \haut{1}
-%    }
+%    \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}
-%\]
-% On remarquera ici l'utilisation de |\barre| dans la partie variations qui
-% oblige à placer le 0 dans une |\zbox| sans quoi la barre serait décalée après le 0.
+%\end{tablvar}\]
 % \begin{verbatim}
-%\begin{tablvar}[3.5em]{3}
+%\[\begin{tablvar}[4em]{4}
 %    \hline
-%    x & -\infty & &\zbox{-1} && \zbox{1} && +\infty \\
-%    \hline  
-%    f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\
+%    x & -\infty && -1 && 0 && 1 && +\infty \\
 %    \hline
-%    \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}}
-%        & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2ex]
-%        & \zbox{\bas{0}} \barre  && \haut{1}
-%    }
+%    \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{tablvar}\]
 % \end{verbatim}
 %
-% Voici un exemple avec deux zones interdites. On considère la fonction $f$ telle que
-% $f(x)= \sqrt{(x^2-1)(x^2-4)}$.
-%{ \footnotesize
-%\[ 
-%\begin{tablvar}{6}
+% 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 && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} 
-%        && +\infty \\
+%    x & -\infty && -2 && -1 && 0 && 1 && 2 && +\infty \\
 %    \hline
-%    2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\
+%    x & &-& \barre & \ZI & \barre &-& \barre[0] &+& \barre & \ZI & \barre &+& \\
 %    \hline
-%    2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre &&
+%    2x^2-5 & &+& \barre & \ZI & \barre &-& \barre &-& \barre & \ZI &
 %        \barre &+& \\
 %    \hline
-%    f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\
+%    f'(x) & &-& \bb & \ZI & \bb &+& \barre[0] &-& \bb & \ZI & \bb &+& \\
 %    \hline
-%    \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre
-%        & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}}
-%        \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty}
-%    }
+%    \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{tablvar}\]
 %}
-% La commande |\ZIh| \emph{ne doit pas être placée deux fois dans une même ligne de signe}
-% car, sauf sur la dernière ligne des variations où elle trace les hachures, 
-% son effet est simplement de cumuler la hauteur de la ligne.
-% Et comme toutes les lignes de signes ont le même numéro 0, la commande |\ZIh|,
-% dans la partie signes, ne sait pas sur quelle ligne elle se trouve
-% et cumule la hauteur de ligne à chaque appel.
 % \begin{verbatim}
-%\begin{tablvar}{6}
+%{ \small \[\begin{tablvar}[2em]{6}
 %    \hline
-%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} 
-%        && +\infty \\
+%    x & -\infty && -2 && -1 && 0 && 1 && 2 && +\infty \\
 %    \hline
-%    2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\
+%    x & &-& \barre & \ZI & \barre &-& \barre[0] &+& \barre & \ZI & 
+%        \barre &+& \\
 %    \hline
-%    2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre &&
+%    2x^2-5 & &+& \barre & \ZI & \barre &-& \barre &-& \barre & \ZI &
 %        \barre &+& \\
 %    \hline
-%    f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\
+%    f'(x) & &-& \bb & \ZI & \bb &+& \barre[0] &-& \bb & \ZI & \bb &+& \\
 %    \hline
-%    \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre
-%        & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}}
-%        \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty}
-%    }
+%    \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{tablvar}\] }
 % \end{verbatim}
 %
-% \DescribeMacro{\ZIh*}
-% Lorsqu'on ne fait qu'un tableau de signes (sans variations), 
-% il faut utiliser la commande |\ZIh*| pour déclencher le tracé des hachures.
-% Celle-ci doit être placée sur la dernière ligne de chaque bloc de hachures.
-% Sur les lignes précédentes, le |\ZIh| peut être placé n'importe où
-%  (une seule fois par ligne).
+% \DescribeMacro{\hachure} 
+% Lorsque l'on dessine des zones interdites hachurées
+% sur plusieurs colonnes contiguës, 
+% les hachures seront en général discontinues. 
+% 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}{6}
+%\[ \begin{tablvar}[intervalwidth=1.8em,ZIaddwidth=1pt]{8}
 %    \hline
-%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1}  && \zbox{2} 
-%        && +\infty \\
+%    x & -\infty && -2 && -\sqrt{\frac{5}{2}} && -1
+%    && 0 && 1 && \sqrt{\frac{5}{2}} && 2 && +\infty \\
 %    \hline
-%    2x & &-& \barre && \barre  &-& \barre[0] &+& \barre &&
-%        \barre{} &+& \ZIh \\
+%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
+%    \barre &+& \barre &+& \barre &+& \\
 %    \hline
-%    2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre &&
-%        \barre{} &+& \ZIh \\
+%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
+%    \barre &-& \barre[0] &+& \barre &+& \\
 %    \hline
-%    f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\
+%    f'(x) & &-& \bb & \ZI & \barre & \ZI & \bb &+& 
+%    \barre[0] &-& \bb & & & & \bb & + & \\
 %    \hline
-%\end{tablvar}
-%\]
-%}
+%    \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} \] }
+%
+% Pour hachurer une zone donnée, 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}
-%\begin{tablvar}{6}
+%{ \footnotesize
+%\[ \begin{tablvar}[intervalwidth=1.8em,ZIaddwidth=1pt]{8}
 %    \hline
-%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1}  && \zbox{2} 
-%        && +\infty \\
+%    x & -\infty && -2 && -\sqrt{\frac{5}{2}} && -1
+%    && 0 && 1 && \sqrt{\frac{5}{2}} && 2 && +\infty \\
 %    \hline
-%    2x & &-& \barre & & \barre  &-& \barre[0] &+& \barre &&
-%        \barre{} &+& \ZIh \\
+%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
+%    \barre &+& \barre &+& \barre &+& \\
 %    \hline
-%    2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre &&
-%        \barre{} &+& \ZIh \\
+%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
+%    \barre &-& \barre[0] &+& \barre &+& \\
 %    \hline
-%    f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\
+%    f'(x) & &-& \bb & \ZI & \barre & \ZI & \bb &+& 
+%    \barre[0] &-& \bb & & & & \bb & + & \\
 %    \hline
-%\end{tablvar}
+%    \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}
 %
-% Si on veut tracer des rectangles de hachures sur des lignes non contiguës,
-% il faut un appel à |\ZIh*| pour chaque rectangle.
-%\[
-%\begin{tablvar}{4} 
+% \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 && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && 
-%        +\infty \\
+%    x & -\infty && -1 && 1 && 2 && +\infty \\
 %    \hline
-%    \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\
-%    \hline
 %    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
 %    \hline
-%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZIinit\ZIh* & \barre[0] & - & 
+%    \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}
-%\]
-% \smallskip
+%\end{tablvar}\]
 % \begin{verbatim}
-%\begin{tablvar}{4}
+%\[\begin{tablvar}{4} 
+%    \hline 
+%    x & -\infty && -1 && 1 && 2 && +\infty \\
 %    \hline
-%    x & -\infty && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && 
-%        +\infty \\
+%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
 %    \hline
-%    \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\
+%    \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] & \ZIinit\ZIh* & \barre[0] & - & 
+%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & 
 %        \barre[0] & + & \\
 %    \hline
-%\end{tablvar}
+%\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}
-% \vspace{-3ex}
-% Ci-dessus, la commande \LaTeX\ |\phantom{0}| sur la ligne des $x$ permet de créer une
-% boite fantôme de la largeur du 0, pour éviter que la largeur de la colonne
-% valeur ne soit complètement nulle produisant un chevauchement inélégant
-% des 0 sur les hachures.\\
-% \DescribeMacro{\ZIinit}
-% L'appel à |\ZIinit| sur la dernière ligne permet de ne pas
-% conserver la hauteur cumulée lors du précédent appel à |\ZIh*|
-% (en fait inutile ici car la 1ère zone hachurée ne fait qu'une seule ligne de haut).
 %
+% \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{\hachure}
-% On ne peut pas dessiner des zones interdites hachurées
-% sur plusieurs colonnes contiguës avec |\ZIh|,
-% mais on peut alors utiliser la primitive graphique |\hachure| 
-% pour définir manuellement le rectangle à hachurer.
+% \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 |{...}|),
+% avec des variables spécifiques 
+% ou (depuis la version 2.0) avec la commande |\tablvarset|\marg{keyval}, 
+% utilisant le mécanisme \emph{clé=valeur}.
 %
-%{ \footnotesize
-%\[
-%\begin{tablvar}{8}
+% \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
-%    x & -\infty && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} 
-%        && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\
+%    \textsf{Option} & \textsf{Valeur par défaut} & 
+%    \textsf{Variable associée} \\
 %    \hline
-%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
-%        \barre &+& \barre &+& \barre &+& \\
+%    \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
-%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
-%        \barre &-& \barre[0] &+& \barre &+& \\
+% \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 ajuster la hauteur d'une ligne particulière, on dispose de la 
+% macro \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 de \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
-%    f'(x) & &-& \bb & & \hachure{-4em,-12.8ex}{4em,2.6ex} & & \bb &+&
-%        \barre[0] &-& \bb & &  & & \bb & + & \\
+%    x & -\infty && -2 && 0 && +\infty \\
 %    \hline
-%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont &&  &&
-%        \bas{0} && \haut{2} && \bas{0} \discont &&
-%        \pos*{3}{\hachure{-4em,14.3ex}{4em,-1.2ex}} && \bas{0} && 
-%        \haut{+\infty}
-%    }
+%    -\frac{x+2}{x^4} && - & \barre[0] & +  & \bb & - & \\
 %    \hline
-%\end{tablvar}
-%\]
-%}
-% Si l'on ne dispose pas de ligne de signe pour placer la commande |\hachure|,
-% on peut la placer sur la ligne des $x$ ou dans la partie variations mais
-% il faut alors mettre celle-ci dans un |\pos*| sinon elle sera répétée pour chaque
-% ligne des variations.
+%    \variations{\mil{\e^{\frac{x+1}{x^2}}} & \haut{1} && \bas{\e^{-\frac{1}{4}}}
+%        && \bblim{1}{+\infty}{1}{+\infty} && \bas{1} }
+%    \hline
+%\end{tablvar} \]
 % \begin{verbatim}
-%\begin{tablvar}{8}
+%\[ \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 && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} 
-%        && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\
+%    x & -\infty && -2 && 0 && +\infty \\
 %    \hline
-%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
-%        \barre &+& \barre &+& \barre &+& \\
+%    -\frac{x+2}{x^4} && - & \barre[0] & +  & \bb & - & \\
 %    \hline
-%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
-%        \barre &-& \barre[0] &+& \barre &+& \\
+%    \variations{\mil{\e^{\frac{x+1}{x^2}}} & \haut{1} && 
+%        \bas{\e^{-\frac{1}{4}}} && \bblim{1}{+\infty}{1}{+\infty} && 
+%        \bas{1} }
 %    \hline
-%    f'(x) & &-& \bb & &\hachure{-4em,-12.8ex}{4em,2.6ex} & & \bb &+&
-%        \barre[0] &-& \bb & &  & & \bb & + & \\
+%\end{tablvar} \]
+% \end{verbatim}
+% 
+% \subsection{Nouveautés de la version 2.0}
+%
+% Cette version 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 le moteur pdf\LaTeX\
+% qui ne supporte pas le code PSTricks.
+%
+% \item \emph{Les colonnes de valeurs ont des largeurs fixes (\texttt{2em} 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} à \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 |\haut|, |\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}
+%
+% \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.
+
+% \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]{7cm}
+% \begin{verbatim}
+%\[\begin{tabvar}{|C|CCCCR|}
 %    \hline
-%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont &&  &&
-%        \bas{0} && \haut{2} && \bas{0} \discont &&
-%        \pos*{3}{\hachure{-4em,14.3ex}{4em,-1.2ex}} && \bas{0} && 
-%        \haut{+\infty}
-%    }
+%    x & 0 & & \frac{1}{2} & & 1 \\ 
 %    \hline
-%\end{tablvar}
+%    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]{5cm}
+%\[\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}
 %
-% \pagebreak
+% \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 avantages 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 quelques différences avec \textsf{tablvar} :
+% \begin{itemize}
+% \item un tableau n'est pas globalement en mode mathématique, il faut donc mettre les 
+% \$ du mode math autour de chaque valeur,
+% \item les hauteurs de ligne doivent être précisées de manière explicite et
+% ne peuvent être données qu'en cm (unité fixe qui ne s'ajuste pas à la fonte),
+% \item \textsf{tablvar} offre la possibilité de mettre des 0 par dessus les flèches,
+% \item les double barres aux extrémités du tableau sont assez éloignées des filets,
+% ce qui peut donc laisser un certain blanc 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}
+% \subsection{Extensions requises et options du package}
 %
 %    \begin{macrocode}
 \RequirePackage{array}
 \RequirePackage{ifthen}
 \RequirePackage{multido}
-\RequirePackage{colortbl} % pour \ZIc
+\RequirePackage{xkeyval}
+\RequirePackage{ifpdf}
 
-\newboolean{tikz}
-\DeclareOption{tikz}{\setboolean{tikz}{true}}
-\DeclareOption{pstricks}{\setboolean{tikz}{false}} % valeur par défaut
+\newif\iftv at tikz % false par défaut
+\DeclareOption{tikz}{\tv at tikztrue}
+\newif\iftv at pstricks
+\DeclareOption{pstricks}{\tv at pstrickstrue}
 \ProcessOptions \relax
 
-\ifthenelse{\boolean{tikz}}{
+\iftv at pstricks
+    \ifpdf
+        \PackageError{tablvar}{Don't use the pstricks option with PDF engines}{}
+    \else
+        \PackageInfo{tablvar}{PSTricks option is used}
+    \fi
+\else\iftv at tikz
+    \PackageInfo{tablvar}{tikz option is used.
+        \MessageBreak
+        Run twice to draw the arrows correctly}
+\else\ifpdf
+    \PackageWarningNoLine{tablvar}{PDF engine is used, 
+        I'm using the tikz option.
+        \MessageBreak
+        Run twice to draw the arrows correctly}
+    \tv at tikztrue
+\else
+    \PackageWarningNoLine{tablvar}{PDF engines not used, 
+        I'm using the pstricks option}
+    \tv at pstrickstrue
+\fi\fi\fi
+    
+\iftv at tikz
     \RequirePackage{tikz}
     \usetikzlibrary{patterns}
-    \newlength{\tikznode at below}
-    }{
+    \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}
+% \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,
-% mais qui n'ont en principe pas besoin d'être touchés.
+% 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 à 2.5~em.
+% valeur prédéfinie à \texttt{3em}.
 %    \begin{macrocode}
 \newlength{\intervalwidth}
-\setlength{\intervalwidth}{2.5em} % largeur des "intervalles"
+\setlength{\intervalwidth}{3em} % largeur des "intervalles"
 %    \end{macrocode}
 % \end{macro}
 
-% \begin{macro}{\bordercolsep}
-% Définit la largeur de l'espace extérieur des première et dernière colonnes de valeurs.
-% Sa valeur par défaut a été réduite par rapport à la longueur \LaTeX\ standard 
-%|\arraycolsep| afin que les valeurs des extrémités (souvent des $\infty$) 
-% soient plus proches des lignes verticales de début et de fin.
+% \begin{macro}{\colvalwidth}
+% Définit la largeur des colonnes de valeurs,
+% valeur prédéfinie à \texttt{2em}. 
 %    \begin{macrocode}
-\newlength{\bordercolsep} % largeur de l'espace inter-colonne
-\setlength{\bordercolsep}{2pt}
+\newlength{\colvalwidth}
+\setlength{\colvalwidth}{2em} % largeur des colonnes de valeurs
 %    \end{macrocode}
 % \end{macro}
 
-% \begin{macro}{\innercolsep}
-% Définit la largeur entre les colonnes valeurs et les colonnes intervalles du tableau.
-% Cette largeur a été ajustée pour que les zones interdites grisées avec |\cellcolor| 
-% arrivent au contact de la double barre. 
+% \begin{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{\innercolsep}
-\setlength{\innercolsep}{4pt}
+\newlength{\firstcolsep}
+\setlength{\firstcolsep}{5pt} % valeur LaTeX par défaut
 %    \end{macrocode}
 % \end{macro}
 
-%\begin{macro}{maxdiscount}
-% La gestion de discontinuités permettant de ne pas relier les flèches l'une à l'autre
-% se fait grâce à la commande |\discont|.
-% Le compteur |maxdiscont| est fixé à 3 par défaut ; il faut l'augmenter si l'on veut
-% produire un tableau de variation avec plus de 3 discontinuités.
+% \begin{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}
-\newcounter{maxdiscont}
-\setcounter{maxdiscont}{3} % nb max de discontinuités
+\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 1.4 (1 correspondant 
+% des lignes du tableau. La valeur par défaut est \texttt{1.6} (1 correspondant 
 % à la valeur standard d'un environnement |array|).
-% Placée dans un environnement math, elle sera locale à cet environnement.
 %    \begin{macrocode}
-\newcommand{\tablvarstretch}{1.4}
+\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 at key{tablvar}{intervalwidth}{\setlength{\intervalwidth}{#1}}
+\define at key{tablvar}{colvalwidth}{\setlength{\colvalwidth}{#1}}
+\define at key{tablvar}{firstcolsep}{\setlength{\firstcolsep}{#1}}
+\define at key{tablvar}{bordercolsep}{\setlength{\bordercolsep}{#1}}
+\define at key{tablvar}{limsep}{\setlength{\limsep}{#1}}
+\define at key{tablvar}{stretch}{\renewcommand{\tablvarstretch}{#1}}
+\define at boolkey{tablvar}[]{extleft}[true]{} % false si non appelé
+\define at boolkey{tablvar}[]{extright}[true]{}
+\define at choicekey{tablvar}{ZItype}{h,c}{\renewcommand{\ZItype}{#1}}
+\define at key{tablvar}{ZIcolor}{\definecolor{ZIcolor}{named}{#1}}
+\define at 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 : 0.5~pt par défaut.
+% 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}
 
-% \subsection{Les commandes graphiques PSTricks/\tikz}
+% \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}
+
+% \subsection{Les commandes graphiques PSTricks/\TikZ} \label{graph}
 %
 % Nous présentons ici les commandes graphiques permettant le dessin 
 % des flèches,
@@ -1314,59 +1841,61 @@
 % (plus précisément liées à l'extension \textsf{pst-node}).
 %
 % \begin{macro}{\fleche}
-% La commande \cmd{\fleche}\marg{noeud1}\marg{noeud2} possède deux paramètres
+% 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 réalisé automatiquement par la commande |\variations|.
-% Pour modifier l'aspect des flèches on peut redéfinir la commande.
+% 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]{
-    \ifthenelse{\boolean{tikz}}{
+    \iftv at 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{noeud1}\marg{noeud2}
+% 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 : lignes en pointillés d'épaisseur 1\,pt.
+% Par défaut, les lignes sont en pointillés d'épaisseur \texttt{1pt}.
 %    \begin{macrocode}
 \newcommand*{\vrconnect}[2]{
-    \ifthenelse{\boolean{tikz}}{
-        \tikz[remember picture,overlay]{\draw[dotted,line width=1pt] 
+    \iftv at 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{noeud}\marg{valeur}
+% \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), 
+% le 1\ier\ paramètre, optionnel, correspond à l'option |t| (top), 
 % |b| (bottom) ou |c| (centered, par défaut) permettant d'ajuster
-% la manière dont la flèche arrive sur le nœud (sans effet pour |tikz|) ;
+% 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]{
-    \ifthenelse{\boolean{tikz}}{
-        \tikz[remember picture,baseline]{
-            \node[anchor=base,inner sep=0,outer sep=4] (#2) {$#3$};
-        } % l'option de placement (#1) n'est pas implémentée pour tikz
-    }{
+    \iftv at 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}
@@ -1376,32 +1905,53 @@
 % 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. 
+% 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]{
-    \ifthenelse{\boolean{tikz}}{
-        \tikz[remember picture,overlay]{\fill[pattern=north east lines] 
+    \iftv at 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 at 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{ligne} % numéro de ligne
-\newcounter{noeud} % numéro du nœud
+\newcounter{var at ligne} % numéro de ligne des variations
+\newcounter{var at noeud} % numéro du nœud des variations
 \newcounter{numvr} % numéro de la valeur remarquable
+\newcounter{nb at 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 $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}
@@ -1412,122 +1962,243 @@
 }
 %    \end{macrocode}
 
-% Longueurs et compteurs pour la commande |\ZIh|.
+% La commande |\mil| positionne son contenu sur la colonne 2,
+% mais réalise un décalage vertical si le nombre de lignes de variations diffère de 3.
+% Pour cela nous avons besoin d'une variable de dimension et d'un compteur.
 %    \begin{macrocode}
+\newlength\mil at heightshift
+\newcounter{mil at rowshift}
+%    \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 at 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{ZI} % numéro de la ZI
-\newcounter{ZIstar} % numéro de ZI pour la commande \ZI*
-\newcounter{ZIvarlignes} % dernière ligne des variations
+\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 at icol} % numéro de colonne "intervalle"
+\newcounter{tv at row} % numéro de ligne du tableau
+\newsavebox{\tv at cellbox}
+\newlength{\tv at cellheight}
+\newlength{\tv at celldepth}
 %    \end{macrocode}
 
 % \bigskip
 % \subsection{Les environnements \texttt{tablvar} et \texttt{tablvar*}}
 %
-% Grâce à l'extension \textsf{array} nous pouvons définir un nouveau type de colonnes 
-% pour les intervalles : |i|.
-%    \begin{macrocode}
-\newcolumntype{i}[1]{>{\centering\arraybackslash $}p{#1}<{$}}
-    % nouveau type de colonne i pour les intervalles
-%    \end{macrocode}
-
 % \begin{macro}{\tablvarinit}
 % \changes{v1.1}{13/04/2019}{ajouté \bslash extrarowheight}
 % Cette commande d'initialisation des compteurs est appelée
-% au début de chaque environnement |tablvar| ou |tablvar*|.
+% au début de chaque environnement |tablvar|.
+% On retire 1 à |nb at 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 
-% dans l'environnement |tablvar|.
+% à l'environnement |tablvar|.
+% L'instruction |\setcounter{var at 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}{
+\newcommand*{\tablvarinit}[1]{
     \setlength{\extrarowheight}{0pt} % paramètre de l'extension array
-    \renewcommand{\arraystretch}{\tablvarstretch} 
-    \setcounter{ligne}{0}
+    \renewcommand{\arraystretch}{\tablvarstretch}
+    \setlength{\arrayrulewidth}{\tvrulewidth}
+    \setcounter{var at ligne}{0}
     \setcounter{numvr}{0}
+    \setcounter{tv at row}{0}
+    \setcounter{nb at intervals}{#1}
+    \addtocounter{nb at intervals}{-1}
 }
 %    \end{macrocode}
 % \end{macro}
 
 % \begin{macro}{\ZIinit}
-% Initialisation des longueurs et compteurs pour la commande |\ZIh|.
-% Prend un argument (optionnel) qui est la largeur des colonnes intervalles
-% (car il faut la sauvegarder dans |\ZIwidth|)
-% et qui est passé automatiquement par |tablvar|.
+% 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}[1][\intervalwidth]{
-    \setlength{\ZIheight}{0pt}
-    \setlength{\ZIdepth}{0pt}
-    \setlength{\ZIwidth}{#1}
-    \setcounter{ZI}{0}
-    \setcounter{ZIstar}{0}
-    \setcounter{ZIvarlignes}{3} 
-    % doit être non nul pour \ZIh si tableau de signe seul
+\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{environment}{tablvar}
-% L'environnement |tablvar| : |\begin{tablvar}|\oarg{width}\marg{nbintervals}.
-% Le 1\ier\ paramètre (optionnel) permet de régler la largeur des colonnes 
-% intervalles (définie par |\intervalwidth|
-% par défaut), le 2\ieme\ paramètre (obligatoire) est le nombre d'intervalles.
-% Cet environnement n'est rien d'autre qu'un |array| dans lequel on a réglé
-% les options de colonages.
-% Les colonnes de valeurs sont de type |c| et les colonnes d'intervalles de type |i|
+% \begin{macro}{\tv at saveheight}
+% 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} de Josselin Noirel
-% ne fonctionne pas ici : les double-barres ne sont pas correctement dessinées.}.
+% 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 at saveheight|.
 %    \begin{macrocode}
-\newenvironment{tablvar}[2][\intervalwidth]{
-    \tablvarinit
-    \ZIinit[#1]
-    \begin{array}{%
-        |c|@{\hspace{\bordercolsep}}%
-        *{#2}{c@{\hspace{\innercolsep}}%
-            i{#1}@{\hspace{\innercolsep}}%
-        }%
-        c@{\hspace{\bordercolsep}}|%
-    }    
-}{\end{array}}
+\newcommand\tv at saveheight{%
+    \tv at cellheight=0pt
+    \tv at celldepth=0pt
+    \ifdim \ht\tv at cellbox > \ht\@arstrutbox
+        \global\advance\tv at cellheight by \ht\tv at cellbox
+    \else
+        \global\advance\tv at cellheight by \ht\@arstrutbox
+    \fi
+    \ifdim \dp\tv at cellbox > \dp\@arstrutbox
+        \global\advance\tv at celldepth by \dp\tv at cellbox
+    \else
+        \global\advance\tv at celldepth by \dp\@arstrutbox
+    \fi
+}
 %    \end{macrocode}
-% \end{environment}
+% \end{macro}
 
-% \begin{environment}{tablvar*}
-% L'environnement |tablvar*| est une variante de |tablvar| (même syntaxe)
-% où la première et la dernière colonnes de valeurs sont alignées respectivement
-% à gauche (|l|) et à droite (|r|).
-% Ceci est utile lorsqu'il y a une double barre à l'une des extrémités.
+% \begin{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 at icol}. 
+% La première colonne de légende, 
+% remet à zéro le compteur \texttt{tv at col} et incrémente le compteur de ligne
+% \texttt{tv at 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}
-\newcounter{nb at intervals}
-\newenvironment{tablvar*}[2][\intervalwidth]{
-    % environnement tablvar* , type l et r pour les extrémités
-    \tablvarinit
-    \ZIinit[#1]
-    \setcounter{nb at intervals}{#2}
-    \addtocounter{nb at intervals}{-1}
+\newcommand{\tvcoltypes}{
+    % type de colonne A pour les légendes à gauche du tableau
+    \newcolumntype{A}{%
+        >{\setcounter{tv at icol}{0}\stepcounter{tv at row}\begin{lrbox}%
+            \tv at cellbox $}%
+        c%
+        <{$\end{lrbox}\usebox{\tv at cellbox}\tv at saveheight}}
+    % type de colonne i pour les intervalles
+    \newcolumntype{i}{>{\stepcounter{tv at 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 at row}=1}{\begin{lrbox}\tv at cellbox $}{}}%
+        ##1%
+        <{\ifthenelse{\value{tv at row}=1}{$\end{lrbox}%
+            \makebox[\colvalwidth][##1]{\usebox\tv at 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 at 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 at 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}{%
-        |c|@{\hspace{\bordercolsep}}%
-        l@{\hspace{\innercolsep}}%
-        i{#1}@{\hspace{\innercolsep}}%
+        |@{\hspace{\firstcolsep}}%
+        A@{\hspace{\firstcolsep}}%
+        |@{\hspace{\bordercolsep}}%
+        B@{\hspace{\innercolsep}}%
+        i@{\hspace{\innercolsep}}%
         *{\value{nb at intervals}}{
-            c@{\hspace{\innercolsep}}%
-            i{#1}@{\hspace{\innercolsep}}%
+            v{c}@{\hspace{\innercolsep}}%
+            i@{\hspace{\innercolsep}}%
         }%
-        r@{\hspace{\bordercolsep}}|%
+        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 at rm\empty \else \setlength{\intervalwidth}{#1} \fi
+    \begin{tablvar}[extleft,extright]{#2}
+}{\end{tablvar}}
+%    \end{macrocode}
+% \end{environment}
+%
 % \subsection{La commande \texttt{\textbackslash variations}}
 %
-% C'est ici qu'est la magie !
-% 
 % \begin{macro}{\varloop}
 % \changes{v1.1}{12/04/2019}{tvloop -> varloop}
 % La commande \cmd{\varloop}\marg{iter}\marg{code} répète \meta{code} (\meta{iter}$- 1$) fois
-% (car la dernière ligne de variations doit subir un traitement particulier).
-% Nous avons créé une variante de |\multido| (du package \textsf{multido}) car
+% (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.
@@ -1544,48 +2215,50 @@
 % \end{macro}
 
 % \begin{macro}{\variations}
-% \cmd{\variations}\oarg{nblignes}\marg{code} où \meta{nblignes} est le nombre
-% de lignes pour les variations (3 par défaut) ;
-% \meta{code} contient les séparateurs de colonnes et la composition des variations 
-% grâce aux commandes de positionnement.\\
-% Le principe est que l'on parcourt 3 fois (par défaut) le contenu de |\variations| ;
-% à chaque itération, le compteur |ligne| est incrémenté, 
-% le compteur |noeud| est remis à 0 puis incrémenté à chaque commande |\pos|,
+% 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 at ligne| est incrémenté, 
+% le compteur |var at noeud| est remis à 0 puis incrémenté à chaque commande |\pos|,
 % mais le contenu de |\pos| n'est affiché et le nœud n'est effectivement créé 
-% que si la valeur du compteur |ligne| correspond à l'argument de ligne de |\pos|.\\
+% que si la valeur du compteur |var at 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 !?
+% mais il faut les tracer avant le |\\| final, sinon la compilation plante !
+% Le compteur |var at ligne| doit être remis à 0 au cas où il y a plusieurs parties variations.
 %    \begin{macrocode}
 \newcommand*{\variations}[2][3]{% #1=nblignes (3 par défaut)
     % (ré)initialisation des compteurs
-    \setcounter{ligne}{0} % nécessaire pour 2 parties variations
+    \setcounter{nbvarlignes}{#1}
+    \setcounter{var at ligne}{0}
     \setcounter{numdiscont}{0}
     \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}}
-    \setcounter{ZIvarlignes}{#1} % nécessaire pour \ZIh
     % boucle : on exécute le code #2 un nb de fois égal à (#1)-1
     \varloop{#1}{%
-        \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
-        % à chaque boucle on réinitialise certains compteurs
-        \stepcounter{ligne} % le numéro de ligne est incrémenté
+        \setcounter{var at noeud}{0}\setcounter{numvr}{0}
+        % à chaque tour de boucle on réinitialise les compteurs de nœuds
+        \stepcounter{var at ligne} % le numéro de ligne est incrémenté
         #2 % les nœuds sont fabriqués par le code #2 (avec \pos et \vr)
         \\ % retour ligne
         }
     % dernière itération -> flèches tracées AVANT \\ sinon bug !?
-    \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
-    \stepcounter{ligne} #2    
-    % tracé des flèches 
-    \addtocounter{noeud}{-1} % 1 flèche de moins que le nb de nœuds
+    \setcounter{var at noeud}{0}\setcounter{numvr}{0}
+    \stepcounter{var at ligne} #2
+    % tracé des flèches
+    \addtocounter{var at noeud}{-1} % 1 flèche de moins que le nb de nœuds
     \setcounter{numdiscont}{1}
-    \multido{\Ix=1+1,\Iy=2+1}{\thenoeud}{
+    \multido{\Ix=1+1,\Iy=2+1}{\thevar at 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} 
+            \fleche{N\Ix}{N\Iy}
         }
     }
     % tracé des pointillés pour les valeurs remarquables
-    \multido{\Ix=1+1}{\thenumvr}{\vrconnect{X\Ix}{Y\Ix}}    
+    \multido{\Ix=1+1}{\thenumvr}{\vrconnect{X\Ix}{Y\Ix}}
     \\ % dernier retour ligne du tableau
 }
 %    \end{macrocode}
@@ -1593,90 +2266,131 @@
 
 % \subsection{Les commandes de positionnement}
 %
-% \begin{macro}{\pos}
-% \cmd{\pos}\oarg{opt}\marg{ligne}\marg{valeur} 
-% sert à positionner les valeurs dans la partie variations.
-% \meta{ligne} désigne la ligne où il faut placer \meta{valeur} et produire le nœud
-% (numéroté avec le compteur |noeud| et défini en appelant la commande |\noeud|).
+% \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 at noeud| et défini en appelant la commande |\noeud|.
 % Les lignes de variations sont numérotées \emph{du haut vers le bas} 
 % (et les lignes de signes portent toutes le numéro 0).
 % Le 1\ier\ argument optionnel, |c| (centered, par défaut), |t| (top) ou |b| (bottom),
-% est utilisé pour le positionnement des flèches.\\
-% \DescribeMacro{\pos*}
-% Dans la version étoilée, \cmd{\pos*}\marg{ligne}\marg{valeur}, la différence 
-% est qu'aucun nœud n'est créé. Ceci est utile en particulier pour la colonne de base, 
-% contenant les légendes.
+% est utilisé pour le positionnement des flèches.
+% La macro |\valpos| sert de macro sous-jacente à la macro |\pos|.
 %    \begin{macrocode}
-\newcommand*{\@pos}[3][c]{
-    \stepcounter{noeud}
-    \ifthenelse{\theligne=#2}{
-        \noeud[#1]{N\thenoeud}{#3}
+\newcommand*{\valpos}[3][c]{
+    \stepcounter{var at noeud}
+    \ifthenelse{\thevar at ligne=#2}{
+        \noeud[#1]{N\thevar at noeud}{#3}
     }{} % si ligne != #2, on ne fait rien
 }
-\newcommand*{\@@pos}[2]{\ifthenelse{\theligne=#1}{#2}{}}
-\newcommand*{\pos}{\@ifstar{\@@pos}{\@pos}}
 %    \end{macrocode}
 % \end{macro}
 
-% Voici quelques alias utiles qui peuvent être utilisés 
-% à la place des commandes |\pos| et |\pos*|.
-% \begin{macro}{\haut}
-% \cmd{\haut}\marg{valeur} =  \cmd{\pos}|{1}|\marg{valeur}.
+% \begin{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.
+% Sa syntaxe est :
+% |\zbox|\oarg{pos}\marg{contenu} où \meta{opt} = |c| (par défaut), |l| (left) ou |r| (right).
 %    \begin{macrocode}
-\newcommand*{\haut}{\pos{1}}
+\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}}
 %    \end{macrocode}
 % \end{macro}
 
-% \begin{macro}{\bas}
-% \cmd{\bas}\marg{valeur} =  \cmd{\pos}|{3}|\marg{valeur}.
+% \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 at 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 at 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 at 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*{\bas}{\pos{3}}
+\newcommand*{\tv at pos}[3][c]{
+    \def\val@@pos{c}
+    \ifextleft
+        \ifthenelse{\thetv at icol=0}{\def\val@@pos{l}}{}
+    \fi
+    \ifextright
+        \ifthenelse{\thetv at icol>\thenb at intervals}{\def\val@@pos{r}}{}
+    \fi
+    \zbox[\val@@pos]{\valpos[#1]{#2}{#3}}
+}
+\newcommand*{\tv@@pos}[2]{\ifthenelse{\thevar at ligne=#1}{#2}{}}
+\newcommand*{\pos}{\@ifstar{\tv@@pos}{\tv at pos}}
 %    \end{macrocode}
-% \end{macro}
 
-% \begin{macro}{\mil}
-% \cmd{\mil}\marg{valeur} =  \cmd{\pos*}|{2}|\marg{valeur}.
+% 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*{\mil}{\pos*{2}}
+\newcommand*{\haut}{\pos{1}}
 %    \end{macrocode}
 % \end{macro}
 
-% Voici enfin deux macros qui permettent si besoin d'ajuster le positionnement
-% (en plus des commandes \LaTeX\ |\hspace| ou |\makebox|).
-% \begin{macro}{\zbox}
-% Place son contenu dans une boite de largeur nulle : affiche le contenu
-% mais considère que l'espace occupé est nul pour le calcul des largeurs de colonne.
-% Sa syntaxe est :
-% |\zbox|\oarg{pos}\marg{contenu} où \meta{opt} = |c| (par défaut), |l| (left) ou |r| (right).
+% \begin{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*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}}
+\newcommand*{\bas}{\pos{\value{nbvarlignes}}}
 %    \end{macrocode}
 % \end{macro}
 
 % \begin{macro}{\vdecal}
-% Décalage vertical : \cmd{\vdecal}\marg{decal}\marg{contenu}, 
+% 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.
+% 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}
 
-% \subsection{Barres, discontinuités et valeurs remarquables}
-%
-% \begin{macro}{\bb}
-% La macro |\bb|, qui produit une double barre,
-% provient de l'extension \textsf{variations} de Christian Obrecht
-% |\def\bb{\vrule\kern1pt\vrule}|.
-% Nous avons ajouté 1\,pt d'espace avant et après, afin d'éviter le contact
-% entre la double barre et les limites à gauche ou à droite.
+% \begin{macro}{\mil}
+% La commande |\mil|\marg{valeur} positionne \meta{valeur} sur la ligne 2
+% de la partie variations. Lorsqu'il y a 3 lignes de variations cela correspond bien
+% au milieu, mais sinon on réalise un décalage vertical grâce à |\vdecal|.
+% La formule de ce décalage est 
+% $(3- \mbox{nblignes}) \times (\mbox{hauteur de ligne})/2$.
+% Le résultat de ce calcul est stocké dans la variable de dimension |\mil at heightshift|.
+% Au cas où |\mil| ne donnerait pas un résultat parfait, on pourrait alors régler
+% le décalage manuellement avec 
+%|\pos*|\marg{ligne}|{\vdecal|\marg{decal}\marg{contenu}|}|.
 %    \begin{macrocode}
-\newcommand*{\bb}{\kern1pt\vrule\kern1pt\vrule\kern1pt}
+\newcommand*{\mil}[1]{%
+    \mil at heightshift = \ht\@arstrutbox
+    \advance\mil at heightshift by \dp\@arstrutbox
+    \divide\mil at heightshift by 2
+    \setcounter{mil at rowshift}{3}
+    \addtocounter{mil at rowshift}{-\value{nbvarlignes}}
+    \multiply\mil at heightshift by \value{mil at rowshift}
+    \pos*{2}{\vdecal{\mil at heightshift}{#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
@@ -1683,15 +2397,42 @@
 % à travers les 0. 
 % Son aspect est contrôlé par les paramètres |\tvbarrewidth| et |\tvbarrecolor|.
 % Sa syntaxe est :
-% |\barre|\oarg{valeur} où, en général, on met 0 comme argument optionnel.
+% |\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}
-    \vrule width \tvbarrewidth
-}
+\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 \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 \emph{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.
+%    \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}}}
+%    \end{macrocode}
+
 % \begin{macro}{\discont}
 % Associe un numéro de nœud à un compteur de discontinuité
 % (chaque discontinuité a son propre compteur).
@@ -1699,46 +2440,39 @@
 % et le nœud suivant ne sera pas tracée.
 %    \begin{macrocode}
 \newcommand*{\discont}{
-    \ifthenelse{\theligne=1}{ 
+    \ifthenelse{\thevar at ligne=1}{
         % on ne compte les discontinuités qu'une seule fois, sur ligne 1
-        \stepcounter{numdiscont}
-        \setcounter{discont\thenumdiscont}{\thenoeud}
-        }{}
-    }
+        \ifthenelse{\thenumdiscont=0}{
+            \ifthenelse{\thevar at noeud > 0}{% pas avant le 1er nœud
+                \stepcounter{numdiscont}
+                \setcounter{discont\thenumdiscont}{\thevar at noeud}
+            }{}
+        }{% on ne compte pas 2 fois la même discontinuité
+            \ifthenelse{\thevar at noeud > \value{discont\thenumdiscont}}{      
+                \stepcounter{numdiscont}
+                \setcounter{discont\thenumdiscont}{\thevar at noeud}
+            }{}
+        }
+    }{}
+}
 %    \end{macrocode}
 % \end{macro}
 
 % \begin{macro}{\bblim}
-% Sert à positionner correctement des limites à gauche et à droite 
-% d'une double barre en conservant le centrage de la double barre.
+% Sert à positionner des limites à gauche \emph{et} à droite 
+% d'une double barre.
 % Cette macro trace la double barre, place les limites et appelle |\discont|.
-% Le principe est que lorsqu'on place la plus large des deux valeurs 
-% d'un côté de la double barre, on place une boite fantôme de même largeur 
-% de l'autre côté ; quant à la plus étroite des deux valeurs, 
-% elle est placée dans une |\zbox| qui annule sa largeur.
-% Sa syntaxe est : \\
-% |\bblim|\marg{ligne gauche}\marg{limite gauche}\marg{ligne droite}\marg{limite droite}
+% Sa syntaxe est : 
+% |\bblim|\marg{ligne gauche}\marg{limite gauche}\marg{ligne droite}\marg{limite droite}.
 %    \begin{macrocode}
-\newsavebox{\@tvlbox}
-\newsavebox{\@tvrbox}
-\newcommand*{\bblim}[4]{
-    \sbox{\@tvlbox}{$#2$}
-    \sbox{\@tvrbox}{$#4$}
-    \ifdim \wd\@tvlbox > \wd\@tvrbox
-        \pos{#1}{#2} \bb\discont
-        \zbox[l]{\pos{#3}{#4}} \pos*{#1}{\phantom{#2}}
-    \else
-        \pos*{#3}{\phantom{#4}} \zbox[r]{\pos{#1}{#2}}
-        \bb\discont \pos{#3}{#4}
-    \fi
-}
+\newcommand*{\bblim}[4]{\limg{#1}{#2}\bb\discont\limd{#3}{#4}}
 %    \end{macrocode}
 % \end{macro}
 
 % \begin{macro}{\vr}
 % La commande |\vr| fabrique un nœud pour chaque valeur remarquable.
-% Les nœuds sont désignés par X1, X2, \ldots\ sur la ligne des $x$
-% et Y1, Y2, \ldots\ sur les lignes de variations.
+% 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),
@@ -1746,83 +2480,267 @@
 % Les nœuds seront ensuite reliés par la commande |\vrconnect| 
 % (appelée par |\variations|) en fonction de leur numéro.
 %    \begin{macrocode}
-\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf sur ligne 0
+\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf si tv at row=1
     \stepcounter{numvr}
-    \ifthenelse{\theligne=0}{
-        \noeud{X\thenumvr}{#2}
-        }{
-        \ifthenelse{\theligne=#1}{
-            \noeud{Y\thenumvr}{#2}
-        }{}
+    \ifthenelse{\thetv at row=1}{\noeud{X\thenumvr}{#2}}{
+        \ifthenelse{\thevar at 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 at pos[#1]{#2}{\noeud{Y\thenumvr}{#3}}}
+%    \end{macrocode}
+% \end{macro}
+
 % \subsection{Zones interdites}
 %
-% \begin{macro}{\ZIc}
-% Commande sans argument qui produit une zone interdite colorée.
-% À placer dans les intervalles voulus. La densité de gris ou la couleur 
-% peuvent être modifiées en redéfinissant la macro.
+% 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{\ZIc}{\discont \cellcolor[gray]{0.7}}
+\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 at icol}}{
+            \setcounter{numZI}{\I}
+        }{}
+    }
+}
 %    \end{macrocode}
 % \end{macro}
 
-% La macro |\ZIh| \DescribeMacro{\ZIh} sert à produire une zone interdite hachurée.
-% Le tracé des hachures n'est déclenché 
-% que sur la dernière ligne des variations, les appels à |\ZIh| sur les lignes
-% précédentes ne font que cumuler hauteur (|\ht|) et profondeur (|\dp|) de la ligne.
-% Dans une ligne de signe, il ne faut qu'\emph{un seul appel} à |\ZIh|, 
-% qui peut être placé n'importe où. 
-% En effet, pour les lignes d'indice 0, la macro ne sait pas
-% s'il y a eu un changement de ligne, donc elle cumule systématiquement la hauteur
-% à chaque appel.
-% Par contre, dans la partie variations, les |\ZIh| doivent être placés 
-% autant de fois que nécessaire, dans les intervalles voulus.\\
-% La macro possède un paramètre optionnel |\ZIh|\oarg{hauteur}
-% qui est un supplément de hauteur global,
-% permettant de faire un ajustement fin si des lignes ont été agrandies 
-% à cause de leur contenu (grandes fractions par exemple).\\
-% Limitation : fonctionne moins bien avec \tikz\ (sensible à la taille de police).
+% \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 at 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 at 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 at cellheight| et |\tv at cellheight|,
+% 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 at cellheight
+    \advance\ZIheight by \tv at 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*|). 
 %
-% La macro |ZIh*| \DescribeMacro{\ZIh*} 
-% (appelée par |\ZIh| sur la dernière ligne des variations) 
-% déclenche le tracé d'un rectangle de hachures en appelant la commande |\hachure|.
-% Elle utilise les dimensions précédemment enregistrées dans les variables de dimension
-% (par |\ZIh|). Dans un tableau de signes sans partie variations 
-% elle doit être placée sur la dernière ligne à la place de |\ZIh|
-% (pour les lignes précédentes). Elle possède le même argument optionnel \oarg{hauteur}.
+% 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{\theligne=\value{ZIvarlignes}}{\@@ZI[#1]}{%
-        \ifthenelse{\theligne=0 \or \theZI=0}{%
-            % on ne doit cumuler la hauteur qu'une fois par ligne
-            % => une seule occurrence de la macro sur une ligne 0
-            \global\advance\ZIheight by \ht\@arstrutbox
-            \global\advance\ZIheight by \dp\@arstrutbox
-        }{}
+    \ifthenelse{\thevar at ligne=\value{nbvarlignes}}{\@@ZI[#1]}{%
+        \ZIfind
+        \ifnum \thenumZI = 0 \ZInew \fi
+        \ZIaddheight{\thenumZI}
     }
-    \stepcounter{ZI} % RAZ par \variations à chaque ligne
 }
 
-\newcommand*{\@@ZI}[1][0pt]{% \discont inutile ici
-    \ifthenelse{\theZIstar=0}{% cumul des longueurs 1 seule fois
-        \global\advance\ZIheight by \ht\@arstrutbox
-        \global\advance\ZIheight by #1
-        \global\advance\ZIdepth by \dp\@arstrutbox
-        \global\advance\ZIwidth by \innercolsep
-        \global\advance\ZIwidth by \innercolsep
-        \global\advance\ZIwidth by 2pt % espace autour doubles barres
-    }{}
-    \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight}
-    \stepcounter{ZIstar}
+\newcommand*{\@@ZI}[1][0pt]{
+    \discont
+    \ZIfind
+    \ifnum \thenumZI > 0 \ZIgetheight{\thenumZI} \else \ZIheight=0pt \fi
+    \advance\ZIheight by \tv at cellheight
+    \advance\ZIheight by 0.5\arrayrulewidth
+    \advance\ZIheight by #1
+    \ZIdepth = \tv at 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*{\ZIh}{\@ifstar{\@@ZI}{\@ZI}}
+\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}{14}
+% \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{MIS} \emph{\textsf{mismath} -- Miscellaneous mathematical macros},
+% Antoine Missier, CTAN, v2.9 19/12/2023.
+% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}. Antoine Missier, 
+% CTAN, v2.7, 23/12/2023.
+% \end{raggedright}
+% \end{thebibliography}
 % \Finale
 \endinput

Modified: trunk/Master/texmf-dist/source/latex/tablvar/tablvar.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/tablvar/tablvar.ins	2023-12-24 21:26:52 UTC (rev 69211)
+++ trunk/Master/texmf-dist/source/latex/tablvar/tablvar.ins	2023-12-24 21:27:15 UTC (rev 69212)
@@ -1,5 +1,5 @@
 %%
-%% Copyright (C) 2018-2019 by Antoine Missier <antoine.missier at ac-toulouse.fr>
+%% Copyright (C) 2018-2023 by Antoine Missier <antoine.missier at 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
@@ -21,7 +21,7 @@
 
 This is a generated file.
 
-Copyright (C) 2018-2019 by Antoine Missier <antoine.missier at ac-toulouse.fr>
+Copyright (C) 2018-2023 by Antoine Missier <antoine.missier at 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
@@ -46,7 +46,7 @@
 \Msg{*     tablvar.sty                                           *}
 \Msg{*                                                           *}
 \Msg{* To produce the documentation run the file tablvar.dtx     *}
-\Msg{* through LaTeX + dvips + ps2pdf.                           *}
+\Msg{* through XeLaTeX or LaTeX + dvips + ps2pdf.                *}
 \Msg{*                                                           *}
 \Msg{* Happy TeXing!                                             *}
 \Msg{*                                                           *}

Modified: trunk/Master/texmf-dist/tex/latex/tablvar/tablvar.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/tablvar/tablvar.sty	2023-12-24 21:26:52 UTC (rev 69211)
+++ trunk/Master/texmf-dist/tex/latex/tablvar/tablvar.sty	2023-12-24 21:27:15 UTC (rev 69212)
@@ -8,7 +8,7 @@
 %% 
 %% This is a generated file.
 %% 
-%% Copyright (C) 2018-2019 by Antoine Missier <antoine.missier at ac-toulouse.fr>
+%% Copyright (C) 2018-2023 by Antoine Missier <antoine.missier at 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
@@ -22,86 +22,159 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}[2005/12/01]
 \ProvidesPackage{tablvar}
-    [2019/07/01 v1.2 .dtx tablvar file]
+    [2023/12/23 v2.0 .dtx tablvar file]
+
 \RequirePackage{array}
 \RequirePackage{ifthen}
 \RequirePackage{multido}
-\RequirePackage{colortbl} % pour \ZIc
+\RequirePackage{xkeyval}
+\RequirePackage{ifpdf}
 
-\newboolean{tikz}
-\DeclareOption{tikz}{\setboolean{tikz}{true}}
-\DeclareOption{pstricks}{\setboolean{tikz}{false}} % valeur par défaut
+\newif\iftv at tikz % false par défaut
+\DeclareOption{tikz}{\tv at tikztrue}
+\newif\iftv at pstricks
+\DeclareOption{pstricks}{\tv at pstrickstrue}
 \ProcessOptions \relax
 
-\ifthenelse{\boolean{tikz}}{
+\iftv at pstricks
+    \ifpdf
+        \PackageError{tablvar}{Don't use the pstricks option with PDF engines}{}
+    \else
+        \PackageInfo{tablvar}{PSTricks option is used}
+    \fi
+\else\iftv at tikz
+    \PackageInfo{tablvar}{tikz option is used.
+        \MessageBreak
+        Run twice to draw the arrows correctly}
+\else\ifpdf
+    \PackageWarningNoLine{tablvar}{PDF engine is used,
+        I'm using the tikz option.
+        \MessageBreak
+        Run twice to draw the arrows correctly}
+    \tv at tikztrue
+\else
+    \PackageWarningNoLine{tablvar}{PDF engines not used,
+        I'm using the pstricks option}
+    \tv at pstrickstrue
+\fi\fi\fi
+
+\iftv at tikz
     \RequirePackage{tikz}
     \usetikzlibrary{patterns}
-    \newlength{\tikznode at below}
-    }{
+    \usetikzlibrary{patterns.meta}% pour le paramétrage des hachures
+\else % pstricks=true
     \RequirePackage{pst-node}
-}
+\fi
 
 \newlength{\intervalwidth}
-\setlength{\intervalwidth}{2.5em} % largeur des "intervalles"
+\setlength{\intervalwidth}{3em} % largeur des "intervalles"
 
-\newlength{\bordercolsep} % largeur de l'espace inter-colonne
+\newlength{\colvalwidth}
+\setlength{\colvalwidth}{2em} % largeur des colonnes de valeurs
+
+\newlength{\firstcolsep}
+\setlength{\firstcolsep}{5pt} % valeur LaTeX par défaut
+
+\newlength{\bordercolsep}
 \setlength{\bordercolsep}{2pt}
 
-\newlength{\innercolsep}
-\setlength{\innercolsep}{4pt}
+\newlength{\limsep}
+\setlength{\limsep}{1pt}
 
-\newcounter{maxdiscont}
-\setcounter{maxdiscont}{3} % nb max de discontinuités
+\newcommand{\tablvarstretch}{1.6}
 
-\newcommand{\tablvarstretch}{1.4}
+\newcommand{\ZItype}{h}
 
+\definecolor{ZIcolor}{named}{gray}
+
+\newlength{\ZIaddwidth}
+\setlength{\ZIaddwidth}{0pt}
+
+\define at key{tablvar}{intervalwidth}{\setlength{\intervalwidth}{#1}}
+\define at key{tablvar}{colvalwidth}{\setlength{\colvalwidth}{#1}}
+\define at key{tablvar}{firstcolsep}{\setlength{\firstcolsep}{#1}}
+\define at key{tablvar}{bordercolsep}{\setlength{\bordercolsep}{#1}}
+\define at key{tablvar}{limsep}{\setlength{\limsep}{#1}}
+\define at key{tablvar}{stretch}{\renewcommand{\tablvarstretch}{#1}}
+\define at boolkey{tablvar}[]{extleft}[true]{} % false si non appelé
+\define at boolkey{tablvar}[]{extright}[true]{}
+\define at choicekey{tablvar}{ZItype}{h,c}{\renewcommand{\ZItype}{#1}}
+\define at key{tablvar}{ZIcolor}{\definecolor{ZIcolor}{named}{#1}}
+\define at key{tablvar}{ZIaddwidth}{\setlength{\ZIaddwidth}{#1}}
+
+\newcommand\tablvarset[1]{\setkeys{tablvar}{#1}}
+
+\newlength{\tvrulewidth}
+\setlength{\tvrulewidth}{0.4pt}
+
 \newlength{\tvbarrewidth}
 \setlength{\tvbarrewidth}{0.5pt}
-
 \definecolor{tvbarrecolor}{gray}{0.7}
 
+\newlength{\bbrulewidth}
+\setlength{\bbrulewidth}{0.4pt}
+
+\newlength{\innercolsep}
+\setlength{\innercolsep}{0pt}
+
+\newcounter{maxdiscont}
+\setcounter{maxdiscont}{4} % nb max de discontinuités
+
 \newcommand*{\fleche}[2]{
-    \ifthenelse{\boolean{tikz}}{
+    \iftv at 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
 }
 
 \newcommand*{\vrconnect}[2]{
-    \ifthenelse{\boolean{tikz}}{
+    \iftv at tikz
         \tikz[remember picture,overlay]{\draw[dotted,line width=1pt]
             (#1) -- (#2);}
-    }{
+    \else
         \ncline[nodesep=5pt,linestyle=dotted,linewidth=1pt]{-}{#1}{#2}
-    }
+    \fi
 }
 
 \newcommand*{\noeud}[3][c]{
-    \ifthenelse{\boolean{tikz}}{
-        \tikz[remember picture,baseline]{
-            \node[anchor=base,inner sep=0,outer sep=4] (#2) {$#3$};
-        } % l'option de placement (#1) n'est pas implémentée pour tikz
-    }{
+    \iftv at 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
 }
 
 \newcommand*{\hachure}[2]{
-    \ifthenelse{\boolean{tikz}}{
-        \tikz[remember picture,overlay]{\fill[pattern=north east lines]
+    \iftv at 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
 }
 
-\newcounter{ligne} % numéro de ligne
-\newcounter{noeud} % numéro du nœud
+\newcommand*{\ZIcouleur}[2]{
+    \iftv at 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
+}
+
+\newcounter{var at ligne} % numéro de ligne des variations
+\newcounter{var at noeud} % numéro du nœud des variations
 \newcounter{numvr} % numéro de la valeur remarquable
+\newcounter{nb at intervals} % nombre de colonnes "intervalles"
 \newcounter{numdiscont} % numéro de la discontinuité
 \AtBeginDocument{% car maxdiscont a pu être modifié dans le préambule
     \stepcounter{maxdiscont}
@@ -109,64 +182,108 @@
     \multido{\I=1+1}{\themaxdiscont}{\newcounter{discont\I}}
 }
 
+\newlength\mil at heightshift
+\newcounter{mil at rowshift}
+
+\newcounter{maxZI} % nb max de ZI
+\setcounter{maxZI}{4}
 \newlength{\ZIheight}
+\newlength{\ZIheighti}
+\newlength{\ZIheightii}
+\newlength{\ZIheightiii}
+\newlength{\ZIheightiv}
 \newlength{\ZIdepth}
 \newlength{\ZIwidth}
-\newcounter{ZI} % numéro de la ZI
-\newcounter{ZIstar} % numéro de ZI pour la commande \ZI*
-\newcounter{ZIvarlignes} % dernière ligne des variations
+\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 at icol} % numéro de colonne "intervalle"
+\newcounter{tv at row} % numéro de ligne du tableau
+\newsavebox{\tv at cellbox}
+\newlength{\tv at cellheight}
+\newlength{\tv at celldepth}
 
-\newcolumntype{i}[1]{>{\centering\arraybackslash $}p{#1}<{$}}
-    % nouveau type de colonne i pour les intervalles
-
-\newcommand{\tablvarinit}{
+\newcommand*{\tablvarinit}[1]{
     \setlength{\extrarowheight}{0pt} % paramètre de l'extension array
     \renewcommand{\arraystretch}{\tablvarstretch}
-    \setcounter{ligne}{0}
+    \setlength{\arrayrulewidth}{\tvrulewidth}
+    \setcounter{var at ligne}{0}
     \setcounter{numvr}{0}
+    \setcounter{tv at row}{0}
+    \setcounter{nb at intervals}{#1}
+    \addtocounter{nb at intervals}{-1}
 }
 
-\newcommand*{\ZIinit}[1][\intervalwidth]{
-    \setlength{\ZIheight}{0pt}
-    \setlength{\ZIdepth}{0pt}
-    \setlength{\ZIwidth}{#1}
-    \setcounter{ZI}{0}
-    \setcounter{ZIstar}{0}
-    \setcounter{ZIvarlignes}{3}
-    % doit être non nul pour \ZIh si tableau de signe seul
+\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}
 }
 
-\newenvironment{tablvar}[2][\intervalwidth]{
-    \tablvarinit
-    \ZIinit[#1]
-    \begin{array}{%
-        |c|@{\hspace{\bordercolsep}}%
-        *{#2}{c@{\hspace{\innercolsep}}%
-            i{#1}@{\hspace{\innercolsep}}%
-        }%
-        c@{\hspace{\bordercolsep}}|%
-    }
-}{\end{array}}
+\newcommand\tv at saveheight{%
+    \tv at cellheight=0pt
+    \tv at celldepth=0pt
+    \ifdim \ht\tv at cellbox > \ht\@arstrutbox
+        \global\advance\tv at cellheight by \ht\tv at cellbox
+    \else
+        \global\advance\tv at cellheight by \ht\@arstrutbox
+    \fi
+    \ifdim \dp\tv at cellbox > \dp\@arstrutbox
+        \global\advance\tv at celldepth by \dp\tv at cellbox
+    \else
+        \global\advance\tv at celldepth by \dp\@arstrutbox
+    \fi
+}
 
-\newcounter{nb at intervals}
-\newenvironment{tablvar*}[2][\intervalwidth]{
-    % environnement tablvar* , type l et r pour les extrémités
-    \tablvarinit
-    \ZIinit[#1]
-    \setcounter{nb at intervals}{#2}
-    \addtocounter{nb at intervals}{-1}
+\newcommand{\tvcoltypes}{
+    % type de colonne A pour les légendes à gauche du tableau
+    \newcolumntype{A}{%
+        >{\setcounter{tv at icol}{0}\stepcounter{tv at row}\begin{lrbox}%
+            \tv at cellbox $}%
+        c%
+        <{$\end{lrbox}\usebox{\tv at cellbox}\tv at saveheight}}
+    % type de colonne i pour les intervalles
+    \newcolumntype{i}{>{\stepcounter{tv at 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 at row}=1}{\begin{lrbox}\tv at cellbox $}{}}%
+        ##1%
+        <{\ifthenelse{\value{tv at row}=1}{$\end{lrbox}%
+            \makebox[\colvalwidth][##1]{\usebox\tv at cellbox}}{}}}
+}
+
+\newenvironment{tablvar}[2][]{%
+    \setkeys*{tablvar}{#1} % fourni par xkeyval
+    \if\XKV at 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}{%
-        |c|@{\hspace{\bordercolsep}}%
-        l@{\hspace{\innercolsep}}%
-        i{#1}@{\hspace{\innercolsep}}%
+        |@{\hspace{\firstcolsep}}%
+        A@{\hspace{\firstcolsep}}%
+        |@{\hspace{\bordercolsep}}%
+        B@{\hspace{\innercolsep}}%
+        i@{\hspace{\innercolsep}}%
         *{\value{nb at intervals}}{
-            c@{\hspace{\innercolsep}}%
-            i{#1}@{\hspace{\innercolsep}}%
+            v{c}@{\hspace{\innercolsep}}%
+            i@{\hspace{\innercolsep}}%
         }%
-        r@{\hspace{\bordercolsep}}|%
+        E@{\hspace{\bordercolsep}}|%
     }
 }{\end{array}}
-
+\newenvironment{tablvar*}[2][]{%
+    \setkeys*{tablvar}{#1} % fourni par xkeyval
+    \if\XKV at rm\empty \else \setlength{\intervalwidth}{#1} \fi
+    \begin{tablvar}[extleft,extright]{#2}
+}{\end{tablvar}}
 \newcounter{loop at counter}
 \newcommand{\varloop}[2]{%
     \setcounter{loop at counter}{#1}
@@ -178,25 +295,25 @@
 
 \newcommand*{\variations}[2][3]{% #1=nblignes (3 par défaut)
     % (ré)initialisation des compteurs
-    \setcounter{ligne}{0} % nécessaire pour 2 parties variations
+    \setcounter{nbvarlignes}{#1}
+    \setcounter{var at ligne}{0}
     \setcounter{numdiscont}{0}
     \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}}
-    \setcounter{ZIvarlignes}{#1} % nécessaire pour \ZIh
     % boucle : on exécute le code #2 un nb de fois égal à (#1)-1
     \varloop{#1}{%
-        \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
-        % à chaque boucle on réinitialise certains compteurs
-        \stepcounter{ligne} % le numéro de ligne est incrémenté
+        \setcounter{var at noeud}{0}\setcounter{numvr}{0}
+        % à chaque tour de boucle on réinitialise les compteurs de nœuds
+        \stepcounter{var at ligne} % le numéro de ligne est incrémenté
         #2 % les nœuds sont fabriqués par le code #2 (avec \pos et \vr)
         \\ % retour ligne
         }
     % dernière itération -> flèches tracées AVANT \\ sinon bug !?
-    \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
-    \stepcounter{ligne} #2
+    \setcounter{var at noeud}{0}\setcounter{numvr}{0}
+    \stepcounter{var at ligne} #2
     % tracé des flèches
-    \addtocounter{noeud}{-1} % 1 flèche de moins que le nb de nœuds
+    \addtocounter{var at noeud}{-1} % 1 flèche de moins que le nb de nœuds
     \setcounter{numdiscont}{1}
-    \multido{\Ix=1+1,\Iy=2+1}{\thenoeud}{
+    \multido{\Ix=1+1,\Iy=2+1}{\thevar at noeud}{
         \ifthenelse{\value{discont\thenumdiscont}=\Ix}{
             % on saute les discontinuités
             \stepcounter{numdiscont}}{
@@ -209,95 +326,180 @@
     \\ % dernier retour ligne du tableau
 }
 
-\newcommand*{\@pos}[3][c]{
-    \stepcounter{noeud}
-    \ifthenelse{\theligne=#2}{
-        \noeud[#1]{N\thenoeud}{#3}
+\newcommand*{\valpos}[3][c]{
+    \stepcounter{var at noeud}
+    \ifthenelse{\thevar at ligne=#2}{
+        \noeud[#1]{N\thevar at noeud}{#3}
     }{} % si ligne != #2, on ne fait rien
 }
-\newcommand*{\@@pos}[2]{\ifthenelse{\theligne=#1}{#2}{}}
-\newcommand*{\pos}{\@ifstar{\@@pos}{\@pos}}
 
-\newcommand*{\haut}{\pos{1}}
+\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}}
 
-\newcommand*{\bas}{\pos{3}}
+\newcommand*{\tv at pos}[3][c]{
+    \def\val@@pos{c}
+    \ifextleft
+        \ifthenelse{\thetv at icol=0}{\def\val@@pos{l}}{}
+    \fi
+    \ifextright
+        \ifthenelse{\thetv at icol>\thenb at intervals}{\def\val@@pos{r}}{}
+    \fi
+    \zbox[\val@@pos]{\valpos[#1]{#2}{#3}}
+}
+\newcommand*{\tv@@pos}[2]{\ifthenelse{\thevar at ligne=#1}{#2}{}}
+\newcommand*{\pos}{\@ifstar{\tv@@pos}{\tv at pos}}
 
-\newcommand*{\mil}{\pos*{2}}
+\newcommand*{\haut}{\pos{1}}
 
-\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}}
+\newcommand*{\bas}{\pos{\value{nbvarlignes}}}
 
 \newcommand*{\vdecal}[2]{\smash{\raisebox{#1}{$#2$}}}
 
-\newcommand*{\bb}{\kern1pt\vrule\kern1pt\vrule\kern1pt}
-
-\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}
-    \color{tvbarrecolor}
-    \vrule width \tvbarrewidth
+\newcommand*{\mil}[1]{%
+    \mil at heightshift = \ht\@arstrutbox
+    \advance\mil at heightshift by \dp\@arstrutbox
+    \divide\mil at heightshift by 2
+    \setcounter{mil at rowshift}{3}
+    \addtocounter{mil at rowshift}{-\value{nbvarlignes}}
+    \multiply\mil at heightshift by \value{mil at rowshift}
+    \pos*{2}{\vdecal{\mil at heightshift}{#1}}
 }
 
+\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}%
+    \color{tvbarrecolor}%
+    \hspace{-0.5\tvbarrewidth}\vrule width \tvbarrewidth}
+
+\newcommand*{\bb}{%
+    \kern1.5pt\vrule width \bbrulewidth\kern1pt
+    \vrule width \bbrulewidth\kern1.5pt}
+
+\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*{\discont}{
-    \ifthenelse{\theligne=1}{
+    \ifthenelse{\thevar at ligne=1}{
         % on ne compte les discontinuités qu'une seule fois, sur ligne 1
-        \stepcounter{numdiscont}
-        \setcounter{discont\thenumdiscont}{\thenoeud}
-        }{}
+        \ifthenelse{\thenumdiscont=0}{
+            \ifthenelse{\thevar at noeud > 0}{% pas avant le 1er nœud
+                \stepcounter{numdiscont}
+                \setcounter{discont\thenumdiscont}{\thevar at noeud}
+            }{}
+        }{% on ne compte pas 2 fois la même discontinuité
+            \ifthenelse{\thevar at noeud > \value{discont\thenumdiscont}}{
+                \stepcounter{numdiscont}
+                \setcounter{discont\thenumdiscont}{\thevar at noeud}
+            }{}
+        }
+    }{}
+}
+
+\newcommand*{\bblim}[4]{\limg{#1}{#2}\bb\discont\limd{#3}{#4}}
+
+\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf si tv at row=1
+    \stepcounter{numvr}
+    \ifthenelse{\thetv at row=1}{\noeud{X\thenumvr}{#2}}{
+        \ifthenelse{\thevar at ligne=#1}{\noeud{Y\thenumvr}{#2}}{}
     }
-
-\newsavebox{\@tvlbox}
-\newsavebox{\@tvrbox}
-\newcommand*{\bblim}[4]{
-    \sbox{\@tvlbox}{$#2$}
-    \sbox{\@tvrbox}{$#4$}
-    \ifdim \wd\@tvlbox > \wd\@tvrbox
-        \pos{#1}{#2} \bb\discont
-        \zbox[l]{\pos{#3}{#4}} \pos*{#1}{\phantom{#2}}
-    \else
-        \pos*{#3}{\phantom{#4}} \zbox[r]{\pos{#1}{#2}}
-        \bb\discont \pos{#3}{#4}
-    \fi
 }
 
-\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf sur ligne 0
+\newcommand*{\posvr}[3][c]{%
     \stepcounter{numvr}
-    \ifthenelse{\theligne=0}{
-        \noeud{X\thenumvr}{#2}
-        }{
-        \ifthenelse{\theligne=#1}{
-            \noeud{Y\thenumvr}{#2}
+    \tv at pos[#1]{#2}{\noeud{Y\thenumvr}{#3}}}
+
+\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 at icol}}{
+            \setcounter{numZI}{\I}
         }{}
     }
 }
 
-\newcommand{\ZIc}{\discont \cellcolor[gray]{0.7}}
+\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 at icol}}
+}
 
+\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
+}
+
+\newcommand*\ZIaddheight[1]{
+    \ZIheight=0pt
+    \advance\ZIheight by \tv at cellheight
+    \advance\ZIheight by \tv at 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
+}
+
+\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
+}
 \newcommand*{\@ZI}[1][0pt]{%
     \discont
-    \ifthenelse{\theligne=\value{ZIvarlignes}}{\@@ZI[#1]}{%
-        \ifthenelse{\theligne=0 \or \theZI=0}{%
-            % on ne doit cumuler la hauteur qu'une fois par ligne
-            % => une seule occurrence de la macro sur une ligne 0
-            \global\advance\ZIheight by \ht\@arstrutbox
-            \global\advance\ZIheight by \dp\@arstrutbox
-        }{}
+    \ifthenelse{\thevar at ligne=\value{nbvarlignes}}{\@@ZI[#1]}{%
+        \ZIfind
+        \ifnum \thenumZI = 0 \ZInew \fi
+        \ZIaddheight{\thenumZI}
     }
-    \stepcounter{ZI} % RAZ par \variations à chaque ligne
 }
 
-\newcommand*{\@@ZI}[1][0pt]{% \discont inutile ici
-    \ifthenelse{\theZIstar=0}{% cumul des longueurs 1 seule fois
-        \global\advance\ZIheight by \ht\@arstrutbox
-        \global\advance\ZIheight by #1
-        \global\advance\ZIdepth by \dp\@arstrutbox
-        \global\advance\ZIwidth by \innercolsep
-        \global\advance\ZIwidth by \innercolsep
-        \global\advance\ZIwidth by 2pt % espace autour doubles barres
-    }{}
-    \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight}
-    \stepcounter{ZIstar}
+\newcommand*{\@@ZI}[1][0pt]{
+    \discont
+    \ZIfind
+    \ifnum \thenumZI > 0 \ZIgetheight{\thenumZI} \else \ZIheight=0pt \fi
+    \advance\ZIheight by \tv at cellheight
+    \advance\ZIheight by 0.5\arrayrulewidth
+    \advance\ZIheight by #1
+    \ZIdepth = \tv at 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*{\ZIh}{\@ifstar{\@@ZI}{\@ZI}}
+\newcommand*{\ZI}{\@ifstar{\@@ZI}{\@ZI}}
 
+\newcommand*{\ZIc}[1][0pt]{\renewcommand{\ZItype}{c}\@@ZI[#1]}
+\newcommand{\ZIh}{\renewcommand{\ZItype}{h}\ZI}
 \endinput
 %%
 %% End of file `tablvar.sty'.



More information about the tex-live-commits mailing list.