Retour

Source de columns.tex

Fichier TeX
%% fichier 'columns.tex'
%% ces macros servent à écrire un texte sur plusieurs colonnes, sans
%% franchissement de page. Elles sont extraites de Lachand-Robert, 
%% pp 382-384. On trouve les mêmes dans le TeXbook p 147.

%% probleme (11-02-98)~: la coupur n'a pas l'air de tenir compte de la
%% profondeur (depth) de la boite a couer, d'ou les problemes de
%% derniere colonne plus grande que les deux premieres.

\catcode`\@=11
\newdimen \gouttiere \gouttiere = 10pt
\newskip \bottomskip \bottomskip = 0pt

\def \columns{%
   \par
   \line \bgroup		%% commence une ligne
   \def \raggedbottom{%
      \global \bottomskip 0pt plus 1fil
      \relax}
   \dimen@i = \baselineskip
   \advance \dimen@i by -\splittopskip
   \afterassignment \c@lumns
   \count@=}			%% recupere le nb de colonnes dans \count@
\def \c@lumns{%
   \advance \hsize by \gouttiere  %% les 3 lignes ci-contre calculent
   \divide \hsize by \count@	  %% la largeur des futures colonnes et
   \advance \hsize by -\gouttiere %% la stocke dans \hsize
   \boxmaxdepth = \z@		%% annulle \boxmaxdepth et \splitmaxdepth
   \splitmaxdepth = \z@
   \setbox0 = \vbox \bgroup	%% commence une boite verticale pour stocker
      \prevdepth = \dimen@i}	%% le texte argument
\def \endcolumns{%
   \egroup			%% ferme la boite verticale
   \vbadness = 10000		%% empeche les messages d'erreur
   \dimen@ = \ht0		%% hauteur du texte argument
   \divide \dimen@ by \count@	%% hauteur (ideale) du texte coupe
   \loop			
      \balancec@lumns		%% on essaye
   \ifdim \dimen@i > \dimen@	%% jusqu'a ce que la derniere colonne
      \advance \dimen@ by \jot	%% soit la plus courte, ce qui donne (dans 
   \repeat			%% \dimen@), la " bonne " hauteur de coupe
   \loop			%% On lance alors la coupe
      \setbox1 = \vsplit0 to \dimen@
      \vtop{%
         \unvbox1
         \vskip \bottomskip
         \hrule height \z@ depth \z@ width \hsize}%
      \hss
      \advance \count@ by -1
   \ifnum \count@ > 1
   \repeat
   \vtop{%			%% on sort la derniere colonne
      \unvbox0
      \vskip \bottomskip
      \hrule height \z@ depth \z@ width \hsize}%
   \egroup}			%% ferme la ligne horizontale
\def \balancec@lumns{{%		%% calcule la hauteur de la derniere
   \setbox2 = \copy0		%% colonne si on coupe a la hauteur \dimen@
   \loop
      \setbox1 = \vsplit2 to \dimen@
      \advance \count@ by -1
   \ifnum \count@ > 1
   \repeat
   \global \dimen@i = \ht2 }}	%% stocke dans \dimen@i la hauteur calculee
\catcode`\@=12