我想创建一个矩形路径和注释节点,可以使用坐标、样式和文本对其进行参数化。目前,我正在这样做:
\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 path
和to path
带有.list
ed 键的示例。
这也允许矩形的两个角使用除笛卡尔坐标系以外的其他坐标系。(使用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}