¿Cómo puedo igualar automáticamente el ancho de columnas cuyo contenido es similar?

¿Cómo puedo igualar automáticamente el ancho de columnas cuyo contenido es similar?

Supongamos que tenemos una tabla y queremos que LaTeX determine automáticamente el ancho de sus columnas siempre que los anchos de las columnas sean iguales. Este problema se puede resolver definiendo un nuevo tipo de columna de la siguiente manera: \newcolumntype{C}{ >{ \arraybackslash \Centering } X }. Sin embargo, cuando se utiliza dicho comando, LaTeX hará que los anchos de las columnas sean iguales, pero esto puede dar como resultado un resultado subóptimo como este:

ingrese la descripción de la imagen aquí

El cual se genera usando el siguiente código:

\documentclass{report}

\usepackage{amsmath}
\usepackage{amssymb, amsfonts}
\usepackage[flushleft]{threeparttable}
\usepackage{makecell}


\usepackage{ragged2e} 
\usepackage{tabularx}
\newcolumntype{L}{ >{ \arraybackslash \RaggedRight } X } % left justified
\newcolumntype{C}{ >{ \arraybackslash \Centering } X } % centered
\newcolumntype{R}{ >{ \arraybackslash \RaggedLeft } X } % right justified
\newcolumntype{J}{ >{ \arraybackslash \justifying } X } % justified
\renewcommand \tabularxcolumn [1] { >{ \centering } m{#1} }
\usepackage{booktabs}
\newcolumntype{A}[1]{ >{ \arraybackslash \RaggedRight } m{#1} }
\newcolumntype{S}[1]{ >{ \arraybackslash \Centering } m{#1} }
\newcolumntype{D}[1]{ >{ \arraybackslash \RaggedLeft } m{#1} }
\newcolumntype{F}[1]{ >{ \arraybackslash \justifying } m{#1} }
\usepackage{multirow}



\begin{document}



\begin{table*}[]



    % Table options
    \caption{Elasticity Values}
    \label{table:PV_mod_STC_comp2}

    % Center the table
    \centering

    % Stretch the table (vertically)
    \renewcommand{\arraystretch}{1.3}


        \begin{tabularx}{1\textwidth}{ D{2.6cm}@{\quad} |C|C|C|C }



            \toprule


            \multirow{2}{*}{
                                \textbf{Customer type}
                            } & 
            \multicolumn{2}{c}{
                                    \multirow{2}{*}{\textbf{Set 1}}
                                }
            &
            \multicolumn{2}{|c}{
                                \multirow{2}{*}{\textbf{Set 2}}
                            }
            \\



            \multicolumn{1}{c|}{} &
            \multicolumn{2}{c}{} &
            \multicolumn{2}{|c}{}
            \\
            \Xhline{0.2 mm}


            \textbf{Residential} &
            $-0.09$ to $-0.5$ &
            $-0.12$ to $-1.56$ & $1$ & $2$
            \\
            \Xhline{0.2 mm}


            \textbf{Commercial} & $-0.019$ to $-0.25$ & $-0.44$ to $-0.97$ & $3$ & $4$
            \\
            \Xhline{0.2 mm}


            \textbf{Industrial} & $-0.005$ to $-0.14$ & $-0.34$ to $-5.48$ & $5$ & 
            $6$
            \\



            \bottomrule



        \end{tabularx}



\end{table*}

\end{document}

Un código optimizado debería resultar en algo como esto:

ingrese la descripción de la imagen aquí

El cual se genera reemplazando las dos últimas columnas con un ancho constante de 1cm cada una. Sin embargo, quiero que LaTeX automáticamente haga que las dos últimas columnas sean pequeñas (porque su contenido es pequeño) y al mismo tiempo obligue a que ambas columnas sean iguales. En otras palabras, quiero definir un nuevo tipo de columna, decir que su nombre es NewColy usarlo en el comando de tabla \begin{tabularx}{1\textwidth}{ D{2.6cm}@{\quad} |C|C| NewCol|NewCol }. NewColaquí debería dar como resultado columnas de igual ancho pero diferentes en tamaño del tipo de columna C. Los anchos de ambos NewColy Cdeben determinarse automáticamente de acuerdo con el contenido de las columnas y la longitud permitida definida en la sintaxis.

Respuesta1

Esta solución mide las columnas combinadas y luego usa esos anchos para la tabla. El inconveniente es que hay que introducir los datos dos veces. Tenga en cuenta que el título del Conjunto 2 es más amplio que los datos.

Hice una serie de cambios gratuitos, principalmente para simplificar el código.

\documentclass{report}

\usepackage{amsmath}
\usepackage{amssymb, amsfonts}
\usepackage[flushleft]{threeparttable}
\usepackage{makecell}
\usepackage{ragged2e} 
\usepackage{multirow}
% none of the above are used here

\usepackage{booktabs}
%\usepackage{array}% already loaded
\newcolumntype{C}[1]{ >{\hfil} m{#1} }
\newcolumntype{D}[1]{ >{\hfill} m{#1} }
\newcommand{\bigstrut}{\rule[\dimexpr -\arraystretch\dp\strutbox-1ex]{0pt}{0pt}%
  \rule{0pt}{\dimexpr \arraystretch\ht\strutbox+1ex}}

\begin{document}

\begin{table*}[]
\sbox0{\begin{tabular}{@{}l@{}}% measure set 1
  $-0.09$ to $-0.5$\\
  $-0.12$ to $-1.56$\\
  $-0.019$ to $-0.25$\\
  $-0.44$ to $-0.97$\\
  $-0.005$ to $-0.14$\\
  $-0.34$ to $-5.48$
\end{tabular}}
\sbox1{\begin{tabular}{@{}l@{}}% measure set 2
  1\\
  2\\
  3\\
  4\\
  5\\
  6
\end{tabular}}
    % Table options
    \caption{Elasticity Values}
    \label{table:PV_mod_STC_comp2}
    % Center the table
    \centering
    % Stretch the table (vertically)
    \renewcommand{\arraystretch}{1.3}
        \begin{tabular}{ D{2.7cm}@{\quad} |C{\wd0}|C{\wd0}|C{\wd1}|C{\wd1}}
            \toprule
            \bigstrut\textbf{Customer type} &
            \multicolumn{2}{c}{\bigstrut\textbf{Set 1}} &
            \multicolumn{2}{|c}{\bigstrut\textbf{Set 2}} \\
            \midrule
            Residential & $-0.09$ to $-0.5$   & $-0.12$ to $-1.56$  & 1 & 2 \\
            \midrule
            Commercial  & $-0.019$ to $-0.25$ & $-0.44$ to $-0.97$  & 3 & 4 \\
            \midrule
            Industrial  & $-0.005$ to $-0.14$ & $-0.34$ to $-5.48$  & 5 & 6 \\
            \bottomrule
        \end{tabular}
\end{table*}
\end{document}

manifestación

Respuesta2

¿Como esto? Solía >{\hsize=xₖ\hsize}X​​ajustar el ancho de Xlas columnas, la condición de los xₖcoeficientes era que su suma fuera igual al número de X columnas (esto funciona como un sistema de coordenadas baricéntricas):

\documentclass{report}
\usepackage{amsmath}
\usepackage{amssymb, amsfonts}
\usepackage[flushleft]{threeparttable}
\usepackage{makecell, caption}
\captionsetup{skip=6pt}
\usepackage{ragged2e}
\usepackage{tabularx}
\newcolumntype{L}{ >{ \arraybackslash \RaggedRight } X } % left justified
\newcolumntype{C}{ >{ \arraybackslash \Centering\hsize=1.6\hsize} X } % centered
\newcolumntype{y}{ >{ \arraybackslash \Centering\hsize=0.4\hsize} X } % centered
\newcolumntype{R}{ >{ \arraybackslash \RaggedLeft } X } % right justified
\newcolumntype{J}{ >{ \arraybackslash \justifying } X } % justified
\renewcommand \tabularxcolumn [1] { >{ \centering } m{#1} }
\usepackage{booktabs}
\newcolumntype{A}[1]{ >{ \arraybackslash \RaggedRight } m{#1} }
\newcolumntype{S}[1]{ >{ \arraybackslash \Centering } m{#1} }
\newcolumntype{D}[1]{ >{ \arraybackslash \RaggedLeft } m{#1} }
\newcolumntype{F}[1]{ >{ \arraybackslash \justifying } m{#1} }
\usepackage{multirow}

\begin{document}

\begin{table*}[]
    % Table options
    \caption{Elasticity Values}
    \label{table:PV_mod_STC_comp2}
    % Center the table
    \centering
    % Stretch the table (vertically)
    \renewcommand{\arraystretch}{1.3}
        \begin{tabularx}{1\textwidth}{ D{2.6cm}@{\quad} |C|C|y|y }
            \toprule
            \multirow{2}{*}{
                                \textbf{Customer type}
                            } &
            \multicolumn{2}{c}{
                                    \multirow{2}{*}{\textbf{Set 1}}
                                }
            &
            \multicolumn{2}{|c}{
                                \multirow{2}{*}{\textbf{Set 2}}
                            }
            \\
            \multicolumn{1}{c|}{} &
            \multicolumn{2}{c}{} &
            \multicolumn{2}{|c}{}
            \\
            \Xhline{0.2 mm}
            \textbf{Residential} &
            $-0.09$ to $-0.5$ &
            $-0.12$ to $-1.56$ & $1$ & $2$
            \\
            \Xhline{0.2 mm}
            \textbf{Commercial} & $-0.019$ to $-0.25$ & $-0.44$ to $-0.97$ & $3$ & $4$
            \\
            \Xhline{0.2 mm}
            \textbf{Industrial} & $-0.005$ to $-0.14$ & $-0.34$ to $-5.48$ & $5$ &
            $6$
            \\
            \bottomrule
        \end{tabularx}
\end{table*}

\end{document} 

ingrese la descripción de la imagen aquí

Respuesta3

tabularxLas columnas X (y tabularyque se acercan más a lo que usted solicita), como plas columnas tabulares estándar, están diseñadas para permitirsalto de líneadentro de una columna a un ancho especificado o calculado, pero casi nunca querrás un salto de línea automático en tablas de datos numéricos. Una columna estándar tabularl,r,c se ajusta automáticamente al ancho del contenido de la columna.

ingrese la descripción de la imagen aquí

\documentclass{report}

\usepackage{amsmath}
\usepackage{amssymb, amsfonts}
\usepackage[flushleft]{threeparttable}
\usepackage{makecell}


\usepackage{booktabs}



\begin{document}

\begin{table*}

% Table options
\caption{Elasticity Values}
\label{table:PV_mod_STC_comp2}

% Center the table
\centering

% Stretch the table (vertically)
\renewcommand{\arraystretch}{1.3}


\begin{tabular}{>\bfseries rcccc }
           \toprule
Customer type&
\multicolumn{2}{c}{\textbf{Set 1}}&
\multicolumn{2}{c}{\textbf{Set 2}}\\
\midrule
Residential&
            $-0.09$ to $-0.5$ &
            $-0.12$ to $-1.56$ & $1$ & $2$
            \\
\midrule
 Commercial & $-0.019$ to $-0.25$ & $-0.44$ to $-0.97$ & $3$ & $4$
            \\
\midrule
Industrial & $-0.005$ to $-0.14$ & $-0.34$ to $-5.48$ & $5$ & 
            $6$
            \\
            \bottomrule
\end{tabular}

\end{table*}

\end{document}

Respuesta4

Lo que necesitas es un tabulary. El ancho de tabularylas columnas es proporcional al ancho natural de la entrada más larga de cada columna. Aquí no se calcula nada manualmente. Los encabezados permitidos son LCJR, los tres L,C,Rson los que sugieren sus nombres y Jes como el normal p, todos en MAYÚSCULAS.

Notas:

  • Cuando se utiliza \multicolumns, el ancho de las columnas combinadas no debe exceder el ancho natural de sus contrapartes separadas. Observe que \makebox[.7em]{$1$}solía aumentar un poco el ancho. Además, c,l,r,pse utilizan letras normales para columnas combinadas.
  • Para aumentar la altura de la primera fila, simplemente \parbox{0pt}{\rule{0pt}{1cm}}puede hacer esto.
  • Finalmente, las reglas verticales no deben usarse con \topruleo \bottomrule, ya que crean un pequeño espacio debajo o encima de la línea horizontal.

-

\documentclass{report}

\usepackage{amsmath}
\usepackage{amssymb, amsfonts}
\usepackage[flushleft]{threeparttable}
\usepackage{makecell,tabulary}

\usepackage{ragged2e} 
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{multirow}    
\begin{document}

\begin{table*}    % [ ] Table options
  \caption{Elasticity Values}
  \label{table:PV_mod_STC_comp2}    
  \centering                                                % Center the table    
  \renewcommand{\arraystretch}{1.3} % Stretch the table (vertically)
  \begin{tabulary}{\textwidth}{ R|C|C|C|C}
    \Xhline{1pt}
    \textbf{Customer type}\parbox{0pt}{\rule{0pt}{1cm}}&\multicolumn{2}{c|}{\textbf{Set 1}} & \multicolumn{2}{c}{\textbf{Set 2}}\\
    \hline\textbf{Residential} & $-0.09$  to $-0.5$  & $-0.12$ to $-1.56$ & \makebox[.7em]{$1$} & $2$\\
    \hline\textbf{Commercial}  & $-0.019$ to $-0.25$ & $-0.44$ to $-0.97$ & $3$ & $4$   \\
    \hline\textbf{Industrial}  & $-0.005$ to $-0.14$ & $-0.34$ to $-5.48$ & $5$ & $6$   \\
    \Xhline{1pt}
  \end{tabulary}
\end{table*}

\end{document}

ingrese la descripción de la imagen aquí

información relacionada