我是 Tikz 新手。请帮帮我。我对使用 below of 和 above of 样式感到困惑。
我试过了。MWE 如下。我希望图形类似于下图所示。
\documentclass[conference]{IEEEtran}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{shapes,arrows}
\begin{document}
\begin{figure}[h]
\centering
% Define block styles
\tikzstyle{block} = [rectangle, draw, fill=blue!20, text width=5em, text centered, minimum height=4em]
\tikzstyle{line} = [draw, -latex']
\begin{tikzpicture}[node distance = 2cm, auto]
% Place nodes
\node [block] (soa) {ST};
\node [block] (slt) {slyt};
\node [block] (sclt) {sclt};
\node [block] (gt) {governance testing};
\node [block] (ilt) {ilt};
\node [block] (olt) {olt};
\node [block] (slt1) {slt1};
% Draw edges
\draw [->] (soa) -- (slt);
\draw [->] (soa) -- (slt1);
\draw[->] (soa) -| (gt);
\end{tikzpicture}
\caption{Testing Domains.}
\label{f1}
\end{figure}
\end{document}
答案1
编辑:
使用该库,您可以根据需要positioning
调整节点之间的距离(或特定节点坐标,例如.south
、等)。这里我定义了相对于节点 的所有距离,但当然定义其他节点之间的距离可能更简单。.north
soa
这是生成所需框图的代码。我\tikzstyle
用更好的命令替换了这些命令\tikzset
(参见应该使用 \tikzset 还是 \tikzstyle 来定义 TikZ 样式?),并稍微重新整理了代码。
\documentclass[conference]{IEEEtran}
\usepackage[a4paper]{geometry}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{shapes,arrows}
% Define block styles
\tikzset{block/.style={rectangle,draw,fill=blue!20,text width=5em, text centered, minimum height=4em},
line/.style={draw,-latex'}}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[node distance = 2cm, auto]
% Place nodes
\node [block] (soa) {ST};
\node [block,below left=2cm and 3cm of soa] (gt) {Governance Testing};
\node [block,below left=4cm and 1cm of soa] (slt) {SLT};
\node [block,below=5cm of soa] (sclt) {SCLT};
\node [block,below right=5cm and 1cm of soa] (ilt) {Ilt};
\node [block,below right=4cm and 4cm of soa] (olt) {olt};
\node [block,below right=2cm and 6cm of soa] (slt1) {slt1};
% Draw edges
\draw [->] (soa.south) --++ (0,-1) -| (slt.north);
\draw[->] (soa.south) --++ (0,-1) -| (gt.north);
\draw[->] (soa.south) --++ (0,-1) -| (ilt.north);
\draw[->] (soa.south) --++ (0,-1) -| (sclt.north);
\draw[->] (soa.south) --++ (0,-1) -| (olt.north);
\draw [->] (soa.south) --++ (0,-1) -| (slt1.north);
\end{tikzpicture}
\caption{Testing Domains.}
\label{f1}
\end{figure}
\end{document}
旧答案:
这里有一个代码可以帮助您入门。我没有使用电脑,所以现在无法正确回答。
但是,您可以使用positioning
已经加载的库:
\documentclass[conference]{IEEEtran}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{shapes,arrows}
\begin{document}
\begin{figure}[h]
\centering
% Define block styles
\tikzstyle{block} = [rectangle, draw, fill=blue!20, text width=5em, text centered, minimum height=4em]
\tikzstyle{line} = [draw, -latex']
\begin{tikzpicture}[node distance = 2cm, auto]
% Place nodes
\node [block] (soa) {ST};
\node [block,below left=4cm and 1cm of soa] (slt) {slyt};
\node [block,below=5cm of soa] (sclt) {sclt};
\node [block,below left=2cm and 3cm of soa] (gt) {governance testing};
\node [block,below right=5cm and 1cm of soa] (ilt) {ilt};
\node [block] (olt) {olt};
\node [block] (slt1) {slt1};
% Draw edges
\draw [->] (soa.south) --++ (0,-1) -| (slt.north);
\draw [->] (soa.south) -- (slt1);
\draw[->] (soa.south) --++ (0,-1) -| (gt);
\draw[->] (soa.south) --++ (0,-1) -| (ilt);
\draw[->] (soa.south) --++ (0,-1) -| (sclt);
\end{tikzpicture}
\caption{Testing Domains.}
\label{f1}
\end{figure}
\end{document}
答案2
另一种解决方案是matrix
使用库:
\documentclass[conference]{IEEEtran}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, matrix, positioning}
\begin{document}
\begin{figure}[h]
\centering
\begin{tikzpicture}
% nodes
\matrix (m) [matrix of nodes,
%nodes in empty cells,
nodes={draw, minimum width=4em, minimum height=1em, inner sep=2mm},
row sep = 4ex, column sep= 1ex]
{
& & ST & & & \\
GT & & & & & SLTI \\
& SLT & & & OLT & \\
& & SCLT & IT & & \\
};
% auxiliary coordinate
\coordinate[below=2ex of m-1-3.south] (a);
% edges
\draw (m-1-3) -- (a)
(m-2-1 |- a) -- (a -| m-2-6);
\draw[-Straight Barb] (a -| m-2-1) edge (m-2-1)
(a -| m-2-6) edge (m-2-6)
(a -| m-3-2) edge (m-3-2)
(a -| m-3-5) edge (m-3-5)
(a -| m-4-3) edge (m-4-3)
(a -| m-4-4) to (m-4-4);
\end{tikzpicture}
\caption{Testing Domains.}
\label{f1}
\end{figure}
\end{document}
附录: 考虑到图像无需任何缩放即可适应列宽,第一行和第二行之间的距离更大并且稍微更“花哨”:
\documentclass[conference]{IEEEtran}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, calc, matrix, shadows}% changed
\usepackage{lipsum}% added for simulating text in document
\begin{document}
\lipsum[1]% added, don't use in real document
\begin{figure}[ht]
\centering
\begin{tikzpicture}
% nodes
\matrix (m) [matrix of nodes,
nodes={draw, fill=white, drop shadow,% changed
minimum width=3.5em, inner ysep=2mm},% changed
row sep = 1ex, column sep = 1.5ex,% changed (reduced)
]
{
& & ST & & & \\[5ex]% added [5ex]
GT & & & & & SLTI \\
& SLT & & & OLT & \\
& & SCLT & IT & & \\
};
% auxiliary coordinate
\path (m-1-3.south) -- coordinate (a) (m-1-3.south |- m-2-1.north);% changed
% edges
\draw (m-1-3) -- (a)
(m-2-1 |- a) -- (a -| m-2-6);
\draw[-Straight Barb] (a -| m-2-1) edge (m-2-1)
(a -| m-2-6) edge (m-2-6)
(a -| m-3-2) edge (m-3-2)
(a -| m-3-5) edge (m-3-5)
(a -| m-4-3) edge (m-4-3)
(a -| m-4-4) to (m-4-4);
\end{tikzpicture}
\caption{Testing Domains.}
\label{f1}
\end{figure}
\lipsum% added, don't use in real document
\end{document}
与第一个 MWE 相比,上述 MWE 中的变化已在代码中用注释进行了标注。