将 Siunitx 应用到每隔一行

将 Siunitx 应用到每隔一行

我有一张表格,其中百分比和计数交替排列。

我如何有条件地将 SIunitx 应用于每隔一行?我希望百分比行保持原样(保留一位小数),并需要将计数行四舍五入为整数、斜体并用括号括起来。

\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepackage[english]{babel}
\usepackage{booktabs}
\usepackage{listings}
\usepackage{pgfplotstable}

 \begin{filecontents*}{test.csv}
{} &22.3\\
15000.9999 & 23568.44485\\
45.1 &22.3\\
15000.9999 & 23568.44485\\
{} &22.3\\
15000.9999 & 23568.44485\\
45.1 &22.3\\
15000.9999 & 23568.44485\\
 \end{filecontents*}


\begin{document}

\pgfplotstableread[col sep=&,header=false]{test.csv}{\mytable}
\begin{table}[!htb]
\begin{center}
\resizebox{1.0\textwidth}{!}{%
\pgfplotstabletypeset[
every first row/.style={before row=\toprule},
string type,
every head row/.style={output empty row},
every last row/.style={after row=\bottomrule},
postproc cell content/.code={
 \ifnum\pgfplotstablecol=1
        \ifodd\pgfplotstablerow\relax
        \pgfkeysalso{@cell content={(\num[math-rm=\mathit,round-mode=places,round-precision=0]{#1}})}%
        \fi
\else\fi
},
]{\mytable}
}
\end{center}
\end{table}
\end{document}

由于我无法将 latex 类型格式指定为“\pgftabletypeset”,因此以下操作不起作用。行尾标记阻止了编译。

我还想在每隔一行后插入一个空格,当仅使用表格时,我可以通过以下解决方法(伪代码)来实现。

\global\let\restorecr=\\ 
. . . 
\global\let\oldcr=\\
\global\def\crsng{\global\let\\=\crdbl\oldcr}
\global\def\crdbl{\global\let\\=\crsng\oldcr[4pt]}
\global\let\\=\crdbl
. . . 
\global\let\restorecr=\\ 

我如何使用 pgfplotstable 实现这一点?

答案1

听起来你喜欢一种自动化的方法,这让我想到了pgfplotstable包裹。

在下面的代码中,我使用了:

\pgfplotstabletypeset[
    every head row/.style={output empty row},
    postproc cell content/.code={
        \ifodd\pgfplotstablerow\relax
        \pgfkeysalso{@cell content={(\num[math-rm=\mathit,round-mode=places,round-precision=0]{#1}})}%
        \fi
    },
]{45.1 22.3
    15000.9999  23568.44485
    45.1 22.3
    15000.9999  23568.44485
    45.1 22.3
    15000.9999  23568.44485
    45.1 22.3
    15000.9999  23568.44485
}

输出结果如下:

截屏

请注意,我使用\numsiunitx包,其中包含可round-mode=places,round-precision=0满足您所需精度的选项。

我认为这非常关闭到您想要的输出。听起来您想要一个S-type 列,它对齐括号内的数字,并忽略百分比数字;这会相当棘手,因为S-type 列对齐数字(,如果和/或)存在,则会引发错误。

以下是完整的代码:

% arara: pdflatex
% arara: indent: {overwrite: yes}
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}

\begin{document}

\pgfplotstabletypeset[
    every head row/.style={output empty row},
    postproc cell content/.code={
        \ifodd\pgfplotstablerow\relax
            \pgfkeysalso{@cell content={(\num[math-rm=\mathit,round-mode=places,round-precision=0]{#1}})}%
        \fi
    },
]{
    45.1 22.3
    15000.9999  23568.44485
    45.1 22.3
    15000.9999  23568.44485
    45.1 22.3
    15000.9999  23568.44485
    45.1 22.3
    15000.9999  23568.44485
}
\end{document}

答案2

我不确定我是否正确理解了你的问题,所以我将用以下图片来帮助自己:

在此处输入图片描述

这是你要找的吗?上图由以下人员生成:

\documentclass{article}
    \usepackage{booktabs,multirow}
    \usepackage{siunitx}

\newcommand{\ml}[1]{\multicolumn{1}{l}{(\itshape #1\upshape\,\,\%)}}

\begin{document}
    \begin{tabular}{l*{2}{S[table-format = 5.3,
                            round-mode = places,
                            round-precision = 2]}}
    \cmidrule[\heavyrulewidth]{2-3}
                                & {Case A}      &   {Case B}        \\
    \midrule
\multirow{2}*{measurement 1}    &   \ml{45.1}   &   \ml{22.3}       \\
                                &   15000.9999  &   23568.44485     \\
    \addlinespace
\multirow{2}*{measurement 2}    &   \ml{45.1}   &   \ml{22.3}       \\
                                &   15000.9999  &   23568.44485     \\
    \addlinespace
\multirow{2}*{measurement 3}    &   \ml{45.1}   &   \ml{22.3}       \\
                                &   15000.9999  &   23568.44485     \\
    \addlinespace
\multirow{2}*{measurement 4}    &   \ml{45.1}   &   \ml{22.3}       \\
                                &   15000.9999  &   23568.44485     \\
    \bottomrule

    \end{tabular}
\end{document}

可能您正在寻找其他东西,但恐怕标准表格环境下无法找到其他解决方案。

编辑:为了强调上述解决方案的好处,我丰富了上述表格,添加了一些格式化可能性,但据我所知,并非所有表格都可以使用pgfplotstable(它不是为此而设计的)。当然,对于没有 的简单表格multicolumnmultirow以及使用额外的垂直空格等分隔线组,使用pgfplotstable-- 如@cmhughes 在他的回答中所示 -- 是正确的解决方案。

如果您可以使用更简单的数字格式siunitx,那么解决方案就比建议的要好这里是寻找问题解决方案的起点。

相关内容