¿Cómo puedo reducir el espacio entre columnas en una tabla?

¿Cómo puedo reducir el espacio entre columnas en una tabla?

Hay otras preguntas similares, todas con diferentes respuestas, pero no pude encontrar ninguna que consiga lo que quiero. En la siguiente tabla, el espacio entre los números es demasiado amplio. ¿Cómo puedo reducirlo un poco?

\newcommand{\testmode}[2] {
    \begin{tabular}{c}
        \textbf{#1} \\ \textbf{d=#2}
    \end{tabular}
}

\begin{table}[ht]
\begin{tabular}{l | c c c | c c c |}
\cline{2-7}
          & \multicolumn{3}{c|}{\textbf{Single}} & \multicolumn{3}{c|}{\textbf{Double}} \\
\cline{2-7}
          & \testmode{Scalar}{1} & \testmode{SSE-4}{4} & \testmode{AVX-2}{8} & \testmode{Scalar}{1} & \testmode{SSE-4}{2} & \testmode{AVX-2}{4} \\
\hline
\multicolumn{1}{|c|}{\textbf{Eytzinger}                        } &     209.86 &     370.18 &     411.25 &     180.85 &     245.37 &     262.61 \\
\multicolumn{1}{|c|}{\textbf{Classic Offset}                    } &     213.28 &     363.35 &     476.10 &     209.04 &     247.02 &     208.63 \\
\hline
\end{tabular}
\caption{Throughput in millions of searches per second with vector $X$ of size 15}
\label{tab:results0}
\end{table}

Respuesta1

En su ejemplo, ha duplicado la separación de columnas usando un tabularinterior a tabular. Nota: LaTeX agrega una distancia \tabcolsepantes y después de cada columna. En su caso, tiene esa distancia antes y después de la columna del tabular interior \testmodey antes y después de la columna del tabular exterior. Para evitar esto, debes agregar @{}antes de la primera columna del tabular interno y después de la última columna del tabular interno:

\documentclass{article}

\begin{document}
\newcommand{\testmode}[2] {%
    \begin{tabular}{@{}c@{}}% Avoid doubling \tabcolsep
        \textbf{#1} \\ \textbf{d=#2}
    \end{tabular}%
}

\begin{table}[ht]
\begin{tabular}{l | c c c | c c c |}
\cline{2-7}
          & \multicolumn{3}{c|}{\textbf{Single}} & \multicolumn{3}{c|}{\textbf{Double}} \\
\cline{2-7}
          & \testmode{Scalar}{1} & \testmode{SSE-4}{4} & \testmode{AVX-2}{8} & \testmode{Scalar}{1} & \testmode{SSE-4}{2} & \testmode{AVX-2}{4} \\
\hline
\multicolumn{1}{|c|}{\textbf{Eytzinger}                        } &     209.86 &     370.18 &     411.25 &     180.85 &     245.37 &     262.61 \\
\multicolumn{1}{|c|}{\textbf{Classic Offset}                    } &     213.28 &     363.35 &     476.10 &     209.04 &     247.02 &     208.63 \\
\hline
\end{tabular}
\caption{Throughput in millions of searches per second with vector $X$ of size 15}
\label{tab:results0}
\end{table}
\end{document}

ingrese la descripción de la imagen aquí

Para explicar un poco más: de forma predeterminada, LaTeX agrega \hskip\tabcolsepantes de comenzar una columna y después de haberla terminado. Entonces tienes la distancia \tabcolsepantes de la primera y después de la última columna y 2\tabcolsepentre dos columnas. Si usas @{…}el código del argumento de @se agregaen lugar de la distancia. Así que @{}simplemente elimina la distancia.

Nota adicional: Recomendaría evitar reglas verticales en las tablas (ver el manual depaquetebooktabs) y utilizarpaquetesiunitxpara columnas numéricas. Y no centraría los elementos de la primera fila de la tabla, sino que los alinearía a la izquierda. Y debido a que d=…en el encabezado de la tabla hay algo así como matemáticas, debes configurarlo en modo matemático. En este caso tampoco lo pondría en negrita (usando, por ejemplo, \boldmath), porque los atributos de fuente en matemáticas tienen principalmente una semántica (por ejemplo, la negrita se usa a menudo para vectores o conjuntos).

Respuesta2

No recuerdo dónde encontré esto (las ediciones con una referencia son bienvenidas), pero agregar lo siguiente directamente antes de su \begin{tabular}declaración puede permitirle ajustar el espacio entre columnas según un valor determinado:

\addtolength{\tabcolsep}{-0.4em}

Puedes usar cualquier unidad aquí, pero en el ejemplo anterior uso em, que es relativo al tamaño de fuente actual.

Respuesta3

Después de cinco años ...

Ahora está disponible un paquete de tablas tabularrayque define la colsepopción de separación de columnas. En comparación con el código de la tabla "clásica", es más corto y el texto de las celdas está mejor espaciado verticalmente:

\documentclass{article}
\usepackage{tabularray}

\begin{document}
    \begin{table}[ht]
\begin{tblr}{hline{4,Z} = {0.8pt}, vline{1} = {4-Z}{solid},
              colsep = {4pt},  % <--- reduce tabcolsep from 6pt to 4pt
             colspec = {Q[l, font=\bfseries] | *{3}{X[c]} | *{3}{X[c]} |},
            row{1-3} = {font=\bfseries}
            }
    \cline[0.8pt]{2-Z}
    &   \SetCell[c=3]{c}  Single
        &   &   &   \SetCell[c=3]{c}  Double   
                    &   &                               \\
\cline{2-7}
    & Scalar & SSE-4 & AVX-2 & Scalar & SSE-4 & AVX     \\
    & D=1    & D=4   & D=8   & D=1    & D=4   & D=8     \\  
Eytzinger
    &209.86 &370.18 &411.25 & 180.85 & 245.37 & 262.61  \\
Classic Offset
    &213.28 &363.35 &476.10 & 209.04 & 247.02 & 208.63  \\
\end{tblr}
\caption{Throughput in millions of searches per second with vector $X$ of size 15}
\label{tab:results0}
    \end{table}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta4

Así es como puedes hacer eso tabular con {NiceTabular}of nicematrix.

\documentclass{article}
\usepackage{nicematrix}

\begin{document}
\begin{table}[ht]
\setlength{\tabcolsep}{4pt}
\renewcommand{\arraystretch}{1.4}
\begin{NiceTabular}{>{\bfseries}l*{6}{X[c]}}[hvlines,corners=NW]
\RowStyle[bold,nb-rows=3]{}
    &   \Block{1-3}{Single}
        &   &   &   \Block{1-3}{Double} \\
    & Scalar & SSE-4 & AVX-2 & Scalar & SSE-4 & AVX     \\
    & D=1    & D=4   & D=8   & D=1    & D=4   & D=8     \\  
Eytzinger
    &209.86 &370.18 &411.25 & 180.85 & 245.37 & 262.61  \\
Classic Offset
    &213.28 &363.35 &476.10 & 209.04 & 247.02 & 208.63  \\
\end{NiceTabular}
\caption{Throughput in millions of searches per second with vector $X$ of size 15}
\label{tab:results0}
\end{table}
\end{document}

Necesita varias compilaciones (porque nicematrixutiliza nodos PGF/Tikz bajo el capó).

Salida del código anterior

información relacionada