% % % % % % % TABVAR.STY - REALISATION DE TABLEAUX DE VARIATIONS  % % % % % % %
% Sur une id\'ee de L.G. Vidiani, modifi\'ee par R. Cabane                    %
% \tabvar{...} ->tableau de variation encadr\'e avec un trait de s\'eparation %
%             entre les colonnes 1 et 2. Les cellules du tableau sont         %
%             compos\'ees en mode math\'ematique. La ligne de base du tableau %
%             est celle de la ligne 1. Les lignes du tableau doivent          %
%             obligatoirement se terminer par \\                              %
%     Dans l'environnement \tabvar, on dispose des macros suivantes :         %
%     \\ : interligne normale                                                 %
%     \L  : trait horizontal                                                  %
%     \d  : fl\`eche descendante                                              %
%     \c  : fl\`eche montante                                                 %
%     \v  : trait vertical centr\'e                                           %
%     \V  : double trait vertical centr\'e                                    %
%     \Vd : double trait vertical cadr\'e \`a droite                          %
%     \Vg : double trait vertical cadr\'e \`a gauche                          %
%     \q  : cale de largeur (\qquad)                                          %
%     \ccc : fl\`eche montante sur 3 colonnes (fusionn\'ees)                  %
%     \ddd : fl\`eche descendante sur 3 colonnes (idem)                       %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
\catcode`\@=11
% Parametres ajustables
\newdimen\tvsaut\tvsaut1.8pt
\newdimen\calehaut\calehaut15pt
\newdimen\calebas\calebas4pt
%
\def\@whilenoop#1{}
\def\@whiledim#1\do #2{\ifdim #1\relax#2\@iwhiledim{#1\relax#2}\fi}
\def\@iwhiledim#1{\ifdim #1\let\@nextwhile=\@iwhiledim
        \else\let\@nextwhile=\@whilenoop\fi\@nextwhile{#1}}

\newbox\@picbox
\newdimen\@picht
\newdimen\@tempdima
\newdimen\@tempdimb
\newcount\@tempcnta
\newcount\@tempcntb
\newcount\@xarg
\newcount\@yarg
\newbox\@linechar
\newdimen\@linelen
\newdimen\@clnwd
\newdimen\@clnht

\font\tenln   =line10

\def\@sline{\ifnum \@yarg>\z@ \@tempcnta\@yarg \else \@tempcnta -\@yarg \fi
\setbox\@linechar\hbox{\tenln
\@tempcnta\@xarg\relax\multiply\@tempcnta 8%
\advance\@tempcnta -9\ifnum \@yarg>\z@ \advance\@tempcnta \@yarg\relax\else
\advance\@tempcnta -\@yarg\relax\advance\@tempcnta 64 \fi
\char\@tempcnta}
\ifnum \@yarg>\z@ \let\@upordown\raise \@clnht\z@
   \else\let\@upordown\lower \@clnht \ht\@linechar\fi
\@clnwd \wd\@linechar
\let\@tempa\relax
\@whiledim \@clnwd<\@linelen \do
  {\@upordown\@clnht\copy\@linechar
   \@tempa
   \advance\@clnht \ht\@linechar
   \advance\@clnwd \wd\@linechar}%
\advance\@clnht -\ht\@linechar
\advance\@clnwd -\wd\@linechar
\@tempdima\@linelen\advance\@tempdima -\@clnwd
\@tempdimb\@tempdima\advance\@tempdimb -\wd\@linechar
\hskip \@tempdimb
\multiply\@tempdima \@m
\@tempcnta \@tempdima \@tempdima \wd\@linechar \divide\@tempcnta \@tempdima
\@tempdima \ht\@linechar \multiply\@tempdima \@tempcnta
\divide\@tempdima \@m
\advance\@clnht \@tempdima
\ifdim \@linelen<\wd\@linechar \hskip \wd\@linechar
  \else\@upordown\@clnht\copy\@linechar\fi}

\def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
\@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi
\@linelen #3pt\@sline
\@tempcnta\@yarg \ifnum\@tempcnta<\z@ \@tempcnta -\@tempcnta\fi
\hskip -\wd\@linechar
\@upordown\@clnht \hbox{\tenln \@tempcntb \@yarg\relax
\ifnum\@tempcntb<\z@ \@tempcntb -\@tempcntb\relax\fi
\ifcase \@tempcntb\relax \@tempcnta'55 \or
\ifnum \@xarg<\thr@@ \@tempcnta \@xarg\relax\multiply\@tempcnta
24\advance\@tempcnta -6 \else \ifnum \@xarg=\thr@@ \@tempcnta 49
\else\@tempcnta 58 \fi\fi\or
\ifnum \@xarg<\thr@@ \@tempcnta=\@xarg\relax\multiply\@tempcnta
24\advance\@tempcnta -\thr@@ \else \@tempcnta 51 \fi\or
\@tempcnta \@xarg\relax\multiply\@tempcnta
\sixt@@n \advance\@tempcnta -\tw@ \else
\@tempcnta \@xarg\relax\multiply\@tempcnta
\sixt@@n \advance\@tempcnta 7 \fi\ifnum \@yarg<\z@ \advance\@tempcnta 64 \fi
\char\@tempcnta}}

\def\fleche(#1,#2,#3,#4,#5,#6,#7)
{\@picht #2pt
\setbox\@picbox\hbox to #1pt\bgroup
\hskip -#3pt \lower #4pt \hbox\bgroup\ignorespaces
\hbox to\z@{\vector(#5,#6){#7}\hss}\ignorespaces
\egroup\hss\egroup\ht\@picbox\@picht
\dp\@picbox\z@%\leavevmode
\box\@picbox}
%
\catcode`\@=12
%
\newdimen\tabvardim
\newdimen\tvtemp
\newbox\matos
\newbox\flechec
\newbox\fleched
\newbox\flecheccc
\newbox\flecheddd

\def\tabvar#1{{%                                  % macros locales
\def\L{\noalign{\hrule}}%                         % trait horizontal
\let\q=\qquad%                                    % cale de largeur
\let\v=\vrule%                                    % trait vertical
\let\\=\cr%                                       % fin de ligne
\def\V{\vrule\hskip2pt\vrule}%                    % double trait vertical
\def\Vg{\V\hfill}%                                % double trait \`a gauche
\def\Vd{\hfill\V}%                                % double trait \`a droite
\setbox\flechec=\hbox{\fleche(10,10,2,2,2,1,10) }
\setbox\fleched=\hbox{\fleche(10,10,2,-6,2,-1,10) }
\setbox\flecheccc=\hbox{\fleche(40,10,2,-2,4,1,40) }
\setbox\flecheddd=\hbox{\fleche(40,10,2,-2,4,-1,40) }
%
\def\c{\copy\flechec %                            % fl\`eche montante+
\global\advance\tabvardim by2\tvsaut}%            % croissant+
\def\d{\copy\fleched %                            % fl\`eche descendante -
\global\advance\tabvardim by-2\tvsaut}%           % d\'ecroissant -
\def\ccc{\multispan3\hfil\raise\tabvardim
\copy\flecheccc\hfil                              % fl\`eche montante+++
\global\advance\tabvardim by6\tvsaut}%            % croissant 3 cases
\def\ddd{\multispan3\hfil\raise\tabvardim
\copy\flecheddd\hfil                              % fl\`eche descendante ---
\global\advance\tabvardim by-6\tvsaut}%           % d\'ecroissant 3 cases
\def\place##1{\setbox\matos\hbox{$##1$}%          % d\'epose mat\'eriel
\tvtemp\ht\matos\advance\tvtemp                   % entourer de blanc
by\tvsaut\ht\matos\tvtemp                         % vers le haut
\tvtemp\dp\matos\advance\tvtemp                   % idem
by\tvsaut\dp\matos\tvtemp                         % vers le bas
\raise\tabvardim\box\matos}                       % place la bo\^\i te
%
\leavevmode                                       % mode horizontal
\hbox{\vrule                                      % cadre (trait gauche)
\vbox{\hrule                                      % cadre (trait haut)
\vtop{\offinterlineskip                           % lignes jointives
\halign{\vbox to\calehaut{}\vtop to\calebas{}     % cale de hauteur/profondeur
\ \hfil$##$\hfil\                                 % colonne 1
\global\tabvardim0pt%
\vrule\                                           % s\'eparation 1-2
&&\hfil\place{##}\hfil\\                          % colonnes 2,3,..
#1%                                               % contenu du tableau
\noalign{\hrule}%                                 % cadre (trait bas)
}}}\vrule}}}                                      % cadre (trait droit)

