Como quebrar texto em tabelas LaTeX?

454

Estou criando um relatório no LaTeX que envolve algumas tabelas. Estou preso nisso porque meus dados de célula na tabela estão excedendo a largura da página. Posso, de alguma forma, quebrar o texto para que ele caia na próxima linha na mesma célula da tabela?

De alguma forma, está relacionado à largura da tabela? Mas, ao ultrapassar a largura da página, isso fará diferença?

Arnkrishn
fonte
Eu estava procurando uma maneira de envolver palavra longa, a outra solução melhor se adapte às minhas necessidades tex.stackexchange.com/questions/198325/wrap-word-in-table-cell
Miranda

Respostas:

513

Use p {width} para os especificadores da coluna em vez de l / r / c.

\begin{tabular}{|p{1cm}|p{3cm}|}
  This text will be wrapped & Some more text \\
\end{tabular}
moinudin
fonte
37
Boa solução, mas perde o '|' se você não quiser uma borda ao redor da mesa. \begin{tabular}{p{1cm}p{3cm}}
Tornaria-
83
Existe alguma maneira de fazer isso enquanto especifica o alinhamento em cada célula?
Dylan Knowles
7
Eu encontrei uma maneira de especificar o alinhamento em cada célula! Crie uma macro! \ newcolumntype {L} {> {\ centering \ arraybackslash} m {.8cm}} \ begin {table *} [t]% \ small \ caption {Comparação} \ centering% \ begin {tabular} {| L | L | L | L | L | L | L | L | L | L | L | L |}
Veridian
8
E se eu tiver duas colunas em que a primeira deve ter o tempo necessário para ajustar seu conteúdo e a outra deve preencher a largura da linha durante a quebra? Então, basicamente, eu precisobegin{tabular}{lp{<whatever is left to fill the line width>}}
Sander
118
Ótima solução. No entanto, eu recomendo usar valores relativos ao invés de dimensão arbitrária, por exemplop{0.2\linewidth}p{0.6\linewidth}}
jgyou
139

Com o tabularambiente regular , você deseja usar o p{width}tipo de coluna, como indica o marcog. Mas isso força você a fornecer larguras explícitas.

Outra solução é o tabularxmeio ambiente:

\usepackage{tabularx}
...
\begin{tabularx}{\linewidth}{ r X }
    right-aligned foo & long long line of blah blah that will wrap when the table fills the column width\\
\end{tabularx}

Todas as colunas X têm a mesma largura. Você pode influenciar isso configurando \hsizena declaração de formato:

>{\setlength\hsize{.5\hsize}} X >{\setlength\hsize{1.5\hsize}} X

mas todos os fatores precisam somar até 1, suponho (peguei isso do companheiro do LaTeX). Há também o pacote tabularyque ajustará as larguras das colunas para equilibrar as alturas das linhas. Para detalhes, você pode obter a documentação de cada pacote com texdoc tabulary(no TeXlive).

Damien Pollet
fonte
3
Interessante, isso parece realmente útil. Quão inteligente é quando se trata de selecionar as larguras das colunas? Por exemplo, se você tem duas colunas que precisam ser quebradas, mas uma com texto muito mais longo que a outra, ainda assim as atribui largura igual?
moinudin
2
Eu editei minha resposta. Mas, na prática, tento simplificar minhas tabelas para que eu só precise do X para uma única coluna. Eu só tabulary descoberto :)
Damien Pollet
50

Outra opção é inserir uma minipágina em cada célula onde o agrupamento de texto é desejado, por exemplo:

\begin{table}[H]
\begin{tabular}{l}
\begin{minipage}[t]{0.8\columnwidth}%
a very long line a very long line a very long line a very long line
a very long line a very long line a very long line a very long line
a very long line a very long line a very long line %
\end{minipage}\tabularnewline
\end{tabular}
\end{table}
Neil Rubens
fonte
8
Obrigado, isso me permitiu colocar itemizelistas em minhas células.
Quentin Pradet
Eu acho que a resposta deve explicar o significado de \columnwidth: Quando eu tentei, parecia ter mais largura da tabela do que largura da coluna, então tive que definir uma proporção manual 0.2\columnwidthpara obter uma largura razoável.
U. Windl
37

Eu gosto da simplicidade do tabularypacote:

\usepackage{tabulary}
...
\begin{tabulary}{\linewidth}{LCL}
    \hline
    Short sentences      & \#  & Long sentences                                                 \\
    \hline
    This is short.       & 173 & This is much loooooooonger, because there are many more words.  \\
    This is not shorter. & 317 & This is still loooooooonger, because there are many more words. \\
    \hline
\end{tabulary} 

No exemplo, você organiza toda a largura da tabela em relação a \ textwidth. Por exemplo, 0,4. O restante é feito automaticamente pelo pacote.

A maior parte do exemplo é retirada de http://en.wikibooks.org/wiki/LaTeX/Tables .

ozi
fonte
20

Simples como um pedaço de bolo!

Você pode definir um novo tipo de coluna como ( Lneste caso) enquanto mantém o alinhamento atual ( c, rou l):

\documentclass{article}
\usepackage{array}
\newcolumntype{L}{>{\centering\arraybackslash}m{3cm}}

\begin{document}

\begin{table}
    \begin{tabular}{|c|L|L|}
        \hline
        Title 1 & Title 2 & Title 3 \\
        \hline 
        one-liner & multi-line and centered & \multicolumn{1}{m{3cm}|}{multi-line piece of text to show case a multi-line and justified cell}   \\
        \hline
        apple & orange & banana \\
        \hline
        apple & orange & banana \\
        \hline
    \end{tabular}
\end{table}
\end{document}

insira a descrição da imagem aqui

Shayan Amani
fonte
5

Se você deseja agrupar o texto, mas manter o alinhamento, poderá agrupar a célula em um ambiente minipageou varwidth(a largura da largura vem do pacote da largura da largura). A largura da largura será "tão larga quanto seu conteúdo, mas não maior que X". Você pode criar um tipo de coluna personalizado que age como "p {xx}", mas diminui para caber usando

\newcolumntype{M}[1]{>{\begin{varwidth}[t]{#1}}l<{\end{varwidth}}}

o que pode exigir o arraypacote. Então, quando você usar algo como \begin{tabular}{llM{2in}}as duas primeiras colunas, ficaremos alinhados à esquerda e a terceira coluna ficará alinhada à esquerda, mas se for maior que 2 polegadas, o texto será quebrado.

cheshirekow
fonte
1

Para alterar o texto ABpara A \r Bnuma célula de tabela, colocar isso em posição de célula: \makecell{A \\ B}.

Antes de fazer isso, você também precisa incluir o pacote makecell.

FlorPraia
fonte
-12
\begin{table}
 \caption{ Example of force text wrap}
 \begin{center}
  \begin{tabular}{|c|c|}
   \hline
   cell 1       &   cell 2 \\   \hline
   cell 3                &       cell 4 & & very big line that needs to be wrap. \\ \hline
   cell 5       &   cell 6 \\   \hline
  \end{tabular}
  \label{table:example}
 \end{center}
\end{table}
Md Monjur Ul Hasan
fonte
Voto negativo. Esta é uma resposta apenas de código, sem nenhuma explicação.
Starbeamrainbowlabs # 2/19
1
Além disso, está errado de qualquer maneira, já que a segunda linha contém 4 células em que a tabela foi projetada para acomodar apenas duas colunas. E não está relacionado à quebra do conteúdo da célula.
Ahmed salah