我开始使用 pgfplotstable 包,因为它似乎是一个强大的工具并且能够做我想要做的事情。
我正在导入自定义 CSV,由于这些 CSV 会随时间而变化,我需要使用条件格式绘制相应的表格。我设法让 95% 符合我的要求,但像往常一样,最后 5% 却很难实现。
以下是 MWE:
\documentclass{report}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\begin{document}
\pgfplotstableread[col sep=comma]{test.csv}\table
\pgfplotstableset{
bold/.append style={
postproc cell content/.append code={
\pgfkeysalso{@cell content=\textbf{##1}}%
},
},
bold last row/.style={
postproc cell content/.append code={
\count0=\pgfplotstablerow
\advance\count0 by1
\ifnum\count0=\pgfplotstablerows
\pgfkeysalso{@cell content=\textbf{##1}}%
\fi
},
},
}
\begin{center}
\pgfplotstabletypeset[
string type,
% bolding the first row of data, and then the 4th, and finally the last one
every row 0 column 0/.style={bold},
every row 0 column 1/.style={bold},
every row 0 column 2/.style={bold},
every row 3 column 0/.style={bold},
every row 3 column 1/.style={bold},
every row 3 column 2/.style={bold},
bold last row,
%columns/0/.style={dec sep align, precision=3} % this doesn't work the way it is
%columns/1/.style={dec sep align, precision=3} % this doesn't work the way it is
%columns/2/.style={dec sep align, precision=3} % this doesn't work the way it is
every head row/.style={before row={\toprule},after row={\midrule}},
every last row/.style={before row={\midrule},after row={\toprule}},
]\table
\end{center}
\end{document}
此外,所需的 test.csv 如下所示:
Header 1,Header 2,Header 3
Cat 1 total,12767849.250,14470789.000
cat 1.1,5545718.200,NA
cat 1.2,7222131.050,NA
cat 2 total,3496774.665,5937501.000
cat 2.1,939910.000,NA
cat 2.2,856060.565,NA
cat 2.3,839982.000,NA
cat 2.4,433976.100,NA
cat 2.5,426846.000,NA
grand total,16264623.915,20408290.000
我还想做以下事情:
粗体标题
正如您所看到的,‘cat 2 total’这一行是故意用粗体显示的,但我还需要在这一行之前加一个中间规则。
第一列(标题 1)需要为 l 类型(左对齐)
其他列需要为“dec sep align”(按小数点分隔符对齐)类型,并且我需要能够选择我想要的精度级别。我以为代码中的注释行可以做到这一点,但它没有做到,而且会干扰其他内容。
最后,我选择在没有值的地方输入“NA”,但也许有更好的方法?将单元格留空?
我猜对于知道如何做的人来说这很容易,所以提前感谢您的帮助。
编辑 1:更新
我稍微修改了上面的代码,现在使用下面的代码
\begin{center}
\pgfplotstabletypeset[
display columns/0/.style={
column name={\textbf{Column 1}},column type = {l},string type
},
display columns/1/.style={
column name={\textbf{Column 2}},fixed,column type = {r}
},
display columns/2/.style={
column name={\textbf{Column 3}},fixed,column type = {r}
},
% bolding the first row of data, and then the 4th, and finally the last one
every row 0 column 0/.style={bold},
every row 0 column 1/.style={bold},
every row 0 column 2/.style={bold},
every row 3 column 0/.style={bold},
every row 3 column 1/.style={bold},
every row 3 column 2/.style={bold},
bold last row,
every head row/.style={before row={\toprule},after row={\midrule}},
%every row no/3/.style={before row=\midrule} %that will break the head row ruling...
every last row/.style={before row={\midrule},after row={\toprule}},
]\tableone
\captionof{table}{Tonnes dumped per location}
\end{center}
通过定义列名、类型和内容,我还可以使用粗体显示标题,但这可能不是最好的方法......这样,我应该能够使用评论中的建议的十进制分隔符对齐和精度。但是,加粗后无法正常工作。它似乎会选择采用正确的格式(“固定”参数)而不加粗,或者加粗但不格式化为其他数字......我确信我在这里遗漏了一些东西。请注意,我只是想让“固定”在加粗或不加粗时都能工作,目前使用 flush 来处理对齐问题。理想情况下,当我让它按照我想要的方式工作时,我会使用精度和十进制分隔符对齐。
另外,我可以在第 3 行之前获得中间规则,但是如果我这样做(使用上面代码中的注释行),它会破坏“每个头行”代码,因为它不是第 3 行......
所以我剩下的两个问题是:
我想要第 3 行之前的中间规则,但希望保留头部和最后一行的格式。
我希望数字按原样对齐,包括加粗时。粗体功能似乎会覆盖 dec sep align 设置。
感谢您的帮助。