好玩的东西

好玩的东西

我将许多表格放在由 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}
}

相关内容