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:
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:
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 NewCol
y usarlo en el comando de tabla \begin{tabularx}{1\textwidth}{ D{2.6cm}@{\quad} |C|C| NewCol|NewCol }
. NewCol
aquí debería dar como resultado columnas de igual ancho pero diferentes en tamaño del tipo de columna C
. Los anchos de ambos NewCol
y C
deben 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}
Respuesta2
¿Como esto? Solía >{\hsize=xₖ\hsize}X
ajustar el ancho de X
las 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}
Respuesta3
tabularx
Las columnas X (y tabulary
que se acercan más a lo que usted solicita), como p
las 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 tabular
l,r,c se ajusta automáticamente al ancho del contenido de la columna.
\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 tabulary
las 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,R
son los que sugieren sus nombres y J
es 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,p
se 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
\toprule
o\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}