Alinear números en columnas tabularx agrupadas

Alinear números en columnas tabularx agrupadas

Estoy intentando formatear una tabla con tabularx, ver más abajo.

Mesa

El contenido de la tabla no importa, sólo pongo algunos números aleatorios allí. Como puede ver, intenté agrupar las cuatro categorías (Apple,...) y una total (columnas 2-4) en bloques de tres columnas usando tipos de columnas personalizados y modificando separadores de columnas.

Pasé bastante tiempo intentando alinear correctamente las cmidrules debajo de las categorías, pero creo que ahora coinciden correctamente con los grupos de columnas. Quedan los siguientes dos problemas:

  • Introduje un nuevo tipo de columna para centrar el contenido de la columna, pero aparentemente todo sigue alineado a la izquierda.
  • Necesito alinear los valores posiblemente negativos en la última fila con los números exclusivamente positivos en las filas superiores. Supongo que esto significa que no quiero centrar las columnas de todos modos, sino que necesito que estén justificadas a la derecha. También leí sobre los tipos de columnas de siunitx, pero no pude integrarlas correctamente en mi tabla.

He adjuntado un MWE. ¡Gracias por tu ayuda de antemano!

\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}

Respuesta1

Mi principal sugerencia sería utilizar un tabular*entorno en lugar de un tabularxentorno. Digo esto porque una de las características principales del Xtipo de columna (el salto de línea automático del contenido de la celda) no parece ser relevante para la tabla que nos ocupa.

Usaría el Stipo de columna en lugar del tipo de columna X(o C) para las 15 columnas de datos y no incluiría los números en \numlas declaraciones. Finalmente, encerraría el material tabular en un tableentorno,noen un figureambiente.

ingrese la descripción de la imagen aquí

\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}

información relacionada