siunitx 仅适用于 1 以下的数字的小数

siunitx 仅适用于 1 以下的数字的小数

假设我有下表

\documentclass{article}
\usepackage{siunitx}
\begin{document}

\begin{table}
\begin{tabular}{S[table-alignment=right, 
                  round-mode=places, 
                  round-precision=1, 
                  table-format=5.3,
                  zero-decimal-to-integer]}
{title}  \\
11111    \\
11.11    \\
0.11     \\
\end{tabular}
\end{table}

\end{document}

并且我希望对数字进行四舍五入,将大于 1 的数字四舍五入为整数,将小于 1 的数字四舍五入为小数点后一位。此处的结果将是11111, 11, 0.1

我尝试了以下组合,但结果并不理想

round-mode=figures and round-precision=1: 10000, 10, 0.1
round-mode=figures and round-precision=5: 11111, 11.110, 0.11000
round-mode=places  and round-precision=1: 11111, 11.1, 0.1

但我无法找出正确的设置来获得我需要的东西(并且希望它足够常见以至于可以实现siunitx)。

答案1

如果这仅用于表格,那么您可以使用pgfplotstable并预处理数字。下面我定义了一个round int提供预处理的新键。

示例输出

\documentclass{article}

\usepackage{siunitx,pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}

\makeatletter
\pgfplotsset{table/round int/.style={%
  /pgfplots/table/preproc cell content/.append code={%
    \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult
    \ifx\pgfmathresult\pgfutil@empty
    \else
    \pgfmathparse{abs(\pgfmathresult) > 1 ? round(\pgfmathresult) : \pgfmathresult}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
    \fi}}}
    \makeatother

\pgfplotstabletypeset[multicolumn names,
  columns/0/.style={column name={title},
    string type,
    column type={S[table-alignment=right,
                  round-mode=places,
                  round-precision=1,
                  table-format=-5.1,
                  zero-decimal-to-integer]},
    round int
}
  ]{
11111
11.11
11.85
0.11
0.19
-10.2
-10.8
}

\end{document}

preproc/expr不幸的是,随附的标准中的pgfplotstable一些设置不适合您数据。以上代码基于preproc/expr该包中的实现方式。

如果您希望数字在列中右对齐,只需将列table-format的参数替换Stable-parse-only

右对齐示例

\documentclass{article}

\usepackage{siunitx,pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}

\makeatletter
\pgfplotsset{table/round int/.style={%
  /pgfplots/table/preproc cell content/.append code={%
    \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult
    \ifx\pgfmathresult\pgfutil@empty
    \else
    \pgfmathparse{abs(\pgfmathresult) > 1 ? round(\pgfmathresult) : \pgfmathresult}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
    \fi}}}
    \makeatother

\pgfplotstabletypeset[multicolumn names,
  columns/0/.style={column name={title},
    string type,
    column type={S[table-alignment=right,
                  round-mode=places,
                  round-precision=1,
                  zero-decimal-to-integer,
                  table-parse-only]},
    round int
}
  ]{
11111
11.11
11.85
0.11
0.19
-10.2
-10.8
}

\end{document}

答案2

如果您需要能够在表格中和文本外部使用此类功能,则可以利用数学功能来pgfmath定义\MyRoundMacro

\newcommand*{\MyRound}[1]{%
    \pgfmathtruncatemacro{\@IntegerComponent}{abs(#1)}%
    \ifnum\@IntegerComponent=0
        \num[round-mode=places, round-precision=1]{#1}%
    \else
        \num{\@IntegerComponent}%
    \fi
}%

您可以直接将其用于每个表中的条目或使用collcell包定义自定义列类型R并使用:

\newcolumntype{R}{>{\collectcell\MyRound}r<{\endcollectcell}}

其中r是所需的列对齐。

MWE 生成的表格如下:

在此处输入图片描述

笔记:

  • 使用R列类型需要您换行任何内不是数字内容(例如标题行)\multicolumn{1}{c}{}

代码:

\documentclass{article}
\usepackage{siunitx}
\usepackage{collcell}% Needed only if desire to use the `R` column type defined below
\usepackage{pgfmath}

\begin{document}

\makeatletter
\newcommand*{\MyRound}[1]{%
    \pgfmathtruncatemacro{\@IntegerComponent}{abs(#1)}%
    \ifnum\@IntegerComponent=0
        \num[round-mode=places, round-precision=1]{#1}%
    \else
        \num{\@IntegerComponent}%
    \fi
}%
\makeatother

\newcolumntype{R}{>{\collectcell\MyRound}r<{\endcollectcell}}

In a table the \verb|R| column type (requires non data entries to be wrapped in a \verb|\multicolumn|):

\begin{tabular}{R}
    \multicolumn{1}{c}{\bfseries title}  \\
    11111    \\
    11.11    \\
    0.11     \\
\end{tabular}

Can use the \verb|\MyRound| macro directly in a table and
outside of a table:

\begin{tabular}{r}
    {\bfseries title}  \\
    \MyRound{11111}    \\
    \MyRound{11.11}    \\
    \MyRound{0.11}     \\
\end{tabular}

Outside of a table:

\MyRound{11111}\par
\MyRound{11.11}\par
\MyRound{0.11}\par

\end{document}

相关内容