Comment encapsuler du texte dans des tableaux LaTeX?

454

Je crée un rapport dans LaTeX qui implique quelques tableaux. Je suis coincé là-dessus car mes données de cellule dans le tableau dépassent la largeur de la page. Puis-je en quelque sorte envelopper le texte afin qu'il tombe dans la ligne suivante dans la même cellule du tableau?

Est-ce en quelque sorte lié à la largeur de la table? Mais comme il dépasse la largeur de la page, cela fera-t-il une différence?

Arnkrishn
la source
Je cherchais un moyen de boucler un long mot, l'autre solution correspond mieux à mes besoins tex.stackexchange.com/questions/198325/wrap-word-in-table-cell
Miranda

Réponses:

514

Utilisez p {width} pour vos spécificateurs de colonne au lieu de l / r / c.

\begin{tabular}{|p{1cm}|p{3cm}|}
  This text will be wrapped & Some more text \\
\end{tabular}
moinudin
la source
37
Bonne solution, mais perdez le '|' si vous ne voulez pas de bordure autour de la table. Il deviendrait alors\begin{tabular}{p{1cm}p{3cm}}
Andrejas
83
Existe-t-il un moyen de le faire tout en spécifiant l'alignement dans chaque cellule?
Dylan Knowles
7
J'ai trouvé un moyen de spécifier l'alignement dans chaque cellule! Créez une macro! \ newcolumntype {L} {> {\ centrage \ arraybackslash} m {.8cm}} \ begin {table *} [t]% \ small \ caption {Comparaison} \ centrage% \ begin {tabular} {| L | L | L | L | L | L | L | L | L | L | L | L | L |}
Veridian
8
Que se passe-t-il si j'ai deux colonnes où la première doit être aussi longue que nécessaire pour tenir son contenu et l'autre doit remplir jusqu'à la largeur de la ligne, tout en encapsulant? Donc, fondamentalement, j'ai besoinbegin{tabular}{lp{<whatever is left to fill the line width>}}
Sander
118
Excellente solution. Cependant, je recommanderais d'utiliser des valeurs relatives au lieu d'une dimension arbitraire, par exemplep{0.2\linewidth}p{0.6\linewidth}}
jgyou
139

Avec l' tabularenvironnement normal , vous souhaitez utiliser le p{width}type de colonne, comme l'indique marcog. Mais cela vous oblige à donner des largeurs explicites.

Une autre solution est l' tabularxenvironnement:

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

Toutes les colonnes X ont la même largeur. Vous pouvez influencer cela en définissant \hsizedans la déclaration de format:

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

mais alors tous les facteurs doivent résumer à 1, je suppose (j'ai pris cela du compagnon LaTeX). Il y a aussi le package tabularyqui ajustera les largeurs de colonne pour équilibrer les hauteurs de ligne. Pour les détails, vous pouvez obtenir la documentation de chaque paquet avec texdoc tabulary(dans TeXlive).

Damien Pollet
la source
3
Intéressant, cela semble vraiment utile. Dans quelle mesure est-il intelligent de sélectionner des largeurs de colonne? Par exemple, si vous avez deux colonnes qui doivent être encapsulées mais une avec un texte beaucoup plus long que l'autre, leur attribue-t-il toujours une largeur égale?
moinudin
2
J'ai édité ma réponse. Mais en fait, dans la pratique, j'essaie de simplifier mes tableaux afin de n'avoir besoin de X que pour une seule colonne. Je viens de découvrir le tableau :)
Damien Pollet
50

Une autre option consiste à insérer une minipage dans chaque cellule où l'habillage du texte est souhaité, par exemple:

\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
la source
8
Merci, cela m'a permis de placer des itemizelistes dans mes cellules.
Quentin Pradet
Je pense que la réponse devrait expliquer la signification de \columnwidth: lorsque je l'ai essayé, il semblait que ce soit plus la largeur de la table que la largeur de la colonne, j'ai donc dû définir une proportion manuelle comme 0.2\columnwidthpour obtenir une largeur raisonnable.
U. Windl
37

J'aime la simplicité du tabularypackage:

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

Dans l'exemple, vous organisez toute la largeur de la table par rapport à \ textwidth. Par exemple 0,4 de celui-ci. Ensuite, le reste est automatiquement effectué par le package.

La plupart de l'exemple est tiré de http://en.wikibooks.org/wiki/LaTeX/Tables .

ozi
la source
20

Simple comme un morceau de GÂTEAU!

Vous pouvez définir un nouveau type de colonne comme ( Ldans ce cas) tout en conservant l'alignement actuel ( 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}

entrez la description de l'image ici

Shayan Amani
la source
5

Si vous souhaitez encapsuler votre texte tout en conservant l'alignement, vous pouvez encapsuler cette cellule dans un environnement minipageou varwidth(varwidth provient du package varwidth). Varwidth sera "aussi large que son contenu mais pas plus large que X". Vous pouvez créer un type de colonne personnalisé qui agit comme "p {xx}" mais se rétrécit pour s'adapter en utilisant

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

qui peut nécessiter le arraypaquet. Ensuite, lorsque vous utilisez quelque chose comme \begin{tabular}{llM{2in}}les deux premières colonnes, nous sommes alignés à gauche et la troisième colonne est alignée à gauche, mais si elle dépasse 2 pouces, le texte est encapsulé.

cheshirekow
la source
1

Pour modifier le texte ABdans A \r Bune cellule de tableau, tout mettre dans la position de la cellule: \makecell{A \\ B}.

Avant de faire cela, vous devez également inclure le package makecell.

FlowerBeach
la source
-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
la source
Downvote. Il s'agit d'une réponse en code uniquement, sans aucune explication.
starbeamrainbowlabs
1
De plus, c'est faux de toute façon puisque la deuxième ligne contient 4 cellules où le tableau est conçu pour n'accueillir que deux colonnes. Et ce n'est pas lié à l'emballage du contenu des cellules de toute façon.
Ahmed salah