我想画一条直线,离开正方形 D 的左下方端点。
我的代码如下
\documentclass{report}
\usepackage{tikz}
\begin{document}
\begin{figure}
\begin{tikzpicture}[node distance=4cm]
\usetikzlibrary{shapes}
\node[regular polygon,regular polygon sides=4,scale=3,dashed,draw](D) {$D$};
\node[draw, right of=D,yshift=1cm, node distance=6cm](G){G};
\node[right of=D, yshift=1cm, node distance =3.5cm] (ygets) {$y \gets U_{2n}$};
\node[right of=D, yshift=-1.22cm, node distance=2.5cm](vazio){};
\node[above of=G, node distance=1cm] (k) {$k \gets U_n$};
\path[draw,->] (G.south) |- (D.east);
\path[draw,->] (k.south) -- (G.north);
\path[draw,->] (ygets.south) |- node[near end, above]{$y$} (D.east);
\path[draw,->] (D.south east) -- node[above] {b} (vazio);
\end{tikzpicture}
\end{figure}
\end{document}
得出的结果是
关于如何做到这一点有什么提示或技巧吗?
答案1
你有两种方法:
\draw[->] (D.south east) -- ++(2,0) node[above,midway] {b};
这个从 开始D.south east
,水平方向进行2
(或任何你想要的数字,它也会采取措施,比如1cm
)并0
垂直进行,所以它向右移动。然后你有
\draw[->] (D.south east) -- (D.south east-|k);
这个命令从同一点开始,一直到节点k
,但仍然是水平移动,然后停止。您决定采用哪种解决方案取决于具体情况。顺便说一句,写成\draw
而不是\path[draw]
更简单,第一个命令实际上是第二个命令的简短版本。
答案2
还有其他方法:
而不是您现有的定义vazio
,而是将其定义为
\coordinate[right=1.5cm of D.south east] (vazio);
该语法right=<len> of ...
需要positioning
库,因此您必须将其添加\usetikzlibrary{positioning}
到序言中。请注意,right=of
建议使用 而不是right of=
,请参阅PGF/TikZ 中“right of=”和“right=of”之间的区别
一个稍微复杂一点的方法,如果D
旋转了也能工作,就是加载calc
库,然后说
\draw[->] (D.south east) -- node[above] {b} ($(D.south west)!1.6!(D.south east)$);
值1.6
可以调整为有用的值。坐标($(D.south west)!1.6!(D.south east)$)
是 下角两角连线上的点,D
该点距离 是两角间距离的 1.6 倍D.south west
。
下面是输出和完整代码。此处添加了两种替代方案,因此图像中有两个箭头。
\documentclass{report}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{figure}
\begin{tikzpicture}[node distance=4cm]
\usetikzlibrary{shapes}
\node[regular polygon,regular polygon sides=4,scale=3,dashed,draw](D) {$D$};
\node[draw, right of=D,yshift=1cm, node distance=6cm](G){G};
\node[right of=D, yshift=1cm, node distance =3.5cm] (ygets) {$y \gets U_{2n}$};
% option 1
\coordinate[right=1.5cm of D.south east] (vazio);
\node[above of=G, node distance=1cm] (k) {$k \gets U_n$};
\draw[->] (G.south) |- (D.east);
\draw[->] (k.south) -- (G.north);
\draw[->] (ygets.south) |- node[near end, above]{$y$} (D.east);
\draw[->] (D.south east) -- node[above] {b1} (vazio);
% option 2
\draw[->] (D.south east) -- node[below] {b2} ($(D.south west)!1.6!(D.south east)$);
\end{tikzpicture}
\end{figure}
\end{document}