Предположим, что у нас есть таблица, и мы хотим, чтобы LaTeX автоматически определял ширину ее столбцов при условии, что ширина столбцов одинакова. Такую проблему можно решить, определив новый тип столбцов следующим образом: \newcolumntype{C}{ >{ \arraybackslash \Centering } X }
. Однако при использовании такой команды LaTeX сделает ширину столбцов одинаковой, но это может привести к неоптимальному выводу, например, такому:
Который генерируется с использованием следующего кода:
\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}
Оптимизированный код должен выглядеть примерно так:
Который генерируется путем замены последних двух столбцов на постоянную ширину в 1 см каждый. Однако я хочу, чтобы LaTeX автоматически сделал последние два столбца маленькими (потому что их содержимое невелико), одновременно принудительно сделав оба столбца равными. Другими словами, я хочу определить новый тип столбца, скажем, его имя NewCol
, и использовать его в команде table \begin{tabularx}{1\textwidth}{ D{2.6cm}@{\quad} |C|C| NewCol|NewCol }
. NewCol
здесь должны получиться столбцы одинаковой ширины, но отличающиеся по размеру от типа столбца C
. Ширина обоих NewCol
и C
должна автоматически определяться в соответствии с содержимым столбцов и допустимой длиной, определенной в синтаксисе.
решение1
Это решение измеряет объединенные столбцы, а затем использует эти ширины для табличного. Недостаток в том, что вам придется вводить данные дважды. Обратите внимание, что заголовок Set 2 шире, чем данные.
Я внес ряд необоснованных изменений, в основном для упрощения кода.
\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}
решение2
Как это? Я привык >{\hsize=xₖ\hsize}X
регулировать ширину X
столбцов, условием для xₖ
коэффициентов было то, что их сумма была равна количеству столбцов X (это работает как система барицентрических координат):
\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}
решение3
tabularx
X столбцов (и tabulary
какой из них ближе к тому, что вы запрашиваете), как и стандартные табличные p
столбцы, предназначены для того, чтобыразрыв строкив пределах столбца до указанной или вычисленной ширины, но вы почти никогда не хотите автоматического переноса строк в таблицах числовых данных. Стандартный tabular
столбец l,r,c автоматически подстраивается под ширину содержимого столбца.
\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}
решение4
Вам нужен tabulary
. Ширина tabulary
столбцов пропорциональна естественной ширине самой длинной записи в каждом столбце. Здесь вам не нужно ничего вычислять вручную. Допустимые заголовки — LCJR
, три из L,C,R
них соответствуют своим названиям и J
похожи на обычные p
, все заглавными буквами.
Примечания:
- При использовании
\multicolumns
ширина объединенных столбцов не должна превышать естественную ширину их отдельных аналогов. Обратите внимание на\makebox[.7em]{$1$}
I, используемую для небольшого увеличения ширины. Такжеc,l,r,p
для объединенных столбцов используются обычные буквы. - Чтобы увеличить высоту первого ряда,
\parbox{0pt}{\rule{0pt}{1cm}}
можно сделать следующее. - Наконец, вертикальные линии не следует использовать вместе с
\toprule
или\bottomrule
, так как они создают небольшой зазор под/над горизонтальной линией.
-
\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}