19

I am creating a table and, after using \multirow, I want to rotate the text of this column and have it centered vertically and horizontally inside its cell. The code I am using would be similar to this one:

\begin{tabular}{ |c|c|c| }
\hline
\multirow{8}{*}{Text} & row 1 & row 1 \\
 & row 2 & row 2 \\
 & row 3 & row 3 \\
 & row 4 & row 4 \\
 & row 5 & row 5 \\
 & row 6 & row 6 \\
 & row 7 & row 7 \\
 & row 8 & row 8 \\ \hline
\end{tabular} 

Thanks.

Carl Mill
  • 201
  • 1
    Please help us to help you and add a minimal working example (MWE) that illustrates your problem. It will be much easier for us to reproduce your situation and find out what the issue is when we see compilable code, starting with \documentclass{...} and ending with \end{document}. –  Sep 17 '14 at 16:44
  • I think, you are after \rotatebox from graphicx package –  Sep 17 '14 at 16:44
  • @ChristianHupfer The code is there. Could you please elaborete? – Carl Mill Sep 17 '14 at 16:45
  • 1
    It's a fragment, not a MWE ;-) –  Sep 17 '14 at 16:46
  • A MWE contains ideally a code that runs: I can't feed a \begin{tabular} stuff to LaTeX without document around it. So it's a fragment of something that could work ;-) –  Sep 17 '14 at 16:49

3 Answers3

27

You can do this with or without multirow. Use graphicx for the rotation via \rotatebox[<opts>]{<deg>}{<stuff>}:

enter image description here

\documentclass{article}
\usepackage{graphicx,multirow}
\begin{document}
\begin{tabular}{ |c|c|c| }
  \hline
  \multirow{8}{*}{\rotatebox[origin=c]{90}{Text}} & row 1 & row 1 \\
   & row 2 & row 2 \\
   & row 3 & row 3 \\
   & row 4 & row 4 \\
   & row 5 & row 5 \\
   & row 6 & row 6 \\
   & row 7 & row 7 \\
   & row 8 & row 8 \\
  \hline
\end{tabular}

\begin{tabular}{ |c|c|c| }
  \hline
   & row 1 & row 1 \\
   & row 2 & row 2 \\
   & row 3 & row 3 \\
  \raisebox{-.5\normalbaselineskip}[0pt][0pt]{\rotatebox[origin=c]{90}{Text}} & row 4 & row 4 \\
   & row 5 & row 5 \\
   & row 6 & row 6 \\
   & row 7 & row 7 \\
   & row 8 & row 8 \\
  \hline
\end{tabular}
\end{document}

With multirow you don't need to worry about the placement, while without you need to place the text in the appropriate location, and perhaps lower/raise it into position. Also, you have to flatten the content (done by using the [0pt][0pt] options to \raisebox) so it doesn't impede in the row height - something that is naturally done by multirow.

There might be a slight discrepancy between the two methods, but it is negligible.

Werner
  • 603,163
5

As mentioned by @Christian Hupfer, you can do that with rotatebox. But maybe, depending on the real contents, aesthetically, you'll prefer the vertical text ‘rule-free’. Some adjusment is often necessary to ensure vertical centring:

\documentclass{article}

\usepackage{multirow}
\usepackage{mathtools}
\usepackage{array, caption}
\usepackage{graphicx}
\usepackage{makecell}

\begin{document}

\begin{tabular}{ |c|c|c| }
\hline
\multirow{8}{*}[-0.4ex]{\rotatebox{90}{Some text}} & row 1 & row 1 \\
 & row 2 & row 2 \\
 & row 3 & row 3 \\
 & row 4 & row 4 \\
 & row 5 & row 5 \\
 & row 6 & row 6 \\
 & row 7 & row 7 \\
 & row 8 & row 8 \\ \hline
\end{tabular}
\hskip 1 cm
\begin{tabular}{ c|c|c| }
\cline{2-3}
\multirow{8}{*}[-0.4ex]{\rotatebox{90}{Some text}} & row 1 & row 1 \\
 & row 2 & row 2 \\
 & row 3 & row 3 \\
 & row 4 & row 4 \\
 & row 5 & row 5 \\
 & row 6 & row 6 \\
 & row 7 & row 7 \\
 & row 8 & row 8 \\
 \cline{2-3}
\end{tabular}

\end{document} 

enter image description here

Bernard
  • 271,350
  • How do you reduce the spacing on top of and below "Some Text". I tried doing it with a block of text that is on two lines and adjusting the column width causes strange things to happen. – Veridian Apr 13 '16 at 23:42
  • @Veridian: I'm afraid I don't understand what you mean with ‘reducing’ – for me, there's nothing to reduce since there are 8 rows. Could give some more details? – Bernard Apr 13 '16 at 23:47
  • @Veridian: Maybe you mean the space which is physically on the left and on the right? – Bernard Apr 13 '16 at 23:50
  • Yeah, I want the column width to be reduced, but just the first column. – Veridian Apr 13 '16 at 23:50
  • Because you have rotated text on two lines? – Bernard Apr 13 '16 at 23:51
  • Yes using this command: \rotatebox[origin=c]{90}{\pbox{3cm}{\relax\ifvmode\centering\fi THIS\THISTHIS THISES}} and not sure how to reduce spacing on left side of rotated box – Veridian Apr 14 '16 at 00:11
  • Try this: \rotatebox[origin=c]{90}{\pbox{4cm}{\relax\ifvmode\centering\linespread{0.65}\fi THIS\\THISTHIS THISES}. Also you can locally reduce the value of \tabcolsep, using this preamble for the table: \begin{tabular}{ |@{\,\,}c@{}|c|c| }. – Bernard Apr 14 '16 at 00:31
1

With {NiceTabular} of nicematrix.

\documentclass{article}
\usepackage{nicematrix}

\begin{document}

\begin{NiceTabular}{|c|c|c|} \hline \Block{8-1}{\rotate Text} & row 1 & row 1 \ & row 2 & row 2 \ & row 3 & row 3 \ & row 4 & row 4 \ & row 5 & row 5 \ & row 6 & row 6 \ & row 7 & row 7 \ & row 8 & row 8 \ \hline \end{NiceTabular}

\end{document}

You need several compilations (because nicematrix uses PGF/Tikz nodes under the hood).

Output of the above code

F. Pantigny
  • 40,250