假设我有一个绘制流程图的代码,我现在想要一个从节点 3 到节点 1 的箭头,我该怎么做?
1<--|
| |
2 |
| |
3----
平均能量损失
\documentclass[class=article,border=0pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
% Define block styles
\tikzset{
block/.style={rectangle, draw, line width=0.5mm, black, text width=5em, text centered,
rounded corners, minimum height=2em},
line/.style={draw, -latex}
}% <- if you insist in using this in the document add this % here.
\begin{document}
\begin{tikzpicture}[node distance = 1cm, auto]
% Place nodes
\node [block] (BLOCK1) {a};
\node [block, below of=BLOCK1] (BLOCK2) {b};
\node [block, below of=BLOCK2, node distance=1cm] (BLOCK3) {c};
% Draw edges
\path [line] (BLOCK1) -- (BLOCK2);
\path [line] (BLOCK2) -- (BLOCK3);
\end{tikzpicture}
\end{document}
答案1
您只需添加一行即可:
\path [line] (BLOCK3) --++ (2cm,0cm) |- (BLOCK1);
此路径从BLOCK3
节点开始。然后它移动--
到 ( ) 具有坐标的点(2cm,0cm)
相对的到该点;因此其中一个+
s。第二个+
将结果点作为新的参考点。如果没有它,路径的下一部分仍将“从”绘制BLOCK3
。
下一个路径描述|-
绘制一条直角路径(先垂直,然后水平)到BLOCK1
。如果我们改用,-|
它将先水平,然后垂直。并不是您想要的;我只是为了清楚起见才将其包括在内。
答案2
A此答案的先前版本解释了paths.ortho
图书馆在我pgf
在 GitHub 上的仓库。图书馆现在是我的一部分tikz-ext
包裹应该使用它(并且有一个适当的手册)。
图书馆ext.paths.ortho
提供
- 路径操作
r-ud
、r-rl
和,r-du
它们r-lr
可以像--
或-|
例如 和 - 键
udlr distance
以及每个运算符的一个<operator> distance
,用于设置线的中间部分和最近节点之间的距离。
|-
此外,节点/坐标可以放置在任何位置。与和运算符类似-|
,角点位于0.25
和0.75
;这可以设置为和1/<n>
,即使用将角设置在和。默认值为。(<n>-1)/<n>
pacing=<n>
spacing=3
0.3333
0.6667
4
还有布尔值,分别设置和处only middle
的角点。0
1
更多解释见我的答案到pgf-tikz 中的垂直线和水平线。
在您的示例中,加载库后您需要做的就是
\path [line] (BLOCK3) r-rl (BLOCK1);
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning, ext.paths.ortho}
\tikzset{
block/.style={rectangle,draw,minimum size=1cm},
line/.style={draw, -latex},
}
\begin{document}
\begin{tikzpicture}[node distance = 1cm, auto]
% Place nodes
\node [block] (BLOCK1) {a};
\node [block, below= of BLOCK1] (BLOCK2) {b};
\node [block, below=2cm of BLOCK2, node distance=1cm] (BLOCK3) {c};
% Draw edges
\path [line] (BLOCK1) -- (BLOCK2);
\path [line] (BLOCK2) -- (BLOCK3);
\path [line] (BLOCK3) r-rl (BLOCK1);
\end{tikzpicture}
\begin{tikzpicture}[
node distance = 1cm,
/utils/temp/.style={#1/.style={to path={r-#1(\tikztotarget)\tikztonodes}}},
/utils/temp/.list={ud, rl, du, lr}]
\node [block] (a) {a};
\node [block, below=of a] (b) {b};
\node [block, right=of a] (c) {c};
\node [block, below=of c] (d) {d};
\path[line, very thick] (a) edge[ud] (c)
(c) edge[rl] (d)
(d) edge[du] (b)
(b) edge[lr] (a);
\path[line, green, thick, ortho/udlr distance=0.25cm] (a) edge[du] (c)
(c) edge[lr] (d)
(d) edge[ud] (b)
(b) edge[rl] (a);
\draw[red] (a) r-ud (c) r-rl (d) r-du (b) r-lr (a);
\end{tikzpicture}
\end{document}
输出 1
答案3
其中一种方法是访问east
锚点,在那里应用xshift
并绘制形式:
笔记:
- 根据 Matthew Leingang 的回答,也有语法
|-
,但我总是必须查找或反复试验才能正确。
代码:
\documentclass[class=article,border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
% Define block styles
\tikzset{
block/.style={rectangle, draw, line width=0.5mm, black, text width=5em, text centered, rounded corners, minimum height=2em},
line/.style={draw, -latex}
}% <- if you insist in using this in the document add this % here.
\begin{document}
\begin{tikzpicture}[node distance = 1cm, auto]
% Place nodes
\node [block] (BLOCK1) {a};
\node [block, below of=BLOCK1] (BLOCK2) {b};
\node [block, below of=BLOCK2, node distance=1cm] (BLOCK3) {c};
% Draw edges
\path [line] (BLOCK1) -- (BLOCK2);
\path [line] (BLOCK2) -- (BLOCK3);
\path [line, red, thick] (BLOCK3.east) --
([xshift=0.5cm]BLOCK3.east) --
([xshift=0.5cm]BLOCK1.east) --
(BLOCK1.east);
\end{tikzpicture}
\end{document}
答案4
PSTricks 解决方案:
\documentclass{article}
\usepackage{multido}
\usepackage{pstricks}
\usepackage{xfp}
% horizontal width of ``back to start'' arrow
\def\arrow{1}
% \diagram[<box width>,<box height>](<number of boxes>){<box separation>}
\def\diagram[#1,#2](#3)#4{%
\begin{pspicture}(\fpeval{#1+\arrow},\fpeval{#3*#2+(#3-1)*#4})
\multido{\rA = 0+\fpeval{#2+#4},
\rB = \fpeval{#2/2}+\fpeval{#2+#4},
\i = #3+-1}{#3}{%
\psframe[framearc = 0.3](0,\rA)(#1,\fpeval{\rA+#2})
\rput(\fpeval{#1/2},\rB){$\i$}}
\multido{\r = #2+\fpeval{#2+#4}}{\fpeval{#3-1}}{%
\psline{<-}(\fpeval{#1/2},\r)(\fpeval{#1/2},\fpeval{\r+#4})}
\psline{->}%
(#1,\fpeval{#2/2})%
(\fpeval{#1+\arrow},\fpeval{#2/2})%
(\fpeval{#1+\arrow},\fpeval{(#3-0.5)*#2+(#3-1)*#4})%
(#1,\fpeval{(#3-0.5)*#2+(#3-1)*#4})
\end{pspicture}}
\begin{document}
\diagram[2.2,1](4){0.5} \qquad
\diagram[1.5,2](3){0.3} \qquad
\diagram[2.5,1](5){0.7}
\end{document}