写带有统计结果的表格时,通常会在括号中包含负数,例如(-1.23)
,这些负数应与列中的其他数字在小数点上对齐。这可以(简单地)通过S
列选项来实现parse-numbers=false
,但是此选项会禁用列的大多数其他选项S
(请参阅中的第一个示例姆韦以下)
我想到的另一种可能性是定义健壮的命令,例如\brckt
并使用它来代替(
。这种方法效果很好,即保留所有S
列选项(参见姆韦),但是我想知道是否有人知道更好的解决方案。到目前为止,我在这个网站上的搜索并没有找到更好的解决方案。
(不那么)最小的工作示例:
\documentclass{article}
\usepackage{booktabs, threeparttable}
\usepackage{siunitx}
\usepackage{etoolbox} % used in second example
\newrobustcmd{\brckt}{(}
\begin{document}
\begin{center}
\sisetup{input-symbols = {( )}, % has no sense
table-space-text-pre={(}, % has no effect ...
table-align-text-pre=false, % has no effect ...
table-space-text-post={$^{***}$}, % has no effect ...
table-align-text-post=false, % has no effect ...
round-mode = places, % has no sense
% round-precision = 3 % make error
parse-numbers=false, % <---
}
\begin{threeparttable}[htb]
\caption{first example}
\label{tab:statistic}
\begin{tabular}{*{3}{S[table-format=-2.3]}}% integer part had to have
% one digit more than normally needed
% other vice decimal point is overwritten
\toprule
1.23\tnote{*} & 1.234 \tnote{**} & 1.2345\tnote{***} \\
(9.87) & (-7.89) & (-7.89) \\
\bottomrule
\end{tabular}
\begin{tablenotes}[para]
\item[*] text;
\item[**] text;
\item[**] text.
\end{tablenotes}
\end{threeparttable}
\end{center}
\begin{center}
\sisetup{input-symbols = {( - )},
table-space-text-pre={(},
table-align-text-pre=false,
table-space-text-post={$^{***}$},
table-align-text-post=false,
round-mode = places,
round-precision = 3
}
\begin{threeparttable}[htb]
\caption{second example}
\label{tab:statistic}
\begin{tabular}{*{3}{S[table-format=-1.3]} }
\toprule
1.23\tnote{*} & 1.234 \tnote{**} & 1.2345\tnote{***} \\
(9.87) & \brckt-7.89) & \brckt-7.89) \\
\bottomrule
\end{tabular}
\begin{tablenotes}[para]
\item[*] text;
\item[**] text;
\item[**] text.
\end{tablenotes}
\end{threeparttable}
\end{center}
\end{document}
答案1
根据我最近在指定表格中的最小(非固定)宽度,它能够在小数点处对齐(无需使用siunitx
),我采用了该代码并对其进行了重大扩展,以允许使用括号和\tnote
s(小数点后只能出现)
和\tnote
s!)。扩展后的代码还执行数字舍入(在原生 LaTeX 中)。
该方法创建一个D{}
列,其参数表示小数点后允许的位数。
再次强调,此方法在 之外运行siunitx
,因此它提供的唯一功能仅限于小数对齐、用括号括住数值参数以及使用尾随\tnote
。
\documentclass{article}
\usepackage{array,stackengine,collcell,booktabs,threeparttable}
\let\endecm\relax
\newcolumntype{D}[1]{%
>{\catcode`)=\active \collectcell\Decm l{#1}}r<{..\endDecm\endcollectcell}}
\def\decm#1#2#3.#4.#5\endDecm{%
$#3.$%
\ensurestackMath{\stackengine%
{0pt}{\truncdig{#4}{#2}}{\rule{#2\wd0}{0pt}}{O}{#1}{F}{F}{L}}}
\newcommand\Decm[1]{\let\tnote\specialtnote\setbox0=\hbox{0}\decm#1}
\newcommand\specialtnote[1]{\rlap{$^{#1}$}}
\let\svrp)
{\catcode`)=\active
\gdef){\rlap{\svrp}}
}
\newcommand\truncdig[2]{\truncdigaux{#2}#1\relax\relax}
\def\truncdigaux#1#2#3\relax{%
\ifx\tnote#2#2{#3}\else
\if\svrp\detokenize{#2}\rlap{)}\else
\ifnum#1>1\relax
#2%
\else
\ifnum#1>0\relax
\roundit#2#3\relax\relax
\fi
\fi
\fi
\ifx\relax#3\else
\expandafter\truncdigaux\expandafter{\the\numexpr#1-1\relax}#3\relax
\fi
\fi
}
\def\roundit#1#2#3\relax{
\ifx\tnote#2#1\else
\ifx\relax#2#1\else
\if\svrp\detokenize{#2}#1\else
\expandafter\ifnum\expandafter`\detokenize\expandafter{#2}<53\relax#1\else
\expandafter\ifnum\expandafter`\detokenize\expandafter{#2}>57\relax#1\else
\the\numexpr#1+1%
\fi
\fi
\fi
\fi
\fi
}
\begin{document}
\tabcolsep=15pt\relax
\begin{tabular}{D{2}D{3}D{3}}
\toprule
1.23\tnote{*} & 1.234 \tnote{**} & 1.2345\tnote{***} \\
(9.87) & (-7.89) & (-7.89) \\
13.375 & (-43.2759) & 1.234 \\
\bottomrule
\end{tabular}
\begin{tablenotes}[para]
\item[*] text;
\item[**] text;
\item[**] text.
\end{tablenotes}
\end{document}
因此,根据这些输入生成下表,要求列有 2、3 和 3 位小数:
1.23\tnote{*} & 1.234 \tnote{**} & 1.2345\tnote{***} \\
(9.87) & (-7.89) & (-7.89) \\
13.375 & (-43.2759) & 1.234 \\