The problem is in understanding precisely how tabular
works.
Each cell has a reference point of reference and all the reference points are eventually put on the same horizontal line. For l
, c
, and r
cells the reference point is on the baseline; for a p
cell the reference point is on the first line's baseline; for m
cells the reference point is midway from the top and the bottom of the text; for b
cells it's on the last line's baseline.
Thus a tabular
specification such as
{l m{3cm} p{3cm}}
will not place the middle cells of a row mid aligned with respect to the last cell, but rather its content will stick above the last column by (slightly less than) half its vertical size.
The kind of alignment you're trying to get can't be obtained without measuring the cells' contents, as Stefan Kottwitz's answer about \tabbox
shows: that 3.7\baselineskip
was good for that example, not in general.
Here's a way out, in your specific case (note the use of \adjustbox
for the picture):
\documentclass{article}
\usepackage{tikz}
\usepackage{array}
\usepackage{booktabs,adjustbox}
\newcommand{\finalcells}[2]{%
\begingroup\sbox0{\begin{minipage}{3cm}\raggedright#1\end{minipage}}%
\sbox2{\begin{minipage}{3cm}\raggedright#2\end{minipage}}%
\xdef\finalheight{\the\dimexpr\ht0+\dp0+\smallskipamount\relax}%
\xdef\finalheightB{\the\dimexpr\ht2+\dp2+\smallskipamount\relax}%
\ifdim\finalheightB>\finalheight
\global\let\finalheight\finalheightB
\fi\endgroup
\begin{minipage}[t][\finalheight][t]{3cm}\raggedright#1\end{minipage}&
\begin{minipage}[t][\finalheight][t]{3cm}\raggedright#2\end{minipage}}
\begin{document}
\begin{tabular}{c m{2cm} m{3cm} m{3cm} m{3cm}}
\toprule
\multicolumn{1}{c}{Header 1} &
\multicolumn{1}{c}{Header 2} &
\multicolumn{1}{c}{Header 3} &
\multicolumn{1}{c}{Header 4} &
\multicolumn{1}{c}{Header 5} \\
\midrule
Short Text &
Slightly Longer Text &
\adjustbox{valign=c}{%
\begin{tikzpicture}
% Draw beam and end lines
\draw (-1.5,-0.75) rectangle (1.5,0.75) ;
\end{tikzpicture}%
}
&
\finalcells{Some text that extends onto more than one line as there's plenty of it.}
{Some text that extends onto more than one line as there's plenty of it.
Some text that extends onto more than one line as there's plenty of it.} \\
\bottomrule
\end{tabular}
\end{document}
You may have to reduce the inter-column spacing by adding something like \setlength{\tabcolsep}{<len>}
before the tabular
(or placing it inside a group to limit the scope of the change, like inside a table
environment). Either fix <len>
or use something relative, like .5\tabcolsep
to reduce the current \tabcolsep
to 50% of its value.
\tabcolsep
has a default value of 6pt under the regular document classes.
Best Answer
You need to change the baseline of the images. Usually you center it to the height of the lower case characters (1ex). This can be done using the
\raisebox
macro or using thevalign=m
key of theadjustbox
package.See also How to align picture top left in a table? and float left figure in titlepage which are similar.
Here my code which also shows some of the other elements like bold math and stacking: