<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
%
% Copyright (C) 2018-2024 by Antoine Missier &lt;antoine.missier@ac-toulouse.fr&gt;
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3 of this license
% or (at your option) any later version.  The latest version of this
% license is in:
%
%   http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of LaTeX version
% 2005/12/01 or later.
% To get the index compile with
% makeindex -s gind.ist -o tablvar.ind tablvar.idx
% \fi
%
% \iffalse
%&lt;*driver&gt;
\ProvidesFile{tablvar.dtx}
%&lt;/driver&gt;
%&lt;*package&gt; 
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{tablvar}   
    [2024/08/09 v2.1 Tables of signs and variations]
%&lt;/package&gt;
%&lt;*driver&gt;
\documentclass{ltxdoc}
%\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{geometry} % pour Ã©viter certains changements avec XeLaTeX

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

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

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

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

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

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

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

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

% \begin{macro}{\bordercolsep}
% DÃ©finit l'espace de sÃ©paration aux extrÃ©mitÃ©s du tableau, pour les premiÃ¨re
% et derniÃ¨re colonnes de valeurs, prÃ©dÃ©finie Ã&nbsp; \texttt{2pt}. 
% Sa valeur par dÃ©faut a Ã©tÃ© rÃ©duite par rapport Ã&nbsp; la longueur \LaTeX\ standard 
%|\arraycolsep|, afin que les valeurs des extrÃ©mitÃ©s (souvent des $\infty$) 
% soient plus proches des filets verticaux bordant le tableau.
%    \begin{macrocode}
\newlength{\bordercolsep}
\setlength{\bordercolsep}{2pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\limsep}
% RÃ¨gle l'espace avant une limite Ã&nbsp; droite et aprÃ¨s une limite Ã&nbsp; gauche, 
% utilisÃ© dans les macros |\limg|, |\limd| et |\bblim|. 
% La macro |\bb| composant la double barre comprend
% dÃ©jÃ&nbsp; \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 Ã&nbsp; \texttt{-1.5pt}, on Ã©limine l'espace
% crÃ©Ã© par |\bb| et on arrive au contact du filet de la double barre.
%    \begin{macrocode}
\newlength{\limsep}
\setlength{\limsep}{1pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tablvarstretch}
% Permet de rÃ©gler la valeur relative de l'espacement vertical
% des lignes du tableau. La valeur par dÃ©faut est \texttt{1.6} (1 correspondant 
% Ã&nbsp; la valeur standard d'un environnement |array|).
%    \begin{macrocode}
\newcommand{\tablvarstretch}{1.6}
%    \end{macrocode}
% \end{macro}

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

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

% \begin{macro}{\ZIaddwidth}
% DÃ©finit une largeur supplÃ©mentaire (positive ou nÃ©gative)
% Ã&nbsp; ajouter Ã&nbsp; 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 Ã&nbsp; l'extension \textsf{xkeyval}~\cite{XKEY} de Hendri Adriaens.
% Nous avons fait le choix de ne pas en faire
% des options de l'extension \textsf{tablvar} elle-mÃªme, mais de fournir
% une commande spÃ©ciale, |\tablvarset|, pour rÃ©gler ces options.
% La couleur dÃ©finie par l'option \texttt{ZIcolor} doit Ãªtre une couleur \og nommÃ©e \fg. 
%    \begin{macrocode}
\define@key{tablvar}{intervalwidth}{\setlength{\intervalwidth}{#1}}
\define@key{tablvar}{colvalwidth}{\setlength{\colvalwidth}{#1}}
\define@key{tablvar}{firstcolsep}{\setlength{\firstcolsep}{#1}}
\define@key{tablvar}{bordercolsep}{\setlength{\bordercolsep}{#1}}
\define@key{tablvar}{limsep}{\setlength{\limsep}{#1}}
\define@key{tablvar}{stretch}{\renewcommand{\tablvarstretch}{#1}}
\define@boolkey{tablvar}[]{extleft}[true]{} % false si non appelÃ©
\define@boolkey{tablvar}[]{extright}[true]{}
\define@choicekey{tablvar}{ZItype}{h,c}{\renewcommand{\ZItype}{#1}}
\define@key{tablvar}{ZIcolor}{\definecolor{ZIcolor}{named}{#1}}
\define@key{tablvar}{ZIaddwidth}{\setlength{\ZIaddwidth}{#1}}

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

% \begin{macro}{\tvrulewidth}
% DÃ©finit l'Ã©paisseur des filets du tableau (\texttt{0.4pt} par dÃ©faut).
%    \begin{macrocode}
\newlength{\tvrulewidth}
\setlength{\tvrulewidth}{0.4pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tvbarrewidth}
% DÃ©finit l'Ã©paisseur des barres de sÃ©paration verticales coupant les 0 
% d'un tableau de signe : \texttt{0.5pt} par dÃ©faut.
%    \begin{macrocode}
\newlength{\tvbarrewidth}
\setlength{\tvbarrewidth}{0.5pt}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{tvbarrecolor}
% DÃ©finit la couleur des mÃªmes barres de sÃ©paration verticales.
% La valeur par dÃ©faut |{gray}{0.7}| correspond Ã&nbsp; un niveau de gris.
% On peut redÃ©finir la couleur par une couleur nommÃ©e
% |\definecolor{named}|\marg{couleur}
% ou selon un modÃ¨le comme rgb, cmyk ou gray : |\definecolor{tvbarrecolor}{rgb}|\marg{x, x, x}.
%    \begin{macrocode}
\definecolor{tvbarrecolor}{gray}{0.7}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bbrulewidth}
% DÃ©finit l'Ã©paisseur des traits verticaux d'une double barre.
%    \begin{macrocode}
\newlength{\bbrulewidth}
\setlength{\bbrulewidth}{0.4pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\innercolsep}
% DÃ©finit la largeur entre les colonnes valeurs et les colonnes intervalles du tableau.
% Cette largeur a Ã©tÃ© fixÃ©e Ã&nbsp; \texttt{0pt}, 
% car l'augmenter est Ã©quivalent Ã&nbsp; 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 Ã&nbsp; la commande |\discont|.
% Le compteur |maxdiscont| est fixÃ© Ã&nbsp; 4 par dÃ©faut ; on peut l'augmenter (dans le prÃ©ambule)
% si l'on veut produire un tableau de variations avec plus de 4 discontinuitÃ©s.
%    \begin{macrocode}
\newcounter{maxdiscont}
\setcounter{maxdiscont}{4} % nb max de discontinuitÃ©s
%    \end{macrocode}
% \end{macro}

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

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

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

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

% \begin{macro}{\noeud}
% \cmd{\noeud}\oarg{pos}\marg{nÅ“ud}\marg{valeur}
% dÃ©finit les nÅ“uds des flÃ¨ches et valeurs remarquables ; 
% le 1\ier\ paramÃ¨tre, optionnel, correspond Ã&nbsp; l'option |t| (top), 
% |b| (bottom) ou |c| (centered, par dÃ©faut) permettant d'ajuster
% la maniÃ¨re dont la flÃ¨che arrive sur le nÅ“ud 
% (pas implÃ©mentÃ© avec l'option |tikz|) ;
% le 2\ieme\ paramÃ¨tre est le nom du nÅ“ud (qui est donnÃ© automatiquement 
% par les commandes de positionnement) ;
% le 3\ieme\ paramÃ¨tre est la valeur affichÃ©e dans le tableau.
%    \begin{macrocode}
\newcommand*{\noeud}[3][c]{
    \iftv@tikz
        % fonctionne mal avec autre chose que 'anchor=base'
        \tikz[remember picture,baseline]{% surtout pas de overlay ici
            \node[anchor=base,inner sep=0pt,outer sep=4pt] at (0,0) (#2) 
                {$#3$};}
    \else
        \rnode[#1]{#2}{#3}
    \fi
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\hachure}
% DÃ©finition des hachures pour les zones interdites.
% La macro prend deux arguments qui sont des paires de longueurs,
% par exemple |\hachure{-3em,12ex}{3em,-1ex}|,
% reprÃ©sentant les extrÃ©mitÃ©s du rectangle Ã&nbsp; hachurer
% par rapport Ã&nbsp; 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 Ã&nbsp; celles de l'option \texttt{pstricks}.
%    \begin{macrocode}
\newcommand*{\hachure}[2]{
    \iftv@tikz
        \tikz[remember picture,overlay]{%
            \fill[pattern={Lines[distance=3pt,angle=135,line width=0.2pt]}]
            (#1) rectangle (#2);}
    \else
        \psframe[linestyle=none,fillstyle=vlines,hatchwidth=0.2pt,
            hatchsep=3pt](#1)(#2)
    \fi
}
%    \end{macrocode}
% \end{macro}

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

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

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

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

% \bigskip
% \subsection{Les environnements \texttt{tablvar} et \texttt{tablvar*}}
%
% \begin{macro}{\tablvarinit}
% \changes{v1.1}{13/04/2019}{ajoutÃ© \bslash extrarowheight}
% Cette commande d'initialisation des compteurs est appelÃ©e
% au dÃ©but de chaque environnement |tablvar|.
% On retire 1 Ã&nbsp; |nb@intervals| Ã&nbsp; 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 
% Ã&nbsp; l'environnement |tablvar|.
% L'instruction |\setcounter{var@ligne}{0}| est nÃ©cessaire ici et pas seulement
% dans la partie variations car le compteur est utilisÃ© par |\ZI| dans les lignes de signes.
%    \begin{macrocode}
\newcommand*{\tablvarinit}[1]{
    \setlength{\extrarowheight}{0pt} % paramÃ¨tre de l'extension array
    \renewcommand{\arraystretch}{\tablvarstretch}
    \setlength{\arrayrulewidth}{\tvrulewidth}
    \setcounter{var@ligne}{0}
    \setcounter{numvr}{0}
    \setcounter{tv@row}{0}
    \setcounter{nb@intervals}{#1}
    \addtocounter{nb@intervals}{-1}
}
%    \end{macrocode}
% \end{macro}

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

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

% \begin{macro}{\tvcoltypes}
% % GrÃ¢ce Ã&nbsp; 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 Ã&nbsp; gauche) ou \texttt{r} 
% (alignÃ© au fer Ã&nbsp; droite). En faire un paramÃ¨tre optionnel ne fonctionne pas ici.
% Les colonnes d'intervalles sont en fait du type \texttt{p}, 
% paragraphe centrÃ©, avec une largeur |\intervalwidth|
% et incrÃ©mentent le compteur interne \texttt{tv@icol}. 
% La premiÃ¨re colonne de lÃ©gende, 
% remet Ã&nbsp; zÃ©ro le compteur \texttt{tv@col} et incrÃ©mente le compteur de ligne
% \texttt{tv@row}.
%
% La commande |\tvcoltypes| est appelÃ©e au dÃ©but de chaque environnement
% \texttt{tablvar} et, de ce fait, ces types de colonnes ne sont reconnus
% qu'Ã&nbsp; l'intÃ©rieur d'un \texttt{tablvar} et ne crÃ©ent pas d'incompatibilitÃ©s
% avec d'autres extensions qui utiliseraient les mÃªmes lettres comme type de colonne.
%    \begin{macrocode}
\newcommand{\tvcoltypes}{
    % type de colonne A pour les lÃ©gendes Ã&nbsp; gauche du tableau
    \newcolumntype{A}{%
        &gt;{\setcounter{tv@icol}{0}\stepcounter{tv@row}\begin{lrbox}%
            \tv@cellbox $}%
        c%
        &lt;{$\end{lrbox}\usebox{\tv@cellbox}\tv@setheight}}
    % type de colonne i pour les intervalles
    \newcolumntype{i}{&gt;{\stepcounter{tv@icol}
        \centering\arraybackslash$}p{\intervalwidth}&lt;{$}}
    % type de colonne v pour les valeurs
    \newcolumntype{v}[1]{% un argument optionnel ne fonctionne pas ici
        &gt;{\ifthenelse{\value{tv@row}=1}{\begin{lrbox}\tv@cellbox $}{}}%
        ##1%
        &lt;{\ifthenelse{\value{tv@row}=1}{$\end{lrbox}%
            \makebox[\colvalwidth][##1]{\usebox\tv@cellbox}}{}}}
}
%    \end{macrocode}
% \end{macro}

% \begin{environment}{tablvar}
% La syntaxe de |tablvar| est : |\begin{tablvar}|\oarg{options}\marg{nbintervals}.
% Le 1\ier\ paramÃ¨tre optionnel permet de rÃ©gler les options sous la forme \emph{clÃ©=valeur}
% ou bien on peut y placer un unique argument dimensionnel qui reprÃ©sente alors
% la largeur des colonnes intervalles.
% Le 2\ieme\ paramÃ¨tre (obligatoire) est le nombre d'intervalles.
% Fondamentalement, cet environnement n'est rien d'autre qu'un |array| 
% dans lequel, aprÃ¨s avoir effectuÃ© les initialisations, 
% on a choisi les bons types de colonnes.
%
% On commence par prendre en compte les options grÃ¢ce Ã&nbsp; |\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 Ã&nbsp; |\XKV@rm|). On l'interprÃ¨te
% \footnote{Un message d'erreur de dimension erronÃ©e
% peut donc signifier que l'on s'est trompÃ© dans l'orthographe d'une clÃ©.}
% alors comme une dimension pour le paramÃ¨tre |\intervalwidth|.
% 
% Les colonnes de valeurs sont de type |c| (centrÃ©) par dÃ©faut mais
% les boolÃ©ens \texttt{extleft} et \texttt{extright} permettent de diffÃ©rencier
% l'alignement dans la premiÃ¨re colonne de valeur (type \texttt{B} comme begin)
% ou la derniÃ¨re (type \texttt{E} comme end).
%    \begin{macrocode}
\newenvironment{tablvar}[2][]{%
    \setkeys*{tablvar}{#1} % fourni par xkeyval
    \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi
    \tvcoltypes   
    \ifextleft\newcolumntype{B}{v{l}}\else\newcolumntype{B}{v{c}}\fi
    \ifextright\newcolumntype{E}{v{r}}\else\newcolumntype{E}{v{c}}\fi
    \tablvarinit{#2}
    \ZIinit
    \begin{array}{%
        |@{\hspace{\firstcolsep}}%
        A@{\hspace{\firstcolsep}}%
        |@{\hspace{\bordercolsep}}%
        B@{\hspace{\innercolsep}}%
        i@{\hspace{\innercolsep}}%
        *{\value{nb@intervals}}{
            v{c}@{\hspace{\innercolsep}}%
            i@{\hspace{\innercolsep}}%
        }%
        E@{\hspace{\bordercolsep}}|%
    }
}{\end{array}}
%    \end{macrocode}
% \end{environment}
%
% \begin{environment}{tablvar*}
% L'environnement |tablvar*| est une variante de |tablvar| (mÃªme syntaxe)
% oÃ¹ les premiÃ¨re et derniÃ¨re colonnes de valeurs sont alignÃ©es respectivement
% au fer Ã&nbsp; gauche (|l|) et Ã&nbsp; droite (|r|).
% L'appel Ã&nbsp; |\setkeys*| enregistre les paramÃ¨tres optionnels 
% dans les variables correspondantes qui seront donc utilisÃ©s par \texttt{tablvar},
% mais \texttt{extleft} et \texttt{extright} seront fixÃ©s.
%    \begin{macrocode}
\newenvironment{tablvar*}[2][]{%
    \setkeys*{tablvar}{#1} % fourni par xkeyval
    \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi
    \begin{tablvar}[extleft,extright]{#2}
}{\end{tablvar}}
%    \end{macrocode}
% \end{environment}
%
% \subsection{La commande \texttt{\textbackslash variations}}
%
% \begin{macro}{\varloop}
% \changes{v1.1}{12/04/2019}{tvloop -&gt; varloop}
% La commande \cmd{\varloop}\marg{iter}\marg{code} rÃ©pÃ¨te \meta{code} (\meta{iter}$- 1$) fois
% (car la derniÃ¨re ligne des variations doit subir un traitement particulier).
% Nous avons crÃ©Ã© notre propre commande de boucle car les usuelles
% |\multido|, |\Multido| ou |\whiledo| plantent sur |\\| ou |\@arraycr|
% et la commande |\variations| a besoin d'utiliser une boucle dans un tableau.
% |\varloop| n'est autre qu'un |\ifthenelse| rÃ©cursif.
%    \begin{macrocode}
\newcounter{loop@counter}    
\newcommand{\varloop}[2]{%
    \setcounter{loop@counter}{#1}
    \addtocounter{loop@counter}{-1}% on boucle 1 fois de moins que #1
    \ifthenelse{\value{loop@counter}=0}{}{%
        #2 \varloop{\value{loop@counter}}{#2}%
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\variations}
% La syntaxe est \cmd{\variations}\oarg{nblignes}\marg{code} oÃ¹ \meta{nblignes} 
% est le nombre de lignes pour les variations (3 par dÃ©faut) ;
% \meta{code} contient les commandes de positionnement
% et les sÃ©parateurs de colonnes |&amp;|. \\
% Le principe est que l'on parcourt \meta{nblignes} fois
% le contenu de |\variations| ;
% Ã&nbsp; chaque itÃ©ration, le compteur |var@ligne| est incrÃ©mentÃ©, 
% le compteur |var@noeud| est remis Ã&nbsp; 0 puis incrÃ©mentÃ© Ã&nbsp; chaque commande |\pos|,
% mais le contenu de |\pos| n'est affichÃ© et le nÅ“ud n'est effectivement crÃ©Ã© 
% que si la valeur du compteur |var@ligne| correspond Ã&nbsp; l'argument de ligne de |\pos|.\\
% Les flÃ¨ches et pointillÃ©s sont dessinÃ©s Ã&nbsp; la fin, quand tous les nÅ“uds sont crÃ©Ã©s,
% mais il faut les tracer avant le |\\| final, sinon la compilation plante !
% Le compteur |var@ligne| doit Ãªtre remis Ã&nbsp; 0 au cas oÃ¹ il y a plusieurs parties variations.
% Cette remise Ã&nbsp; zÃ©ro s'effectue Ã&nbsp; la fin au cas oÃ¹ on mettrait des lignes de signes
% aprÃ¨s une ligne variations.
%    \begin{macrocode}
\newcommand*{\variations}[2][3]{% #1=nblignes (3 par dÃ©faut)
    % (rÃ©)initialisation des compteurs
    \setcounter{nbvarlignes}{#1}
    \setcounter{numdiscont}{0}
    \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}}
    % boucle : on exÃ©cute le code #2 un nb de fois Ã©gal Ã&nbsp; (#1)-1
    \varloop{#1}{%
        \setcounter{var@noeud}{0}\setcounter{numvr}{0}
        % Ã&nbsp; chaque tour de boucle on rÃ©initialise les compteurs de nÅ“uds
        \stepcounter{var@ligne} % le numÃ©ro de ligne est incrÃ©mentÃ©
        #2 % les nÅ“uds sont fabriquÃ©s par le code #2 (avec \pos et \vr)
        \\ % retour ligne
        }
    % derniÃ¨re itÃ©ration -&gt; flÃ¨ches tracÃ©es AVANT \\ sinon bug !?
    \setcounter{var@noeud}{0}\setcounter{numvr}{0}
    \stepcounter{var@ligne} #2
    % tracÃ© des flÃ¨ches
    \addtocounter{var@noeud}{-1} % 1 flÃ¨che de moins que le nb de nÅ“uds
    \setcounter{numdiscont}{1}
    \multido{\Ix=1+1,\Iy=2+1}{\thevar@noeud}{
        \ifthenelse{\value{discont\thenumdiscont}=\Ix}{
            % on saute les discontinuitÃ©s
            \stepcounter{numdiscont}}{
            % sinon on trace la flÃ¨che N1-&gt;N2 puis N2-&gt;N3, etc.
            \fleche{N\Ix}{N\Iy}
        }
    }
    % tracÃ© des pointillÃ©s pour les valeurs remarquables
    \multido{\Ix=1+1}{\thenumvr}{\vrconnect{X\Ix}{Y\Ix}}
    \setcounter{var@ligne}{0}
    \\ % dernier retour ligne du tableau
}
%    \end{macrocode}
% \end{macro}

% \subsection{Les commandes de positionnement}
%
% \label{cmd-pos}
% \begin{macro}{\valpos}
% \cmd{\valpos}\oarg{opt}\marg{ligne}\marg{valeur} 
% sert Ã&nbsp; positionner les valeurs dans la partie variations ;
% \meta{ligne} dÃ©signe la ligne oÃ¹ il faut placer \meta{valeur} et produire le nÅ“ud,
% numÃ©rotÃ© avec le compteur |var@noeud| et dÃ©fini en appelant la commande |\noeud|.
% Les lignes de variations sont numÃ©rotÃ©es \emph{du haut vers le bas} 
% (et les lignes de signes portent toutes le numÃ©ro 0).
% Le 1\ier\ argument optionnel, |c| (centered, par dÃ©faut), |t| (top) ou |b| (bottom),
% est utilisÃ© pour le positionnement des flÃ¨ches.
% La macro |\valpos| sert de macro sous-jacente Ã&nbsp; la macro |\pos|.
%    \begin{macrocode}
\newcommand*{\valpos}[3][c]{
    \stepcounter{var@noeud}
    \ifthenelse{\thevar@ligne=#2}{
        \noeud[#1]{N\thevar@noeud}{#3}
    }{} % si ligne != #2, on ne fait rien
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\zbox}
% Place son contenu dans une boite de largeur nulle : affiche le contenu
% mais considÃ¨re que l'espace occupÃ© est nul pour ne pas altÃ©rer le calcul de la
% largeur de colonne.
% Cette macro est similaire Ã&nbsp; |\mathclap| de l'extension \textsf{mathtools}~\cite{TOOLS}.
% Sa syntaxe est :
% |\zbox|\oarg{pos}\marg{contenu} oÃ¹ \meta{opt} = |c| (par dÃ©faut), |l| (left) ou |r| (right).
%    \begin{macrocode}
\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}}
%    \end{macrocode}
% \end{macro}

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

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

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

% \begin{macro}{\vdecal}
% La macro \cmd{\vdecal}\marg{decal}\marg{contenu} permet de rÃ©aliser un dÃ©calage
% vertical :  
% le 1\ier\ paramÃ¨tre est le dÃ©calage 
% (positif = vers le haut ou nÃ©gatif = vers le bas), le second est le contenu Ã&nbsp; placer.
% Elle est utilisÃ©e en particulier par |\mil|.
%    \begin{macrocode}
\newcommand*{\vdecal}[2]{\smash{\raisebox{#1}{$#2$}}}
%    \end{macrocode}
% |\smash| a pour effet d'annuler la hauteur de la boite afin de ne pas agrandir
% la ligne courante ainsi quelque soit le dÃ©calage, le tableau ne bouge pas
% (on pourrait mÃªme faire sortir le contenu Ã&nbsp; afficher du tableau).
% \end{macro}

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

% \subsection{Barres, discontinuitÃ©s, limites et valeurs remarquables}
%
% \begin{macro}{\barre}
% La macro |\barre| permet de tracer une barre verticale
% pour marquer les sÃ©parations de colonne dans un tableau de signe, en passant
% Ã&nbsp; travers les 0. 
% Son aspect est contrÃ´lÃ© par les paramÃ¨tres |\tvbarrewidth| et |\tvbarrecolor|.
% Sa syntaxe est :
% |\barre|\oarg{valeur} oÃ¹, en principe, on met 0 comme argument optionnel ou rien.
% Le |\hspace{-0.5\tvbarrewidth}| sert Ã&nbsp; obtenir un centrage parfait du |\vrule|
% en particulier si on souhaite un trait Ã©pais.
%    \begin{macrocode}
\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}%
    \color{tvbarrecolor}%
    \hspace{-0.5\tvbarrewidth}\vrule width \tvbarrewidth}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bb}
% La macro |\bb|, qui produit une double barre,
% reprend celle de l'extension \mbox{\textsf{variations}} de Christian Obrecht :
% |\def\bb{\vrule\kern1pt\vrule}|.
% Nous avons ajoutÃ© \texttt{1.5pt} d'espace avant et aprÃ¨s, afin d'aligner au mieux
% la double barre avec un 0 sur la ligne des $x$, lorsque la double barre
% se trouve Ã&nbsp; 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 Ã&nbsp; positionner des limites Ã&nbsp; gauche ou Ã&nbsp; 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 Ã&nbsp; placer.
%
% \DescribeMacro{\limg*}\DescribeMacro{\limd*}
% Les versions Ã©toilÃ©es n'acceptent comme argument que \texttt{+} ou \texttt{-}, 
% |\limg*{+}| correspond Ã&nbsp; |\limg{1}{+\infty}|,
% |\limg*{-}| correspond Ã&nbsp; |\limg{|$n$|}{-\infty}| (pour une partie variations
% sur $n$ lignes et de mÃªme pour |\limd*|.
%    \begin{macrocode}
\newcommand*{\@limg}[3][c]{%
    \zbox[r]{\valpos[#1]{#2}{#3\hspace{\limsep}}}}
\newcommand*{\@limd}[3][c]{%
    \zbox[l]{\valpos[#1]{#2}{\hspace{\limsep}#3}}}
\newcommand*{\@@limg}[1]{%
    \ifthenelse{\equal{#1}{+}}{\@limg{1}{+\infty}}{
    \ifthenelse{\equal{#1}{-}}{\@limg{\value{nbvarlignes}}{-\infty}}{
        \PackageError{tablvar}{Invalid argument for \string\limg*}
            {Only + or - are valid arguments for \string\limg*}
    }}
}
\newcommand*{\@@limd}[1]{%
    \ifthenelse{\equal{#1}{+}}{\@limd{1}{+\infty}}{
    \ifthenelse{\equal{#1}{-}}{\@limd{\value{nbvarlignes}}{-\infty}}{
        \PackageError{tablvar}{Invalid argument for \string\limd*}
            {Only + or - are valid arguments for \string\limd*}
    }}
}
\newcommand{\limg}{\@ifstar{\@@limg}{\@limg}}
\newcommand{\limd}{\@ifstar{\@@limd}{\@limd}}
%    \end{macrocode}

% \begin{macro}{\discont}
% Associe un numÃ©ro de nÅ“ud Ã&nbsp; un compteur de discontinuitÃ©
% (chaque discontinuitÃ© a son propre compteur).
% La flÃ¨che entre le nÅ“ud prÃ©cÃ©dent |\discont| (enregistrÃ© dans le compteur)
% et le nÅ“ud suivant ne sera pas tracÃ©e.
%    \begin{macrocode}
\newcommand*{\discont}{
    \ifthenelse{\thevar@ligne=1}{
        % on ne compte les discontinuitÃ©s qu'une seule fois, sur ligne 1
        \ifthenelse{\thenumdiscont=0}{
            \ifthenelse{\thevar@noeud &gt; 0}{% pas avant le 1er nÅ“ud
                \stepcounter{numdiscont}
                \setcounter{discont\thenumdiscont}{\thevar@noeud}
            }{}
        }{% on ne compte pas 2 fois la mÃªme discontinuitÃ©
            \ifthenelse{\thevar@noeud &gt; \value{discont\thenumdiscont}}{      
                \stepcounter{numdiscont}
                \setcounter{discont\thenumdiscont}{\thevar@noeud}
            }{}
        }
    }{}
}
%    \end{macrocode}
% \end{macro}

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

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

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

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

% \begin{macro}{\ZInew}
% CrÃ©Ã© une nouvelle zone interdite en lui affectant un numÃ©ro (indice)
% et mÃ©morise le numÃ©ro de 
% la colonne intervalle oÃ¹ cette ZI est crÃ©Ã©e.
% Si le numÃ©ro de colonne (intervalle) courante ne correspond
% Ã&nbsp; 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Ã&nbsp; Ã©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 Ã&nbsp; 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}&gt;0}{}{
        % si pas de ZI disponible il faut augmenter nbZI
        \stepcounter{nbZI}
        \setcounter{numZI}{\value{nbZI}}
    }
    \setcounter{ZI\thenumZI}{\value{tv@icol}}
}
%    \end{macrocode}
% \end{macro}

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

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

% \begin{macro}{\ZIgetheight}
% On rÃ©cupÃ¨re, avant le tracÃ©, la hauteur globale de la ZI 
% (dont le numÃ©ro est donnÃ© en argument) dans la variable |\ZIheight|.
%    \begin{macrocode}
\newcommand*\ZIgetheight[1]{%
    \ifnum #1=1
        \global\ZIheight=\ZIheighti
    \else \ifnum #1 = 2
        \global\ZIheight=\ZIheightii
    \else \ifnum #1 = 3
        \global\ZIheight=\ZIheightiii
    \else \ifnum #1 = 4
        \global\ZIheight=\ZIheightiv
    \fi\fi\fi\fi
}
%    \end{macrocode}
% \end{macro}
% \DescribeMacro{\ZI}
% La macro |\ZI| est Ã&nbsp; 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 Ã&nbsp; |\ZI*|). 
%
% On crÃ©e une discontinuitÃ© puis on rÃ©cupÃ¨re l'indice de ZI (\texttt{numZI})
% grÃ¢ce Ã&nbsp; |\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 Ã&nbsp; |\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 Ã&nbsp; \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 Ã&nbsp; 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 Ã&nbsp; intervenir.
% 
% Par contre, dans un tableau de signes sans partie variations 
% il faut placer explicitement des |\ZI*| Ã&nbsp; la place des |\ZI|, au moment
% oÃ¹ l'on souhaite dÃ©clencher le tracÃ© des hachures, sur la derniÃ¨re ligne 
% d'un bloc de hachures.
% La commande |\ZI*| possÃ¨de le mÃªme argument optionnel |ZI*|\oarg{hauteur}. 
%    \begin{macrocode}
\newcommand*{\@ZI}[1][0pt]{%
    \discont
    \ifthenelse{\thevar@ligne=\value{nbvarlignes}}{\@@ZI[#1]}{%
        \ZIfind
        \ifnum \thenumZI = 0 \ZInew \fi
        \ZIaddheight{\thenumZI}
    }
}

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

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

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