相对于其中心定位 tikz 节点组

相对于其中心定位 tikz 节点组

我正在尝试绘制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)它仍然可以灵活地设置columnrow 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}

两者产生完全相同的输出:

在此处输入图片描述

相关内容