在 的主要部分,tikzpicture
我只想创建block
。因此,我需要在它们的样式定义中的某个地方执行对它们公共边界矩形的跟踪。我尝试访问current bounding box
,但它显然设置为节点的矩形,因此不幸的是,重复了path picture bounding box
。
我将在创建另一种类型的节点(例如,foo
即将实现)时使用此框。因此,再次强调,它应该可以从 的foo
样式定义内部访问。目标是让这些计算从用户(抽屉)的角度来看不可见,尽管他将被限制在两个连续的部分中声明节点。
有没有比使用低级命令(例如ifdim
等)更舒适的方式来完成这项任务?使用 TikZ 绘图时,存储值的首选方式是什么?我猜,这不是通过使用\newcommand
,它定义了全局范围内可用的宏。到目前为止,我已经设法使用 来存储值,\pgfkeys
但我坚持获取主图片的边界框。
\documentclass[landscape]{article}
\usepackage{tikz}
\usetikzlibrary{scopes,chains,shapes.multipart,backgrounds,positioning,fit,calc}
\newcommand{\setup}{
\tikzset{
node distance=5mm and 3cm,
block/.style={rectangle, %draw, thick,
path picture={
\draw[red, thick] (current bounding box.south west) rectangle (current bounding box.north east);
}
},
%foo/.style={circle},
every edge/.style={->, rounded corners, thick, draw,
to path={
let \p1=(\tikztostart.east),
\p2=($ (\tikztostart.east) + (1cm,0) $),
\p3=(\tikztotarget.west) in
(\p1) -- (\p2) \ifdim\y2=\y3 -- \else |- \fi (\p3)
\tikztonodes
}
}
}
}
\begin{document}
\begin{tikzpicture}
\setup
% First section. This blocks will build up the bounding rectangle, which is to be used in the next section.
\node[block=1] (A) {System A};
\node[block=2] (B) [above right=of A] {System B};
\node[block=3] (C) [right=of A] {System C};
\node[block=4] (D) [below right=of A] {System D};
% Second section. Positioning of this nodes depends on the resulting bounding rectangle of the previous section.
%\node[foo] (o1) {circle 1};
%\node[foo] (o2) {circle 2};
\path
(A) edge (B)
edge (C)
edge (D);
\end{tikzpicture}
\end{document}
答案1
TikZ 的库fit
可用于创建多个节点或坐标的周围矩形或其他形状的节点。
% Preamble:
\usetikzlibrary{fit}
% ..
\node[inner sep=0pt,outer sep=0pt,fit=(a) (b) (c) (d) (e)] (bb) {};
% use `(bb.north west)` etc. to access the boundaries
使用 TikZ 绘图时,存储值的首选方式是什么?
您可以使用coordinate (<name>)
内部来\path
保存当前位置。另一种方法是使用\coordinate (<name>) at (<coordinate>);
宏。
答案2
path picture
好吧,我玩了更多节点和样式…… 内部重复current bounding box
的结论path picture bounding box
完全是错误的。 它代表了它应该代表的东西。 因此,此代码有效(感谢节点的全局定义):
block/.style={rectangle,
path picture={
\node[rectangle, fit=(current bounding box), inner sep=0pt, outer sep=0pt] (my bounding box) {};
}
},
不幸的是,我没能弄清楚,为什么在最初的帖子的例子中,每个节点都被红色边框包围,而随着每个新节点的创建,红色边框的尺寸应该会增加。