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 usado para configurar as colunas da tabela. Exemplo:

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

\begin{document}
    \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{document}

O & é usado para separar as colunas da tabela e as duas barras invertidas servem para terminar uma linha. Na última linha, não é necessário usar as duas barras. O argumento obrigatório do ambiente tabular especifica a estrutura da tabela. As linhas verticais são separadores. As letras servem para indicar o alinhamento das colunas: l (left / esquerda), c (center / centralizado) e 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, e que passou a ser necessário colocar as duas barras invertidas após a linha dos dados do filósofo Demócrito por causa da inclusão do \hline no final da tabela.

Veja abaixo como a última tabela é exibida em um documento compilado:

Documento de LaTeX com uma tabela

Também é 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|}}

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 isso, pode ser criado um comando:

\newcommand{\hcell}[1]{\textbf{#1}}

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. O comando \toprule traça uma linha na parte superior da tabela. Ele tem um argumento opcional, onde dá para especificar a espessura da linha:

\toprule[1.5pt]

O comando \bottomrule traça uma linha na parte inferior da tabela. Também há um argumento opcional para especificar a espessura da linha.

\bottomrule[1.5pt]

O comando \midrule traça uma linha entre duas linhas da tabela. Ele também tem um argumento opcional para especificar a espessura da linha. Um bom lugar para usar esse comando seria após o cabeçalho, para separar o cabeçalho do corpo da tabela:

\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}

Veja abaixo como essa tabela é exibida em um documento compilado:

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, apenas uma vez, de forma que os valores fornecidos sejam aplicados a todas as tabelas do documento. Isso aumenta a consistência do documento e facilita a manutenção dele.

O comando \setlength é usado para alterar a espessura das linhas da tabela:

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

Note que o tipo da linha que se quer alterar é informado no primeiro argumento do comando. O comando \heavyrulewidth é informado para alterar a espessura das linhas superior e inferior; já o comando \lightrulewidth cuida da espessura das linhas criadas com \midrule e o \cmidrulewidth cuida das linhas criadas com \cmidrule (que é um comando que você verá 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, sendo que as colunas nascimento e cidade natal passam a ser vizinhas, o nome da coluna de nascimento muda para Data e as duas colunas são unidas pelo tema em comum que elas tem, que é o nascimento. O falecimento é deslocado para a última coluna. Veja abaixo como a tabela ficou:

\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) e 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 comando \cline. Porém, ele não será coberto aqui, porque há um comando bem melhor para o mesmo fim, que é o \cmidrule. Ele tem um argumento opcional, passado entre parênteses, que serve para cortar um pedaço do começo ou fim da linha ou de ambos.

Para cortar um pedaço do começo da linha, você passa l, e para cortar um pedaço do final da linha, você passa r. Você também pode passar lr para cortar os dois ao mesmo tempo.

O comando \cmidrule também tem um argumento obrigatório, no qual você informa a coluna onde a linha deve começar a ser traçada e a coluna onde a linha deve terminar de ser traçada, separando as duas por hífen. Veja abaixo um exemplo de uso do comando:

\cmidrule(r){1-1}
\cmidrule(lr){2-3}
\cmidrule(l){4-4}

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

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

Note que o argumento opcional do comando \cmidrule é informado entre parênteses. O mais comum é os argumentos opcionais do comando serem fornecidos entre colchetes, mas isso não vale para todos os comandos.

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. Para isso, basta usar o pacote multirow e o comando que tem o mesmo nome. No exemplo abaixo, foi adicionado um filósofo francês à tabela de filósofos, e os filósofos foram divididos em gregos e franceses:

\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 define quantas linhas a célula ocupará. O segundo define a largura da célula. No caso, o asterisco quer dizer que a célula não terá largura definida, delegando a responsabilidade de definir a largura da célula ao LaTeX. Por fim, 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 no seu documento uma lista de tabelas. 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
  
    \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 realmente colocou a tabela onde ela foi inserida, ou seja, depois do \lipsum. Esse comando aceita também outras opções como t (top), b (bottom) e p (page). Essa última 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. Exemplo:

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