%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Nouvelles marcros et environnement %%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\newcounter{TabNodeX}                          % Compte les colonnes
\renewcommand{\theTabNodeX}{\Alph{TabNodeX}}   % Compte en A B C ...

\newcounter{TabNoLigne}[TabNodeX]              % Compte les lignes dans une colonne
\newcounter{TabVieux}                          % Ancienne ligne

\newcounter{TabShowLabel}
\newcommand{\TabShowLabelOn}{
    \setcounter{TabShowLabel}{1}
    \psgrid[gridcolor=blue,subgridcolor=blue,subgriddiv=10,%
                gridwidth=.5pt,subgridwidth=.1pt,%
                gridlabels=0pt](-1cm,-1)(1,\NbLignesH)}
\newcommand{\TabShowLabelOff}{\setcounter{TabShowLabel}{0}}

\newlength{\TabLargeur}             % Largeur du tableau en cm
\newlength{\TabColX}                % Abscisse de la colonnne
\newlength{\TabNodeX}               % Abscisse du node

\newlength{\TabTitreL}              % Largeur de la colonne de gauche
\setlength{\TabTitreL}{1.5cm}       % de 1.5cm par défaut

\newlength{\TabHautLigne}           % Hauteur d'une ligne en cm
\newlength{\TabNodeY}               % Ordonnée du node

\newcommand{\TabNewCol}[1]{%
    \setcounter{TabVieux}{-1}
	\stepcounter{TabNodeX}              % Incrémente le numéro de colonne
    \setlength{\TabColX}{#1\TabLargeur} % place la colonne horizontalement
    }
    
\newcommand{\rTabPut}[5][0]{%           % #1 type de ligne qui traverse
                                        %    la case. 0 rien (défaut),
                                        %    1 pointillé, 2 filet, 3 dbl barre
                                        % #2 point de référence
                                        % #3 Correction horizontale
                                        % #4 Correction verticale 
                                        % #5 ce qu'il faut afficher
    
    % Calcule l'ordonnée du node avec la correction verticale
    
    \setlength{\TabNodeY}{#4\TabHautLigne}
    \addtolength{\TabNodeY}{-\theTabNoLigne\TabHautLigne}
    
    
    % Calcule l'abscisse du node avec la correction horizoncale
    
    \setlength{\TabNodeX}{#3cm}
    \addtolength{\TabNodeX}{\TabColX}
        
        % Affiche le nom des nodes à la place de ce qu'il faudrait
        % Plus une grille pour les positionner

        \ifthenelse%           ligne en pointillé dans la case
		{\equal{#1}{1}}%
		{\psline[style=TabLigneP]%
			(\TabNodeX,\theTabVieux)%
			(\TabNodeX,\theTabNoLigne)}%
		{}%

		\ifthenelse%           ligne en continue dans la case
		{\equal{#1}{2}}%
		{\psline[style=TabLigne]%
			(\TabNodeX,\theTabVieux)%
			(\TabNodeX,\theTabNoLigne)}%
		{}%

		\ifthenelse%           ligne double dans la case
		{\equal{#1}{3}}%
		{\psline[style=TabDblBarre]%
			(\TabNodeX,\theTabVieux)%
			(\TabNodeX,\theTabNoLigne)}%
		{}%
        \ifthenelse%
        {\equal{\theTabShowLabel}{0}}%
        {    % Pour que les nodes se déplacent dynamiquement avec le changement
             % de hauteur de ligne sauf sur la ligne au dessus du tableau. 

            \ifthenelse%
            {\equal{\theTabNoLigne}{0}}%
            {\rput[#2](\TabNodeX,#4cm)%
                {\rnode{\theTabNodeX\theTabNoLigne}{#5}}}%
            {\rput[#2](\TabNodeX,\TabNodeY)%
                {\rnode{\theTabNodeX\theTabNoLigne}{#5}}}%

		\stepcounter{TabVieux}
        \stepcounter{TabNoLigne}            % numéro de ligne suivante
		
        }%
        {    % Pour que les nodes se déplacent dynamiquement avec le changement
             % de hauteur de ligne sauf sur la ligne au dessus du tableau. 
            \ifthenelse%
            {\equal{\theTabNoLigne}{0}}%
            {\uput{.2}[90](\TabNodeX,#4cm){\bf\footnotesize\theTabNodeX\theTabNoLigne}
			 \rput[#2](\TabNodeX,#4cm)%
                {\rnode{\theTabNodeX\theTabNoLigne}{\small$\bullet$}}}%
            {\uput{.2}[90](\TabNodeX,\TabNodeY){\bf\footnotesize\theTabNodeX\theTabNoLigne}
			 \rput[#2](\TabNodeX,\TabNodeY)%
                {\rnode{\theTabNodeX\theTabNoLigne}{\small$\bullet$}}}%
        
        \stepcounter{TabNoLigne}            % numéro de ligne suivante
        
        }%

    
    }

\newenvironment{MonTableau}[3]{%        % #1 est le nombre de lignes
                                        % #2 est la largeur du tableau
                                        % #3 est la hauteur d'une ligne
    
    \setcounter{TabNodeX}{0}            % On repart de 0
	
	\setlength{\TabLargeur}{#2cm}       % Largeur du tableau
    \setlength{\TabHautLigne}{#3cm}     % Hauteur des lignes
    \psset{xunit=#2,yunit=-#3}          % Unités pour que chaque case du tableau
                                        % ait les dimension 1x1
                                        
    \begin{pspicture}(-\TabTitreL,#1)(1,.8cm)   % Début de PSpicture
    
    \def\NbLignesH{#1}
    }%
    {\psline(-\TabTitreL,0)(1,0)                % Dessin des lignes horizontales
    \multido{\i=1+1}{\NbLignesH}{%
        \psline[linewidth=.3pt](0,\i)(1,\i)}
    
	% Dessin des lignes verticales et de la dernière ligne
    \psline(0,.8cm)(0,\NbLignesH)(1,\NbLignesH)(1,0)
	
	\end{pspicture}                    % Fin de PSpicture
    }

\newcommand{\TabFleche}[2]{%            % Flèche entre deux nodes
    \ncline[nodesep=3pt,linewidth=.5pt]{->}{#1}{#2}}

\newcommand{\TabTitre}[2]{%             % Titre de ligne var. ou sgn. de f
	$\stackrel{\rule[-5pt]{0pt}{5pt}\text{\normalsize\bf#1}}{#2}$}

\newcommand{\TabFerme}{%      % ferme le tableau pour ceux qui on froid
	\psline(1,\NbLignesH)(1,.8cm)(-\TabTitreL,.8cm)(-\TabTitreL,\NbLignesH)%
	(1,\NbLignesH)}

\newcommand{\TabTitreFerme}{%      % lignes horizontales dans la col. de gauche
    \multido{\i=1+1}{\NbLignesH}{%
        \psline[linewidth=.3pt](-\TabTitreL,\i)(0,\i)}}

\newpsstyle{TabDblBarre}{linewidth=.4pt,doubleline=true,doublesep=.6pt}
\newpsstyle{TabLigne}{linewidth=.4pt}
\newpsstyle{TabLigneP}{linewidth=.4pt,linestyle=dashed,dash=3pt 2pt}

\newcommand{\TabZ}[1][$0$]{\pscirclebox*{#1}}