幫我讓我的 TikZ Petri 網看起來漂亮一點!

幫我讓我的 TikZ Petri 網看起來漂亮一點!

我正在嘗試在 TikZ 中繪製下圖:

他們的形象

我的嘗試看起來像這樣(注意節點標籤略有不同,但這不是我的問題!):

我的嘗試

我的程式碼如下:

\documentclass[11pt,a4paper]{report}

\usepackage[USenglish]{babel} 
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern} 

\usepackage{tikz}

\usetikzlibrary{positioning,fit,backgrounds,arrows,shapes,automata,petri}

\tikzset{
    place/.style={
        circle,
        thick,
        minimum size=6mm,
                draw
    },
    transitionV/.style={
        rectangle,
        thick,
        fill=black,
        minimum height=6mm,
        inner xsep=1pt
    }
}

\begin{document}

\title{Test}
\author{Me}
\date{\today}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[node distance=1cm and 2cm,>=stealth',bend     angle=45,thick]
        \node [transitionV,label=above:$q_1$] (q1) {};
        \node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {}
            edge[pre,bend right,overlay] (q1)
            edge[post,bend left,overlay] (q1);
        \node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {}
            edge[pre] (q1);
        \node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {}
            edge[pre] (p41);
        \node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {}
            edge[pre] (q4);
        \node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {}
                edge[pre] (p24);
        \node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {}
                edge[pre,bend right,overlay] (q2)
                edge[post,bend left,overlay] (q2);
        \node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {}
                edge[pre] (q1);
        \node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {}
            edge[pre] (p31);
        \node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {}
                edge[pre] (q3)
                edge[post] (q2);
        \node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {}
                edge[pre,bend left,out=45,in=45,looseness=1.2] (q2)
                edge[post,bend left,out=315,in=315,looseness=1.2] (q1);
\end{tikzpicture}
\caption{Event graph}
\end{figure}

\end{document}

我已經用盡了 TikZ 的知識。請有人告訴我如何讓我的圖表看起來像上面的例子一樣漂亮?謝謝!

答案1

請提出具體問題,包括您想要什麼、您已經嘗試過什麼以及您在哪些方面未能實現這一目標。就像現在一樣,這個網站沒有研究價值,只是一個「為我做」的貼文。

我糾正了我看到的兩個主要問題。其餘的內容應該從您已有的程式碼中不言自明。

% arara: pdflatex

\documentclass[11pt,a4paper]{report}
\usepackage[USenglish]{babel} 
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern} 
\usepackage{tikz}
\usetikzlibrary{positioning,arrows,petri}

\tikzset{
    place/.style={
        circle,
        thick,
        minimum size=6mm,
        draw
    },
    transitionV/.style={
        rectangle,
        thick,
        fill=black,
        minimum height=6mm,
        inner xsep=1pt
    }
}

\begin{document}
    \begin{figure}[h!]
        \centering
        \begin{tikzpicture}[node distance=1cm and 2cm,>=stealth',bend angle=45,thick]
        \node [transitionV,label=above:$q_1$] (q1) {};
        \node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {}
        edge[pre,bend right=70] (q1)
        edge[post,bend left=70] (q1);
        \node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {}
        edge[pre] (q1);
        \node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {}
        edge[pre] (p41);
        \node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {}
        edge[pre] (q4);
        \node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {}
        edge[pre] (p24);
        \node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {}
        edge[pre,bend right=70] (q2)
        edge[post,bend left=70] (q2);
        \node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {}
        edge[pre] (q1);
        \node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {}
        edge[pre] (p31);
        \node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {}
        edge[pre] (q3)
        edge[post] (q2);
        \node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {}
        edge[pre,out=0,in=20,,looseness=1.2] (q2)
        edge[post,out=180,in=160,looseness=1.2] (q1);
        \end{tikzpicture}
        \caption{Event graph}
    \end{figure}    
\end{document}

在此輸入影像描述

答案2

在我的嘗試中,我透過將節點與路徑分開並使用arc路徑在側面繪製小節點來修改您的程式碼。這是因為我認為組織得更好的程式碼更容易理解,每次編寫/完成一些程式碼時,我都會花幾分鐘來修復其結構並刪除冗餘選項。

這些線透過使用錨點在不同的路徑上連接,在這種情況下,我必須添加calc以計算其他位置來實現它。因此,例如,如果您有(q2.west)(q2.south west),為了計算中點,您可以編寫($(q2.west)!.5!(q2.south west)$),以便您的箭頭可以連接到某個節點的西邊和西南邊之間的中點。

所有路徑也已根據您想要的範例縮短。bending 為了使弧形箭頭上的尖端正確對齊,還添加了該庫。

輸出

圖1

程式碼

\documentclass[11pt,a4paper]{report}
\usepackage[USenglish]{babel}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern}
\usepackage{tikz}

\usetikzlibrary{positioning,fit,backgrounds,arrows,shapes,automata,petri,calc,bending}

\tikzset{
    place/.style={
        circle,
        thick,
        minimum size=6mm,
                draw
    },
    transitionV/.style={
        rectangle,
        thick,
        fill=black,
        minimum height=6mm,
        inner xsep=1pt
    }
}

\begin{document}

\title{Test}
\author{Me}
\date{\today}

\begin{figure}[h!]
\centering
\begin{tikzpicture}[
    node distance=1cm and 2cm,
    >=stealth',
    bend angle=#1,
    thick,
  shorten >=2pt,
  shorten <=2pt
    ]

% Nodes
    \node [transitionV,label=above:$q_1$] (q1) {};
    \node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {};
    \node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {};
    \node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {};
    \node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {};
    \node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {};
    \node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {};
    \node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {};
    \node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {};
    \node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {};
    \node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {};

% Paths

  % left
    \draw ($(q1.north east)!.5!(q1.east)$) edge[bend left=15,->] (p31);
  \draw (q1.east) edge[bend right=15,->] (p41);
  % central
  \draw (p31) edge[bend left=10,->] (q3);
  \draw (q3) edge[bend left=10,->] (p23);
  \draw (p41) edge[bend right=10,->] (q4);
  \draw (q4) edge[bend right=10,->] (p24);
  % right
  \draw (p23) edge[bend left=15,->] ($(q2.north west)!.5!(q2.west)$);
  \draw (p24) edge[bend right=15,->] (q2.west);

% round arrows on the...

  % ...left
\draw[->] ($(p11.west)+(2pt,4pt)$) arc (240:105:1.8em);
\draw[<-] ($(p11.east)+(-2pt,4pt)$) arc (-60:75:1.8em);
  % ...right
\draw[->] ($(p22.west)+(2pt,4pt)$) arc (240:105:1.8em);
\draw[<-] ($(p22.east)+(-2pt,4pt)$) arc (-60:75:1.8em);

% huge round arrows from the top node
\draw[->] (p12) edge[out=180,in=145] ($(q1.north west)!.5!(q1.west)$);
\draw[->] (p12) edge[out=0,in=35] ($(q2.north east)!.5!(q2.east)$);

\end{tikzpicture}
\caption{Event graph}
\end{figure}
\end{document}

相關內容