Angenommen, wir haben eine Tabelle und möchten, dass LaTeX die Breite der Spalten automatisch bestimmt, vorausgesetzt, dass die Spaltenbreiten gleich sind. Ein solches Problem kann durch die Definition eines neuen Spaltentyps wie folgt gelöst werden: \newcolumntype{C}{ >{ \arraybackslash \Centering } X }
. Wenn Sie jedoch einen solchen Befehl verwenden, gleicht LaTeX die Spaltenbreiten aus, was jedoch zu einer suboptimalen Ausgabe wie dieser führen kann:
Dieses wird mit dem folgenden Code generiert:
\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}
Ein optimierter Code sollte in etwa wie folgt aussehen:
Dies wird durch Ersetzen der letzten beiden Spalten durch Spalten mit einer konstanten Breite von jeweils 1 cm erzeugt. Ich möchte jedoch, dass LaTeX die letzten beiden Spalten automatisch verkleinert (weil ihr Inhalt klein ist), während beide Spalten gleich groß bleiben. Mit anderen Worten, ich möchte einen neuen Spaltentyp definieren, sagen wir, sein Name ist NewCol
, und ihn im Tabellenbefehl verwenden \begin{tabularx}{1\textwidth}{ D{2.6cm}@{\quad} |C|C| NewCol|NewCol }
. NewCol
hier sollten Spalten gleicher Breite, aber unterschiedlicher Größe vom Spaltentyp resultieren C
. Die Breiten von NewCol
und C
sollten automatisch entsprechend dem Inhalt der Spalten und der in der Syntax definierten zulässigen Länge bestimmt werden.
Antwort1
Diese Lösung misst die kombinierten Spalten und verwendet diese Breiten dann für die Tabelle. Der Nachteil besteht darin, dass Sie die Daten zweimal eingeben müssen. Beachten Sie, dass der Titel von Satz 2 breiter ist als die Daten.
Ich habe eine Reihe unnötiger Änderungen vorgenommen, hauptsächlich um den Code zu vereinfachen.
\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}
Antwort2
So? Ich habe >{\hsize=xₖ\hsize}X
die Breite der X
Spalten angepasst, wobei die Bedingung für die xₖ
Koeffizienten war, dass ihre Summe gleich der Anzahl der X-Spalten ist (dies funktioniert wie ein System baryzentrischer Koordinaten):
\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}
Antwort3
tabularx
X-Spalten (und tabulary
welche kommen dem näher, was Sie verlangen), p
sind wie normale Tabellenspalten dafür gedacht,Zeilenumbruchinnerhalb einer Spalte auf eine angegebene oder berechnete Breite, aber Sie möchten in Tabellen mit numerischen Daten fast nie einen automatischen Zeilenumbruch. Eine Standardspalte tabular
l,r,c passt sich automatisch der Breite des Spalteninhalts an.
\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}
Antwort4
Was Sie brauchen, ist ein tabulary
. Die Breite der tabulary
Spalten ist proportional zur natürlichen Breite des längsten Eintrags in jeder Spalte. Hier berechnen Sie nichts manuell. Die zulässigen Überschriften sind LCJR
, die drei L,C,R
sind, was ihre Namen vermuten lassen und J
sind wie die normalen p
, alle in GROSSBUCHSTABEN.
Anmerkungen:
- Bei der Verwendung
\multicolumns
sollte die Breite der kombinierten Spalten die natürliche Breite ihrer separaten Gegenstücke nicht überschreiten. Beachten Sie, dass das\makebox[.7em]{$1$}
I verwendet wird, um die Breite ein wenig zu vergrößern. Außerdemc,l,r,p
werden für kombinierte Spalten normale Buchstaben verwendet. - Um die Höhe der ersten Reihe zu erhöhen,
\parbox{0pt}{\rule{0pt}{1cm}}
können Sie Folgendes ganz einfach tun. \toprule
Schließlich sollten vertikale Linien nicht mit oder verwendet werden\bottomrule
, da diese eine kleine Lücke unter/über der horizontalen Linie erzeugen.
-
\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}