在 Tikz 中访问 `\newcommand` 中的多个参数

在 Tikz 中访问 `\newcommand` 中的多个参数

我需要一个像这样的图形(四个垂直堆叠的带有文本的矩形;文本中的两个数字不同且不遵循模式):

我做了什么:

%working
\documentclass{standalone}
\usepackage{tikz,amsmath}

\newcommand{\vrect}[2]{ %%% Need to pass an array of 4 arguments
    \foreach \pos [count=\i] in {{(0,-4)},{(0,-3)},{(0,-2)},{(0,-1)}}{
        \node[draw=black,thick,minimum size=1cm] (z\i) at \pos {Val#1#2};
    }
}
\begin{document}
    \begin{tikzpicture}[scale=1]
    %%\vrect{{1,1}, {3,5}, {8,7}, {1,0}}} %% How to use this?
    \vrect{1}{1}
    \end{tikzpicture}    
\end{document}

我不知道

  • 如何传递数组作为参数
  • 如何根据索引访问参数(尝试#\i失败)

任何帮助都将受到赞赏。 附言我需要绘制几个这样的图形,所以我创建了一个\newcommand

答案1

\foreach命令可以迭代多个参数,以 分隔/。您可以使用循环的数组作为命令的参数。可以使用 用计数器设置\i位置(0,-\i)

注意:您可以在数组内传递任意数量的参数(不必是 4 个)。

\documentclass{standalone}
\usepackage{tikz,amsmath}

\newcommand{\vrect}[1]{
    \foreach \x/\y [count=\i] in #1 {
        \node[draw=black,thick,minimum size=1cm] (z\i) at (0,-\i) {Val\x\y};
    }
}

\begin{document}
    \begin{tikzpicture}[scale=1]
        \vrect{{1/1, 3/5, 8/7, 1/0}}
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

如果你不受那个奇怪的语法的束缚:

\documentclass{standalone}
\usepackage{tikz,amsmath}

\newcommand{\vrect}[1]{%
  \def\myarray{{#1}}%
  \foreach \pos [count=\i from 0] in {{(0,-4)},{(0,-3)},{(0,-2)},{(0,-1)}}{
    \pgfmathsetmacro{\val}{\myarray[\i]}%
    \node[draw=black,thick,minimum size=1cm] (z\i) at \pos {Val\val};
  }%
}
\begin{document}

\begin{tikzpicture}
\vrect{11,35,87,10}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

您可以将数组作为单个参数传递给,但是,如果使用 而不是\vect列表,则会更容易。这样,您就可以以“正常”的 tikz 方式循环遍历坐标。{1,1}, {3,5}, {8,7}, {1,0}1/1, 3/5, 8/7, 1/0

这是您的完整(更正后的) MWE:

\documentclass{standalone}
\usepackage{tikz,amsmath}

\newcommand{\vrect}[1]{ %%% Need to pass 4 arguments
    \foreach \x/\y [count=\i] in {#1} {
        \node[draw=black,thick,minimum size=1cm] (z\i) at (\x,\y) {Val\x-\y};
    }
}
\begin{document}
    \begin{tikzpicture}[scale=1]
      \vrect{1/1, 3/5, 8/7, 1/0} %% How to use this!
    \end{tikzpicture}
\end{document}

产生

在此处输入图片描述

请注意,这适用于数组中的任意数量的参数。

编辑

如果你想让盒子垂直堆叠,这会稍微容易一些:

\documentclass{standalone}
\usepackage{tikz,amsmath}

\newcommand{\vrect}[1]{ %%% Need to pass 4 arguments
\foreach \x/\y [count=\i] in {#1} {
        \node[draw=black,thick,minimum size=1cm] (z\i) at (0,-\i) {Val\x-\y};
    }
}
\begin{document}
    \begin{tikzpicture}[scale=1]
      \vrect{1/1, 3/5, 8/7, 1/0} %% How to use this?
    \end{tikzpicture}
\end{document}

生成结果:

在此处输入图片描述

再次,这将接受任意数量的参数。

相关内容