You need to put the \label
somewhere safer:
\documentclass{article}
\begin{document}
\hrule
\begin{tabular}{p{40mm}p{60mm}}\label{blah}
a & b \\
c & d
\end{tabular}
\hrule
\begin{tabular}{p{40mm}p{60mm}}
a\label{blah2} & b \\
c & d
\end{tabular}
\hrule
\begin{tabular}{p{40mm}p{60mm}}
a & b \\
c & d
\end{tabular}\label{blah3}
\hrule
\end{document}
A \label
is not like \typeout
that simply writes to the terminal it has to delay the writing to the aux file until the page number is known. The resulting write node is in many ways like a box of height and width 0pt and that is the effect that you see on the layout: the parbox (vtop) is aligning on the first node in its vertical list which is the invisible write node.
\label
to work, LaTeX has to be able to associate the argument of\label
with a counter. The\caption
command, when used inside atable
(nottabular
) environment, increments a counter calledtable
. If you place\label
after\caption
, LaTeX will make the correct connection. In contrast, your particular use of\label
is guaranteed to achieve nothing useful -- and, in fact, mess things up in unexpected ways. Interestingly, if one embeds yourtabular
environment (sans the\label
directive) inside atable
environment, the problem vanishes.\color
) and so long as you don't need\ref
it's Ok to use\label
here. By design it does something more or less sensible even if no counter is active.