Tabelas

  1. Uso básico
  2. Linhas horizontais
  3. Células com múltiplas colunas
  4. Linhas horizontais parciais
  5. Células com múltiplas linhas
  6. Legendas
  7. Posicionamento da tabela

Uso básico

Tabelas são criadas com o ambiente tabular. Esse ambiente requer um argumento obrigatório que define a estrutura da tabela.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}

\begin{document}
  \begin{tabular}{|l|c|r|} % As linhas verticais são separadores. As letras indicam o alinhamento das colunas
    Nome do filósofo & Nascimento/Falecimento & Cidade natal \\ % O & é usado para separar as colunas
    Aristóteles      &   384 a.C - 322 a.C    &     Estagira \\
    René Descartes   &      1596 - 1650       &    Descartes \\
    Demócrito        &   460 a.C - 370 a.C    &       Abdera % Na última linha, não é necessário usar as duas barras.
  \end{tabular}
\end{document}

A tabela abaixo mostra as letras que podem ser usadas no alinhamento das colunas da tabela:

Letra Descrição
l Left (esquerda)
c Center (centralizado)
r Right (direita)

O comando \hline é usado para traçar linhas horizontais na tabela:

\begin{tabular}{|l|c|r|}
  \hline
  Nome do filósofo & Nascimento/Falecimento & Cidade natal \\
  \hline
  Aristóteles      &   384 a.C - 322 a.C    &     Estagira \\
  René Descartes   &      1596 - 1650       &    Descartes \\
  Demócrito        &   460 a.C - 370 a.C    &       Abdera \\
  \hline
\end{tabular}

Perceba que linhas horizontais não precisam do sinal de duas barras invertidas depois delas. Note que agora a linha dos dados do último filósofo tem duas barras invertidas no final dela como as outras. Isso passou a ser necessário porque a linha deixou de ser a última, por causa da linha horizontal adicionada ao final da tabela.

É possível aplicar opções para várias colunas de uma vez no argumento obrigatório do tabular. O exemplo abaixo alinha a primeira coluna à esquerda e centraliza as duas colunas restantes. Todas as colunas terão uma barra vertical depois delas.

\begin{tabular}{|l|*{2}{c|}}
  Nome do filósofo & Nascimento/Falecimento & Cidade natal \\
  Aristóteles      &  384 a.C - 322 a.C     &     Estagira \\
  René Descartes   &     1596 - 1650        &    Descartes \\
  Demócrito        &  460 a.C - 370 a.C     &       Abdera
\end{tabular}

O asterisco indica que as opções serão aplicadas a várias colunas. O número de colunas que serão afetadas é especificado nas chaves que vem depois do asterisco. As opções que serão aplicadas são passadas no segundo grupo de chaves.

Veja que as células do cabeçalho tem a mesma formatação das outras células. Muitas tabelas usam uma formatação diferente para essas células. Pra fazer isso, é só criar um comando e usá-lo nas células do cabeçalho:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}
\newcommand{\hcell}[1]{\textbf{#1}} % deixa as células do cabeçalho em negrito

\begin{document}
  \begin{tabular}{|l|*{2}{c|}}
    \hcell{Nome do filósofo} & \hcell{Nascimento/Falecimento} &\hcell{Cidade natal} \\
    Aristóteles      	 &  384 a.C - 322 a.C    	  &    Estagira 	 \\
    René Descartes   	 &     1596 - 1650       	  &   Descartes 	 \\
    Demócrito        	 &  460 a.C - 370 a.C    	  &      AbderaS
  \end{tabular}
\end{document}

Basta usar esse comando nas células de cabeçalho para que elas tenham uma formatação diferente.

Linhas horizontais

O pacote booktabs tem comandos para traçar linhas horizontais que são mais flexíveis e mais semânticos do que o \hline. Cada um deles tem um argumento opcional para especificar a espessura da linha.

Comando Descrição
\toprule Traça uma linha na parte superior da tabela
\bottomrule Traça uma linha na parte inferior da tabela
\midrule Traça uma linha entre duas linhas da tabela

O exemplo abaixo usa todas essas linhas:

\begin{tabular}{lcr}
  \toprule[1.5pt]
  Nome do filósofo & Nascimento/Falecimento & Cidade natal \\
  \midrule
  Aristóteles      &   384 a.C - 322 a.C    &     Estagira \\
  René Descartes   &      1596 - 1650       &    Descartes \\
  Demócrito        &   460 a.C - 370 a.C    &       Abdera \\
  \bottomrule[1.5pt]
\end{tabular}
Documento de LaTeX com uma tabela com linhas horizontais

É recomendável usar esses comandos para traçar linhas na tabela ao invés do \hline. Esses comandos são mais semânticos e flexíveis.

Uma das formas de mudar a espessura das linhas é usando o argumento opcional, que é o que foi feito. Mas há uma forma alternativa de mudar a espessura muito melhor e mais recomendável: fazer essa mudança usando comandos no preâmbulo do documento.

A alteração é feita apenas uma vez com o comando \setlength, de forma que os valores fornecidos sejam aplicados a todas as tabelas do documento. Isso aumenta a consistência e facilita a manutenção do documento.

\setlength{\heavyrulewidth}{1.5pt}
\setlength{\lightrulewidth}{0.7pt}
\setlength{\cmidrulewidth}{0.5pt}

O tipo da linha que se quer alterar é informado no primeiro argumento do comando. Veja a qual linha cada comando se refere:

Linha Descrição
\heavyrulewidth Linhas superior e inferior
\lightrulewidth Linhas criadas com \midrule
\cmidrulewidth Linhas criadas com \cmidrule. Será visto daqui a pouco, na seção Linhas parciais.

Usando o pacote array e usando novamente o comando \setlength, também dá para aumentar a altura da linha:

\usepackage{array}
...
\setlength{\extrarowheight}{5pt}

Células com múltiplas colunas

Às vezes, pode fazer sentido fazer com que uma célula ocupe mais de uma coluna. Essa necessidade é mais comum no cabeçalho da tabela.

O exemplo abaixo altera a tabela de filósofos, colocando duas linhas no cabeçalho:

\begin{tabular}{lccr}
  \toprule[1.5pt]
  Nome do filósofo & \multicolumn{2}{c}{Nascimento}     & Falecimento \\
                   & Data         & Cidade          &             \\
  \midrule
  Aristóteles      & 384 a.C      & Estagira        & 322 a.C     \\
  René Descartes   & 1596         & Descartes       & 1650        \\
  Demócrito        & 460 a.C      & Abdera          & 370 a.C     \\
  \bottomrule[1.5pt]
\end{tabular}

A única célula que ocupa mais de uma coluna é a Nascimento. O comando \multicolumn é usado para esse fim. O primeiro argumento informado é o número de colunas que a célula ocupará. O segundo é o alinhamento da coluna. Podem ser usadas as mesmas opções de alinhamento passadas como argumento ao ambiente tabular. O último argumento é o texto da coluna.

Linhas horizontais parciais

Também é possível traçar linhas parciais, que não ocupam a linha inteira, indo de uma coluna m até uma coluna n. Existe um comando nativo do LaTeX que faz isso: é o \cline. Porém, ele não será coberto aqui, porque há um comando bem melhor para o mesmo fim, que é o \cmidrule:

\begin{tabular}{lccr}
  \toprule[1.5pt]
  Nome do filósofo & \multicolumn{2}{c}{Nascimento}    &Falecimento \\
                   & Data         & Cidade          &            \\
  \cmidrule(r){1-1} \cmidrule(lr){2-3} \cmidrule(l){4-4}
  Aristóteles      & 384 a.C      & Estagira        &322 a.C     \\
  René Descartes   & 1596         & Descartes       &1650        \\
  Demócrito        & 460 a.C      & Abdera          370 a.C     \\
  \bottomrule[1.5pt]
\end{tabular}

O argumento passado entre parênteses é opcional. O mais comum é fornecer os argumentos opcionais entre colchetes, mas isso não vale para todos os comandos. No caso desse comando, o argumento opcional é passado entre parênteses. Ele serve para cortar um pedaço da linha. O que será cortado depende da letra usada no argumento:

Letra Efeito
l Corta um pedaço do começo da linha
r Corta um pedaço do fim da linha
lr Corta um pedaço do começo e do fim da linha

Também dá pra controlar o quanto será cortado:

\cmidrule(r{10pt}){1-1}

O argumento obrigatório informa a coluna onde a linha deve começar a ser traçada e a coluna onde ela deve terminar de ser traçada, separando as duas por hífen. No exemplo acima, a linha é traçada apenas na 1ª coluna.

Células com múltiplas linhas

Você já viu como fazer com que uma célula ocupe várias colunas. Também podem acontecer situações onde você pode querer que uma célula ocupe várias linhas. O pacote multirow é usado para esse fim:

\usepackage{multirow}
...

\begin{tabular}{llccr}
  \toprule[1.5pt]
                             & Nome do filósofo & \multicolumn{2}{c}{Nascimento} & Falecimento \\
                             &                  & Data         & Cidade          &             \\
  \midrule
  \multirow{2}{*}{Gregos}    & Aristóteles      & 384 a.C      & Estagira        & 322 a.C     \\
                             & Demócrito        & 460 a.C      & Abdera          & 370 a.C     \\
  \multirow{2}{*}{Franceses} & René Descartes   & 1596         & Descartes       & 1650        \\
                             & Michel Foucault  & 1926         & Poitiers        & 1984        \\
  \bottomrule[1.5pt]
\end{tabular}

O primeiro argumento do comando \multirow é o número de linhas que a célula ocupará. O segundo é a largura da célula. O asterisco significa que a célula não terá largura definida. Isso faz com que o LaTeX defina a largura da célula automaticamente. O último argumento é o texto da célula.

Legendas

O comando \caption é usado para colocar uma legenda na tabela. Porém, além de usar esse comando, o ambiente tabular precisa ser envolvido no ambiente table. A legenda é colocada dentro desse ambiente também, fora do tabular:

\begin{table}
  \begin{tabular}
    ...
  \end{tabular}

  \caption{Tabela de filósofos}
\end{table}

O comando \caption aceita um argumento opcional, onde você pode fornecer uma versão mais curta das legendas das tabelas, que é usada caso você imprima uma lista de tabelas no seu documento. Exemplo:

\caption[Filósofos]{Tabela de filósofos}

Posicionamento da tabela

O ambiente table tem um argumento opcional para especificar opções de posicionamento da tabela. Isso é necessário porque ele é um ambiente flutuante, o que quer dizer que não necessariamente ele aparecerá na posição em que ele foi colocado. Compile e veja o documento abaixo:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}
\usepackage{lipsum}

\begin{document}
  \lipsum[1-3]

  \begin{table}
    \begin{tabular}{|l|c|r|}
      Nome do filósofo & Nascimento/Falecimento & Cidade natal \\
      Aristóteles      &   384 a.C - 322 a.C    &     Estagira \\
      René Descartes   &      1596 - 1650       &    Descartes \\
      Demócrito        &   460 a.C - 370 a.C    &       Abdera
    \end{tabular}
  \end{table}
\end{document}

Como você pode ver, a tabela não foi impressa depois do \lipsum. Ela ficou no topo da segunda página, no meio do \lipsum. Para corrigir isso, é só usar o argumento opcional do table para pedir ao LaTeX que ele posicione a tabela onde ela foi colocada. Para fazer isso, será a usada opção h (here):

\begin{table}[h]

Agora, o LaTeX colocou a tabela onde ela foi inserida, ou seja, depois do \lipsum. Além do h, também podem ser usadas outras opções:

Opção Descrição
t top (superior)
b bottom (inferior)
p page. Coloca a tabela em uma página só para ambientes flutuantes.

Também é possível usar a exclamação para aumentar a importância do pedido, antes de uma ou mais opções:

\begin{table}[!hb]

O comando acima informa ao LaTeX que é muito importante que a imagem fique onde ela foi colocada. Mas, se não for possível, seria bom que ela fosse colocada na parte de baixo da página, como uma segunda opção.