對齊分組 tabularx 列中的數字

對齊分組 tabularx 列中的數字

我正在嘗試使用 tabularx 格式化表格,請參見下文。

桌子

表的內容並不重要,我只是在那裡放了一些隨機數字。如您所看到的,我嘗試使用自訂列類型和修改列分隔符號將四個類別(Apple,...)和總共一個類別(第 2-4 列)分組為三列區塊。

我花了相當多的時間嘗試正確對齊類別下方的 cmidrules,但我認為它們現在正確匹配列組。仍然存在以下兩個問題:

  • 我引入了一種新的列類型來使列內容居中,但顯然所有內容仍然是左對齊的。
  • 我需要將最後一行中可能的負值與頂行中的唯一正數對齊。所以我想這意味著我無論如何都不想將列居中,但需要它們右對齊。我還閱讀了有關 siunitx 列類型的信息,但無法成功將其整合到我的表中。

我已附上 MWE。先感謝您的幫忙!

\documentclass[11pt]{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage[scaled=1]{uarial}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{array}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{siunitx}

\begin{document}

\newcommand{\ap}[1]{AP\textsubscript{#1}}
\newcommand{\apavg}[0]{AP\textsubscript{\(\varnothing\)}}

\begin{figure}[!htbp]
  \centering
  \tiny
  \newcolumntype{C}{>{\centering\arraybackslash}X} % centered X-column
  \newcolumntype{B}{*{3}{C}} % block of 3 columns
  \newcolumntype{d}{@{\hspace{3\tabcolsep}}} % 150% spacing
  \begin{tabularx}{\textwidth}{c d B d B d B d B d B @{\hspace{2\tabcolsep}}}
    \toprule
    \multirow{2}[3]{*}{Model} & \multirow{2}[3]{*}{\ap{50}} & \multirow{2}[3]{*}{\ap{75}} & \multirow{2}[3]{*}{\apavg} & \multicolumn{3}{@{}cd}{Apple} & \multicolumn{3}{@{}cd}{Banana} & \multicolumn{3}{@{}cd}{Potato} & \multicolumn{3}{@{}c}{Orange} \\ \cmidrule(r{2\tabcolsep}){5-7} \cmidrule(r{2\tabcolsep}){8-10} \cmidrule(r{2\tabcolsep}){11-13} \cmidrule(r{\tabcolsep}){14-16}
    &  &  &  & \ap{50} & \ap{75} & \apavg & \ap{50} & \ap{75} & \apavg & \ap{50} & \ap{75} & \apavg & \ap{50} & \ap{75} & \apavg \\
    \midrule
    Baseline & \num{0.100} & \num{0.460} & \num{0.810} & \num{0.210} & \num{0.450} & \num{0.520} & \num{0.880} & \num{0.020} & \num{0.080} & \num{0.240} & \num{0.080} & \num{0.600} & \num{0.050} & \num{0.990} & \num{0.030} \\
    Improved & \num{0.200} & \num{0.360} & \num{0.860} & \num{0.390} & \num{0.400} & \num{0.600} & \num{0.900} & \num{0.020} & \num{0.080} & \num{0.200} & \num{0.080} & \num{0.600} & \num{0.100} & \num{0.990} & \num{0.100} \\
    \(\Delta\) & \num{0.100} & \num{-0.100} & \num{0.050} & \num{0.180} & \num{-0.050} & \num{0.080} & \num{0.020} & \num{0.000} & \num{0.000} & \num{-0.040} & \num{0.000} & \num{0.000} & \num{0.050} & \num{0.000} & \num{0.070} \\
    \bottomrule
  \end{tabularx}
\end{figure}

\end{document}

答案1

我的主要建議是使用tabular*環境而不是tabularx環境。我這樣說是因為列類型的主要功能之一X——單元格內容的自動換行——似乎與手邊的表格無關。

對於 15 個資料列,我將使用S列類型而不是X(或C) 列類型,並且我不會將數字包含在\num語句中。最後,我將表格資料​​放入一個table環境中,不是在一個figure環境中。

在此輸入影像描述

\documentclass[11pt]{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage[scaled=1]{helvet} % I don't seem to have 'uarial' package
\renewcommand{\familydefault}{\sfdefault}
\usepackage{array,amssymb,booktabs,siunitx}

\newcommand{\ap}[1]{AP\textsubscript{#1}}
\newcommand{\apavg}[0]{AP\textsubscript{\(\!\varnothing\)}}

\begin{document}

\begin{table}[!htbp] % <-- 'table', not 'figure'
\setlength\tabcolsep{0pt}
\tiny
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} % <-- use 'tabular*'
                   l *{15}{S[table-format=1.3]} }
    \toprule
    Model & &&&
    \multicolumn{3}{c}{Apple}  & \multicolumn{3}{c}{Banana} & 
    \multicolumn{3}{c}{Potato} & \multicolumn{3}{c}{Orange} \\ 
    \cmidrule{5-7} \cmidrule{8-10} \cmidrule{11-13} \cmidrule{14-16}
    & {\ap{50}} & {\ap{75}} & {\apavg} 
    & {\ap{50}} & {\ap{75}} & {\apavg} & {\ap{50}} & {\ap{75}} & {\apavg} 
    & {\ap{50}} & {\ap{75}} & {\apavg} & {\ap{50}} & {\ap{75}} & {\apavg} \\
    \midrule
    Baseline & 0.100 & 0.460 & 0.810 & 0.210 & 0.450 & 0.520 & 0.880 & 0.020 & 0.080 & 0.240 & 0.080 & 0.600 & 0.050 & 0.990 & 0.030\\
    Improved & 0.200 & 0.360 & 0.860 & 0.390 & 0.400 & 0.600 & 0.900 & 0.020 & 0.080 & 0.200 & 0.080 & 0.600 & 0.100 & 0.990 & 0.100\\
    Diff. & 0.100 & -0.100 & 0.050 & 0.180 & -0.050 & 0.080 & 0.020 & 0.000 & 0.000 & -0.040 & 0.000 & 0.000 & 0.050 & 0.000 & 0.070\\
    \bottomrule
\end{tabular*}
\end{table}
\end{document}

相關內容