我知道我可以使用 tikz 的 fit 库来获取某些节点后面的适合的背景。
我怎样才能使其也适合边缘?
我当前的代码:
\begin{tikzpicture}[prefix=fig/,
state/.style={circle,draw,thick},
hmm/.style={draw,rectangle}]
\node[state] (a1) at (0,0) {} edge [loop above,thick] () ;
\node[state] (a2) at (1,0) {} edge [loop above,thick] () edge[<-,thick] (a1);
\node[state] (a3) at (2,0) {} edge [loop above,thick] () edge[<-,thick] (a2);
\node[hmm,fit=(a1) (a2) (a3)] (a) {};
\end{tikzpicture}
这样背景框的顶部就直接穿过环路。我怎样才能让框完美地贴合在节点和边缘周围(因此环路的顶部在贴合过程中必须以某种方式成为点)。
答案1
一种方法是在每个循环的中点添加一个坐标(在这个例子中,只需要将它添加到一个循环中,因为所有循环的高度都相同)。然后将该坐标添加到拟合中。
\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}[prefix=fig/,
state/.style={circle,draw,thick},
hmm/.style={draw,rectangle}]
\node[state] (a1) at (0,0) {} edge [loop above,thick] coordinate (l1) () ;
\node[state] (a2) at (1,0) {} edge [loop above,thick] coordinate (l2) () edge[<-,thick] (a1);
\node[state] (a3) at (2,0) {} edge [loop above,thick] coordinate (l3) () edge[<-,thick] (a2);
\node[hmm,fit=(a1) (a2) (a3) (l1) (l2) (l3)] (a) {};
\end{tikzpicture}
\end{document}
请注意,坐标规范前循环的虚拟目标。顺便说一句,这说明了为什么虚拟目标很有用。将坐标放在目标后面会将坐标放在循环的末尾,将其放在目标前面会将其放在循环的中点。
我想一个更优雅的解决方案是如果可以命名一条路径并将该名称传递给库fit
,但我不知道这是否可能(但是,上次我说了类似的话,有人过来做了所以我提到它以防万一我可以重新调用 tikz-djinn)。
答案2
一种可能性是使用current bounding box
:
% snip...
\node[state] (a1) at (0,0) {} edge [loop above,thick] () ;
\node[state] (a2) at (1,0) {} edge [loop above,thick] () edge[<-,thick] (a1);
\node[state] (a3) at (2,0) {} edge [loop above,thick] () edge[<-,thick] (a2);
\draw (current bounding box.south west) rectangle (current bounding box.north east);
% snip...
它可能太紧了,但是不需要 fit-library。