我想在 latex 中绘制类似的东西。我该怎么做?我希望它是一个有向图,并且能够标记顶点。
答案1
一种选择是使用PGF/TikZ;该软件包的文档非常完善,您可以在文档中找到许多示例。另一个示例来源可以在TeXample.net
以下是一个小例子:
\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{positioning,chains,fit,shapes,calc}
\begin{document}
\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}
\begin{tikzpicture}[thick,
every node/.style={draw,circle},
fsnode/.style={fill=myblue},
ssnode/.style={fill=mygreen},
every fit/.style={ellipse,draw,inner sep=-2pt,text width=2cm},
->,shorten >= 3pt,shorten <= 3pt
]
% the vertices of U
\begin{scope}[start chain=going below,node distance=7mm]
\foreach \i in {1,2,...,5}
\node[fsnode,on chain] (f\i) [label=left: \i] {};
\end{scope}
% the vertices of V
\begin{scope}[xshift=4cm,yshift=-0.5cm,start chain=going below,node distance=7mm]
\foreach \i in {6,7,...,9}
\node[ssnode,on chain] (s\i) [label=right: \i] {};
\end{scope}
% the set U
\node [myblue,fit=(f1) (f5),label=above:$U$] {};
% the set V
\node [mygreen,fit=(s6) (s9),label=above:$V$] {};
% the edges
\draw (f1) -- (s6);
\draw (s6) -- (f2);
\draw (f2) -- (s7);
\draw (s7) -- (f3);
\draw (s8) -- (f3);
\draw (f3) -- (s9);
\draw (s9) -- (f5);
\draw (f5) -- (s6);
\end{tikzpicture}
\end{document}
编辑:我添加了上一个图的变体(在评论中请求);每个顶点现在将是一个带标签的有序对。这个想法是在每个\foreach
构造中使用多个变量;第一个变量将用于为每个节点添加名称并创建标签;第二个和第三个变量将给出每个有序对的第一个和第二个坐标。代码:
\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{positioning,chains,fit,shapes,calc}
\begin{document}
\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}
\begin{tikzpicture}[thick,
fsnode/.style={},
ssnode/.style={},
every fit/.style={ellipse,draw,inner sep=5pt,text width=2cm},
->,shorten >= 3pt,shorten <= 3pt
]
% the vertices of U
\begin{scope}[start chain=going below,node distance=7mm]
\foreach \i/\xcoord/\ycoord in {1/6/8,2/5/1,3/-4/7,4/6/9,5/0/-3}
\node[fsnode,on chain,label=left:$t_{\i}$] (f\i) {$(\xcoord,\ycoord)$};
\end{scope}
% the vertices of V
\begin{scope}[xshift=4cm,yshift=-0.5cm,start chain=going below,node distance=7mm]
\foreach \i/\xcoord/\ycoord in {6/0/3,7/1/4,8/-2/1,9/5/9}
\node[ssnode,on chain,label=right:$t_{\i}$] (s\i) {$(\xcoord,\ycoord)$};
\end{scope}
% the set U
\node [myblue,fit=(f1) (f5),label=above:$U$] {};
% the set V
\node [mygreen,fit=(s6) (s9),label=above:$V$] {};
% the edges
\draw (f1) -- (s6);
\draw (s6) -- (f2);
\draw (f2) -- (s7);
\draw (s7) -- (f3);
\draw (s8) -- (f3);
\draw (f3) -- (s9);
\draw (s9) -- (f5);
\draw (f5) -- (s6);
\end{tikzpicture}
\end{document}
答案2
战斗结束后我来到这里,希望能提供一些有趣的信息。
cvs 版本中有一个新的库
graphs
,但我认为文档中有一个错误,您需要将其替换为:\usetikzlibrary{graph}
如果\usetikzlibrary{ graphs, graphs.standard}
不替换,graphs.standard
我会收到错误:$
缺失像您的代码这样的示例(我没有得到这两个集合的蓝色和绿色)
\documentclass[]{scrartcl} \usepackage[usenames,dvipsnames]{xcolor} \usepackage{tikz} \thispagestyle{empty} \usetikzlibrary{ graphs, graphs.standard } \begin{document} \definecolor{myblue}{RGB}{80,80,160} \definecolor{mygreen}{RGB}{80,160,80} \begin{tikzpicture} \graph[nodes={draw, circle,fill=myblue}, radius=.5cm, empty nodes, branch down=1 cm, grow right sep=4cm] {subgraph I_nm [V={a, b, c, d, e}, W={1,...,4}]; a -- { 1}; b -- { 1, 2 }; c -- { 2,3, 4 }; e -- { 1,4} }; \end{tikzpicture} \end{document}
结果:
我制作了一个包
tkz-berge
,我认为下周它会出现在 ctan 服务器上。我需要完成一些文档工具\documentclass[]{scrartcl} \usepackage[usenames,dvipsnames]{xcolor} \usepackage{tkz-berge} \thispagestyle{empty} \usetikzlibrary{fit,shapes} \begin{document} \definecolor{myblue}{RGB}{80,80,160} \definecolor{mygreen}{RGB}{80,160,80} \begin{tikzpicture}[every fit/.style={ellipse,draw,inner sep=-2pt,text width=2cm, line width=1pt}] \GraphInit[vstyle=Normal] \SetUpVertex[Math,Lpos=-180,LabelOut] \SetVertexNormal[FillColor=myblue,OuterSep=0pt,TextColor=myblue] \grEmptyPath[form=2,x=0,y=0,RA=2,rotation=90,prefix=U]{5} \SetVertexShade[BallColor=mygreen,OuterSep=0pt] \SetUpVertex[Lpos=0] \SetVertexNormal[FillColor=mygreen,TextColor=mygreen] \grEmptyPath[form=2,x=6,y=0,RA=2,rotation=90,prefix=V]{4} \SetUpEdge[lw=2pt,color=black] \Edges(U4,V3,U3,V2,U1) \Edges(U3,V3,U0,V0,U2,V1) % the set U \node [myblue,fit=(U0) (U4),label=above:\textcolor{myblue}{$U$}] {}; % the set V \node [mygreen,fit=(V0) (V3),label=above:\textcolor{mygreen}{$V$}] {}; \end{tikzpicture} \end{document}
结果不错,但最好在绘制边缘之前在背景中绘制椭圆
答案3
这是一个使用pstricks
:
\documentclass{article}
\usepackage{pst-node}% http://ctan.org/pkg/pst-node
\usepackage{multido}% http://ctan.org/pkg/multido
\begin{document}
\begin{pspicture}
% Define nodes/vertices
\multido{\i=5+-1}{5}{\pnode(1,\i){U\i}}% Vertices in U
\multido{\i=4+-1}{4}{\pnode[0,0.5](4,\i){V\i}}% Vertices in V
% Draw vertex set/ellipses
\psset{linestyle=solid,linecolor=black,linewidth=1pt,fillstyle=none}%
\psellipse[linecolor=blue!80!white](1,3)(1.25,3)% U
\psellipse[linecolor=green!40!black](4,3)(1.25,2.5)% V
% Vertex set/ellipse labels
\rput[u](1,6.5){$U$}% U
\rput[u](4,6){$V$}% V
% Node/vertex connections/edges
\psset{linecolor=black,linewidth=0.5pt}%
\psline(U5)(V4)
\psline(U4)(V4) \psline(U4)(V3)%
\psline(U3)(V2) \psline(U3)(V1)%
\psline(U2)(V3)%
\psline(U1)(V4) \psline(U1)(V1)%
% Draw nodes/vertices and labels
\psset{fillstyle=solid}%
\multido{\i=5+-1}{5}{% U vertex set
\pscircle[fillcolor=blue!80!white](U\i){0.2}% Print vertex
\uput{10pt}[l](U\i){$U_\i$}% Print vertex label
}%
\multido{\i=4+-1}{4}{% V vertex set
\pscircle[fillcolor=green!40!black](V\i){0.2}% Print vertex
\uput{10pt}[r](V\i){$V_\i$}% Print vertex label
}%
\end{pspicture}
\end{document}
答案4
还有一个可能的解决方案:
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{calc, chains,
fit,
positioning,
shapes}
\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}
\begin{document}
\begin{tikzpicture}[
node distance = 7mm and 21mm,
start chain = going below,
V/.style = {circle, draw,
fill=#1,
inner sep=0pt, minimum size=3mm,
node contents={}},
every fit/.style = {ellipse, draw=#1, inner ysep=-1mm,
inner xsep=5mm},
]
% vertices
\foreach \i in {4,...,0}
{
\ifnum\i=4
\node (n1\i) [V=myblue,on chain,
label={[text=myblue]left:$u_{\i}$}];
\else
\node (n1\i) [V=myblue,on chain,
label={[text=myblue]left:$u_{\i}$}];
\node (n2\i) [V=mygreen, above right=3.5mm and 22mm of n1\i,
label={[text=mygreen]right:$v_{\i}$}];
\fi
}
% set U
\node [myblue,fit=(n14) (n10),label=above:$U$] {};
% set V
\node [mygreen,fit=(n23) (n20),label=above:$V$] {};
% links
\draw[->, shorten >=1mm, shorten <=1mm]
(n14) edge (n23)
(n13) edge (n23) (n13) edge (n22)
(n12) edge (n21) (n12) edge (n20)
(n11) edge (n22)
(n10) edge (n23) (n10) edge (n20);
\end{tikzpicture}
\end{document}