我正在尝试绘制tikzpicture
一组节点的中心相对于另一组节点的中心位于给定位置。
我试过使用fit
,,pic
并且看过其他答案,例如这,这和这到目前为止,我已经能够将单个节点相对于 的中心定位pic
,但我还无法绘制pic
并将其中心置于给定位置。
这是 MWE。我希望我的图片中的节点中心d,e,f
位于节点中心的右侧(并垂直对齐)a,b,c
。此外,我还想在每个组下方添加一个方程,使得两个方程也垂直对齐。
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[every node/.style={draw,circle,inner sep=1pt,minimum size=15pt}]
%% First group of nodes
\node (a) {};
\node[below left=of a] (b) {};
\node[below right=of a] (c) {};
\path[-latex] (a) edge (b)
(a) edge (c);
%% Second group of nodes
\node at (3,0) (d) {};
\node[right=of d] (e) {};
\node[right=of e] (f) {};
\path[-latex] (d) edge (e)
(e) edge (f);
\end{tikzpicture}
\end{document}
我想到的一个选择是为每个组制作单独的 tikzpicture,然后在文档主体中制作一个表格。但是,由于一些原因,这不是最理想的,并且不具有普遍性,所以如果可能的话,我希望在单个 tikzpicture 中有一个解决方案。
有什么想法吗?谢谢!
答案1
在我看来,您好像正在寻找local bounding box
。
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[every node/.style={draw,circle,inner sep=1pt,minimum size=15pt}]
%% First group of nodes
\begin{scope}[local bounding box=group 1]
\node (a) {};
\node[below left=of a] (b) {};
\node[below right=of a] (c) {};
\path[-latex] (a) edge (b)
(a) edge (c);
\end{scope}
\node[below=1mm of group 1,rectangle,draw=none] (E1) {$E=mc^2$};
%% Second group of nodes
\begin{scope}[local bounding box=group 2]
\node[right=1cm of group 1] (d) {};
\node[right=of d] (e) {};
\node[right=of e] (f) {};
\path[-latex] (d) edge (e)
(e) edge (f);
\end{scope}
\node[rectangle,draw=none] (E2) at (E1-|group 2.center){$E=mc^2$};
\end{tikzpicture}
\end{document}
答案2
像这样吗?
我做了什么?我在第一张图片中声明了顶部和底部节点之间的中心点的辅助坐标。之后,我将此坐标用作第二组上第一个节点的参考。由于第二组中的所有节点都按照第一个节点放置,因此它们都移动到了正确的位置。下面的方程式也类似。
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[every node/.style={draw,circle,inner sep=1pt,minimum size=15pt}]
%% First group of nodes
\node (a) {};
\node[below left=of a] (b) {};
\node[below right=of a] (c) {};
\path[-latex] (a) edge (b)
(a) edge (c);
\draw[densely dotted, gray!70] (a)-|(c) coordinate[pos=.75] (aux);
\fill (aux) circle (1pt);
\draw[densely dotted, gray!70,->] (aux)--++(1,0) node[above, midway] {1cm};
%% Second group of nodes
\node[right=1cm of aux] (d) {};
\node[right=of d] (e) {};
\node[right=of e] (f) {};
\path[-latex] (d) edge (e)
(e) edge (f);
\node[draw=none, rectangle, minimum size=0pt, below=.5cm of a|-c.south] (eq) {$E=mc^2$};
\node[draw=none, rectangle, minimum size=0pt, ] at (eq-|e) {$E=mc^2$};
\end{tikzpicture}
\end{document}
答案3
最后我找到了一些与我想要的类似的东西这个答案。我决定采用matrix of nodes
其中所有节点都有的align=center, anchor=center
,并且每个节点都是的tikzpicture
。这并不像我希望的那样通用,但 1)它仍然可以灵活地设置column
和row sep
,并且 2)我今天已经在 tikz 上浪费了足够多的时间 [:
修复下面的 MWE。
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning,matrix}
\tikzstyle{foo} = [draw,circle,inner sep=1pt,minimum size=15pt]
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes, nodes={align=center, anchor=center}] {
%% First group of nodes
\begin{tikzpicture}
\node[foo] (a) {};
\node[foo, below left=of a] (b) {};
\node[foo, below right=of a] (c) {};
\path[-latex] (a) edge (b)
(a) edge (c);
\end{tikzpicture}
&
%% Second group of nodes
\begin{tikzpicture}
\node[foo] at (3,0) (d) {};
\node[foo, right=of d] (e) {};
\node[foo, right=of e] (f) {};
\path[-latex] (d) edge (e)
(e) edge (f);
\end{tikzpicture}
\\
$E = mc^2$
&
$E = mc^2$
\\ };
\end{tikzpicture}
\end{document}
答案4
除了这里已经给出的答案之外,还有其他几种可能性:
- 在节点内使用 tikzpicture 对子节点进行分组。Latex 纯粹主义者会对此表示不满,并指出 tikzpictures 不是为嵌套设计的,因为它们将共享全局变量
- 使用盒子。这对我来说似乎更难做到,但似乎更有可能满足乳胶纯粹主义者
tizkpicture 内部节点方法:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[every node/.style={draw,circle,inner sep=1pt,minimum size=15pt}]
%% First group of nodes
\node [draw=none] (group1) {
\begin{tikzpicture}
\node (a) {};
\node[below left=of a] (b) {};
\node[below right=of a] (c) {};
\path[-latex] (a) edge (b)
(a) edge (c);
\end{tikzpicture}};
%% Second group of nodes
\node [draw=none, right=of group1] (group2) {
\begin{tikzpicture}
\node at (3,0) (d) {};
\node[right=of d] (e) {};
\node[right=of e] (f) {};
\path[-latex] (d) edge (e)
(e) edge (f);
\end{tikzpicture}};
\end{tikzpicture}
\end{document}
盒子方法:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\newsavebox{\boxone}
\begin{lrbox}{\boxone}
\begin{tikzpicture}[every node/.style={draw,circle,inner sep=1pt,minimum size=15pt}]
\node (a) {};
\node[below left=of a] (b) {};
\node[below right=of a] (c) {};
\path[-latex] (a) edge (b)
(a) edge (c);
\end{tikzpicture}
\end{lrbox}
\newsavebox{\boxtwo}
\begin{lrbox}{\boxtwo}
\begin{tikzpicture}[every node/.style={draw,circle,inner sep=1pt,minimum size=15pt}]
\node at (3,0) (d) {};
\node[right=of d] (e) {};
\node[right=of e] (f) {};
\path[-latex] (d) edge (e)
(e) edge (f);
\end{tikzpicture}
\end{lrbox}
\begin{document}
\begin{tikzpicture}[every node/.style={draw,circle,inner sep=1pt,minimum size=15pt}]
%% First group of nodes
\node [draw=none] (group1) {\usebox{\boxone}};
%% Second group of nodes
\node [draw=none, right=of group1] (group2) {\usebox{\boxtwo}};
\end{tikzpicture}
\end{document}
两者产生完全相同的输出: