% boites.sty
% (c) 1998-1999 Vincent Zoonekynd <zoonek@math.jussieu.fr>
% Distributed under the GNU Public Licence
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Mars 1999 : Il y a certaines lignes à ne pas numéroter (par
%%             exemple, celles qui ne contiennent que des espaces
%%             verticaux avant ou après une énumération).
%% Mars 1999 : commentaires
%%
%% Modifiations par VZ, Juillet 1998
%%
%% Il y a quelques bugs, en particulier des traits qui sont trop
%% longs, trop courts, trop épais ou trop fins. Si Quelqu'un sait à
%% quoi c'est dû, qu'il me le dise.
%%
%% Il ne devrait plus y avoir de problème à cause d'un environement de
%% type liste (itemize, enumerate, etc.) à l'intérieur des boites.
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% D'après :
% eclbkbox.sty by Hideki Isozaki, 1992
% Date: May  28, 1993

\ProvidesFile{boites.sty} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{boites} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

\def\breakboxskip{2pt}
\def\breakboxparindent{1.8em}

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

% Ce que l'on met à gauche du texte, par exemple, une ligne verticale
% pour faire un cadre, ou une ligne qui ondule.
\def\bkvz@left{\vrule \@width\fboxrule\hskip\fboxsep} %%%%%%%%%%%%%%%%%

% De même, ce que l'on met à droite,
\def\bkvz@right{\hskip\fboxsep\vrule \@width\fboxrule} %%%%%%%%%%%%%%%%

% en haut
\def\bkvz@top{\hrule\@height\fboxrule} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% ou en bas
\def\bkvz@bottom{\hrule\@height\fboxrule} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 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ôté. 
\def\bkvz@set@linewidth{\advance\linewidth -2\fboxrule %%%%%%%%%%%%%%%%
  \advance\linewidth -2\fboxsep} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% FIN DES PARAMÈTRES MODIFIABLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

%% Le début de l'environement
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\breakbox{%
  % On n'est pas nécessairement 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
  % À l'intérieur 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 éventuellement, si l'utilisateur le désire. 
\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, à 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èmes, c'est que la première boite a une hauteur vide. 
  % On peut lui redonner sa hauteur initiale grace à \vbox{\unvbox...}
\setbox\bk@bxa\vbox{\unvbox\bk@bxa}% recover height & depth of \bk@bxa
  % L'autre problème, c'est que l'on a perdu l'espace (interligne) entre
  % nos deux boites. Pour le récupérer, on ajoute la hauteur de ces deux
  % boites, et on fait la différence avec la hauteur initiale.
\setbox\@tempboxa\vbox{\copy\bk@bxa\copy\bk@bxb}% naive concatenation
\advance\@tempdimb-\ht\@tempboxa 
\advance\@tempdimb-\dp\@tempboxa
  % Désormais, \@tempdimb contient l'espace entre les deux boites, que
  % l'on utilisera avec \bk@addskipdp.
}% gap between two boxes
 
%% Rajouter \fboxsep à la première ligne
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \@tempdima: height of the first line (\bk@bxa) + fboxsep
\def\bk@addfsepht{%
     \setbox\bk@bxa\vbox{\vskip\fboxsep\box\bk@bxa}}

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

%% Rajouter \fboxsep à la dernière ligne
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \@tempdima: depth of the first line (\bk@bxa) + fboxsep
\def\bk@addfsepdp{%
     \@tempdima\dp\bk@bxa
     \advance\@tempdima\fboxsep
     \dp\bk@bxa\@tempdima}

%% Rajouter l'espace qui a été 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
     \dp\bk@bxa\@tempdima}

%% On ne compte pas toutes les lignes, mais uniquement celles qui en
%% sont vraiment. J'ai pris comme critère une largeur supérieure à
%% 1mm.  La même 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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      \box\bk@bxa
        % Il arrive que la boite ne soit pas aussi large que la ligne
        % (par exemple, espace avant une énumération)
      \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 à un.
\bk@lcnt 0%
  % Le booléen que nous allons utiliser dans la boucle plus loin.
\@bkconttrue
  % Comme on va empiler des boites, on met certains ressorts à zéro,
  % pour éviter les espaces verticaux non désirés.
\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 été 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ève, ça ne marche plus.)
\hfil 
  % On commence à compter les lignes
%\advance\bk@lcnt\@ne %%%%%%%%%%%%%%%%%%%% Voir \bkvz@countlines
  % Début de la boucle
\loop 
  % On coupe ce qui reste de la boite.
 \bk@split
  % On rajoute l'espace vertical qui a été perdu.
 \bk@addskipdp
  % Éventuellement, on augmente le numéro de la ligne
 \bkvz@countlines
  % ???
\leavevmode
  % S'il s'agit de la dernière ligne
\ifvoid\bk@bxb
  % On met le booléen indiquant que la boucle doit se poursuivre à FAUX.
 \@bkcontfalse
  % On met un peu d'espace vertical (\fboxsep)
 \bk@addfsepdp
  % En envoie la dernière ligne.
  % POURQUOI \vtop ??? Pour que l'éventuel numéro de ligne soit à 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

