将 dcolumn 中定义的列类型与 tabularx 结合起来

将 dcolumn 中定义的列类型与 tabularx 结合起来

我正在寻找一种方法来定义一种列类型,该列类型“混合”包中定义的“D”列dcolumn和包定义的“X”列tabularx。换句话说,我想要一种按小数点对齐单元格内容的列类型可以拉伸以适应我指定的表格宽度。当然可以不是一定要混合dcolumntabularx。有什么想法吗?

下面是一些代码,可以清楚地说明我想要实现的目标。第一个表dcolumn在表格环境中使用包中的列类型 D。如何让表拉伸到我指定的宽度?表格1

第二个表格使用包X中的列tabularx。表格按我想要的方式展开,但是如何让单元格按小数点对齐?表 2

第三个表尝试将两者结合起来。结果显然不是我想要的(尽管这正是我所期望的)。表3

% preamble
\usepackage{array}       
\usepackage{tabularx}
\usepackage{dcolumn} 
  \newcolumntype{d}[1]{D{.}{.}{#1}}    
\usepackage{booktabs}


\begin{document}

% table using D from dcolumn package
\begin{table}

  \centering
  \caption{table using dcolumn}
  \begin{tabular}{l*{3}{d{-2}}}

  \toprule
            &  \multicolumn{1}{c}{col A} & \multicolumn{1}{c}{col B} & \multicolumn{1}{c}{col C} \\
  \cmidrule(lr){2-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4}
  \midrule  
       North &      2,228   &   0.300 &  10.6 \\    
       South &        689.2 &   0.8   &   2.6 \\
  \bottomrule

  \end{tabular}     
\end{table}


% table using X from tabularx
\begin{table}

  \centering
  \caption{table using tabularx}

  \begin{tabularx}{\textwidth}{l*{3}{X}}

  \toprule

            &  \multicolumn{1}{c}{col A} & \multicolumn{1}{c}{col B} & \multicolumn{1}{c}{col C} \\
  \cmidrule(lr){2-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4}

  \midrule  
       North &      2,228   &   0.300 &  10.6 \\    
       South &        689.2 &   0.8   &   2.6 \\     
  \bottomrule

  \end{tabularx}    
\end{table}

% table using D inside tabularx
\begin{table}

  \centering
  \caption{table using dcolumn inside tabularx}
  \begin{tabularx}{\textwidth}{l*{3}{d{-2}}}

  \toprule
            &  \multicolumn{1}{c}{col A} & \multicolumn{1}{c}{col B} & \multicolumn{1}{c}{col C} \\
  \cmidrule(lr){2-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4}
  \midrule  
       North &      2,228   &   0.300 &  10.6 \\    
       South &        689.2 &   0.8   &   2.6 \\
  \bottomrule

  \end{tabularx}    
\end{table}



\end{document}

答案1

在此处输入图片描述

之前从未尝试过但是......

\documentclass{article}

\usepackage{array}       
\usepackage{tabularx}
\usepackage{dcolumn} 
  \newcolumntype{d}[1]{D{.}{.}{#1}}    
\usepackage{booktabs}


\begin{document}

% table using D from dcolumn package
\begin{table}

  \centering
  \caption{table using dcolumn}
  \begin{tabularx}{\textwidth}{l*{3}{d{-2}}}

  \toprule
            &  \multicolumn{1}{X}{\centering col A} &
 \multicolumn{1}{X}{\centering col B} &
 \multicolumn{1}{X}{\centering col C} \\
 \cmidrule(lr){2-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4}
  \midrule  
       North &      2,228   &   0.300 &  10.6 \\    
       South &        689.2 &   0.8   &   2.6 \\
  \bottomrule

  \end{tabularx}     
\end{table}


\end{document}

答案2

我不知道如何将dcolumn包的小数对齐功能与tabularx结合起来。(不过,David Carlisle 可能最终会决定展示如何做到这一点。)更新:果然如此!)

不过,您可以将tabular*环境(core-LaTeX 的一部分,不需要额外的包)与dcolumn包一起使用。与tabular接受一个参数(列规范集)的环境不同,它接受两个参数:整体宽度和列规范集。和tabular*之间的最大区别在于,后者通过适当扩展列宽来工作,而前者通过调整列间空白量来工作。tabular*tabularx

这个“技巧”就是利用构造@{\extracolsep{\fill}}扩大列间空白这样tabular*环境就会占据环境第一个参数中指定的整个宽度。在下面的例子中,它很大程度上改编自您的第一个示例,由于 dcolumn 说明符,第 2、3 和 4 列都具有相同的宽度d{6.3};这可以通过比较三个\cmidrules 的长度来验证。(另外:由于表格具有大量的列间空白,因此没有必要修剪 s\cmidrule以确保它们之间有一定的间隔。)这些列由相同数量的列间空白分隔,这要归功于指令@{\extracolsep{\fill}}

我希望这或多或少就是你所寻找的。

在此处输入图片描述

\documentclass{article}
\usepackage{dcolumn} 
\newcolumntype{d}[1]{D{.}{.}{#1}}    
\usepackage{booktabs}
\newcommand{\mc}[1]{\multicolumn{1}{c}{#1}} % handy shortcut macro
\begin{document}
\noindent
The width of the text block is indicated by this horizontal rule:
\hrule

\begin{table}[h] % I'm the "h" location specifier just to assure that the table is typeset after the \hrule...
\caption{Table using dcolumn and tabular*}
\begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}*{3}{d{6.3}}}
\toprule
&  \mc{col A} & \mc{col B} & \mc{col C} \\ 
\cmidrule{2-2} \cmidrule{3-3} \cmidrule{4-4}
\midrule  
North &      2,228   &   0.300 &  10.6 \\    
South &        689.2 &   0.8   &   2.6 \\
\bottomrule
\end{tabular*}     
\end{table}
\end{document}

相关内容