我将许多表格放在由 csv 文件生成的许多文件中。我使用datatools
(而不是说pgfplotstable
),因为它在 csv 输入格式方面更加宽容(例如,它忽略了文本周围的引号)。但是,我想让我的表格每隔一行都“呈条纹状”,颜色为灰色。
说白了,我想\DTLifoddrow{\rowcolor{grey}}{}
在文档的序言部分使用它。这样我就不用手动创建每个表格环境,并且可以将相同的样式应用于所有表格。
不幸的\DTLifoddrow
是必须在里面\DTLforeach
。因此我可能必须重新定义\DTLforeach
或\DTLdisplaydb
自动添加我的\DTLifoddrow
。我不确定要走哪条路或如何重新定义这些命令。
答案1
自从询问以来,我已经弄清楚了如何使用 datatool 做很多有趣的事情:
简短答案
\usepackage[table]{xcolor}
\usepackage{datatool}
\definecolor{light-gray}{gray}{0.9}
\let\oldtabular\tabular
\let\endoldtabular\endtabular
\renewenvironment{tabular}{\rowcolors{0}{white}{light-gray}\oldtabular}{\endoldtabular}
现在,每个表格环境(包括由 DTL 自动创建的表格环境)都是带条纹的。要绘制非条纹表格,请使用\begin{oldtabular}
和\end{oldtabular}
。
好玩的东西
自动使用 Booktabs
Booktabs 非常棒。请一直使用它。
\usepackage{booktabs}
% start every dtl table with \toprule from booktabs
\renewcommand{\dtldisplaystarttab}{\toprule}
% likewise for \midrule and \bottomrule from booktabs
\renewcommand{\dtldisplayafterhead}{\midrule}
\renewcommand{\dtldisplayendtab}{\\\bottomrule}
现在所有数据工具表看起来都很漂亮!
格式化数字
我的 CSV 文件看起来像4525,25463135,2346234,4643
等等(即丑陋的)。无需使用 datatool 来显示它们,效果也很差。使用包siunitx
!
现在我必须承认,我并不了解的全部功能siunitx
,因此我建议阅读文档,但我会告诉你我所知道的内容。
我们将使用它来格式化长数字,使其在千位上使用逗号(即 1,234 而不是 1234)。对于非常长的数字,我思考 siunitx
将数字以科学计数法表示。通过一些调整,也可以显示(或四舍五入到)任意数量的小数。再次提醒,请阅读文档。
为了siunitx
发挥它的魔力,每个数字都必须用 包裹\num{ }
。我们按照以下方式进行操作:
% package to automatically format numbers with thousands separator
\usepackage[group-separator={,},group-minimum-digits=3]{siunitx}
\renewcommand*{\dtlrealformat}[1]{\num{#1}}
这应该正确格式化任何看起来是数字的东西(根据datatool
)。
轻松插入 CSV
我们定义两个命令:\csvtable
和\widecsvtable
:
\newcommand{\csvtable}[3][]{%
\DTLloadrawdb[#1]{#2}{#2}
\begin{table}[h!]
\centering
\caption{#3}
\DTLdisplaydb{#2}
\end{table}
}
\newcommand{\widecsvtable}[3][]{%
\DTLloadrawdb[#1]{#2}{#2}
\begin{table}[h!]
\centering
\caption{#3}
\begin{adjustbox}{center}
{\footnotesize \DTLdisplaydb{#2}}
\end{adjustbox}
\end{table}
}
\csvtable
采用的形式\csvtable[options]{filename}{caption}
与options
您提供给 的选项相同\DTLloadrawdb
。例如,列标签在 csv 文件中必须是唯一的,并且不能包含任何 LaTeX 特殊符号。要不受任何限制地设置列标签,请使用例如:
\csvtable[headers={repeat header,repeat header,\$ymbol}]{file.csv}{caption}
其中,headers=
列标签以逗号分隔。如果 csv 文件不包含第一行的标签,请使用选项,noheader
例如:
\csvtable[noheader,headers={*header list*}]{file.csv}{caption}
\widecsvtable
使用方法相同,只是缩小表格的字体并将其居中页。这为您提供了一两列额外空间。要使用此功能,我们需要\usepackage{adjustbox}
。
多行列标题
一般来说(不仅仅是在表格中),单词可以用 堆叠在一起
\shortstack{row 1\\row 2}
。这对于多行列标题很有用,例如:
\csvtable[headers={\shortstack{line 1\\line 2},\shortstack{line 1\\line 2}}]{file.csv}{caption}
是一个有两列表格且有两行列标签(可能很长)的表格。
长答案
把所有这些放在一起,你最终会得到一个类似这样的序言:
% import xcolor and (optionally) booktabs and adjustbox
\usepackage[table]{xcolor}
\usepackage{booktabs}
\usepackage{adjustbox}
% package to automatically format numbers with thousands separator
\usepackage[group-separator={,},group-minimum-digits=3]{siunitx}
% datatool
\usepackage{datatool}
% wrap all real numbers with \num from siunitx so that they're
% displayed nicely
\renewcommand*{\dtlrealformat}[1]{\num{#1}}
% start every dtl table with \toprule from booktabs
\renewcommand{\dtldisplaystarttab}{\toprule}
% likewise for \midrule and \botomrule from booktabs
% (take this out if you dont like booktabs, but it is _highly_ recommended)
\renewcommand{\dtldisplayafterhead}{\midrule}
\renewcommand{\dtldisplayendtab}{\\\bottomrule}
% here's where the magic happens
\definecolor{light-gray}{gray}{0.9}
\let\oldtabular\tabular
\let\endoldtabular\endtabular
\renewenvironment{tabular}{\rowcolors{0}{white}{light-gray}\oldtabular}{\endoldtabular}
\newcommand{\csvtable}[3][]{%
\DTLloadrawdb[#1]{#2}{#2}
\begin{table}[h!]
\centering
\caption{#3}
\DTLdisplaydb{#2}
\end{table}
}
\newcommand{\widecsvtable}[3][]{%
\DTLloadrawdb[#1]{#2}{#2}
\begin{table}[h!]
\centering
\caption{#3}
\begin{adjustbox}{center}
{\footnotesize \DTLdisplaydb{#2}}
\end{adjustbox}
\end{table}
}