다른 여러 질문과 마찬가지로 tikz에서 하이퍼그래프를 그리려고 합니다. 나는 이 이미지와 비슷한 방향성 하이퍼그래프를 그리고 싶습니다.여기:
다른 질문과 달리 관련 가장자리 사이에 호를 그리고 싶지 않습니다. 대신 가장자리를 세그먼트로 결합한 다음 다시 분할하고 싶습니다.
조인 포인트의 위치를 지정하는 것은 괜찮지만 들어오고 나가는 가장자리의 각도를 수동으로 지정할 필요는 없습니다. 나는 선이 조인 포인트에서 부드럽게 분리되는 것을 선호합니다.
이것은 이 그림을 재현하려는 나의 잘못된 시도입니다.
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz}
\begin{document}
\tikz{
\node [circle,draw] (v1) at (0,0) { $v_1$ };
\node [circle,draw] (v2) at (-1,-3) { $v_2$ };
\node [circle,draw] (v3) at (2,-2) { $v_3$ };
\node [circle,draw] (v4) at (1,-4) { $v_4$ };
\node [circle,draw] (v5) at (3,1) { $v_5$ };
\node [circle,draw] (v6) at (5,-1) { $v_6$ };
\node [circle,draw] (v7) at (4,-5) { $v_7$ };
\node [] (e1) at (1,-2) { $e_1$ };
\node [] (e2) at (2,0) { $e_2$ };
\node [] (e3) at (3,-3) { $e_3$ };
\node [] (e4) at (4,0) { $e_4$ };
%
\path
% edge 1
(v1) [-] edge node { } (e1)
(v2) [-] edge node { } (e1)
(e1) [->] edge node { } (v3)
(e1) [->] edge node { } (v4)
% edge 2
(v1) [-] edge node { } (e2)
(v3) [-] edge node { } (e2)
(e2) [->] edge node { } (v5)
% edge 3
(v7) [-] edge node { } (e3)
(e3) [->] edge node { } (v3)
(e3) [->] edge node { } (v4)
% edge 4
(v5) [-] edge node { } (e4)
(e4) [->] edge node { } (v6)
(e4) [->] edge node { } (v7)
;
}
\end{document}
그러면 다음 그림이 생성됩니다.
답변1
암호
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\makeatletter
\tikzset{
@pos/.style={@pos1={#1},@pos2={#1}},
@ratio/.style={@ratio1={#1},@ratio2={#1}},
@delta/.style={@delta1={#1},@delta2={#1}},
@edge/.style={@@edge/.append style={#1}},
@edge 0/.style={@@edge 0/.append style={#1}},
@edge 1/.style={@@edge 1/.append style={#1}},
@edge 2/.style={@@edge 2/.append style={#1}},
@edge 3/.style={@@edge 3/.append style={#1}},
@edge 4/.style={@@edge 4/.append style={#1}},
% and for four:
@pos1/.store in=\qrr@posA,
@pos2/.store in=\qrr@posB,
@ratio1/.store in=\qrr@ratioA,
@ratio2/.store in=\qrr@ratioB,
@delta1/.store in=\qrr@deltaA,
@delta2/.store in=\qrr@deltaB,
@pos=.5,
@ratio=.5,
@delta=.1,
}
\newcommand*{\connectThree}[4][]{
\begingroup
\tikzset{#1}
\coordinate (@aux1) at ($(#2)!\qrr@ratioA!(#3)$);
\coordinate (@aux2) at ($(#4)!\qrr@posA!(@aux1)$);
\path (@aux2) edge[@@edge/.try, @@edge 0/.try, @@edge 3/.try] (#4);
\draw[@@edge/.try, @@edge 1/.try] (@aux2) .. controls ($(#4)!\qrr@posA+\qrr@deltaA!(@aux1)$) .. (#2);
\draw[@@edge/.try, @@edge 2/.try] (@aux2) .. controls ($(#4)!\qrr@posA+\qrr@deltaA!(@aux1)$) .. (#3);
\endgroup
}
% \renewcommand*{\connectThree}[4][]{\connectFour[#1, @@edge 4/.style={draw=none}, @ratio2=0]{#2}{#3}{#4}{0,0}}
\newcommand*{\connectFour}[5][]{
\begingroup
\tikzset{#1}
\coordinate (@aux1a) at ($(#2)!\qrr@ratioA!(#3)$);
\coordinate (@aux1b) at ($(#4)!\qrr@ratioB!(#5)$);
\coordinate (@aux2a) at ($(@aux1b)!\qrr@posA!(@aux1a)$);
\coordinate (@aux2b) at ($(@aux1a)!\qrr@posB!(@aux1b)$);
\path (@aux2a) edge[@@edge/.try,@@edge 0/.try] (@aux2b);
\draw[@@edge/.try,@@edge 1/.try] (@aux2a) .. controls ($(@aux1b)!\qrr@posA+\qrr@deltaA!(@aux1a)$) .. (#2);
\draw[@@edge/.try,@@edge 2/.try] (@aux2a) .. controls ($(@aux1b)!\qrr@posA+\qrr@deltaA!(@aux1a)$) .. (#3);
\draw[@@edge/.try,@@edge 3/.try] (@aux2b) .. controls ($(@aux1a)!\qrr@posB+\qrr@deltaB!(@aux1b)$) .. (#4);
\draw[@@edge/.try,@@edge 4/.try] (@aux2b) .. controls ($(@aux1a)!\qrr@posB+\qrr@deltaB!(@aux1b)$) .. (#5);
\draw[help lines] (@aux1a) -- (@aux1b) node[midway,above,sloped,font=\tiny,shape=rectangle,inner xsep=+0pt,draw=none,align=center,fill=white,fill opacity=.75,outer ysep=\pgflinewidth,text opacity=1] {ratio: \qrr@ratioA/\qrr@ratioB\\pos: \qrr@posA/\qrr@posB\\delta: \qrr@deltaA/\qrr@deltaB};
\endgroup
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node [circle,draw] (v1) at (0,0) { $v_1$ };
\node [circle,draw] (v2) at (-1,-3) { $v_2$ };
\node [circle,draw] (v3) at (2,-2) { $v_3$ };
\node [circle,draw] (v4) at (1,-4) { $v_4$ };
\node [circle,draw] (v5) at (3,1) { $v_5$ };
\node [circle,draw] (v6) at (5,-1) { $v_6$ };
\node [circle,draw] (v7) at (4,-5) { $v_7$ };
\connectThree[
@edge 3=->
]{v1}{v3}{v5}
\connectThree[
@ratio=0,
@edge 1=->,
@edge 2=->
]{v6}{v7}{v5}
\connectThree[
@edge 1=->,
@edge 2=->
]{v3}{v4}{v7}
\connectFour[
@ratio=.4,
@pos1=.7,
@pos2=.5,
@edge 3=->,
@edge 4=->,
@edge=thick
]{v1}{v2}{v3}{v4}
\connectFour[@edge=blue,@edge 3=->, @edge 4={draw}, @ratio2=0]{v3}{v5}{v6}{v7}
\end{tikzpicture}
\end{document}
산출
답변2
모듈을 Asymptote
사용하여 인라인을 사용한 하이퍼그래프 :flowchart
hypg.tex
\documentclass{article}
\usepackage[inline]{asymptote}
\usepackage{lmodern}
\begin{document}
\begin{asy}
size(0,200);
import flowchart;
pair[]pv={
(0,0) , // pv[0], not used, included for convenient indexing nodes from pv[1]
(0,0) ,
(-1,-3) ,
(2,-2) ,
(1,-4) ,
(3,1) ,
(5,-1) ,
(4,-5) ,
};
pair[][] pe={ // point coordinates and a relative position of the label (N=North etc)
{(0,0), N} , // ev[0], not used, included for convenient indexing nodes from ev[1]
{(0.2,-2) ,N} ,
{(2,0) ,SE} ,
{0.1pv[3]+0.2pv[6]+0.7pv[7],E},
{(4.5,0.75) ,SW} ,
};
pen nodeFill=yellow+opacity(0.8);
pen nodeLine=darkblue+1.2pt+opacity(0.5);
block[] v=new block[pv.length];
block[] e=new block[pe.length];
for(int i=1;i<pv.length;++i){
v[i]=circle("$v_"+string(i)+"$",pv[i],nodeFill,nodeLine);
draw(v[i]);
}
string s;
for(int i=1;i<pe.length;++i){
s="$e_"+string(i)+"$";
e[i]=circle(s,pe[i][0]);
label(s,pe[i][0],pe[i][1]);
dot(pe[i][0]);
}
add(
new void(picture pic, transform t) {
blockconnector operator --=blockconnector(pic,t);
real tg;
pen linePen=darkblue+0.8pt;
currentpen=linePen;
arrowfactor=4;
draw(pic,v[1].bottomleft(t) .. {dir(-30)}t*e[1].center{dir(-30)} ..v[3].bottomleft(t),Arrow(HookHead));
draw(pic,v[2].top(t){dir(80)} .. {dir(-30)}t*e[1].center{dir(-30)} ..v[4].top(t),Arrow(HookHead));
draw(pic,v[1].right(t) .. t*e[2].center ..v[5].bottom(t),Arrow(HookHead));
draw(pic,v[3].topleft(t){dir(120)} .. {dir(20)}(t*pe[2][0]));
tg=-30;
draw(pic,v[5].right(t) .. {dir(tg)}t*e[4].center{dir(tg)} ..v[6].top(t),Arrow(HookHead));
draw(pic,v[5].right(t) .. {dir(tg)}t*e[4].center{dir(tg)} ..v[7].topright(t),Arrow(HookHead));
tg=90;
draw(pic,v[7].top(t) .. {dir(tg)}t*e[3].center{dir(tg)} ..v[3].right(t),Arrow(HookHead));
draw(pic,v[7].top(t) .. {dir(tg)}t*e[3].center{dir(tg)} ..v[4].topright(t),Arrow(HookHead));
}
);
\end{asy}
\end{document}
로 처리하려면 latexmk
파일을 생성하세요 latexmkrc
.
sub asy {return system("asy '$_[0]'");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");
그리고 실행하십시오 latexmk -pdf hypg.tex
.