如何在 TikZ 中创建以下图形 - 第 2 部分

如何在 TikZ 中创建以下图形 - 第 2 部分

这是问题的第二部分如何在 TikZ 中创建以下图形

我想用 TikZ 创建下图。

\documentclass[tikz,border=5pt]{standalone}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
%
\usepackage{tikz}
\usetikzlibrary{matrix,positioning-plus}


\begin{document}
\begin{tikzpicture}[
kreis/.style={circle,draw,minimum width=20pt},
every node/.style={align=center}]

\matrix(mat)[row sep=10pt, column sep=60pt] at (0,0) {
\node[kreis](k1) {}; &
\node[kreis](k2) {}; &
\node[kreis](k3) {}; &
\node[kreis](k4) {}; &
\node[kreis](k5) {}; &
\node[kreis](k6) {}; \\
};

 \draw[-latex] (k1) -- (k2);
 \draw[-latex] (k2) -- (k3);
 \draw[-latex] (k3) -- (k4);
 \draw[-latex] (k4) -- (k5);
 \draw[-latex] (k5) -- (k6);

\node [below,text width=2.5cm,font=\small] at (k1.south) {Text 1};
\node [below,text width=2.5cm,font=\small] at (k2.south) {Text 2};
\node [below,text width=2.5cm,font=\small] at (k3.south) {Text 3};
\node [below,text width=2.5cm,font=\small] at (k4.south) {Text 4};
\node [below,text width=2.5cm,font=\small] at (k5.south) {Text 5};
\node [below,text width=2.5cm,font=\small] at (k6.south) {Text 6};

\node (n1) [above=of k1] {};
\node (n2) [above=of k2] {};
\node (n3) [above=of k3] {};
\node (n4) [above=of k4] {};
\node (n5) [above=of k5] {};
\node (n6) [above=of k6] {};


 \draw[latex-latex] (n1) -- (n2) node[midway,above] {Text 7};
 \draw[latex-latex] (n2) -- (n3) node[midway,above] {Text 8};
 \draw[latex-latex] (n3) -- (n4) node[midway,above] {Text 9};
 \draw[latex-latex] (n4) -- (n5) node[midway,above] {Text 10};
 \draw[latex-latex] (n5) -- (n6) node[midway,above] {Text 11};

\node (m1) [above=of n1] {};
\node (m5) [above=of n5] {};
\node (m6) [above=of n6] {};


 \draw[latex-latex] (m1) -- (m5) node[midway,above] {Text 12};
 \draw[latex-latex] (m5) -- (m6) node[midway,above] {Text 13};

\node (k1) [above=of m1] {};
\node (k6) [above=of m6] {};

 \draw[latex-latex] (k1) -- (k6) node[midway,above] {Text 14};

\end{tikzpicture}
\end{document}

实际上我存在以下问题:

  1. 圆圈上方的箭头太短了,我该如何调整它们?
  2. 箭头上方的文字没有垂直居中,我该怎么办?
  3. 我怎样才能添加如上图所示的垂直线?

另一个问题属于发布,我如何快速生成并呈现我的代码的图片?

答案1

对于(1)coordinate,定义不占用空间的 s可能比定义node占用空间的 s 更好。加载calc库将允许您计算1cm节点正上方的坐标(k1)

\coordinate(n1)at($(k1)+(0,1cm)$);

对于(2),而不是node[midway,above]{...}使用node[midway,anchor=base,yshift=1ex]{...}。或者,您可以将节点分组为一个scope并设置

\begin{scope}[every node/.append style={anchor=base,yshift=1ex}]
 \draw[latex-latex] (n1) -- (n2) node[midway,] {Text 7};
 \draw[latex-latex] (n2) -- (n3) node[midway,] {Text 8};
 \draw[latex-latex] (n3) -- (n4) node[midway,] {Text 9};
 \draw[latex-latex] (n4) -- (n5) node[midway,] {Text 10};
 \draw[latex-latex] (n5) -- (n6) node[midway,] {Text 11};
\end{scope}

对于(3),加载arrows库,添加

>=latex

tikzpicture选项,并将选项传递|<->|\draw(而不是latex-latex):

\draw[|<->|] (n2) -- (n3) node[midway,above] {Text 8};

完整代码

\documentclass[tikz,border=5pt]{standalone}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
%
\usepackage{tikz}
\usetikzlibrary{matrix,positioning,arrows,calc}


\begin{document}
\begin{tikzpicture}[
kreis/.style={circle,draw,minimum width=20pt},
every node/.style={align=center},
>=latex,
]

\matrix(mat)[row sep=10pt, column sep=60pt] at (0,0) {
\node[kreis](k1) {}; &
\node[kreis](k2) {}; &
\node[kreis](k3) {}; &
\node[kreis](k4) {}; &
\node[kreis](k5) {}; &
\node[kreis](k6) {}; \\    };

 \draw[->] (k1) -- (k2);
 \draw[->] (k2) -- (k3);
 \draw[->] (k3) -- (k4);
 \draw[->] (k4) -- (k5);
 \draw[->] (k5) -- (k6);

\node [below,text width=2.5cm,font=\small] at (k1.south) {Text 1};
\node [below,text width=2.5cm,font=\small] at (k2.south) {Text 2};
\node [below,text width=2.5cm,font=\small] at (k3.south) {Text 3};
\node [below,text width=2.5cm,font=\small] at (k4.south) {Text 4};
\node [below,text width=2.5cm,font=\small] at (k5.south) {Text 5};
\node [below,text width=2.5cm,font=\small] at (k6.south) {Text 6};

\foreach \i in {1,...,6}
\coordinate(n\i)at($(k\i)+(0,1cm)$);

\foreach \j in {1,5,6}
\coordinate(m\j)at($(n\j)+(0,1cm)$);

\foreach \k in {1,6}
\coordinate(k\k)at($(m\k)+(0,1cm)$);


\begin{scope}[every node/.append style={anchor=base,yshift=1ex}]
 \draw[|<->|] (n1) -- (n2) node[midway] {Text 7};
 \draw[|<->|] (n2) -- (n3) node[midway] {Text 8};
 \draw[|<->|] (n3) -- (n4) node[midway] {Text 9};
 \draw[|<->|] (n4) -- (n5) node[midway] {Text 10};
 \draw[|<->|] (n5) -- (n6) node[midway] {Text 11};

 \draw[|<->|] (m1) -- (m5) node[midway] {Text 12};
 \draw[|<->|] (m5) -- (m6) node[midway] {Text 13};

 \draw[|<->|] (k1) -- (k6) node[midway] {Text 14};
\end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

有了这样一个规则的结构(一旦你知道如何做),我认为只需一个就可以更轻松地创建nodes和。使用和选项,您可以避免一些键入和混合和节点。甚至节点下的文本也可以包含在 中。之后,只需在已创建的参考点之间绘制箭头即可。coordinatesmatrixrow #/.stylenodes in empty cellscoordinateskreiskreisnodes' labels

\documentclass[tikz,border=5pt]{standalone}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
%
\usetikzlibrary{matrix,arrows}

\begin{document}

\begin{tikzpicture}[
    kreis/.style={circle,draw,minimum width=20pt},
    every node/.style={align=center},
    >=latex,
]

\matrix(mat)[row sep=7mm, column sep=10pt, matrix of nodes,
             nodes={coordinate},
             row 4/.style={nodes={kreis},
                 every label/.style={rectangle, draw=none, font=\small,
                         text width=2.5cm,align=center}}, 
             nodes in empty cells] 
{
  & & & & & & \\
  & & & & & & \\
  & & & & & & \\[-2mm]    
|[label=below:Text 1]|&
|[label=below:Text 2]|&
|[label=below:Text 3]|&
|[label=below:Text 4]|&
|[label=below:Text 5]|&
|[label=below:Text 6]|\\
};

\foreach \i/\k [count=\j] in {2/Text 7, 3/Text 8, 4/Text 9,
                                    5/Text 10, 6/Text 11}
{
    \draw[->] (mat-4-\j)--(mat-4-\i);
    \draw[|<->|] (mat-3-\j)--(mat-3-\i) node[above,midway]{\k};
}

\draw[|<->|] (mat-2-1) -- (mat-2-5) node[above,midway] {Text 12};
\draw[|<->|] (mat-2-5) -- (mat-2-6) node[above,midway] {Text 13};

\draw[|<->|] (mat-1-1) -- (mat-1-6) node[above,midway] {Text 14};

\end{tikzpicture}
\end{document}

在此处输入图片描述

笔记:

中的labels和存在问题。需要name。 此错误已在版本中解决,但 v2.10 的解决方法已在中提出。nodesTiKZ v2.10label nodenodecvs使用TikZ的矩阵库绘制链表的一些问题。它包括name=none在标签选项中使用。您可以看到它是如何工作的:

\matrix(mat)[row sep=7mm, column sep=10pt, matrix of nodes,
             nodes={coordinate},
             row 4/.style={nodes={kreis},
                 every label/.style={rectangle, draw=none, font=\small,
                         text width=2.5cm,align=center}}, 
             nodes in empty cells] 
{
  & & & & & & \\
  & & & & & & \\
  & & & & & & \\[-2mm]    
|[label=below:Text 1]|&
|[label=below:Text 2]|&
|[label=below:Text 3]|&
|[label={[name=none]below:Text 4}]|&
|[label={[name=none]below:Text 5}]|&
|[label={[name=none]below:Text 6}]|\\
};

在此处输入图片描述

编辑:现在,使用版本TikZ 3.0.1a上面的代码可以得到预期的结果:

在此处输入图片描述

相关内容