% boites.sty % (c) 1998-1999 Vincent Zoonekynd % 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