20

The code below produces the following figure:

enter image description here

The issue I am having is that Sample is not vertically aligned, I get proper alignment if \cmidrule(l){2-3} \cmidrule(l){4-5} is removed.

How do I get proper alignment while maintaining the two horizontal lines?

\documentclass{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}

\begin{table}[h]\centering
\begin{tabular}{lcccc}
\toprule 
\multirow{2}{*}{Sample} & \multicolumn{2}{c}{I} & \multicolumn{2}{c}{II} \\
\cmidrule(l){2-3} \cmidrule(l){4-5}
 & A & B & C & D \\
\midrule
S1 & 5 & 8 & 12 & 2 \\
S2 & 6 & 9 & 2 & 6 \\
S3 & 7 & 9 & 5 & 8 \\
S4 & 8 & 9 & 8 & 2 \\
\bottomrule
\end{tabular}
\end{table}

\end{document}
  • 1
    Welcome to TeX.SX! You can have a look at our starter guide to familiarize yourself further with our format. – karlkoeller Jan 27 '14 at 16:18
  • 5
    Off topic: I would use \cmidrule(lr) instead of \cmidrule(l). – Manuel Jan 27 '14 at 16:36
23

Use the optional argument of \multirow.

Substituting

\multirow{2}{*}{Sample}

with

\multirow{2}[3]{*}{Sample}

does what you want.

MWE:

\documentclass{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}

\begin{table}[h]\centering
\begin{tabular}{lcccc}
\toprule
\multirow{2}[3]{*}{Sample} & \multicolumn{2}{c}{I} & \multicolumn{2}{c}{II} \\
\cmidrule(lr){2-3} \cmidrule(lr){4-5}
 & A & B & C & D \\
\midrule
S1 & 5 & 8 & 12 & 2 \\
S2 & 6 & 9 & 2 & 6 \\
S3 & 7 & 9 & 5 & 8 \\
S4 & 8 & 9 & 8 & 2 \\
\bottomrule
\end{tabular}
\end{table}

\end{document} 

Output:

enter image description here

Note that I've also changed \cmidrule(l) to \cmidrule(lr) for a better looking table, as suggested by Manuel in the comments.

  • Why do you give 3 as the optional argument? – ondra.cifka Jun 3 '16 at 15:11
  • @ondra.cifka In that optional argument you have to try and select the best number that fits... – karlkoeller Jun 9 '16 at 12:22
3

I had this same problem, and wasn't satisfied with having to guess at the bigstruts argument to \multirow, so I came up with this:

\documentclass{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}

\begin{table}[h]\centering
  \begin{tabular}{lcccc}
    \toprule
    \multirow{2}{*}[-0.5\dimexpr \aboverulesep + \belowrulesep + \cmidrulewidth]{Sample}
    & \multicolumn{2}{c}{I} & \multicolumn{2}{c}{II} \\
    \cmidrule(l){2-3} \cmidrule(l){4-5}
    & A & B & C & D \\
    \midrule
    S1 & 5 & 8 & 12 & 2 \\
    S2 & 6 & 9 & 2 & 6 \\
    S3 & 7 & 9 & 5 & 8 \\
    S4 & 8 & 9 & 8 & 2 \\
    \bottomrule
  \end{tabular}
\end{table}

\end{document}

output of above code

I think this is correct because multirow is already trying to vertically center two rows' worth of height, but you have to account for the extra space added by \cmidrule, which adds \aboverulesep + \cmidrulewidth + \belowrulesep vertical space. To accomplish that, we tell \multirow to vertically adjust the box downward by half of that \cmidrule space.

If it looks a little off center, I think that's just an illusion because \aboverulesep is smaller than \belowrulesep. I contend that it's "centered" until someone proves me wrong, but you can try -0.5\dimexpr 2\aboverulesep + \cmidrulewidth instead and see if you like the look of that better.

While the above solution just fudges the box down, an alternative is probably to set \bigstrutjot to \dimexpr \aboverulesep + \belowrulesep + \cmidrulewidth and then use \multirow{2}[1]{*}{Sample}. If I understand multirow's documentation, this will actually make the box higher (two rows plus the space added by \cmidrule) rather than just moving the box down. However, in my testing, it yielded the exact same results as the above, and it seems less readable. (Readability being relative, mind you.)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.