multirow.sty version V1.5 (16-July-1999)

Jerry Leichter <leichter@smarts.com,leichter@lrw.com>

Piet van Oostrum <piet@cs.uu.nl> Traduction et adaptation françaises^{∗}: Françoise Marre-Fournier <marre-fournier@unilim.fr>

20 décembre 1999

1 Historique

– V1.0 : distribuée de façon anonyme, par un message posté sur Usenet, sans être destinée à être utilisée seule ;

– V1.1 : modifiée par Piet van Oostrum <piet@cs.uu.nl> de façon à ce qu’elle fonctionne sans bigstrut.sty ;

– V1.2 : modifiée par Jerry Leichter dans le même but, mais en utilisant une approche différente qui fonctionne correctement et conjointement avec

bigstrut.sty ;

– V1.2a : modifiée par Piet van Oostrum <piet@cs.uu.nl> pour utiliser \vskip à la place de \raise dans le positionnement, évitant de produire des lignes trop hautes quand l’ajustement est large ;

– V1.3 : modifiée par Piet van Oostrum pour fonctionner correctement dans une colonne p{} (ajout de \leavevmode) ;

– V1.4 a été modifiée par Piet van Oostrum de façon à vérifier le cas particulier où la largeur est donnée par une ∗. Dans ce cas, la largeur naturelle de l’argument texte sera utilisée, lequel sera traité dans un mode LR ;

– V1.5 : modifiée par Piet van Oostrum :

– Ajout d’un % après \hbox{#5}\vfill} ;

– ajout de \struts autour de #5 pour un meilleur positionnement vertical ;

– ajout de code pour la valeur négative de nrows.

∗Ce document f-multirowsty.tex est la traduction du mode d’emploi figurant dans multirow.sty, avant le code

2 Fusionner des lignes dans une table

La commande à utiliser est :

\multirow{nrows}[bigstruts]{width}[fixup]{text} où :

nrows est le nombre de lignes à fusionner. C’est à l’utilisateur de laisser vides les autres lignes sinon le résultat de \multirow réécrira par dessus. Une valeur positive de nrows fusionnera la ligne en cours et (nrows-1) lignes au dessous d’elle. Avec une valeur négative de nrows, ce sera la ligne en cours et les (1-nrows) lignes au dessus ;

bigstruts est principalement utilisé si on a employé bigstrut.sty. Dans ce cas, il représente le nombre total d’utilisation de \bigstrut à l’intérieur des lignes à fusionner. Compter 2 utilisations pour chaque \bigstrut, 1 pour chaque \bigstrut[x] où x est soit t ou b. La valeur par défaut est 0 ;

width est la largeur que doit occuper le texte, ou ∗ pour indiquer que c’est la

largeur naturelle de l’argument qui doit être utilisée ; text est le texte vrai. Si la largeur est définie explicitement, le texte sera inclus

dans une « parbox » de cette largeur ; on peut utiliser \\ pour forcer les sauts de ligne à la demande. Si la largeur est définie par ∗, le texte sera installé selon le mode LR. Si on désire des entrées de plusieurs lignes dans ce cas, il faudra utiliser tabular ou array dans le paramètre text. Le texte est centré verticalement à l’intérieur de l’étendue des lignes fusionnées.

fixup est une longueur utilisée pour les réglages fins : le texte sera relevé (ou abaissé si fixup est négatif) de la valeur de la distance au-dessus (ou au-dessous) partout où, autrement, il aurait disparu.

3 Exemple (utilisant multirow et bigstrut)

\newcommand{\minitab}[2][l]{\begin{tabular}{#1}#2\end{tabular}}
\begin{tabular}{|c|c|}
\hline
\multirow{4}{1in}{Common g text} & Column g2a\\
  & Column g2b \\
  & Column g2c \\
  & Column g2d \\
\hline
\multirow{3}[6]*{Common g text} & Column g2a\bigstrut\\\cline{2-2}
  & Column g2b \bigstrut\\\cline{2-2}
  & Column g2c \bigstrut\\
\hline
\multirow{4}[8]{1in}{Common g text} & Column g2a\bigstrut\\\cline{2-2}
  & Column g2b \bigstrut\\\cline{2-2}
  & Column g2c \bigstrut\\\cline{2-2}

       & Column g2d \bigstrut\\
 \hline
 \multirow{4}*{\minitab[c]{Common \\ g text}} & Column g2a\\
       & Column g2b \\
       & Column g2c \\
       & Column g2d \\
 \hline
 \end{tabular}

Common g text Column g2a Column g2b Column g2c Column g2d

Common g text Column g2a

Column g2b

Column g2c

Common g text Column g2a

Column g2b

Column g2c

Column g2d

Common g text  Column g2a

Column g2b Column g2c Column g2d

Si toutes les lignes fusionnées sont inhabituellement larges, ou si bigstrut.sty et sa commande \bigstrut sont utilisées de façon assymétrique par rapport au centrage de ligne des cellules élargies, le centrage vertical peut ne pas donner le résultat escompté. Utilisez l’argument fixup dans ce cas.

Juste avant que text soit étendu, la macro-commande \multirowsetup est exécutée pour composer un environnement quelconque. Initialement, \multirowsetup contient juste \raggedright. On peut le redéfinir avec \renewcommand.

4 Divers

4.1 Bugs

Il est à peu près impossible de traiter correctement les « descendeurs ». Le texte sera centré mais il se peut qu’il ait un interligne qui ne corresponde pas à celui du matériel à côté de lui, en particulier si ce matériel a des descendeurs^{1} et le texte non. Il peut en résulter un mauvais alignement léger. Pour ce problème, ce qu’il est possible de faire c’est de donner une touche finale au texte, en utilisant l’argument optionnel fixup. (Conseil : si on utilise une dimension de l’ordre de .1ex, il y a raisonnablement une chance que le fixup soit encore correct si on change la taille du corps de la fonte utilisée dans le tableau.)

1Des lettres qui descendents sous la ligne porteuse du texte, comme le p et le q.

4.2 tabular ou array ?

\multirow est principalement conçu pour être utilisé avec l’environnement tabular, par opposition à array. Il ne fonctionnera pas bien dans un environnement array puisque les lignes ont un \jot supplémentaire, pour l’interligne, qui n’est pas pris en compte. Résoudre ce problème dans le cas général difficile, et ne semble pas être valable.

Les arguments bigstrut peuvent être utilisés pour fournir une solution semiautomatique : d’abord, fixez \bigstrutjot à 0.5\jot. Puis répétez simplement nrows comme argument de bigstrut. Cela donnera un résultat proche mais probablement pas exact ; vous pouvez utiliser l’argument fixup pour affiner le résultat. (Si vous ne répétez pas cette séquence, vous voudrez probablement déclarer ces étapes dans une simple macro. Notez que la valeur modifiée de \bigstrutjot ne donnera pas un résultat raisonnable si vous avez des bigstruts et utilisez cet argument dans le but de faire autre chose que son but initial. Dans ce cas, vous voudrez probablement le redéfinir localement).

4.3 Compatibilité avec le package colortbl

Si vous utilisez \multirow avec ce package, vous avez à prendre des précautions si vous voulez colorer la colonne concernée par \multirow. colortbl fonctionne en colorant chaque cellule séparément. Donc, si vous utilisez \multirow avec une valeur positive de nrows, colortbl colorera d’abord la cellule du haut, puis \multirow prendra en compte les cellules nrows en commençant à cette cellule, et en continuant avec celles d’en-dessous, ensuite de quoi colortbl colorera les autres cellules, effaçant le texte dans cette zone. Cela peut être résolu en mettant \multirow dans la dernière ligne avec une valeur négative de nrows.

Exemple :

  \begin{tabular}{l>{\columncolor{yellow}}l}
    aaaa & \\
    cccc & \\
    dddd & \multirow{-3}*{bbbb}\\
  \end{tabular}

5 La macro \multirow

\def\multirowsetup{\raggedright}
\def\multirow#1{\relax\@ifnextchar
  [{\@multirow{#1}}{\@multirow{#1}[0]}}
\def\@multirow#1[#2]#3{\@ifnextchar [{\@xmultirow{#1}[#2]{#3}}%
  {\@xmultirow{#1}[#2]{#3}[0pt]}}
\def\@xmultirow#1[#2]#3[#4]#5{\@tempcnta=#1%

\@tempdima\@tempcnta\ht\@arstrutbox
\advance\@tempdima\@tempcnta\dp\@arstrutbox
\ifnum\@tempcnta<0\@tempdima=-\@tempdima\fi
\advance\@tempdima#2\bigstrutjot
\if*#3\setbox0\vtop to \@tempdima{\vfill\multirowsetup
  \hbox{\strut#5\strut}\vfill}%
\else
    \setbox0\vtop to \@tempdima{\hsize#3\@parboxrestore
              \vfill \multirowsetup \strut#5\strut\par\vfill}%
\fi
\ht0\z@\dp0\z@
\ifnum\@tempcnta<0\advance\@tempdima-\dp\@arstrutbox
\else\@tempdima=\ht\@arstrutbox
   \ifnum#2>0 \advance\@tempdima\bigstrutjot \fi
\fi
\advance\@tempdima#4 \leavevmode\vtop{\vskip-\@tempdima\box0\vss}}
\@ifundefined{bigstrutjot}{\newdimen\bigstrutjot \bigstrutjot\jot}{}