优化使用 dcolumn/siunitx 制作的表格的大小(字体和宽度)

优化使用 dcolumn/siunitx 制作的表格的大小(字体和宽度)

我的文档中有几个表格,现在是时候完成它们了。这意味着我想要优化:

1)字体的大小(如果可能的话,\normalsize与文档的其余部分一样,或者至少是尽可能最大的尺寸,以便表格可以在空间内容纳);和

2)柱子之间的距离(如果可能的话应该相等)

请注意,我必须遵循这些设置(论文指导):geometry{left=2cm,right=5cm,top=2cm,bottom=2cm}

另外,我希望表格标题不要太大。我不知道我的尺寸在这里是否正常。

对于解决方案,如果我能遵循它,我将不胜感激,这样我就可以将其应用于我的所有表格。这意味着我需要了解优化每个表格所采取的步骤。

这是 dcolumn 方面的 MWE。我尝试仅添加我认为对这项任务很重要的序言部分。

\documentclass[a4paper, 12pt, headsepline, smallheadings]{scrreprt}
\usepackage{setspace}
\usepackage[a4paper]{geometry}
\usepackage{booktabs}
\usepackage[labelfont=bf,labelsep=newline,singlelinecheck=false,
format=plain,indention=2cm]{caption}
\usepackage{dcolumn}
\newcolumntype{Y}{D..{-1}}

\KOMAoption{captions}{tableheading}
\onehalfspacing
\geometry{left=2cm,right=5cm,top=2cm,bottom=2cm}
\pagestyle{headings}

\begin{document}
\begin{table}[htbp]
\centering
\caption{Caption...} 
\label{a1}
{\scriptsize
\begin{tabular}{lYYYYYYYYYYYY}
\toprule 
  & \multicolumn{2}{c}{X1} & \multicolumn{2}{c}{X2} &
  \multicolumn{2}{c}{X1}  & \multicolumn{2}{c}{X1}  & \multicolumn{2}{c}{X2} &
  \multicolumn{2}{c}{X2} \\
  \cmidrule(rl){2-3} \cmidrule(rl){4-5}\cmidrule(rl){6-7} \cmidrule(rl){8-9}   \cmidrule(rl){10-11} 
  \cmidrule(rl){12-13} 
  & \multicolumn{1}{c}{A} & \multicolumn{1}{c}{B} & \multicolumn{1}{c}{A} &  \multicolumn{1}{c}{B} & 
  \multicolumn{1}{c}{A} & \multicolumn{1}{c}{G} & \multicolumn{1}{c}{B} & \multicolumn{1}{c}{A} 
  & \multicolumn{1}{c}{B} & \multicolumn{1}{c}{G} & \multicolumn{1}{c}{A} & \multicolumn{1}{c}{B} 
  \\
  \midrule C1 & 0.37 & 0.37 & 0.45 & 0.45 & 0.45 & 0.44 & 0.50 & 0.45 & 0.45 & 0.45 &  0.47 & 0.26 \\ 
  C2 & 0.37 & 0.31 & 0.43 & 0.29 & 0.29 & 0.29 & 0.48 & 0.50 & 0.72 & 0.75 & 0.45 &   0.38 \\ 
  C3 & 0.37 & 0.29 & 0.29 & 0.12 & 0.15 & 0.37 & 0.41 & 0.46 & 0.45 & 0.45 & 0.45 & 0.43 \\ 
  C4 & 0.37 & 0.20 & 0.25 & 0.45 & 0.45 & 0.18 & 0.45 & 0.45 & 0.38 & 0.44 & 0.45 & 0.38 \\ 
  Clongnamehere5 & 0.37 & 0.32 & 0.45 & 0.12 & 0.45 & 0.50 & 0.45 & 0.45 & 0.57 & 0.59 & 0.45 & 0.51 \\ 
  \bottomrule\end{tabular}
  % cut here but goes on much further
 }
 \end{table}
 \end{document}

我刚刚注意到,这siunitx似乎起了作用,但仅限于 scriptsize. 这样是否更有利于达到目的?

MWE 具有siunitx

\documentclass[a4paper, 12pt, headsepline, smallheadings]{scrreprt}
\usepackage{setspace}
\usepackage[a4paper]{geometry}
\usepackage{booktabs}
\usepackage[labelfont=bf, labelsep=newline,singlelinecheck=false,
format=plain,indention=2cm]{caption}
\KOMAoption{captions}{tableheading}
\onehalfspacing
\geometry{left=2cm,right=5cm,top=2cm,bottom=2cm}
\pagestyle{headings}

\usepackage{siunitx}
\begin{document}

\begin{table}[htbp]
\centering
\caption{Caption...} 
\label{ovb1}
{\scriptsize
\begin{tabular}{l
S[table-format=1.2]
S[table-format=1.2] 
S[table-format=1.2] 
S[table-format=1.2]
S[table-format=1.2] 
S[table-format=1.2] 
S[table-format=1.2] 
S[table-format=1.2]
S[table-format=1.2]
S[table-format=1.2] 
S[table-format=1.2] 
S[table-format=1.2] }
\toprule 
  & \multicolumn{2}{c}{X1} & \multicolumn{2}{c}{X2} &
  \multicolumn{2}{c}{X1}  & \multicolumn{2}{c}{X1}  & \multicolumn{2}{c}{X2} &
  \multicolumn{2}{c}{X2} \\
  \cmidrule(rl){2-3} \cmidrule(rl){4-5}\cmidrule(rl){6-7} \cmidrule(rl){8-9}   \cmidrule(rl){10-11} 
  \cmidrule(rl){12-13} 
  & \multicolumn{1}{c}{A} & \multicolumn{1}{c}{B} & \multicolumn{1}{c}{A} &  \multicolumn{1}{c}{B} & 
  \multicolumn{1}{c}{A} & \multicolumn{1}{c}{G} & \multicolumn{1}{c}{B} & \multicolumn{1}{c}{A} 
  & \multicolumn{1}{c}{B} & \multicolumn{1}{c}{G} & \multicolumn{1}{c}{A} & \multicolumn{1}{c}{B} 
  \\
  \midrule C1 & 0.37 & 0.37 & 0.45 & 0.45 & 0.45 & 0.44 & 0.50 & 0.45 & 0.45 & 0.45 &  0.47 & 0.26 \\ 
  C2 & 0.37 & 0.31 & 0.43 & 0.29 & 0.29 & 0.29 & 0.48 & 0.50 & 0.72 & 0.75 & 0.45 & 0.38 \\ 
  C3 & 0.37 & 0.29 & 0.29 & 0.12 & 0.15 & 0.37 & 0.41 & 0.46 & 0.45 & 0.45 & 0.45 & 0.43 \\ 
  C4 & 0.37 & 0.20 & 0.25 & 0.45 & 0.45 & 0.18 & 0.45 & 0.45 & 0.38 & 0.44 & 0.45 & 0.38 \\ 
  Clongnamehere5 & 0.37 & 0.32 & 0.45 & 0.12 & 0.45 & 0.50 & 0.45 & 0.45 & 0.57 & 0.59 & 0.45 & 0.51 \\ 
  % cut here but goes on much further
  \bottomrule\end{tabular}
  }
  \end{table}
  \end{document}

谢谢。

答案1

假设您想继续使用该dcolumn软件包,那么您可以进行两项重要的优化,它们共同允许您使用 fontsize 指令而\small不是,\scriptsize并且仍然使表格适合可用的文本块:

  • \newcolumntype{Y}{D{.}{.}{1.2}}通过而不是通用的;定义小数列布局\newcolumntype{Y}{D{.}{.}{-1}

  • 使用较小的值\tabcolsep,该参数控制列间空白的宽度(一半)。在下面的示例中,我使用了值3.5pt

在此处输入图片描述

\documentclass[a4paper, 12pt, headsepline, 
   smallheadings]{scrreprt}
\usepackage{setspace}
\usepackage[a4paper]{geometry}
\usepackage{booktabs}
\usepackage[labelfont=bf,labelsep=newline,
   singlelinecheck=false,format=plain,indention=2cm]{caption}
\usepackage{dcolumn}
\newcolumntype{Y}{D..{1.2}}

\KOMAoption{captions}{tableheading}
\onehalfspacing
\geometry{left=2cm,right=5cm,vmargin=2cm}
\pagestyle{headings}
% two shortcut commands
\newcommand\mcii[1]{\multicolumn{2}{c}{#1}}
\newcommand\mci[1]{\multicolumn{1}{c}{#1}}

\begin{document}
\begin{table}[htbp]
%\centering
\caption{Caption...} 
\label{a1}
{\small
 \setlength{\tabcolsep}{3.5pt} % default value: 6pt
\begin{tabular}{@{} l *{12}{Y} @{}}
\toprule 
& \mcii{X1} & \mcii{X2} & \mcii{X1}  & 
  \mcii{X1} & \mcii{X2} & \mcii{X2} \\
\cmidrule(rl){2-3} \cmidrule(rl){4-5}   \cmidrule(rl){6-7} \cmidrule(rl){8-9} \cmidrule(rl){10-11} \cmidrule(l){12-13} 
  & \mci{A} & \mci{B} & \mci{A} & \mci{B} & 
    \mci{A} & \mci{G} & \mci{B} & \mci{A} & 
    \mci{B} & \mci{G} & \mci{A} & \mci{B} \\
\midrule 
  C1 & 0.37 & 0.37 & 0.45 & 0.45 & 0.45 & 0.44 & 0.50 & 0.45 & 0.45 & 0.45 &  0.47 & 0.26 \\ 
  C2 & 0.37 & 0.31 & 0.43 & 0.29 & 0.29 & 0.29 & 0.48 & 0.50 & 0.72 & 0.75 & 0.45 &   0.38 \\ 
  C3 & 0.37 & 0.29 & 0.29 & 0.12 & 0.15 & 0.37 & 0.41 & 0.46 & 0.45 & 0.45 & 0.45 & 0.43 \\ 
  C4 & 0.37 & 0.20 & 0.25 & 0.45 & 0.45 & 0.18 & 0.45 & 0.45 & 0.38 & 0.44 & 0.45 & 0.38 \\ 
  Clongnamehere5 & 0.37 & 0.32 & 0.45 & 0.12 & 0.45 & 0.50 & 0.45 & 0.45 & 0.57 & 0.59 & 0.45 & 0.51 \\ 
\bottomrule
\end{tabular}
% cut here but goes on much further
}
\end{table}
\end{document}

如果你想使用siunitx包而不是包来dcolumn对齐小数点上的数字,你所要做的就是(i)加载包siunitx并(ii)指定环境的格式tabular

\begin{tabular}{@{} l *{12}{S[table-format=1.2]} @{}}

而不是

\begin{tabular}{@{} l *{12}{Y} @{}}

附录:为了消除与设置值相关的猜测,\tabcolsep以便创建一个与 一样宽的表\textwidth,您可以按如下方式进行;所有假设是表会合适如果您选择\small作为字体大小。

  • 故意设置\tabcolsep为一个太小的值,例如1pt

  • 使用tabular*而不是tabular环境

  • 设置环境布局tabular*如下:

    \begin{tabular*}{\textwidth}{@{} l @{\extracolsep{\fill}} *{12}{Y} @{}}
    
  • \end{tabular}用。。。来代替\end{tabular*}

这个想法是让 LaTeX 计算插入列之间的额外“填充”量,以使环境tabular*占据整个分配的宽度(\textwidth在本例中);这就是该指令所要@{\extracolsep{\fill}}实现的。因为只能取正值,所以将其设置为故意小的值\fill很重要,比如说。\tabcolsep1pt

顺便说一句,如果此方法对给定的表不起作用,则意味着\small生成的字体太大;请使用 重试\footnotesize

相关内容