如何在乳胶中在自动机周围绘制一个容器盒?

如何在乳胶中在自动机周围绘制一个容器盒?

这是我的 tikz 代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,shapes.geometric,arrows,fit,calc,positioning,automata,}
\usepackage{amsmath}

\begin{document}

\begin{tikzpicture}[shorten >=1pt,auto,node distance=5 cm, scale = 0.6, transform shape]

  \node[initial,state] (A)                                  {$q_0$};
  \node[state]         (B) [right of=A,node distance=3 cm]              {$q_1$};
  \node[state]         (C) [right of=B,node distance = 6.5 cm]              {$q_2$};
  \node[state]         (D) [below right of=B]       {$q_3$};
  \node[state]         (E) [below right of=D]                   {$q_5$};
  \node[state]         (F) [below left of=D]                {$q_4$};


  \path[->] (A) edge [above]            node [align=center]             {}  (B)
        (B) edge [loop above]       node [align=center]             {}  (B)
        edge [bend right,below]     node [align=center]         {}  (C)
        edge [left]             node [align=center]         {}  (D)
        (C) edge [loop above]       node [align=center]         {}  (C)
        edge [bend right,right]     node [above,align=center]       {}  (B)
        edge [right]            node [align=center]             {} (D)
        (D) edge [bend left,right]      node [align=center]         {} (E)
        edge [bend right,left]      node [pos=0.4,align=center]     {} (F)
        (E) edge [bend left]        node [pos=0.2,align=center]     {} (D)
        (F) edge [bend right,above]     node [pos=0.6,align=center]     {} (D)
        edge [bend left]        node [pos=0.7,align=center]     {} (A);


\end{tikzpicture}


\end{document}

输出结果如下: 在此处输入图片描述

我想在 {q1,q2,q3} 和 {q3,q4,q5} 状态周围绘制容器框(可能带有虚线边框)并标记它们。如何在 tikz 中做到这一点?

我想要以下输出:

在此处输入图片描述

答案1

这是图书馆的工作fit

1.初步猜测:

使用fit=并指定想要盒子围绕的节点:

\node [draw=red, fit= (B) (C) (D)] {};
\node [draw=red, fit= (D) (E) (F)] {};

让你非常接近你想要的:

在此处输入图片描述

现在只需调整盒子的问题。

2. 添加inner sep=

请注意,这些框紧密贴合指定节点。因此,这让我认为我们应该增加inner sep。因此,如果您将其添加inner sep=0.75cm到第一个矩形和inner sep=1.00cm第二个矩形:

\node [draw=red, fit= (B) (C) (D), inner sep=0.75cm] {};
\node [draw=red, fit= (D) (E) (F), inner sep=1.00cm] {};

你得到:

在此处输入图片描述

3. 调整:线条样式:

您还要求使用虚线框,因此将其添加dashed到列表选项中,并使线条更粗,ultra thick我们得到:

在此处输入图片描述

也许对线条使用不同的颜色并添加一些不透明度的填充颜色将使组更容易看到:

在此处输入图片描述

4.添加标签

您可以添加标签来命名选项产生的框fit=并将anchor标签贴到边界上的某个点上:

在此处输入图片描述

5.整理:

现在看起来我们已经完成了。但是等一下,蓝色框与红色框的重叠并不完全对称。似乎我们可以将蓝色框稍微向左拉伸一下,这样看起来会好得多。因此,如果我们能以某种方式让库相信fit节点(F)(对应于q4)稍微向左移动一点,那么事情就会成功。基本上我们需要使用 TikZ fit 包时留出一些额外的空间。因此,让我们在 西侧稍左边定义一个新点(F)

\coordinate (F') at ($(F.west) + (-1.75em,0)$);

那么我们就捐给(F')图书馆fit而不是(F)

6. 使用图层

使用layers允许您将适合放置在background图层中,以便绘图元素位于顶部并且没有任何不透明效果。

在此处输入图片描述

笔记:

  • 您确实应该使用与节点相对应的节点名称。这里Q0,,Q1... 是理想的。更新的解决方案with layers有这些。
  • 更新后的layers解决方案需要对边界框的位置进行额外的调整——不确定为什么。

完整的代码如下,但基本上我所做的就是添加以下几行:

    \coordinate (F') at ($(F.west) + (-1.75em,0)$);
    \node (Y) [draw=blue, fit= (D) (E) (F'), inner sep=1.00cm, 
            dashed, ultra thick, fill=blue!10, fill opacity=0.2] {};
    \node [yshift=3.0ex, blue] at (Y.south) {Label B};

代碼: 沒有layers

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,shapes.geometric,arrows,fit,calc,positioning,automata,}
\usepackage{amsmath}

\begin{document}

\begin{tikzpicture}[shorten >=1pt,auto,node distance=5 cm, scale = 0.6, transform shape]

  \node[initial,state] (A)                                     {$q_0$};
  \node[state]         (B) [right of=A,node distance=3 cm]     {$q_1$};
  \node[state]         (C) [right of=B,node distance = 6.5 cm] {$q_2$};
  \node[state]         (D) [below right of=B]                  {$q_3$};
  \node[state]         (E) [below right of=D]                  {$q_5$};
  \node[state]         (F) [below left of=D]                   {$q_4$};


  \path[->] (A) edge [above]            node [align=center]         {} (B)
            (B) edge [loop above]       node [align=center]         {} (B)
                edge [bend right,below] node [align=center]         {} (C)
                edge [left]             node [align=center]         {} (D)
            (C) edge [loop above]       node [align=center]         {} (C)
                edge [bend right,right] node [above,align=center]   {} (B)
                edge [right]            node [align=center]         {} (D)
            (D) edge [bend left,right]  node [align=center]         {} (E)
                edge [bend right,left]  node [pos=0.4,align=center] {} (F)
            (E) edge [bend left]        node [pos=0.2,align=center] {} (D)
            (F) edge [bend right,above] node [pos=0.6,align=center] {} (D)
                edge [bend left]        node [pos=0.7,align=center] {} (A);

        % Following lines added
        \node (X) [draw=red, fit= (B) (C) (D), inner sep=0.75cm, 
                dashed, ultra thick, fill=red!20, fill opacity=0.2] {};

        \coordinate (F') at ($(F.west) + (-1.75em,0)$);
        \node (Y) [draw=blue, fit= (D) (E) (F'), inner sep=1.00cm, 
                dashed, ultra thick, fill=blue!10, fill opacity=0.2] {};
        \node [yshift=3.0ex, blue] at (Y.south) {Label B};
\end{tikzpicture}
\end{document}

代码:与layers

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,shapes.geometric,arrows,fit,calc,positioning,automata,}
\usepackage{amsmath}

%% -------------------------------------- Declare the layers
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

\begin{document}

\begin{tikzpicture}[shorten >=1pt,auto,node distance=5 cm, scale = 0.6, transform shape]

    \node[initial,state] (Q0)                                      {$q_0$};
    \node[state]         (Q1) [right of=Q0,node distance=3 cm]     {$q_1$};
    \node[state]         (Q2) [right of=Q1,node distance = 6.5 cm] {$q_2$};
    \node[state]         (Q3) [below right of=Q1]                  {$q_3$};
    \node[state]         (Q5) [below right of=Q3]                  {$q_5$};
    \node[state]         (Q4) [below left  of=Q3]                  {$q_4$};

    \begin{pgfonlayer}{main}
        \path[->, thick] 
            (Q0) edge [above]            node [align=center]         {} (Q1)
            (Q1) edge [loop above]       node [align=center]         {} (Q1)
                 edge [bend right,below] node [align=center]         {} (Q2)
                 edge [left]             node [align=center]         {} (Q3)
            (Q2) edge [loop above]       node [align=center]         {} (Q2)
                 edge [bend right,right] node [above,align=center]   {} (Q1)
                 edge [right]            node [align=center]         {} (Q3)
            (Q3) edge [bend left,right]  node [align=center]         {} (Q5)
                 edge [bend right,left]  node [pos=0.4,align=center] {} (Q4)
            (Q5) edge [bend left]        node [pos=0.2,align=center] {} (Q3)
            (Q4) edge [bend right,above] node [pos=0.6,align=center] {} (Q3)
                 edge [bend left]        node [pos=0.7,align=center] {} (Q0);
    \end{pgfonlayer}
    
    \begin{pgfonlayer}{background}
        % Following lines added
        \coordinate (Q1') at ($(Q1.north west) + (-6.0em,10.0ex)$);
        \coordinate (Q2') at ($(Q2.north east) + ( 6.0em,10.0ex)$);
        \coordinate (Q3') at ($(Q3.south) + (0.0em,-7.0ex)$);
        \node (X) [draw=red, fit= (Q1') (Q2') (Q3'), inner sep=0.75cm, 
                dashed, ultra thick, fill=red!20, fill opacity=0.2] {};

        \coordinate (Q3') at ($(Q3.north) + (0.0em,3.0ex)$);
        \coordinate (Q4') at ($(Q4.west) + (-8.0em,-4.0ex)$);
        \coordinate (Q5') at ($(Q5.east) + ( 7.0em,0)$);
        \node (Y) [draw=blue, fit= (Q3') (Q5') (Q4'), inner sep=1.00cm, 
                dashed, ultra thick, fill=blue!10, fill opacity=0.2] {};
        \node [yshift=3.0ex, blue] at (Y.south) {Label B};
    \end{pgfonlayer}
\end{tikzpicture}
\end{document}

相关内容