%% Mars 1999 : Il y a certaines lignes \`a ne pas num\'eroter (par
%%             exemple, celles qui ne contiennent que des espaces
%%             verticaux avant ou apr\`es une \'enum\'eration).
%% Mars 1999 : commentaires
%%
%% Modifiations par VZ, Juillet 1998
%%
%% Il y a quelques bugs, en particulier des traits qui sont trop
%% longs, trop courts, trop \'epais ou trop fins. Si Quelqu'un sait \`a
%% quoi c'est d\^u, qu'il me le dise.
%%
%% Il ne devrait plus y avoir de probl\`eme \`a cause d'un environement de
%% type liste (itemize, enumerate, etc.) \`a l'int\'erieur des boites.
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% D'apr\`es :
% eclbkbox.sty by Hideki Isozaki, 1992
% Date: May  28, 1993
\ProvidesFile{boites-tb.sty} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{boites-tb} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newbox\fd@box
\newdimen\fd@dima
\newdimen\fd@dimb

\newbox\bk@bxb
\newbox\bk@bxa
\newif\if@bkcont 
\newif\ifbkcount
\newcount\bk@lcnt

\@ifundefined{FrameRule}{\newdimen\FrameRule \FrameRule=\fboxrule}{}
\@ifundefined{FrameSep} {\newdimen\FrameSep  \FrameSep =2\fboxsep}{}

\def\breakboxskip{1pt}
\def\breakboxparindent{0em}

%% Param\`etres modifiables
%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\bkvz@before@breakbox{\ifhmode\par\fi\vskip\breakboxskip\relax} %%%

% Ce que l'on met \`a gauche du texte, par exemple, une ligne verticale
% pour faire un cadre, ou une ligne qui ondule.
\def\bkvz@left{{\color{framecolor}\vrule \@width\FrameRule}} %%%%%%%%%%%%%%%%%

% De m\^eme, ce que l'on met \`a droite,
\def\bkvz@right{{\color{framecolor}\vrule \@width\FrameRule}} %%%%%%%%%%%%%%%%

% en haut
\def\bkvz@top{{\color{framecolor}\hrule\@height\FrameRule}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% ou en bas
\def\bkvz@bottom{{\color{framecolor}\hrule\@height\FrameRule}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Si vous modifiez l'une de ces macros, il ne faut pas oublier de
% modifier aussi la suivante, qui change la valeur de \linewidth en
% lui retirant la largeur de tout ce que l'on vient de mettre sur le
% c\^ot\'e. 
\def\bkvz@set@linewidth{\advance\linewidth -2\FrameRule %%%%%%%%%%%%%%%%
  \advance\linewidth -2\FrameSep} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% FIN DES PARAM\`ETRES MODIFIABLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Le d\'ebut de l'environement
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\breakbox{%
  % On n'est pas n\'ecessairement en mode vertical.
  % C'est \bkvz@before@breakbox qui s'en occupe (ou non).
\bkvz@before@breakbox
  % on met tout dans une \vbox (\bk@bxb)
\setbox\bk@bxb\vbox\bgroup
  % \`A l'int\'erieur de cette \vbox, on change la valeur de \hsize (et
  % aussi \linewidth).
\bkvz@set@linewidth %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\hsize\linewidth
  % je ne sais pas ce que fait la commande \@parboxrestore.
\@parboxrestore
  % On indente \'eventuellement, si l'utilisateur le d\'esire. 
\parindent\breakboxparindent\relax}

%% On coupe la boite
%%%%%%%%%%%%%%%%%%%%%%
% \@tempdimb: amount of vertical skip 
% between the first line (\bk@bxa) and the rest (\bk@bxb)
\def\bk@split{%
  % On calcule la hauteur totale (hauteur + profondeur) de la boite.
\@tempdimb\ht\bk@bxb % height of original box
\advance\@tempdimb\dp\bk@bxb 
  % On coupe, \`a l'aide de la commande \vsplit... to 0pt
  % Le morceau du haut se retrouve dans \bk@bxa, 
  % celui du bas dans \bk@bxb.
\setbox\bk@bxa\vsplit\bk@bxb to\z@ % split it
  % L'un des probl\`emes, c'est que la premi\`ere boite a une hauteur vide. 
  % On peut lui redonner sa hauteur initiale grace \`a \vbox{\unvbox...}
\setbox\bk@bxa\vbox{\unvbox\bk@bxa}% recover height & depth of \bk@bxa
  % L'autre probl\`eme, c'est que l'on a perdu l'espace (interligne) entre
  % nos deux boites. Pour le r\'ecup\'erer, on ajoute la hauteur de ces deux
  % boites, et on fait la diff\'erence avec la hauteur initiale.
\setbox\@tempboxa\vbox{\copy\bk@bxa\copy\bk@bxb}% naive concatenation
\advance\@tempdimb-\ht\@tempboxa 
\advance\@tempdimb-\dp\@tempboxa
  % D\'esormais, \@tempdimb contient l'espace entre les deux boites, que
  % l'on utilisera avec \bk@addskipdp.
}% gap between two boxes
 
%% Rajouter \fboxsep \`a la premi\`ere ligne
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \@tempdima: height of the first line (\bk@bxa) + fboxsep
\def\bk@addfsepht{%
     \setbox\bk@bxa\vbox{\vskip\FrameSep\box\bk@bxa}}

%% cette macro n'est pas utilis\'ee
\def\bk@addskipht{%
     \setbox\bk@bxa\vbox{\vskip\@tempdimb\box\bk@bxa}}

%% Rajouter \fboxsep \`a la derni\`ere ligne
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \@tempdima: depth of the first line (\bk@bxa) + fboxsep
\def\bk@addfsepdp{%
     \@tempdima\dp\bk@bxa
     \advance\@tempdima\FrameSep
     \dp\bk@bxa\@tempdima}

%% Rajouter l'espace qui a \'et\'e perdu par \vsplit... to 0pt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \@tempdima: depth of the first line (\bk@bxa) + vertical skip
\def\bk@addskipdp{%
     \@tempdima\dp\bk@bxa
     \advance\@tempdima\@tempdimb
%     \advance\@tempdima0.5pt
     \dp\bk@bxa\@tempdima}

%% On ne compte pas toutes les lignes, mais uniquement celles qui en
%% sont vraiment. J'ai pris comme crit\`ere une largeur sup\'erieure \`a
%% 1mm.  La m\^eme distance se retrouve un peu plus loin, dans
%% \bk@line. 
\def\bkvz@countlines{%
  \ifdim\wd\bk@bxa>1mm\advance\bk@lcnt\@ne\fi
}

%% Afficher la ligne que l'on vient de couper
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\bk@line{%
    \hbox to \linewidth{%
      \ifdim\wd\bk@bxa>1mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \ifbkcount\smash{\llap{\the\bk@lcnt\ }}\fi
      \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      \bkvz@left %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%      \colorbox{shadecolor}{\box\bk@bxa}%
      % On rajoute les espaces sur les bords
      \setbox\fd@box\hbox{\vrule\@width\FrameRule}%
      \ifdim\dp\bk@bxa>\dp\fd@box%
        \fd@dima\dp\bk@bxa%
      \else%
        \fd@dima\dp\fd@box%
      \fi%
      \ifdim\ht\bk@bxa>\ht\fd@box%
        \fd@dimb\ht\bk@bxa%
      \else%
        \fd@dimb\ht\fd@box%
      \fi%
      \setbox\bk@bxa\hbox{\hskip\FrameSep\box\bk@bxa\hskip\FrameSep}%
      \rlap{\color{shadecolor}\vrule \@height\fd@dimb \@depth\fd@dima \@width\linewidth}%wd\bk@bxa}%
      \box\bk@bxa%
        % Il arrive que la boite ne soit pas aussi large que la ligne
        % (par exemple, espace avant une \'enum\'eration)
      \hfil %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      \bkvz@right}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% La fin de l'environement
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\endbreakbox{%
  % On ferme la \vbox (\bk@bxb)
\egroup
%\ifhmode\par\fi
{\noindent
  % On remet le compteur de lignes \`a un.
\bk@lcnt 0%
  % Le bool\'een que nous allons utiliser dans la boucle plus loin.
\@bkconttrue
  % Comme on va empiler des boites, on met certains ressorts \`a z\'ero,
  % pour \'eviter les espaces verticaux non d\'esir\'es.
\baselineskip\z@
\lineskiplimit\z@
\lineskip\z@
\vfuzz\maxdimen
  % On coupe la boite
\bk@split
  % On ajoute un peu d'espace vertical (\fboxsep) au dessus
\bk@addfsepht
  % On ajoute en dessous l'espace qui avait \'et\'e perdu par la commande
  % \vsplit. 
\bk@addskipdp
  % De deux choses l'une, 
\ifvoid\bk@bxb
  % Soit, il n'y a qu'une ligne
\def\bk@fstln{%
  % On rajoute un peu d'espace (\fboxsep) en dessous.
\bk@addfsepdp
  % On construit la boite : le haut, le milieu (qui contient la gauche
  % et la droite) et le bas.
\bkvz@countlines
\vbox{\bkvz@top\bk@line\bkvz@bottom}}% %%%%%%%%%%%%%%%%%%%%%%%%%%
  % Soit, il y en a plusieurs.
\else
\def\bk@fstln{%
  % On met le haut
\bkvz@countlines
\vbox{\bkvz@top\bk@line}% %%%%%%%%%%%%%%%%%%%%%%%%%%%
  % ??? (Si on l'enl\`eve, \c{c}a ne marche plus.)
\hfil 
  % On commence \`a compter les lignes
%\advance\bk@lcnt\@ne %%%%%%%%%%%%%%%%%%%% Voir \bkvz@countlines
  % D\'ebut de la boucle
\loop 
  % On coupe ce qui reste de la boite.
 \bk@split
  % On rajoute l'espace vertical qui a \'et\'e perdu.
 \bk@addskipdp
  % \'Eventuellement, on augmente le num\'ero de la ligne
 \bkvz@countlines
  % ???
\leavevmode
  % S'il s'agit de la derni\`ere ligne
\ifvoid\bk@bxb
  % On met le bool\'een indiquant que la boucle doit se poursuivre \`a FAUX.
 \@bkcontfalse
  % On met un peu d'espace vertical (\fboxsep)
 \bk@addfsepdp
  % En envoie la derni\`ere ligne.
  % POURQUOI \vtop ??? Pour que l'\'eventuel num\'ero de ligne soit \`a la
  % bonne hauteur.
 \vtop{\bk@line\bkvz@bottom}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\else               % 2,...,(n-1)
 \bk@line
\fi
 \hfil
 %\advance\bk@lcnt\@ne %%%%%%%%%%%%%%%% Voir \bkvz@countlines
\if@bkcont\repeat}%
\fi
\leavevmode\bk@fstln\par}\vskip\breakboxskip\relax}

\bkcountfalse

%% Seconde modification
\def\boiteavecunebarre{%
  %\fboxrule=0.4pt
  \def\bkvz@before@breakbox{\ifhmode\par\fi\vskip\breakboxskip\relax}%
  \def\bkvz@set@linewidth{\advance\linewidth -2\fboxrule 
    \advance\linewidth -2\fboxsep
    \advance\linewidth -4mm}%
  \def\bkvz@left{\hspace{4mm}%
    \vrule \@width\fboxrule\hskip\fboxsep}%
  \def\bkvz@right{}%
  \def\bkvz@top{}%
  \def\bkvz@bottom{}%
  \breakbox
}
\def\endboiteavecunebarre{\endbreakbox}
