¿Qué tiene de malo este tabularx?

Aug 26 2020

¡Odio las tablas en LaTeX! Siempre me estoy metiendo en algunos problemas y, sin embargo, esto debería ser fácil:

\documentclass[12pt,letterpaper,twoside]{book}
\usepackage{lmodern}
\usepackage[total={6in,10in},left=1.5in,top=0.5in,includehead,includefoot]{geometry}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{multirow}
\usepackage{hhline}
\usepackage{tabularx}

\begin{document}
 
\begin{center}
    \renewcommand{\arraystretch}{1.5}
    \begin{tabularx}{\textwidth}{|X|X|X|X|X|}
    \hline
        \rowcolor[gray]{0.95}
        \multicolumn{5}{|c|}{Title}
        \\ \hline
        \multicolumn{1}{|c|}{\textsf{Day 1}}
        & \multicolumn{1}{c|}{\textsf{Day 2}}
        & \multicolumn{1}{c|}{\textsf{Day 3}}
        & \multicolumn{1}{c|}{\textsf{Day 4}}
        & \multicolumn{1}{c|}{\textsf{Day 5}}
        \\ \hhline{|=|=|=|=|=|}
        \multicolumn{1}{|c|}{Text 1}
        & \multicolumn{1}{c|}{Text 2}
        & \multicolumn{1}{c|}{Text 3}
        & \multicolumn{1}{c|}{Text 4}
        & \multicolumn{1}{c|}{Text 5}
        \\
        \multicolumn{1}{|c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        \\ \hline
    \end{tabularx}
\end{center}

\end{document}

Vista previa del problema:

Como muestra la imagen, la mesa no cierra en el lado derecho. ¿Qué está mal con el código?

Respuestas

6 Mico Aug 26 2020 at 11:57

Tu preguntaste,

¿Qué está mal con el código?

El código encierra (¿sepulta?) todas y cada una de las celdas en un \multicolumn{1}{|c|}{...}envoltorio, por lo que anula por completo Xla capacidad del tipo de columna para proporcionar saltos de línea automáticos dentro de las celdas. En consecuencia, no hay absolutamente ninguna razón para esperar que el ancho del tabularxentorno sea igual a \textwidth.

¿El remedio? Debe (a) deshacerse de los \multicolumn{1}{|c|}{...}envoltorios, para que la tabularxmaquinaria pueda hacer su trabajo, y (b) definir y emplear una versión del Xtipo de columna que centre en lugar de justificar completamente el contenido de la celda. Consulte el código a continuación para conocer las formas de satisfacer la segunda condición.

Para el ejemplo que nos ocupa, reducir el valor de \tabcolsep(el parámetro que rige la cantidad de espacios en blanco entre columnas) a la mitad logra evitar los saltos de línea en la fila final. Vea el segundo tabularxejemplo en la siguiente captura de pantalla para ver el "aspecto" resultante.

\documentclass[12pt,letterpaper,twoside]{book}
\usepackage{lmodern}
\usepackage[total={6in,10in}, left=1.5in,top=0.5in, 
            includehead,includefoot]{geometry}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{multirow,hhline}
\usepackage{tabularx}
\usepackage{ragged2e} % for '\Centering' macro
% Define a centered version of 'X' column type:
\newcolumntype{C}{>{\Centering}X} 
% or: \newcolumntype{C}{>{\centering\arraybackslash}X} 

\begin{document}

\begin{center}
\renewcommand{\arraystretch}{1.5}
    \begin{tabularx}{\textwidth}{|*{5}{C|}} % <-- "C", not "X"
    \hline
    \rowcolor[gray]{0.95}
    \multicolumn{5}{|c|}{\texttt{tabularx} with default value of \texttt{\string\tabcolsep}}
    \\ \hline
    \textsf{Day 1}
    & \textsf{Day 2} & \textsf{Day 3} & \textsf{Day 4} & \textsf{Day 5}
    \\ \hhline{|=|=|=|=|=|}
    Text 1 & Text 2 & Text 3 & Text 4 & Text 5 \\
    12h00 to 18h00 & 12h00 to 18h00 & 12h00 to 18h00 & 12h00 to 18h00 & 12h00 to 18h00
    \\ \hline
    \end{tabularx}

\bigskip
\setlength\tabcolsep{3pt} % default value: 6pt

    \begin{tabularx}{\textwidth}{|*{5}{C|}} % <-- "C", not "X"
    \hline
    \rowcolor[gray]{0.95}
    \multicolumn{5}{|c|}{\texttt{tabularx} with reduced value of \texttt{\string\tabcolsep}}
    \\ \hline
    \textsf{Day 1}
    & \textsf{Day 2} & \textsf{Day 3} & \textsf{Day 4} & \textsf{Day 5}
    \\ \hhline{|=|=|=|=|=|}
    Text 1 & Text 2 & Text 3 & Text 4 & Text 5 \\
    12h00 to 18h00 & 12h00 to 18h00 & 12h00 to 18h00 & 12h00 to 18h00 & 12h00 to 18h00
    \\ \hline
    \end{tabularx}
\end{center}

\end{document}
1 jsbibra Aug 26 2020 at 11:14

\documentclass[12pt,letterpaper,twoside]{book}
\usepackage{lmodern}
\usepackage[total={6in,10in},left=1.5in,top=0.5in,includehead,includefoot]{geometry}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{multirow}
\usepackage{hhline}
\usepackage{tabularx}

\begin{document}
 
\begin{center}
    \renewcommand{\arraystretch}{1.5}
    \begin{tabular}{|c|c|c|c|c|}
    \hline
        \rowcolor[gray]{0.95}
        \multicolumn{5}{|c|}{Title}
        \\ \hline
        \multicolumn{1}{|c|}{\textsf{Day 1}}
        & \multicolumn{1}{c|}{\textsf{Day 2}}
        & \multicolumn{1}{c|}{\textsf{Day 3}}
        & \multicolumn{1}{c|}{\textsf{Day 4}}
        & \multicolumn{1}{c|}{\textsf{Day 5}}
        \\ \hhline{|=|=|=|=|=|}
        \multicolumn{1}{|c|}{Text 1}
        & \multicolumn{1}{c|}{Text 2}
        & \multicolumn{1}{c|}{Text 3}
        & \multicolumn{1}{c|}{Text 4}
        & \multicolumn{1}{c|}{Text 5}
        \\
        \multicolumn{1}{|c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        & \multicolumn{1}{c|}{12h00 to 18h00}
        \\ \hline
    \end{tabular}
\end{center}

\end{document}