我的代码是:
\begin{center}
\begin{tikzpicture}
\foreach \x in {0,...,11}
\draw (\x,0) +(-0.5,-.5)rectangle +(0.5,0.5);
\foreach \x/\val in {0/9,1/5,2/13,3/19,4/12,5/8,6/7,7/4,8/21,9/2,10/6,11/11}
\draw (\x,0) node {\val} (\x,-0.85) node{{\footnotesize \x+1}};
\draw[ultra thick] (0,0)++(-0.5,-.5) rectangle +(12,1);
\end{tikzpicture}
\end{center}
输出为:
我希望节点处的文本为 (x+1) 的值,但我得到的只是文本。如何获取数组下方 1 到 12 的值以指出索引?
答案1
evaluate
一种方法是在循环内使用\foreach
:
\foreach \x/\val [evaluate=\x as \xx using \x+1] in {0/9,1/5,2/13,3/19,4/12,5/8,6/7,7/4,8/21,9/2,10/6,11/11} {
\draw (\x,0) node {\val} (\x,-0.85) node{{\footnotesize \xx}};
}
话虽如此,我还是会以不同的方式做这件事。首先,\foreach
只需将多个命令括在 中,就可以将它们放在一个循环中{...}
,这样就可以摆脱其中一个循环。其次,如果将节点绘制为矩形,这将处理相邻框之间的线。最后,由于\x
只计算框,您可以使用 来“计算”它\count
,从而使代码更易于阅读和编写。
综合起来得到:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{center}
\begin{tikzpicture}[mybox/.style={rectangle, draw,
minimum width=10mm, minimum height=10mm}]
\foreach \val [count=\x, remember=\x] in {9,5,13,19,12,8,7,4,21,2,6,11} {
\node[mybox,label=below:{\footnotesize\x}] at (\x,0) {\val};
}
\draw[ultra thick] (0.5,-0.5) rectangle +(\x,1);
\end{tikzpicture}
\end{center}
\end{document}
生产:
请注意,我已移动了您的“大”框,使其从 开始,(0.5,-0.5)
以避免必须添加到1
。\x
此外,mybox
样式会处理框之间的线。循环remmber
中的\foreach
是,以便\x
在循环之后可以使用 的最后一个值来绘制框架。
style命令rectangle,draw
中的 围绕节点的边框绘制一个矩形。如果省略minimum height
和minimum width
,则矩形的大小将仅足以容纳节点的内容,这意味着节点的“框”将具有不同的大小。指定minimum height
和minimum width
可确保我们获得方形框。事实上,如果我们省略最小高度和宽度,则我们得到:
如果您想将其放入宏,那么您可以使用类似以下内容:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand\boxes[1]{%
\begin{center}
\begin{tikzpicture}[mybox/.style={rectangle, draw, minimum width=10mm, minimum height=10mm}]
\foreach \val [count=\x, remember=\x] in {#1} {
\node[mybox,label=below:{\footnotesize\x}] at (\x,0) {\val};
}
\draw[ultra thick] (0.5,-0.5) rectangle +(\x,1);
\end{tikzpicture}
\end{center}
}
\boxes{9,5,13,19,12,8,7,4,21,2,6,11}
\boxes{9,5,13,19,1}
\end{document}
给予
答案2
另一种解决方案是使用matrix
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{center}
\begin{tikzpicture}[mybox/.style={rectangle, draw, minimum size=10mm}]
\matrix (A) [matrix of nodes, column sep=-\pgflinewidth,
row 1/.style={nodes={mybox, anchor=center}},
row 2/.style={font=\footnotesize, inner ysep=2mm}]
{
9 & 5 & 13 & 19 & 12 & 8 & 7 & 4 & 21 & 2 & 6 & 11\\
1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12\\
};
\draw[ultra thick] (A-1-1.north west) rectangle (A-1-12.south east);
\end{tikzpicture}
\end{center}
\end{document}
更新:
列标签可以自动定义:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{center}
\begin{tikzpicture}[mybox/.style={rectangle, draw, minimum size=10mm}]
\matrix (A) [matrix of nodes, column sep=-\pgflinewidth,
row 1/.style={nodes={mybox, anchor=center}},
row 2/.style={font=\footnotesize, inner ysep=2mm,
nodes={node contents=\the\pgfmatrixcurrentcolumn}},
nodes in empty cells]
{
9 & 5 & 13 & 19 & 12 & 8 & 7 & 4 & 21 & 2 & 6 & 11\\
& & & & & & & & & & & \\
};
\draw[ultra thick] (A-1-1.north west) rectangle (A-1-12.south east);
\end{tikzpicture}
\end{center}
\end{document}