这是我的 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}