TikZ 带有变量的可重复使用路径

TikZ 带有变量的可重复使用路径

我想创建一个矩形路径和注释节点,可以使用坐标、样式和文本对其进行参数化。目前,我正在这样做:

\draw[styA] (\Axi,\Ayi) -- (\Axi,\Ayi + \Ayii) node[midway, right] {annotation A} -- (\Axi + \Axii,\Ay + \Ayii) -- (\Axi + \Axii,\Ayi) -- cycle;
\draw[styB] (\Bxi,\Byi) -- (\Bxi,\Byi + \Byii) node[midway, right] {annotation B} -- (\Bxi + \Bxii,\By + \Byii) -- (\Bxi + \Bxii,\Byi) -- cycle;
\draw[styC] (\Cxi,\Cyi) -- (\Cxi,\Cyi + \Cyii) node[midway, right] {annotation C} -- (\Cxi + \Cxii,\Cy + \Cyii) -- (\Cxi + \Cxii,\Cyi) -- cycle;
...

我想要做的是这样的:

\foreach \sty,\annotation,\xi,\xii,\yi,\yii (<more foreachy stuff>)
  \draw[\sty] (\xi,\yi) -- (\xi,\yi + \yii) node[midway, right] {\annotation} -- (\xi + \xii,\y + \yii) -- (\xi + \xii,\yi) -- cycle;

或这个:

\MyFancyCommand{\styA,\annotationA,\Axi,\Axii,\Ayi,\Ayii}
\MyFancyCommand{\styB,\annotationB,\Bxi,\Bxii,\Byi,\Byii}
\MyFancyCommand{\styC,\annotationC,\Cxi,\Cxii,\Cyi,\Cyii}
...

有没有办法做类似其中一件事,或者其中的一部分,而不需要使用外部预处理器?

答案1

使用稍微不同的语法,您可以执行以下操作:

\foreach \sty/\annotation/\xi/\xii/\yi/\yii in {%
  <sty 1>/<annotation 1>/<xi 1>/<xii 1>/<yi 1>/<yii 1>,
  <sty 2>/<annotation 2>/<xi 2>/<xii 2>/<yi 2>/<yii 2>,
  …,
  <sty n>/<annotation n>/<xi n>/<xii n>/<yi n>/<yii n>}
  \draw[style/.expand once=\sty]
        (\xi, \yi)               -- (\xi, \yi + \yii) node[midway, right] {\annotation}
     -- (\xi + \xii, \yi + \yii) -- (\xi + \xii,  \yi) -- cycle;

使用相对坐标也可能有用:

  \draw[style/.expand once=\sty]
          (\xi,  \yi)  -- + (up:\yii) node[midway, right] {\annotation}
     -- + (\xii, \yii) -- + (right:\xi) -- cycle;

甚至

 \draw[style/.expand once=\sty]
   (\xi,  \yi) |- + (\xii, \yii) node[near start, right] {\annotation} |- + (0, 0) -- cycle;

下面的代码显示了一个示例以及带有 a 的相同示例to pathto path带有.listed 键的示例。

这也允许矩形的两个角使用除笛卡尔坐标系以外的其他坐标系。(使用edges一条路径,您还可以将矩形的第一个角指定为相对于另一个矩形的坐标。)

还有rectangle路径运算符,即(corner A) rectangle (corner B),但不幸的是,没有适当的计时器设置来放置节点,请参阅是否可以结合 TikZ 距离和线到操作?

你不妨考虑将其作为一个节点来执行,参见tikz:我们可以设置矩形的角坐标吗?

代码

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \sty/\annotation/\xi/\xii/\yi/\yii in {%
  draw                       /Foo/  0  /1/0  /2  ,
  {fill=blue!25, draw=blue}  /Bar/  1.5/2/-.5/1.5,
  {transform shape,rotate=30}/Woah!/2  /2/0.5/1  }
 \draw[style/.expand once=\sty]
  (\xi,  \yi) |- + (\xii, \yii) node[near start, right] {\annotation}
              |- + (0, 0) -- cycle;
\end{tikzpicture}

\tikzset{
  my Rect/.style={
    to path={
      |- node[near start, right] {#1} (\tikztotarget) |- (\tikztostart)}}}%
\begin{tikzpicture}
\path (0,     0) edge[my Rect=Foo]                               + (1,2)
      (1.5, -.5) edge[my Rect=Bar, fill=blue!25, draw=blue]      + (2, 1.5)
      (2,   0.5) edge[my Rect=Woah!, rotate=30, transform shape] + (2,1);
\end{tikzpicture}

\begin{tikzpicture}[my Foreach/.style args={[#1]#2:#3)#4}{
  insert path={#3) edge[my Rect={#2},#1] #4}}]
\path [my Foreach/.list={{[]                           Foo:  (0,0)     +(1,2)  },
                         {[fill=blue!25, draw=blue]    Bar:  (1.5,-.5) +(2,1.5)},
                         {[rotate=30, transform shape] Woah!:(2,0.5)   +(2,1)  }}];
\end{tikzpicture}
\end{document}

相关内容