siunitx,用括号括住负数

siunitx,用括号括住负数

写带有统计结果的表格时,通常会在括号中包含负数,例如(-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),我采用了该代码并对其进行了重大扩展,以允许使用括号和\tnotes(小数点后只能出现)\tnotes!)。扩展后的代码还执行数字舍入(在原生 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         \\

在此处输入图片描述

相关内容