Tell me more ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

How do you guys go about controlling column padding in tables?

UPDATE

To clarify, I'm looking for a way to control both vertical and horizontal padding. So, if I had a simple table like this

\begin{tabular}{|l|l|}
    \hline
    column 1 & column 2 \\ 
    \hline
    I really would like this less & crammed\\
    \hline
\end{tabular}

I could pad the columns and make them look a bit less.. ugly :P I tried using \vspace but it leaves gaps in the vertical lines.

share|improve this question
1  
Welcome to TeX.sx! Are you now talking about the horizontal distance between columns (which is what "column padding" is for me) or how to get vertical lines with booktabs? If might be easier if you post a minimal working example (MWE) that illustrates your problem. – Martin Scharrer Oct 15 '11 at 19:03
3  
Note that booktabs doesn't change how tabular environments are typeset, as long as one doesn't use the new commands provided by the package: vertical rules will touch the horizontal ones input as \hline or \cline. – egreg Oct 15 '11 at 19:43

4 Answers

up vote 12 down vote accepted

use a default tabular environment without package booktabs and put right before the environment:

\bgroup
\def\arraystretch{1.5}%  1 is the default, change whatever you need
\begin{tabular}{|c|...}
...
\end{tabular}
\egroup
share|improve this answer
thank you very much :) – JustDanyul Oct 16 '11 at 1:27

Vertical padding

Vertical padding is possible in a global way using @Herbert's answer. That is, to redefine the array stretch factor <factor> using

\renewcommand{\arraystretch}{<factor>}

However, as the name suggests, this is a factor and not a length. So, it would be difficult to provide an adequate factor that would add (say) 15pt above/below each row. There are other options available for this.

Vertical padding is also possible in a manual way or on a per-row basis using the optional parameter to end a tabular line; \\[<len>] where <len> is any familiar TeX length. A final alternative is to use the set the length \extrarowheight provided by the array package.

Here's an example showing the above three possibilities:

\documentclass{article}
\usepackage[landscape]{geometry}% http://ctan.org/pkg/geometry
\usepackage{array}% http://ctan.org/pkg/array
\begin{document}

% =========== FACTOR approach ===========
{\renewcommand{\arraystretch}{2}%
\begin{tabular}{|l|l|}
  \hline
  column 1 & column 2 \\
  \hline
  I really would like this less & crammed \\
  \hline
\end{tabular}} \quad
% =========== LENGTH approaches ===========
\begin{tabular}{|l|l|}
  \hline
  column 1 & column 2 \\[4ex]
  \hline
  I really would like this less & crammed \\[5pt]
  \hline
\end{tabular} \quad
{\setlength{\extrarowheight}{20pt}%
\begin{tabular}{|l|l|}
  \hline
  column 1 & column 2 \\
  \hline
  I really would like this less & crammed \\
  \hline
\end{tabular}}
\end{document}

enter image description here

Note how the "factor" approach is more evenly distributed than the "length" approaches. This is to be expected. However, these techniques can also be combined, if needed. Also, the use of \\[<len>] provides top padding, while setting \extrarowheight adds bottom padding. Finally, note the grouping within the example: \renewcommand and \setlength are made local by putting is inside {...}. That is, the value/length of \arraystretch/\extrarowheight revert back to the original value before resetting it at the end of the group.


Horizontal padding

Similar approach to horizontal padding of columns exist. The use of tabularx or tabulary might be considered factor-based, as well as using \extracolsep{\fill}. However, these all pertain to fixed-width tables, with the first being addressed in @cmhughes' answer. Here is a description of tabulary usage, taken from the UK TeX FAQ entry on Fixed-width tables:

The tabulary package ... provides a way of "balancing" the space taken by the columns of a table. The package defines column specifications C, L, R and J, giving, respectively, centred, left, right and fully-justified versions of space-sharing columns. The package examines how long each column would be "naturally" (i.e., on a piece of paper of unlimited width), and allocates space to each column accordingly.

A length-based approach could include a per-column addition of a separate length using the @{...} "column specifier". Also, modifying the length \tabcolsep would do this for all columns, and is therefore more generic. Finally, the array package also provides a means for insert stuff before a column entry and after it using >{<before>} and <{<after>}. Here are some examples:

\documentclass{article}
\usepackage[landscape]{geometry}% http://ctan.org/pkg/geometry
\usepackage{array}% http://ctan.org/pkg/array
\begin{document}
% =========== FACTOR approach ===========
\begin{tabular*}{500pt}{@{\extracolsep{\fill}}|l|l|}
  \hline
  column 1 & column 2 \\
  \hline
  I really would like this less & crammed \\
  \hline
\end{tabular*}

\bigskip

% =========== LENGTH approaches ===========
\begin{tabular}{|@{\hspace{2em}}l@{}|l@{\qquad}|}
  \hline
  column 1 & column 2 \\
  \hline
  I really would like this less & crammed \\
  \hline
\end{tabular} \quad
{\setlength{\tabcolsep}{2em}
\begin{tabular}{|l|l|}
  \hline
  column 1 & column 2 \\
  \hline
  I really would like this less & crammed \\
  \hline
\end{tabular}}

\medskip

\begin{tabular}{|>{\hspace{1pc}}l|l<{\hspace{-2pt}}|}
  \hline
  column 1 & column 2 \\
  \hline
  I really would like this less & crammed \\
  \hline
\end{tabular}
\end{document}

enter image description here

Of course, if all columns should have the same specifier, using the "multiple column specifier" *{<num>}{<col spec>} is a better choice.

In the above examples, geometry was loaded to adjust for a possibly wide display.


Alternative padding approaches

Another way of regulating vertical padding would be to insert so-called (vertical) struts in the form of a zero-width rule (say). For example, using \rule{0pt}{2em}stuff inserts a 2em strut before stuff, thereby increasing the vertical height of the cell containing stuff. Similarly, padding below a cell could be achieved using \rule[-1em]{0pt}{1em}stuff which drops the strut 1em below the baseline.

The same goes for horizontal padding via zero-height struts.

share|improve this answer

The tabularx might also be useful to you. From the documentation

A new environment, tabularx, is defined, which takes the same arguments as tabular*, but modifies the widths of certain columns, rather than the inter column space, to set a table with the requested total width.

Below is a MWE- note that the different width specifications, 250pt and \textwidth, and the results.

\documentclass{report}

\usepackage{tabularx}

\begin{document}

\begin{table}
 \centering
\begin{tabularx}{250pt}{|c|X|c|X|}
 \hline
 \multicolumn{2}{|c|}{Multicolumn entry}                 &   THREE   &   FOUR    \\\hline
    one                 &  The width of 
                            this column depends     
                            on the width of the table   &  three    &           \\\hline
\end{tabularx}
\end{table}

\begin{table}
 \centering
\begin{tabularx}{\textwidth}{|c|X|c|X|}
 \hline
 \multicolumn{2}{|c|}{Multicolumn entry}                 &   THREE   &   FOUR    \\\hline
    one                 &  The width of 
                            this column depends     
                            on the width of the table   &  three    &           \\\hline
\end{tabularx}
\end{table}

\end{document}

enter image description here

share|improve this answer

Vertical spacing inside tabular cells...

...seemed to be a secret to me, but now I found the following:

The vertical size of a tabular cell is at least \baselineskip. This is (by default) composed of:

  1. height = 0.7\baselineskip and
  2. depth = 0.3\baselinesip.

If the content of the cell exceeds these minimum height or depth, that tabular line gets increased vertical size. To know this behaviour was very essential to me when working with so-called vertical struts (see "alternative padding approaches" in this answer above).

An \hline command at the beginning of a (leftmost) cell places a horizontal line with height \arrayrulewidth above the cell. An \hline command in the (leftmost) cell of the next line is places below the cell. So \hline commands increase the total height of tabulars.

share|improve this answer
Knowing this, one might increase cell height. But to decrease it, the implicit strut placed by TeX/LaTeX needs to be chopped. This can either be done via an \arraystretch factor below 1 or by setting the \strutbox manually, which allows for specialized height+depth - see this answer from Heiko Oberdiek! – tueftl Apr 3 at 12:19

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.