带有自定义列设置和圆角的 tikz 表格

带有自定义列设置和圆角的 tikz 表格

我需要在 tikzpicture 环境中制作一个表格。到目前为止,我使用了 tikz 矩阵,但我无法得到我想要的。表格需要将所有内容对齐到右侧。奇数列的宽度必须约为 30 毫米,偶数列必须进行调整以适应相应列中的最长内容。左右单元格边距应为 1 毫米。我希望两者都有可见和不可见的线条。在这里我填充了偶数列以便能够看到宽度。在我的尝试中,似乎尽管我的“最小宽度=3 厘米”或“文本宽度=3 厘米”,奇数列的宽度仍然变得非常窄。

这是我的妈妈:

\documentclass[a4paper]{article}


\usepackage{tikz}
\usetikzlibrary{positioning, calc, matrix}

\tikzset{
    table/.style = {every even column/.style={nodes={minimum width=2.4cm, fill=gray!20},
                  every odd column/.style={nodes={minimum width=3cm}}},}
}

\begin{document}
\begin{tikzpicture}

\matrix [matrix of nodes, nodes in empty cells,
         nodes={align=right, minimum height=1.5em, anchor=center},
         table] (nombres)
{
1 & un & 11 & onze & 21 & vingt-et-un \\
2 & deux & 12 & douze & 22 & vingt-deux \\
3 & trois & 13 & treize & 23 & vingt-trois \\
4 & quatre & 14 & quatorze & 24 & vingt-quatre \\
5 & cinq & 15 & quinze & 25 & vingt-cinq \\
6 & six & 16 & seize & 26 & vingt-six \\
7 & sept & 17 & dix-sept & 27 & vingt-sept \\
8 & huit & 18 & dix-huit & 28 & vingt-huit \\
9 & neuf & 19 & dix-neuf & 29 & vingt-neuf \\
10 & dix & 20 & vingt & 30 & trente \\
};
\end{tikzpicture}
\end{document}

编辑——这是我的改进版本,附有另一位用户的答案。我愿意简化代码并进行改进。特别是,有没有办法立即分辨出自定义列表的样式,即既不是奇数也不是偶数。是否可以获取第 1、4 和 7 列左侧的 2 个角,以及第 2、5 和 8 列右侧的 2 个角?

\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{positioning, calc, matrix}

\tikzset{
  table/.style = {
font=\large, row sep=-\pgflinewidth, column sep=-\pgflinewidth,

nodes={align=right, minimum height=2.1em, anchor=center, outer sep=0pt},

  column 1/.style={
nodes={minimum width=12mm, text width=6mm, fill=red!10}},

  column 2/.style={
nodes={minimum width=24mm, text width=18mm, fill=green!10}},

  column 3/.style={
nodes={minimum width=14mm}},

  column 4/.style={
nodes={minimum width=12mm, text width=6mm, fill=red!10}},

  column 5/.style={
nodes={minimum width=24mm, text width=18mm, fill=green!10}},

  column 6/.style={
nodes={minimum width=14mm}},

  column 7/.style={
nodes={minimum width=12mm, text width=6mm, fill=red!10}},

  column 8/.style={
nodes={minimum width=24mm, text width=18mm, fill=green!10}},}
}

\begin{document}
\begin{tikzpicture}

\matrix at (.5\textwidth,0) [matrix of nodes, nodes in empty cells,
        matrix anchor=north, table] (nombres)
{
1 & un & & 11 & onze & & 21 & vingt-et-un \\
2 & deux & & 12 & douze & & 22 & vingt-deux \\
3 & trois & & 13 & treize & & 23 & vingt-trois \\
4 & quatre & & 14 & quatorze & & 24 & vingt-quatre \\
5 & cinq & & 15 & quinze & & 25 & vingt-cinq \\
6 & six & & 16 & seize & & 26 & vingt-six \\
7 & sept & & 17 & dix-sept & & 27 & vingt-sept \\
8 & huit & & 18 & dix-huit & & 28 & vingt-huit \\
9 & neuf & & 19 & dix-neuf & & 29 & vingt-neuf \\
10 & dix & & 20 & vingt & & 30 & trente \\
};
\end{tikzpicture}
\end{document}

答案1

  • 在第二个文档示例中,您需要删除table样式定义中的所有空行。这样做会生成带有数字的红色列和带有名称的绿色列。绿色列之前是空白。
  • 我不太清楚你的矩阵应该是什么样的
  • 我猜测该矩阵应该类似于以下内容:

在此处输入图片描述

  • 对于上述矩阵,不需要定义table样式,只需定义奇数列和偶数列与节点陈旧的常见定义之间的差异,并添加到column sep所需宽度的奇数列即可:

编辑: 现在绿色列的宽度由这些列中最宽的文本定义。这样所有Underfull \hbox...警告都会消失。代码中的这些更改标记为%%% <---

%   \documentclass[a4paper]{article}
\documentclass[margin=3.141592]{standalone}% that display only the matrix
\usepackage{tikz}
\usetikzlibrary{matrix} 
\newlength\greencolwidth                %%% <---
\settowidth\greencolwidth{vingt-quatre} %%% <---
                
\begin{document}
\begin{tikzpicture}

\matrix [matrix of nodes, 
         nodes in empty cells, 
         row sep=-\pgflinewidth, 
         nodes={minimum height=4ex, outer sep=0pt,
                anchor=center, align=right},
         every odd column/.style  = {nodes={text width=2em, fill=red!30}},
         every even column/.style = {nodes={text width=\greencolwidth, %%% <--- 
                                     fill=green!30},
                                     column sep=2em,
                                     }
         ] (nombres)
{
1 & un      & 11 & onze     & 21 & vingt-et-un  \\
2 & deux    & 12 & douze    & 22 & vingt-deux   \\
3 & trois   & 13 & treize   & 23 & vingt-trois  \\
4 & quatre  & 14 & quatorze & 24 & vingt-quatre \\
5 & cinq    & 15 & quinze   & 25 & vingt-cinq   \\
6 & six     & 16 & seize    & 26 & vingt-six    \\
7 & sept    & 17 & dix-sept & 27 & vingt-sept   \\
8 & huit    & 18 & dix-huit & 28 & vingt-huit   \\
9 & neuf    & 19 & dix-neuf & 29 & vingt-neuf   \\
10 & dix    & 20 & vingt    & 30 & trente       \\
};
\end{tikzpicture}
\end{document}

附录:

  • 关于圆角:
    • 应该让它们任意组合成矩阵,像这样:

在此处输入图片描述

在这种情况下,矩阵选项是:

\matrix [matrix of nodes, 
         nodes in empty cells, 
         row sep=1pt, column sep=1.5pt,
         nodes={minimum height=3.4ex, rounded corners,
                anchor=center, align=right},
         every odd column/.style  = {nodes={text width=2em, fill=red!30}},
         every even column/.style = {nodes={text width=\greencolwidth, %%% <--- 
                                     fill=green!30},
                                     column sep=2em,
                                     }
         ] (nombres)
  • 或者像这样?

在此处输入图片描述

其中 MWE 为:

\usepackage{tikz}
\usetikzlibrary{fit,
                matrix,
                babel,      % if needed
                }
\newlength\greencolwidth                %%% <---
\settowidth\greencolwidth{vingt-quatre} %%% <---

\begin{document}
    \begin{tikzpicture}[
FIT/.style = {draw=white, line width=2mm, rounded corners=4mm,
              inner sep=0.5\pgflinewidth, fit=#1}
                        ]
\matrix [matrix of nodes,
         nodes in empty cells,
         row sep=-\pgflinewidth,
         nodes={minimum height=4ex, inner xsep=2mm,
                anchor=center, align=right},
         every odd column/.style  = {nodes={text width=2em, fill=red!30}},
         every even column/.style = {nodes={text width=\greencolwidth, %%% <---
                                     fill=green!30},
                                     column sep=2em,
                                     }
         ] (nombres)
{
1 & un      & 11 & onze     & 21 & vingt-et-un  \\
2 & deux    & 12 & douze    & 22 & vingt-deux   \\
3 & trois   & 13 & treize   & 23 & vingt-trois  \\
4 & quatre  & 14 & quatorze & 24 & vingt-quatre \\
5 & cinq    & 15 & quinze   & 25 & vingt-cinq   \\
6 & six     & 16 & seize    & 26 & vingt-six    \\
7 & sept    & 17 & dix-sept & 27 & vingt-sept   \\
8 & huit    & 18 & dix-huit & 28 & vingt-huit   \\
9 & neuf    & 19 & dix-neuf & 29 & vingt-neuf   \\
10 & dix    & 20 & vingt    & 30 & trente       \\
};
\node[FIT= (nombres-1-1) (nombres-10-2)] {};
\node[FIT= (nombres-1-3) (nombres-10-4)] {};
\node[FIT= (nombres-1-5) (nombres-10-6)] {};
    \end{tikzpicture}
\end{document}

笔记: 在第一个解决方案中,带有白色圆角边框的矩形位于红色/绿色柱子上(因为只有这样才能覆盖外柱角),因此一半的边框线位于柱子内部。因此,inner xsep矩阵节点数增加到 2mm。

新解决方案使用适合每对柱子的节点。它们的样式设置是这样的,它们只覆盖柱对的外角。因此,它们能够定义较大的角半径,但是这样做也应该inner xsep相应地增加。

答案2

奇数列宽度的问题缺失了}every even column这使得every odd column样式必须在偶数列内定义。

为了对齐,您需要一个text width

\documentclass[a4paper, landscape]{article}

\usepackage{tikz}
\usetikzlibrary{positioning, calc, matrix}

\tikzset{
    table/.style = {every even column/.style={nodes={minimum width=2.4cm, fill=gray!20, text width=2.2cm}},
                  every odd column/.style={nodes={minimum width=3cm, text width=2.5cm}},}
}

\begin{document}
\centering
\begin{tikzpicture}

\matrix [matrix of nodes, nodes in empty cells, row sep=-\pgflinewidth, column sep=-\pgflinewidth,
         nodes={align=right, minimum height=1.5em, anchor=center, outer sep=0pt},
         table] (nombres)
{
1 & un & 11 & onze & 21 & vingt-et-un \\
2 & deux & 12 & douze & 22 & vingt-deux \\
3 & trois & 13 & treize & 23 & vingt-trois \\
4 & quatre & 14 & quatorze & 24 & vingt-quatre \\
5 & cinq & 15 & quinze & 25 & vingt-cinq \\
6 & six & 16 & seize & 26 & vingt-six \\
7 & sept & 17 & dix-sept & 27 & vingt-sept \\
8 & huit & 18 & dix-huit & 28 & vingt-huit \\
9 & neuf & 19 & dix-neuf & 29 & vingt-neuf \\
10 & dix & 20 & vingt & 30 & trente \\
};
\end{tikzpicture}

\begin{tikzpicture}

\matrix [matrix of nodes, nodes in empty cells, row sep=-\pgflinewidth, column sep=-\pgflinewidth,
         nodes={draw, align=right, minimum height=1.5em, anchor=center, outer sep=0pt},
         table] (nombres)
{
1 & un & 11 & onze & 21 & vingt-et-un \\
2 & deux & 12 & douze & 22 & vingt-deux \\
3 & trois & 13 & treize & 23 & vingt-trois \\
4 & quatre & 14 & quatorze & 24 & vingt-quatre \\
5 & cinq & 15 & quinze & 25 & vingt-cinq \\
6 & six & 16 & seize & 26 & vingt-six \\
7 & sept & 17 & dix-sept & 27 & vingt-sept \\
8 & huit & 18 & dix-huit & 28 & vingt-huit \\
9 & neuf & 19 & dix-neuf & 29 & vingt-neuf \\
10 & dix & 20 & vingt & 30 & trente \\
};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容