# 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

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...

-