![使用 siunitx 将小数点与千位分隔符对齐](https://linux22.com/image/266520/%E4%BD%BF%E7%94%A8%20siunitx%20%E5%B0%86%E5%B0%8F%E6%95%B0%E7%82%B9%E4%B8%8E%E5%8D%83%E4%BD%8D%E5%88%86%E9%9A%94%E7%AC%A6%E5%AF%B9%E9%BD%90.png)
我的表格由两组行组成。第一组包含较大的值(X,XXX)。第二组包含较小的值(0.XXX)。Siunitx 根据小数点的位置对齐所有数字。结果并不美观:一些数字靠左对齐,而另一些则靠右对齐。
是否可以对齐数字,以便小数点标记(从小值开始)与千位分隔符(从大值开始)对齐?
这是表格的示例。第二列和第三列显示当前情况。最后两列是我希望数据如何显示的示例(使用 Photoshop 编辑)。
如果不存在完美的解决方案,那么也会欢迎一种黑客解决方案。
我已经想到了一种方法,可以更改表格中的小数点标记:如果我可以将逗号作为第一组行的小数点标记,那么一切都会好起来。但是,我无法让它发挥作用(我对 LaTeX 了解甚少)。
表格所用代码:
\documentclass{article}
\usepackage{booktabs}
\usepackage{siunitx}
\sisetup{group-separator={,},group-minimum-digits={3},output-decimal-marker={.}}
\begin{document}
\begin{tabular}{@{}p{2.3cm}SSp{0.3cm}SS@{}}
\toprule
& \multicolumn{2}{c}{Without Threshold Selector} && \multicolumn{2}{c}{With Threshold Selector}\\
\cmidrule{2-3} \cmidrule{5-6}
& \multicolumn{1}{p{2.3cm}}{\centering{Naive Bayes}} & \multicolumn{1}{p{2.3cm}}{\centering{Logistic}} && \multicolumn{1}{p{2.3cm}}{\centering{Naive Bayes}} & \multicolumn{1}{p{2.3cm}}{\centering{Logistic}}\\
\midrule
True positives & 2791 & 1831 && 3126 & 3547\\
False positives & 2924 & 995 && 3853 & 3483\\
True negatives & 36998 & 38927 && 36069 & 36439\\
False negatives & 2498 & 3458 && 2163 & 1742\\
\addlinespace
Sensitivity & 0.528 & 0.346 && 0.591 & 0.671\\
Precision & 0.488 & 0.648 && 0.448 & 0.505\\
\bottomrule
\end{tabular}
\end{document}
答案1
虽然我不推荐这种显示形式,但它确实是可行的。siunitx
我可能会选择一种“低级”解决方案,而不是使用,这在某种程度上取决于dcolumn
对齐方式。这里的策略是一种混合方法。首先,使用 抓取单元格内容collcell
(其作用与第一阶段大致相同siunitx
)。收集的材料被认为是小数或整数,因此会进行快速检查.
。对于小数,允许在前面填充一位数字,并且数字按“原样”排版。对于整数,有一个硬编码检查用于添加 a,
并将数字转储到输出中。在固定宽度的框中执行所有操作可以实现对齐:
\documentclass{article}
\usepackage{array}
\usepackage{booktabs}
\usepackage{collcell}
\newlength\mylength
\AtBeginDocument{\settowidth\mylength{$12.345$}}
\newcolumntype{M}{>{\collectcell\multialign}l<{\endcollectcell}}
\makeatletter
\newcommand*\multialign[1]{%
\setbox0=\hbox to \mylength{%
\hfil
$
\in@{.}{#1}%
\ifin@
\settowidth\mylength{$0$}%
\hspace{\mylength}%
\expandafter\@firstofone
\else
\expandafter\multialignint
\fi
{#1}%
$%
}%
\hfil\box0\hfil
}
\newcommand*\multialignint[1]{%
\multialignintauxi#1\empty\empty\empty\empty\relax\stop
}
\newcommand*\multialignintauxi{}
\def\multialignintauxi#1#2#3#4#5#6\stop{%
\ifx#4\empty % Three or fewer digits
#1#2#3%
\else
\ifx#5\empty % Four digits
#1\mathord,#2#3#4%
\else % Five digits
#1#2\mathord,#3#4#5%
\fi
\fi
}
\makeatother
\begin{document}
\begin{tabular}{@{}p{2.3cm}MMp{0.3cm}MM@{}}
\toprule
& \multicolumn{2}{c}{Without Threshold Selector} && \multicolumn{2}{c}{With Threshold Selector}\\
\cmidrule{2-3} \cmidrule{5-6}
& \multicolumn{1}{p{2.3cm}}{\centering{Naive Bayes}} & \multicolumn{1}{p{2.3cm}}{\centering{Logistic}} && \multicolumn{1}{p{2.3cm}}{\centering{Naive Bayes}} & \multicolumn{1}{p{2.3cm}}{\centering{Logistic}}\\
\midrule
True positives & 2791 & 1831 && 3126 & 3547\\
False positives & 2924 & 995 && 3853 & 3483\\
True negatives & 36998 & 38927 && 36069 & 36439\\
False negatives & 2498 & 3458 && 2163 & 1742\\
\addlinespace
Sensitivity & 0.528 & 0.346 && 0.591 & 0.671\\
Precision & 0.488 & 0.648 && 0.448 & 0.505\\
\bottomrule
\end{tabular}
\end{document}