通常,在绘制框图时,我想向具有垂直线的节点添加“输入”(如下图所示,用红色绘制)。
有没有一种方法可以不使用 calc 等,以稳健的方式实现这一点?理想情况下,我想使用类似的东西\draw (input) -| (node)
。
\begin{tikzpicture}
\node[draw,minimum height=4cm,minimum width=1cm] (node) at (0,0) {ABC};
\draw[->] (-2,1) node[anchor=east] {Some input 1} -- (node);
\draw[->,red] (-2,-1) node[anchor=east] {Some input 2} -- +(1.5,0);
\end{tikzpicture}
答案1
您可以使用-|
和|-
运算符来形成坐标。在这里,您可以提供是通过将包含n.east
的节点命名为 来明确指定值。另一种方法是使用路径操作,它会自动设置为操作的起始坐标:Some input 2
n
to
\tikztostart
to
\documentclass[tikz, border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}
\node[draw, minimum height=4cm, minimum width=1cm] (node) at (0,0) {ABC};
\draw[->] (-2,1) node[anchor=east] {Some input 1} -- (node);
\draw[->, red] (-2,-1) node[anchor=east] {Some input 2}
to (\tikztostart -| node.west);
\end{tikzpicture}
\end{document}
为了回应一些评论,以下内容表明该问题不是用“一般形状”明确定义的:
\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{calc, shapes.misc}
\begin{document}
\begin{tikzpicture}
\node[draw, minimum height=2cm,
rounded rectangle, rounded rectangle west arc=concave] (n) {Some stuff};
\node[circle, inner sep=1.5pt] (foo) at (n.west) {foo};
\draw[red!60!black, ->]
let \p1=($(n.north)-(n.center)$) in
(foo) foreach \angle in {-90, -75, ..., 90} { edge +(\angle:\y1) };
\end{tikzpicture}
\end{document}
但是如果?
那么,你有一个旋转的矩形节点,还想玩吗?Ti钾Zcalc
库可以正交投影一个点页在线上(ab)语法如下($(a)!(p)!(b)$)
:
\documentclass[tikz, border=1mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node[draw, rotate=30] (n) {Some stuff};
\node[draw] (foo) at (-1,0.5) {foo bar};
\foreach \anch in {270, 300, 320, 330, 337, 350} {
\draw[very thin, ->] (foo.\anch) --
($(n.north west)!(foo.\anch)!(n.north east)$);
}
\end{tikzpicture}
\end{document}
答案2
作为对 frougon 非常好的回答的补充,如果你不想使用宏\tikztostart
(这是完全没问题的),你也可以命名包含的节点一些输入 2(此处为aux
)并在构造相交点 时使用此名称(aux-|node.west)
。这在绘制多条折线时有时很有用。
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}
\node[draw,minimum height=4cm,minimum width=1cm] (node) at (0,0) {ABC};
\draw[->] (-2,1) node[anchor=east] {Some input 1} -- (node);
\draw[->,red] (-2,-1) node[anchor=east] (aux) {Some input 2} -- (aux-|node.west);
\end{tikzpicture}
\end{document}
输出是一样的。
答案3
这是一个愚蠢的答案:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[draw,circle, minimum height=4cm,minimum width=1cm] (node) at (0,0) {ABC};
\draw[<-] (node.120) -- +(-2,0) node[anchor=east] {Some input 1};
\draw[<-] (node.150) -- +(-2,0) node[anchor=east] {Some input 2};
\draw[<-] (node.190) -- +(-2,0) node[anchor=east] {Some input 3};
\draw[<-] (node.240) -- +(-2,0) node[anchor=east] {Some input 4};
\end{tikzpicture}
\end{document}
即使“ABC”节点不是矩形,这种方法也是有效的。——但巨大的问题是输入节点的位置不是由明确的坐标设置的。