如何在 foreach 循环内显示节点的同时执行加法?

如何在 foreach 循环内显示节点的同时执行加法?

我的代码是:

\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 heightminimum width,则矩形的大小将仅足以容纳节点的内容,这意味着节点的“框”将具有不同的大小。指定minimum heightminimum 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}

相关内容