TikZ 新手在绘制稍微复杂的图表时遇到的问题

TikZ 新手在绘制稍微复杂的图表时遇到的问题

我需要一大堆图像,有人建议我使用 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}

在此处输入图片描述

评论:

这里,我针对问题中明确提到的问题谈几点看法。

  1. 为了处理不同类型的\nodes,建议定义样式(正如您已经做的那样)。请注意,该petri库为您提供了一些预定义的有用样式(我使用过placetokensautomata该库还可用于其他类型的图表。

  2. 要将文本放在边缘的不同位置,您可以使用

    node[pos=<value>,<position>] {text} 
    

    沿着路径,就像我在示例中所做的那样。阅读手册以查看其他可能有用的选项,例如near endnear start等。同样的构造允许您沿着边缘放置一个“框”(绘制的节点),带或不带文本。

  3. 要在节点附近显示文本,您可以使用label键(再次参考手册)或强大的quotes库(后者需要 3.0 版本)。

  4. 为了让边缘有一些箭头尖(或其他类型的装饰),TikZ 为您提供了一系列装饰;特别是,在这里我使用decorations.markings library将箭头尖放置在一条路径上的不同位置。

相关内容