summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/boites/boites.sty
blob: 5de8b7a8cd77cdf2b4b88121bfc1160c6772df70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
% 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}[2013/11/21 v1.1 Colored, framed and breakable across pages boxes]

\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.
    \splittopskip\z@ % glue inserted at the top of a box resulting from a \vsplit
    \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{\bk@singleline}%
      }%
      % Soit, il y en a plusieurs.
    \else
      \def\bk@fstln{%
          % On met le haut
        \bkvz@countlines
        \vbox{\bk@firstline}%
          % ??? (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@lastline}%
          \else               % 2,...,(n-1)
            \bk@middleline
          \fi
          \hfil
          %\advance\bk@lcnt\@ne %%%%%%%%%%%%%%%% Voir \bkvz@countlines
          \if@bkcont\repeat
      }%
    \fi
    \leavevmode\bk@fstln\par
  }%
  \vskip\breakboxskip\relax
}

\bkcountfalse

\def\bk@singleline{%
  \bkvz@top
  \bk@line
  \bkvz@bottom
}

\def\bk@firstline{%
  \bkvz@top
  \bk@line
}

\def\bk@middleline{%
  \bk@line
}

\def\bk@lastline{%
  \bk@line
  \bkvz@bottom
}