How to force a table into page width?

I have the following table:

\begin{table}[htb]
\begin{tikzpicture}
\node (table) [inner sep=0pt] {
\begin{tabular}{ l | l }
{\bf Symptom} & {\bf Metric} \\
\hline
Class that has many accessor methods and accesses a lot of external data & ATFD is more than a few\\
Class that is large and complex & WMC is high\\
Class that has a lot of methods that only operate on a proper subset of the instance variable set & TCC is low\\
\end{tabular}
};
\draw [rounded corners=.5em] (table.north west) rectangle (table.south east);
\end{tikzpicture}
\caption{God class symptoms}
\label{tbl:god_class}
\end{table}


Now I want to force the width of the table to be the same as the \textwidth, either by linewrapping of table text or by scaling. How can I achieve that?

-
You should not use {\bf <text>} but \textbf{<text>} or \bfseries instead! Same is true for \it and \tt or how they are called. They are all deprecated. Please see the l2tabu document for this and other things. –  Martin Scharrer Feb 8 '11 at 0:16

You can use the tabularx package. It allows you to set the width of the table and provides the X column type, which fills out the rest of the space. It can be used for several columns, which then share the rest of the width equally.

Example:

\usepackage{tabularx} % in the preamble
% ....
\begin{tabularx}{\textwidth}{X|l}
\textbf{Symptom} & \textbf{Metric} \\
\hline
Class that has many accessor methods and accesses a lot of external data & ATFD is more than a few\\
Class that is large and complex & WMC is high\\
Class that has a lot of methods that only operate on a proper subset of the instance variable set & TCC is low\\
\end{tabularx}


In general it is also possible to set the width of a column using p{<width>} instead of l as column type. Then it will be formatted as a paragraph and can include line breaks. Replace <width> with the required width.

-
If you're considering tabularx you might also consider its less well known (but sometimes better behaved) sibling tabulary –  David Carlisle May 19 '12 at 17:03
How can we adjust the width of the columns? –  prince Dec 9 '14 at 5:47

Just to mention an additional method: the tabular* environment. Suppose you have a table with 6 center-aligned columns. You can force it to take up the full width of the textblock by setting it up as follows:

\begin{tabular*}{\textwidth}{c @{\extracolsep{\fill}} ccccc}
...
\end{tabular*}


Unlike the tabularx and tabulary environments, which work by expanding the width of the columns, the tabular* environment works by expanding the intercolumn whitespace.

Personally, I suspect it's the need to remember to insert the directive @{\extracolsep{\fill}} that has kept the popularity of this approach quite subdued...

-

One can use tabu (e.g). It will set the table to a given width without needing to calc the ration by hand.

\documentclass{article}

\usepackage{tabu}
\usepackage{booktabs}% for better rules in the table

\begin{document}
\begin{tabu} to \textwidth {XXXX}
\toprule
xx & 1 & 2 & 3 \\
\bottomrule
\end{tabu}
\end{document}


tabu comes with the new column type X which sets it’s width automatically, it has an optional argument taking l, r, c to adjust the alignment inside the cell or a numer to set uneven widths of columns. For example two columns, the first on right, the second one left aligned and twice the width of the first one, will be X[r]X[2] (l and 1 will be set by default). The part between to and {<cols>} can be any width, and the full part can be omitted to, i.e. \begin{tabu}{<cols>}.

tabu is compatible with longtable with the new environment {longtabu}.

Adding showframeand some text (lipsum) to the above example shows that the table has exactly the width of the text. On may notic that a table without a float enviroment is set inline and gets indented as every normal text, too. Use \nointend to prevent that.

\documentclass{article}

\usepackage{tabu}
\usepackage{booktabs}% for better rules in the table
\usepackage{showframe,lipsum}

\begin{document}
\lipsum[4]

\noindent
\begin{tabu} to \textwidth {XXXX}
\toprule
xx & 1 & 2 & 3 \\
\bottomrule
\end{tabu}
\end{document}

-
Thanks! But I think the table is still somewhat wider than the text width of the page (compared with \hrulefill).. –  Håkon Hægland Oct 22 '13 at 9:06
@HåkonHægland: As you can see in my edit, the table has exactly the same width as the text … –  Tobi Oct 22 '13 at 9:39
Great package ! Thanks Tobi :-) –  madit Nov 1 '13 at 19:57
Indeed but read tex.stackexchange.com/q/121841/4918 before falling in love to deeply ;-) –  Tobi Nov 1 '13 at 21:22