
Estou tentando desenhar o seguinte diagrama no TikZ:
Minha tentativa é assim (observe que os rótulos dos nós são um pouco diferentes, mas isso não é problema meu!):
Meu código é o seguinte:
\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}
Esgotei meu conhecimento sobre TikZ. Por favor, alguém poderia me dizer como posso deixar meu diagrama bonito como no exemplo acima? Obrigado!
Responder1
Por favor, faça perguntas específicas sobre o que você deseja ter, o que você tentou e onde não conseguiu alcançar isso. Da forma como está agora, não tem valor de pesquisa para este site e é apenas uma postagem do tipo "faça isso por mim".
Corrigi os dois principais problemas que vi. O resto deve ser autoexplicativo a partir do código que você já possui.
% 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}
Responder2
Na minha tentativa modifiquei seu código separando os nós dos caminhos e usando arc
caminhos para desenhar os pequenos nas laterais. Isso ocorre porque acho que um código melhor organizado é mais fácil de entender e cada vez que escrevo/termino algum código, levo alguns minutos para consertar sua estrutura e remover opções redundantes.
As linhas se unem em caminhos diferentes usando âncoras e neste caso tive que somar calc
para calcular outras posições para conseguir isso. Então, por exemplo, se você tiver (q2.west)
e (q2.south west)
, para calcular o ponto médio, você escreveria ($(q2.west)!.5!(q2.south west)$)
, desta forma sua seta pode se conectar ao ponto médio entre o oeste e o sudoeste de um determinado nó.
Todos os caminhos também foram encurtados conforme o exemplo desejado. A bending
biblioteca também foi adicionada para que as pontas das setas do arco fiquem devidamente alinhadas.
Saída
Código
\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}