
Есть и другие похожие вопросы, все с разными ответами, но я не смог найти тот, который бы достигал того, что мне нужно. В таблице ниже интервал между числами слишком большой. Как мне его немного уменьшить?
\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}
решение1
В вашем примере вы удвоили разделение столбцов, используя tabular
внутри a tabular
. Примечание: LaTeX добавляет расстояние \tabcolsep
до и после каждого столбца. В вашем случае у вас есть такое расстояние до и после столбца внутренней таблицы \testmode
и до и после столбца внешней таблицы. Чтобы избежать этого, вы должны добавить @{}
перед первым столбцом внутренней таблицы и после последнего столбца внутренней таблицы:
\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}
Чтобы объяснить еще немного: По умолчанию LaTeX добавляет \hskip\tabcolsep
до начала столбца и после его окончания. Таким образом, у вас есть расстояние \tabcolsep
до первого и после последнего столбца и 2\tabcolsep
между двумя столбцами. Если вы используете @{…}
код аргумента, @
добавляетсявместо расстояния. Так что @{}
просто убирает расстояние.
Дополнительное примечание: Я бы рекомендовал избегать вертикальных линий в таблицах (см. руководство пользователя).упаковкаbooktabs
) и использоватьупаковкаsiunitx
для числовых столбцов. И я бы не центрировал элементы первой строки таблицы, а выровнял их по левому краю. И поскольку d=…
в заголовке таблицы есть что-то вроде математики, вам следует установить ее в математический режим. В этом случае я бы также не делал ее жирной (используя, например, \boldmath
), потому что атрибуты шрифта в математике имеют в основном семантическую направленность (например, жирный часто используется для векторов или наборов).
решение2
Не помню, где я это нашел (редактирование со ссылкой приветствуется), но добавление следующего текста непосредственно перед вашим \begin{tabular}
утверждением позволит вам изменить интервал между столбцами на заданное значение:
\addtolength{\tabcolsep}{-0.4em}
Здесь вы можете использовать любые единицы измерения, но в приведенном выше примере я использую em
, которые относятся к текущему размеру шрифта.
решение3
Спустя пять лет...
Теперь доступен табличный пакет tabularray
, который для определения разделения столбцов определяет colsep
опцию. По сравнению с "классической" таблицей код короче и текст в ячейках лучше разнесен по вертикали:
\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}
решение4
Вот как можно сделать это в табличной форме с {NiceTabular}
помощью 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}
Вам нужно несколько компиляций (т.к. nicematrix
внутри используются узлы PGF/Tikz).