multirow.sty 7.2 KB
   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
%%
%% multirow.sty V1.6 version (5-May-2004)
%%
%% Author: Jerry Leichter <jerrold.leichter@smarts.com>
%% Piet van Oostrum <piet@cs.uu.nl>
%%
%% This file may be distributed under the terms of the LaTeX Project Public
%% License, as described in lppl.txt in the base LaTeX distribution.
%% Either version 1 or, at your option, any later version.
%%
%% V1.0 was distributed anonymously, based on a Usenet posting that was
%% not intended for stand-alone use.
%% V1.1 was modified by Piet van Oostrum <piet@cs.uu.nl> to allow it to
%% work without bigstrut.sty.
%% V1.2 was modified by Jerry Leichter for the same goal, but using a
%% different approach which will work properly in conjunction with
%% bigstrut.sty.
%% V1.2a was modified by Piet van Oostrum <piet@cs.uu.nl> to use \vskip
%% instead of \raise in positioning, avoiding making rows too high
%% when the adjustment is large.
%% V1.3 was modified by Piet van Oostrum to work properly in a p{} column
%% (\leavevmode added)
%% V1.4 was modified by Piet van Oostrum to check for the special case that
%% the width is given as an *. In this case the natural
%% width of the text argument will be used and the argument
%% is processed in LR-mode.
%% V1.5 was modified by Piet van Oostrum: Added a % after \hbox{#5}\vfill}.
%% Added \struts around #5 for better vertical positioning.
%% Additional coding for negative value of nrows.
%% V1.6 was modified by Piet van Oostrum: Replace a space by \relax after
%% \advance\@tempdima#4.
%%
% Make an entry that will span multiple rows of a table.
%
% \multirow{nrows}[bigstruts]{width}[fixup]{text}
%
% nrows is the number of rows to span. It's up to you to leave the other
% rows empty, or the stuff created by \multirow will over-write it.
% With a positive value of nrows the spanned colomns are this row and
% (nrows-1) rows below it. With a negative value of nrows they are
% this row and (1-nrows) above it.
%
% bigstruts is mainly used if you've used bigstrut.sty. In that case it
% is the total number of uses of \bigstrut within the rows being
% spanned. Count 2 uses for each \bigstrut, 1 for each \bigstrut[x]
% where x is either t or b. The default is 0.
% width is the width to which the text is to be set, or * to indicate that
% the text argument's natural width is to be used.
%
% text is the actual text. If the width was set explicitly, the text will
% be set in a parbox of that width; you can use \\ to force linebreaks
% where you like.
%
% If the width was given as * the text will be set in LR mode. If you
% want a multiline entry in this case you should use a tabular or array
% in the text parameter.
%
% The text is centered vertically within the range spanned by nrows.
%
% fixup is a length used for fine tuning: The text will be raised (or
% lowered, if fixup is negative) by that length above (below) wherever
% it would otherwise have gone.
%
% For example (using both multirow and 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}
%
% If any of the spanned rows are unusually large, or if you're using
% bigstrut.sty and \bigstrut's are used assymetrically about the centerline of
% the spanned rows, the vertical centering may not come out right. Use the
% fixup argument in this case.
%
% Just before "text" is expanded, the \multirowsetup macro is expanded to
% set up any special environment. Initially, \multirowsetup contains just
% \raggedright. It can be redefined with \renewcommand.
%
% Bugs: It's just about impossible to deal correctly with descenders. The
% text will be set up centered, but it may then have a baseline that doesn't
% match the baseline of the stuff beside it, in particular if the stuff
% beside it has descenders and "text" does not. This may result in a small
% missalignment. About all that can be done is to do a final touchup on
% "text", using the fixup optional argument. (Hint: If you use a measure
% like .1ex, there's a reasonable chance that the fixup will still be correct
% if you change the point size.)
%
% \multirow is mainly designed for use with table, as opposed to array,
% environments. It will not work well in an array environment since the lines
% have an extra \jot of space between them which it won't account for. Fixing
% this is difficult in general, and doesn't seem worth it. The bigstruts
% argument can be used to provide a semi-automatic fix: First set
% \bigstrutjot to .5\jot. Then simply repeat nrows as the bigstruts argument.
% This will be close, but probably not exact; you can use the fixup argument
% to refine the result. (If you do this repeatedly, you'll probably want to
% wrap these steps up in a simple macro. Note that the modified \bigstrutjot
% value will not give reasonable results if you have bigstruts and use this
% argument for its intended purpose elsewhere. In that case, you might want
% to set it locally.)
%
% If you use \multirow with the colortbl package you have to take
% precautions if you want to color the column that has the \multirow in it.
% colortbl works by coloring each cell separately. So if you use \multirow
% with a positive nrows value, colortbl will first color the top cell, then
% \multirow will typeset nrows cells starting with this cell, and later
% colortbl will color the other cells, effectively hiding the text in that
% area. This can be solved by putting the \multirow is the last row with a
% negative nrows value.
% Example:
%
% \begin{tabular}{l>{\columncolor{yellow}}l}
% aaaa & \\
% cccc & \\
% dddd & \multirow{-3}*{bbbb}\\
% \end{tabular}
%
\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\relax\leavevmode\vtop{\vskip-\@tempdima\box0\vss}}
\@ifundefined{bigstrutjot}{\newdimen\bigstrutjot \bigstrutjot\jot}{}