我需要在 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}