我需要生成一个大尺寸(25x10)的表格,其中只有某些特定单元格是非空的(并且是彩色的)。手动创建它相当困难。当然我可以使用一些 latex 表格生成器,但如果我想事后修改给定单元格的内容,我仍然会遇到问题(我必须搜索数十个 & 字符)。
有没有办法创建一个表,让我可以以类似于编程语言中二维数组的寻址方式修改单元格的内容,例如“设置坐标为 12, 4 的单元格以包含以下文本并具有以下(背景)颜色”?
答案1
这是一个想法。该\sparsetable
命令有三个参数:行数、列数和条目列表。
列表中的每个项目都有四个参数:行索引、列索引、条目和颜色。顺序是任意的。
宏解析列表,将项目存储在属性列表中,然后用于填充表体;我们利用\prop_item:Nn
如果没有相应的属性则不返回任何内容的事实。
\documentclass{article}
\usepackage{xcolor}
\usepackage{colortbl}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\sparsetable}{mmm}
{% #1 = number of rows, #2 = number of columns, #3 = list of entries
\prop_clear:N \l_demitau_sparse_table_prop
\clist_map_inline:nn { #3 } { \demitau_sparse_table_cell:nnnn ##1 }
\demitau_sparse_table:nn { #1 } { #2 }
}
\prop_new:N \l_demitau_sparse_table_prop
\tl_new:N \l_demitau_sparse_table_body_tl
\cs_new_protected:Nn \demitau_sparse_table_cell:nnnn
{
\prop_put:Nnn \l_demitau_sparse_table_prop { #1,#2 } { \cellcolor{#4}#3 }
}
\cs_new_protected:Nn \demitau_sparse_table:nn
{
\tl_clear:N \l_demitau_sparse_table_body_tl
\int_step_inline:nnnn { 1 } { 1 } { #1 }
{
\int_step_inline:nnnn { 1 } { 1 } { #2 - 1 }
{
\tl_put_right:Nx \l_demitau_sparse_table_body_tl
{
\prop_item:Nn \l_demitau_sparse_table_prop { ##1,####1 } &
}
}
% no trailing & in the last column
\tl_put_right:Nx \l_demitau_sparse_table_body_tl
{
\prop_item:Nn \l_demitau_sparse_table_prop { ##1,#2 }
}
\tl_put_right:Nn \l_demitau_sparse_table_body_tl { \\ }
}
\begin{tabular}{*{#2}{c}}
\tl_use:N \l_demitau_sparse_table_body_tl
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\sparsetable{10}{5}{
{1}{1}{a}{red},
{1}{4}{b}{blue!50},
{3}{2}{c}{blue!70},
{4}{5}{d}{green},
{10}{1}{e}{gray!70},
{10}{5}{f}{green},
{5}{1}{0}{white},
{6}{1}{0}{white},
{7}{1}{0}{white},
{8}{1}{0}{white},
{9}{1}{0}{white},
}
\end{document}
函数中的一些变化\demitau_sparse_table:nn
给出了表中的规则:
\cs_new_protected:Nn \demitau_sparse_table:nn
{
\tl_clear:N \l_demitau_sparse_table_body_tl
\int_step_inline:nnnn { 1 } { 1 } { #1 }
{
\int_step_inline:nnnn { 1 } { 1 } { #2 - 1 }
{
\tl_put_right:Nx \l_demitau_sparse_table_body_tl
{
\prop_item:Nn \l_demitau_sparse_table_prop { ##1,####1 } &
}
}
% no trailing & in the last column
\tl_put_right:Nx \l_demitau_sparse_table_body_tl
{
\prop_item:Nn \l_demitau_sparse_table_prop { ##1,#2 }
}
\tl_put_right:Nn \l_demitau_sparse_table_body_tl { \\ \hline }
}
\begin{tabular}{|*{#2}{c|}}
\hline
\tl_use:N \l_demitau_sparse_table_body_tl
\end{tabular}
}