我有一张表格,其中百分比和计数交替排列。
我如何有条件地将 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
}
输出结果如下:
请注意,我使用\num
了siunitx
包,其中包含可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
(它不是为此而设计的)。当然,对于没有 的简单表格multicolumn
,multirow
以及使用额外的垂直空格等分隔线组,使用pgfplotstable
-- 如@cmhughes 在他的回答中所示 -- 是正确的解决方案。
如果您可以使用更简单的数字格式siunitx
,那么解决方案就比建议的要好这里是寻找问题解决方案的起点。