¿Cómo solucionar el problema de forzar la división del texto en la tabla?

¿Cómo solucionar el problema de forzar la división del texto en la tabla?

Tengo una tabla simple en LibreOffice calc e intenté convertirla a látex usando la macro Calc2Latex.

Luego usando Latex intenté mejorarlo. ¡Sin embargo, no puedo entender el texto correctamente!

Así es como quiero que sea el texto en la tabla: ingrese la descripción de la imagen aquí

Por ejemplo, en la primera columna se divide "Mensaje por minuto por fuente".

Sin embargo, en mi tabla generada por látex, ¡eso no sucede! Es todo un gran lío: ingrese la descripción de la imagen aquí

Intenté solucionar el problema usando tabularxy leí en alguna parte que no debería usar multicolumn, ¡pero todavía soy un novato y no sé cómo solucionarlo!

Aquí está mi MWE:

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{microtype}
\usepackage[margin=2.54cm]{geometry}
\usepackage{graphicx,booktabs,tabularx}
\usepackage[table]{xcolor}
\usepackage{array}

%define some nice colors
\definecolor{middleware_green}{RGB}{82, 119, 17}
\definecolor{middleware_white}{RGB}{255, 255, 255}
\definecolor{middleware_light_gray}{RGB}{239, 239, 239}
\definecolor{middleware_dark_gray}{RGB}{153, 153, 153}

\renewcommand{\tabularxcolumn}[1]{>{\small}m{#1}}
\newcolumntype{F}{|>{\leavevmode\ignorespaces\raggedright\sffamily\bfseries}p{2.5cm}}%
\newcolumntype{R}{|>{\leavevmode\ignorespaces\raggedright\arraybackslash\sffamily}X}%
\newcolumntype{L}{|>{\leavevmode\ignorespaces\raggedleft\arraybackslash\sffamily}X}%
\newcolumntype{C}{|>{\leavevmode\ignorespaces\centering\arraybackslash\sffamily}X|}%
\rowcolors{2}{middleware_white}{middleware_light_gray}

\begin{document}

\begin{table}[htbp]

\begin{tabularx}{\textwidth}{|R|L|L|L|}
\hline\rowcolor{middleware_green}
\multicolumn{ 4}{|c|}{\textcolor{white}{\textbf{1 Source, 1 Session, 1 Client, Exp0}}} \\ \hline
\multicolumn{1}{|c|}{\textbf{Messages per minute per source}} & \multicolumn{1}{c|}{\textbf{Middleware Exec Time (s)}} & \multicolumn{1}{c|}{\textbf{Delay (s)}} & \multicolumn{1}{c|}{\textbf{Average Delay (s)}} \\ \hline
\multicolumn{ 1}{|r|}{60} & 60 & 0 & \multicolumn{ 1}{r|}{0.00} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 60 & 0 & \multicolumn{ 1}{l|}{} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 60 & 0 & \multicolumn{ 1}{l|}{} \\ \hline
\multicolumn{ 1}{|r|}{120} & 60 & 0 & \multicolumn{ 1}{r|}{0.00} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 60 & 0 & \multicolumn{ 1}{l|}{} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 60 & 0 & \multicolumn{ 1}{l|}{} \\ \hline
\multicolumn{ 1}{|r|}{240} & 60 & 0 & \multicolumn{ 1}{r|}{0.00} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 60 & 0 & \multicolumn{ 1}{l|}{} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 60 & 0 & \multicolumn{ 1}{l|}{} \\ \hline
\multicolumn{ 1}{|r|}{480} & 69 & 9 & \multicolumn{ 1}{r|}{16.67} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 69 & 9 & \multicolumn{ 1}{l|}{} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 92 & 32 & \multicolumn{ 1}{l|}{} \\ \hline
\multicolumn{ 1}{|r|}{1000} & 159 & 99 & \multicolumn{ 1}{r|}{109.67} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 173 & 113 & \multicolumn{ 1}{l|}{} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 177 & 117 & \multicolumn{ 1}{l|}{} \\ \hline
\multicolumn{ 1}{|r|}{2000} & 391 & 331 & \multicolumn{ 1}{r|}{311.00} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 383 & 323 & \multicolumn{ 1}{l|}{} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 339 & 279 & \multicolumn{ 1}{l|}{} \\ \hline
\multicolumn{ 1}{|r|}{4000} & 561 & 501 & \multicolumn{ 1}{r|}{512.33} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 631 & 501 & \multicolumn{ 1}{l|}{} \\ \cline{ 2- 3}
\multicolumn{ 1}{|l|}{} & 595 & 535 & \multicolumn{ 1}{l|}{} \\ \hline
\end{tabularx}

\label{}
\caption{}
\end{table}


\end{document}

La razón principal por la que quiero hacer las columnas más pequeñas es para que ocupen menos espacio y espero poder poner algo de texto al lado de ellas o poner 2 tablas una al lado de la otra.

Respuesta1

Una Xcolumna permite que su contenido se rompa, pero cuando lo hace, \multicolumn{1}{c}{Lots of text}anula ese especificador de columna. Esa celda se comportará como una ccolumna, lo que no permite saltos de línea.

Para tener el encabezado de la columna centrado, sin dejar de permitir saltos de línea, y tener el resto de la columna alineado a la derecha, use a \multicolumncon su Ccolumna, por ejemplo \multicolumn{1}{C}{\textbf{Messages per minute per source}}.

El resto de las \multicolumn{1}{..cosas creo que puedes eliminarlas. En el código completo a continuación, hay una tabla con reglas verticales y otra sin ellas. Creo que puedes usar el que no tiene, pero dejaré que tú decidas.

Estas mesas están colocadas a 0.45\textwidth, por lo que podrían ser un poco más anchas y aún habría espacio para dos una al lado de la otra. Si no lo necesita, por supuesto pueden ser mucho más anchos.

ingrese la descripción de la imagen aquí

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{microtype}
\usepackage[margin=2.54cm]{geometry}
\usepackage{graphicx,booktabs,tabularx}
\usepackage[table]{xcolor}
\usepackage{array}

%define some nice colors
\definecolor{middleware_green}{RGB}{82, 119, 17}
\definecolor{middleware_white}{RGB}{255, 255, 255}
\definecolor{middleware_light_gray}{RGB}{239, 239, 239}
\definecolor{middleware_dark_gray}{RGB}{153, 153, 153}

\renewcommand{\tabularxcolumn}[1]{>{\small}m{#1}}
\newcolumntype{F}{>{\leavevmode\ignorespaces\raggedright\sffamily\bfseries}p{2.5cm}}%
\newcolumntype{R}{>{\leavevmode\ignorespaces\raggedright\arraybackslash\sffamily}X}%
\newcolumntype{L}{>{\leavevmode\ignorespaces\raggedleft\arraybackslash\sffamily}X}%
\newcolumntype{C}{>{\leavevmode\ignorespaces\centering\arraybackslash\sffamily}X}%
\rowcolors{2}{middleware_white}{middleware_light_gray}

\begin{document}

\begin{table}
\centering
\begin{tabularx}{.45\textwidth}{LLLL}
\hline\rowcolor{middleware_green}
\multicolumn{4}{|c|}{\textcolor{white}{\textbf{1 Source, 1 Session, 1 Client, Exp0}}} \\ \hline
\multicolumn{1}{C}{\textbf{Messages per minute per source}} &
\multicolumn{1}{C}{\textbf{Middle\-ware Exec Time (s)}} &
\multicolumn{1}{C}{\textbf{Delay (s)}} &
\multicolumn{1}{C}{\textbf{Average Delay (s)}} \\ \hline
60 & 60 & 0 & 0.00 \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \hline
120 & 60 & 0 & 0.00 \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \hline
240 & 60 & 0 & 0.00 \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \hline
480 & 69 & 9 & 16.67 \\ \cline{ 2- 3}
 & 69 & 9 &  \\ \cline{ 2- 3}
 & 92 & 32 &  \\ \hline
1000 & 159 & 99 & 109.67 \\ \cline{ 2- 3}
 & 173 & 113 &  \\ \cline{ 2- 3}
 & 177 & 117 &  \\ \hline
2000 & 391 & 331 & 311.00 \\ \cline{ 2- 3}
 & 383 & 323 &  \\ \cline{ 2- 3}
 & 339 & 279 &  \\ \hline
4000 & 561 & 501 & 512.33 \\ \cline{ 2- 3}
 & 631 & 501 &  \\ \cline{ 2- 3}
 & 595 & 535 &  \\ \hline
\end{tabularx}
\begin{tabularx}{.45\textwidth}{|L|L|L|L|}
\hline\rowcolor{middleware_green}
\multicolumn{4}{|c|}{\textcolor{white}{\textbf{1 Source, 1 Session, 1 Client, Exp0}}} \\ \hline
\multicolumn{1}{|C|}{\textbf{Messages per minute per source}} &
\multicolumn{1}{C|}{\textbf{Middle\-ware Exec Time (s)}} &
\multicolumn{1}{C|}{\textbf{Delay (s)}} &
\multicolumn{1}{C|}{\textbf{Average Delay (s)}} \\ \hline
60 & 60 & 0 & 0.00 \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \hline
120 & 60 & 0 & 0.00 \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \hline
240 & 60 & 0 & 0.00 \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \cline{ 2- 3}
 & 60 & 0 &  \\ \hline
480 & 69 & 9 & 16.67 \\ \cline{ 2- 3}
 & 69 & 9 &  \\ \cline{ 2- 3}
 & 92 & 32 &  \\ \hline
1000 & 159 & 99 & 109.67 \\ \cline{ 2- 3}
 & 173 & 113 &  \\ \cline{ 2- 3}
 & 177 & 117 &  \\ \hline
2000 & 391 & 331 & 311.00 \\ \cline{ 2- 3}
 & 383 & 323 &  \\ \cline{ 2- 3}
 & 339 & 279 &  \\ \hline
4000 & 561 & 501 & 512.33 \\ \cline{ 2- 3}
 & 631 & 501 &  \\ \cline{ 2- 3}
 & 595 & 535 &  \\ \hline
\end{tabularx}
\caption{Look, two tables!}
\end{table}
\end{document}

Respuesta2

Propongo esta solución, aunque makecellestá lejos de ser perfecta. Sin embargo, creo que es interesante porque el código es mucho más compacto.

Tiene problemas con los colores: las dos primeras filas están bien, pero las siguientes filas no están completamente coloreadas, por razones que no entiendo ya que el código no es fundamentalmente diferente del código de la segunda fila (probé reemplazando los \multirowcomandos en la 4ª fila con \makecell, sin ningún cambio en la tabla resultante).

Entonces, si alguien pudiera explicar cuál es el problema...

    \documentclass[a4paper,10pt]{article}
    \usepackage[utf8]{inputenc}
    \usepackage{microtype}
    \usepackage[margin=2.54cm]{geometry}
    \usepackage{graphicx,tabularx}%booktabs,
    \usepackage{array}

    %define some nice colors
    \usepackage[font = sf]{caption}
    \usepackage{makecell}
    \renewcommand{\theadfont}{\bfseries}
    \renewcommand{\cellalign}{rc}

    \usepackage[table, svgnames]{xcolor}
    \definecolor{middleware_green}{RGB}{82, 119, 17}
    \definecolor{middleware_white}{RGB}{255, 255, 255}
    \definecolor{middleware_light_gray}{RGB}{239, 239, 239}
    \definecolor{middleware_dark_gray}{RGB}{153, 153, 153}
    \usepackage{colortbl}
    \rowcolors{2}{White}{Olive!15!}
    \begin{document}

    \begin{table}[htbp]
    \sffamily\centering
    \label{}
    \caption{}
    \begin{tabular}{|r|r|r|r|}%
    \hline\rowcolor{middleware_green}
    \multicolumn{ 4}{|c|}{\Gape[8pt]{\textcolor{white}{\textbf{1 Source, 1 Session, 1 Client, Exp0}}}} \\ %
    \hline%
    \makecell*{Messages\\ per minute\\ per source} & \makecell{Middleware Exec\\ Time (s)} & \makecell{Delay (s)}& \makecell{Average\\ Delay (s)} \\
    \hline
    \multirowcell{3}{360} & \makecell{60\\ 60\\60} & \makecell{0\\0\\0} & \multirowcell{3}{0.00} \\
     \hline\rowcolor{Olive!20!}%%
     \multirowcell{3}{120} & \makecell*{60\\60\\60} & \makecell{0\\0\\0} & \multirowcell{3}{0.00} \\%
    \hline
    \multirowcell{3}{240} & \makecell*{60\\60\\60} & \makecell{0\\0\\0} & \multirowcell{3}{0.00} \\
    \hline
    \multirowcell{3}{480} & \makecell*{69\\69\\92} & \makecell{9\\9\\32}& \multirowcell{3}{16.67} \\
    \hline
    \multirowcell{3}{1000} & \makecell*{159\\173\\177} & \makecell{99\\113\\117} & \multirowcell{3}{109.67} \\
    \hline
    \multirowcell{3}{2000} & \makecell*{391\\383\\339} & \makecell{331\\323\\279} & \multirowcell{3}{311.00} \\
    \hline
    \multirowcell{3}{4000} & \makecell*{561\\631\\595} & \makecell{501\\501\\535} & \multirowcell{3}{512.33} \\
    \hline
    \end{tabular}
    \end{table}

    \end{document} 

ingrese la descripción de la imagen aquí

información relacionada