Wie kann ich die Breite von Spalten mit ähnlichem Inhalt automatisch angleichen?

Wie kann ich die Breite von Spalten mit ähnlichem Inhalt automatisch angleichen?

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:

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

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 }. NewColhier sollten Spalten gleicher Breite, aber unterschiedlicher Größe vom Spaltentyp resultieren C. Die Breiten von NewColund Csollten 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}

Demo

Antwort2

So? Ich habe >{\hsize=xₖ\hsize}Xdie Breite der XSpalten 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} 

Bildbeschreibung hier eingeben

Antwort3

tabularxX-Spalten (und tabularywelche kommen dem näher, was Sie verlangen), psind 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 tabularl,r,c passt sich automatisch der Breite des Spalteninhalts an.

Bildbeschreibung hier eingeben

\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 tabularySpalten 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,Rsind, was ihre Namen vermuten lassen und Jsind wie die normalen p, alle in GROSSBUCHSTABEN.

Anmerkungen:

  • Bei der Verwendung \multicolumnssollte 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ßerdem c,l,r,pwerden 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.
  • \topruleSchließ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}

Bildbeschreibung hier eingeben

verwandte Informationen