我需要一大堆图像,有人建议我使用 Tikz,它似乎可以满足我的要求,但是我找不到一些东西,我感觉我在用拙劣的方式拼凑代码。我在 Paint 中制作了我想要的示例:
它基本上是一个具有不同类型节点、边缘末端的文本、不同类型的箭头的图表,其中一些箭头中间有一个框,框内可能有或可能没有文本,以及节点附近的文本标签。
我目前有的是:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\begin{document}
\begin{tikzpicture}[narray/.style={circle,fill=white,draw},node distance=3cm,
norm/.style={circle,fill=black,draw,minimum size=0.2cm}]
\node[narray] (q1) {\tikz\draw[black, fill=black] (0,0) circle (.7ex);} ;
\node[norm] (p1) [right of=q1] {};
\path
(q1) edge [->,>=latex',thick] node[above] {A} (p1);
\end{tikzpicture}
\end{document}
这使得
我觉得使用标签绘制内圆是错误的方法,我不知道如何将文本放到那里并制作我需要的其他类型的箭头。有人能给我指出正确的方向吗?
答案1
你走在正确的轨道上;然而,你的代码还可以做一些改进;最重要的是,嵌套 tikzpictures 并不总是最好的选择;事实上,就当前的情况而言,它根本没有必要。
以下是使用该petri
库的一种可能性:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows,petri,positioning,decorations.markings}
\begin{document}
\begin{tikzpicture}[
node distance=3cm,
norm/.style={
circle,
fill=black,
draw,
minimum size=0.2cm
},
>= latex
]
\node[place,tokens=1,label={80:$n$}] (p1) {} ;
\node[norm,below right=of p1] (q1) {};
\node[place,tokens=1,above right=of q1,label={80:$m$}] (p2) {} ;
\draw[->]
(p1) --
(p2)
node[pos=0.15,above] {$[2..3]$}
node[pos=0.85,above] {$[1..2]$}
;
\draw[->]
(p1) --
(q1)
node[pos=0.05,below=6pt] {$[4]$}
node[midway,draw,fill=white] {$t$}
;
\begin{scope}[decoration={
markings,
mark=at position 0.15 with {\arrow{>}},
mark=at position 0.9 with {\arrow{<}}
}
]
\draw[-,postaction=decorate]
(p2) --
(q1)
;
\end{scope}
\end{tikzpicture}
\end{document}
评论:
这里,我针对问题中明确提到的问题谈几点看法。
为了处理不同类型的
\node
s,建议定义样式(正如您已经做的那样)。请注意,该petri
库为您提供了一些预定义的有用样式(我使用过place
)tokens
。automata
该库还可用于其他类型的图表。要将文本放在边缘的不同位置,您可以使用
node[pos=<value>,<position>] {text}
沿着路径,就像我在示例中所做的那样。阅读手册以查看其他可能有用的选项,例如
near end
,near start
等。同样的构造允许您沿着边缘放置一个“框”(绘制的节点),带或不带文本。要在节点附近显示文本,您可以使用
label
键(再次参考手册)或强大的quotes
库(后者需要 3.0 版本)。为了让边缘有一些箭头尖(或其他类型的装饰),TikZ 为您提供了一系列装饰;特别是,在这里我使用
decorations.markings library
将箭头尖放置在一条路径上的不同位置。