我正在尝试创建一个表格(来自 csv 文件),其中单元格是彩色的(来自另一个 csv 文件(这样我就可以在外部进行预处理))。我简要查看了诸如datatool
、csvsimple
和之类的工具pgfplotstable
,并搜索了许多其他问题,但没有找到允许从外部文件读取数据进行着色的答案。1描述使用静态数据单独对表中的每个元素进行着色使用文件中的逻辑/命令。 2解释动态着色使用文件中的逻辑,但不读取颜色,但是不会从外部文件读取颜色。
期望的结果是,给出 n 个(本例中为 6x6)csv 文件,如下所示
,1,2,3,4,5
1,1,2,3,4,5
2,2,4,6,8,10
3,3,6,9,12,15
4,4,8,12,16,20
5,5,10,15,20,25
以及 am by n 颜色文件,am by n 表,其中表的 (i,j) 条目包含数据 csv 文件的 (i,j) 条目,根据颜色 csv 文件的 (i,j) 条目着色。csv 文件中的颜色可以采用最终使用的工具最方便的任何格式,尽管理想情况下它能够指定色调和颜色(可能通过十六进制 RGB 或 RGBA),但是即使只是指定彩色按名字就可以了。
潜在预处理的一个例子是使用外部 python 脚本读取数据 csv 文件,规范化所有数据,并将某种调色板应用于规范化的数据,并将相应的颜色值写入颜色 csv 文件。
非常感谢任何帮助,非常感谢!
编辑1:进一步说明了为什么前两个问题没有回答这个问题,并提供了预处理的例子。
答案1
一个expl3
实现。
两个 csv 文件中的项目都存储在属性列表中,形式为<row>@<column>
,模拟二维数组。然后根据检索到的数据构建一个标记列表变量,其中每个单元格包含
\__aerys_colortable_color:n { <color> } <item>
其中,函数是的包装器\cellcolor
。
\begin{filecontents*}{\jobname-data.csv}
0,1,2
1,1,2
2,2,4
\end{filecontents*}
\begin{filecontents*}{\jobname-colors.csv}
gray!20,[rgb]{0.1,0.3,0.9},green!20
[RGB]{201,123,12},[cmyk]{0.1,0.9,0.2,0.4},green
red,yellow!49,green
\end{filecontents*}
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\makecolortable}{mm}
{% #1 = data file, #2 = colors file
\aerys_colortable:nn { #1 } { #2 }
}
\ior_new:N \g__aerys_colortable_data_ior
\int_new:N \l__aerys_colortable_row_int
\int_new:N \l__aerys_colortable_column_int
\prop_new:N \l__aerys_colortable_data_prop
\prop_new:N \l__aerys_colortable_colors_prop
\tl_new:N \l__aerys_colortable_body_tl
\seq_new:N \l__aerys_colortable_temp_seq
\cs_generate_variant:Nn \prop_put:Nnn { Ne }
\cs_generate_variant:Nn \prop_item:Nn { Ne }
\cs_new_protected:Nn \aerys_colortable:nn
{
\int_zero:N \l__aerys_colortable_column_int
% store the data
\__aerys_colortable_read:Nn \l__aerys_colortable_data_prop { #1 }
% store the colors
\__aerys_colortable_read:Nn \l__aerys_colortable_colors_prop { #2 }
% get the number of columns
\ior_open:Nn \g__aerys_colortable_data_ior { #1 }
\ior_map_inline:Nn \g__aerys_colortable_data_ior
{
\int_set:Nn \l__aerys_colortable_column_int { \clist_count:n { ##1 } }
\ior_map_break:
}
\ior_close:N \g__aerys_colortable_data_ior
% fill the table
\tl_clear:N \l__aerys_colortable_body_tl
\int_step_inline:nn { \l__aerys_colortable_row_int }
{
\int_step_inline:nn { \l__aerys_colortable_column_int - 1 }
{
\tl_put_right:Nx \l__aerys_colortable_body_tl
{
\aerys_colortable_color:n
{
\prop_item:Nn \l__aerys_colortable_colors_prop { ##1 @ ####1 }
}
\prop_item:Nn \l__aerys_colortable_data_prop { ##1 @ ####1 }
&
}
}
\tl_put_right:Nx \l__aerys_colortable_body_tl
{
\aerys_colortable_color:n
{
\prop_item:Ne \l__aerys_colortable_colors_prop { ##1 @ \int_to_arabic:n { \l__aerys_colortable_column_int } }
}
\prop_item:Ne \l__aerys_colortable_data_prop { ##1 @ \int_to_arabic:n { \l__aerys_colortable_column_int } }
\exp_not:N \\
}
}
\begin{tabular}{*{\l__aerys_colortable_column_int}{c}}
\tl_use:N \l__aerys_colortable_body_tl
\end{tabular}
}
\cs_new_protected:Nn \__aerys_colortable_read:Nn
{
\int_zero:N \l__aerys_colortable_row_int
\prop_clear:N #1
\ior_open:Nn \g__aerys_colortable_data_ior { #2 }
\ior_map_inline:Nn \g__aerys_colortable_data_ior
{
\int_incr:N \l__aerys_colortable_row_int
\seq_set_split:Nnn \l__aerys_colortable_temp_seq { , } { ##1 }
\seq_indexed_map_inline:Nn \l__aerys_colortable_temp_seq
{
\prop_put:Nen #1 { \int_to_arabic:n { \l__aerys_colortable_row_int } @ ####1 } { ####2 }
}
}
\ior_close:N \g__aerys_colortable_data_ior
}
\cs_new_protected:Nn \aerys_colortable_color:n
{
\str_if_eq:eeTF { [ } { \tl_head:n { #1 } }
{
\cellcolor#1
}
{
\cellcolor{#1}
}
}
\ExplSyntaxOff
\begin{document}
\makecolortable{\jobname-data.csv}{\jobname-colors.csv}
\end{document}