305

I would like to create a table with some columns' width specified, while the text in those columns should be centered both horizontally and vertically. I found out that

\usepackage{array}
\begin{tabular}{| c | c | m{5cm} |}

vertically centers the text in the last column, but justifies it horizontally (like text in normal paragraphs).

Update: With Jake's method, it seems both \\ and \hline cause an error. How to fix it?

1

4 Answers 4

470

A comprehensive solution (based on this answer) is to define new column types (say, L, C, and R) that take their width as argument and do the following:

  • Issue \raggedright, \centering, or \raggedleft to achieve the desired horizontal alignment,

  • Declare \let\newline\\ to allow to use \newline for manual line breaks within a cell (note that \centering & friends change the meaning of \\ -- this is the problem with Jake's solution),

  • Issue \arraybackslash (i.e., \let\\\tabularnewline) to allow (again) to use \\ for ending rows,

  • Issue \hspace{0pt} to allow the first word in a cell to be hyphenated.

In the example below, the new column types are based on (vertically centered) m-columns, but one may use (top- or bottom-aligned) p- or b-columns as well.

\documentclass{article}

\usepackage{array}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}

\begin{document}

\begin{tabular}{| c | L{3cm} | C{3cm} | R{3cm} |}
foo &
A cell with text that wraps around, is raggedright and allows \newline
    manual line breaks &
A cell with text that wraps around, is centered and allows \newline
    manual line breaks &
A cell with text that wraps around, is raggedleft and allows \newline
    manual line breaks \\
\end{tabular}

\end{document}

enter image description here

17
  • Thanks, it works. In this way I don't have to add anything, just use "\\" and "\hline" as normally.
    – Covi
    Mar 5, 2011 at 12:24
  • 4
    For anybody's interest: There is an (error free) conflict with the pdfsync package, which corrupts the spacing. I took me a while to find this problem...
    – matheburg
    Mar 14, 2014 at 19:54
  • 2
    One small problem with this solution is that columns using p get vertically centered when there are longer L columns. Mar 10, 2016 at 17:57
  • 5
    Please note that LCRJ column types are defined by the tabulary package. Just in case someone uses this excellent hint together with tabulary and wonders why some other tables break.
    – koppor
    Jul 9, 2016 at 23:26
  • 2
    for the other noobs reading this: you HAVE TO specify a width for each column of this new type. Otherwise, you get the usual 27 Latex errors that say absolutely nothing ;)
    – Jakob
    Apr 26, 2018 at 9:42
76

The 'm' column type only centers the text vertically; to get it also centered horizontally, you can use the >{cmd} syntax, which adds a command before each cell in the specified column:

\documentclass{article}
\usepackage{array}
\begin{document}
\begin{tabular}{| c | c | >{\centering}m{5cm} |}
Abc & Bcd & A long cell with text that wraps around and is centered
\end{tabular}
\end{document}

tabular with column that is horizontally and vertically centered

As Stefan Kottwitz pointed out in his comment, this can also be be wrapped in a new column type that you can define using

\newcolumntype{C}[1]{>{\centering}m{#1}}

Then you can define the above table using

begin{tabular}{| c | c | C{5cm} |}
3
  • 11
    Works, but if there is a \\ \hline after the table row, this yields a misplaced \noalign error. According to this answer, \arraybackslash is required. Oct 15, 2015 at 12:27
  • How to add multiple rows to the table such that each cell is bordered by lines? Currently, only the columns are bordered by lines.
    – Hans
    Aug 15, 2018 at 23:00
  • 1
    @Hans - Use \hline to draw horizontal lines.
    – Mico
    Jan 24, 2021 at 9:47
12

I found a very different technique that also works:

With the package ragged2e you can issue the command \RaggedRight outside the tabular environment and get ragged right inside p- or m-columns of a tabular environment.

Here is an example document:

\documentclass{article}
\usepackage{array}
\usepackage{ragged2e}
\begin{document}
{\RaggedRight
    \begin{tabular}{| c | m{3cm}}
    foo &
A cell with text that wraps around, is raggedright and allows \newline
manual line breaks \\ 
\end{tabular}
}% end of \RaggedRight
\end{document}

Eample created with <code>ragged2e</code>

2
  • How to add multiple rows to the table such that each cell is bordered by lines? Currently, only the columns are bordered by lines.
    – Hans
    Aug 15, 2018 at 23:12
  • @Hans: As usual, using \hline between the table rows (delimited by `\\`) Aug 16, 2018 at 15:06
12

It’s easy peasy to specify the horizontal and vertical alignment of table cells at the same time with tblr environment of the new LaTeX3 package tabularray:

\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{tblr}{|Q[l,t,3cm]|Q[c,m,3cm]|Q[r,b,3cm]|}
\hline
 {Top Baseline \\ Left Left} & Middle Center & {Right Right \\ Bottom Baseline} \\
\hline
\end{tblr}
\end{document}

enter image description here

You can even remove the width settings of the columns to use the natural widths.

3

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .