Just to sum up the above comments and get future readers an overview about the discussed answers:
Prerequisites:
\usetikzlibrary{positioning}
Per node distance definition:
\node (id) [below left=<x-value> and <y-value> of <reference>] {<text>};
Global distance definition:
\begin{tikzpicture}[node distance=<x-value> and <y-value>]
\node (id) [below left=of <reference>] {<text>};
% ...
As is explained in How do I draw shapes inside a tikz node? pics
can be used for defining new objects. My main problem using pics is how to place where you want because they aren't nodes
and positioning them is not so easy.
Following code shows how to define EDFA
block.
EDFA/.pic={
\begin{scope}[scale=.5]
\draw (-1,0) coordinate (in) -- (-1,1) -- (1,0) coordinate (out) -- (-1,-1) -- cycle;
\node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
\end{scope}
In this case, coordinate (-1,0) will act as west
anchor and 1,0
as east. Both point will have an special name for further reference. Every pic
is placed according its own origin (0,0)
. You can use Claudio's answer to Anchoring TiKZ pics for better positioning.
As your example was simple, I'd prefer to star with EDFA
and place Source
and Sink
after it.
\documentclass[]{article}
% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning
\begin{document}
\tikzset{%
EDFA/.pic={
\begin{scope}[scale=.5]
\draw (-1,0) coordinate (in) -- (-1,1) -- (1,0) coordinate (out) -- (-1,-1) -- cycle;
\node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
\end{scope}
}
}
\begin{tikzpicture}[
block/.style={draw},
]
\draw pic (edfa) {EDFA};
\node[block, left=of edfain] (source) {Source};
\node[block, right= of edfaout] (sink) {Sink};
\draw[->] (source) -- (edfain);
\draw[->] (edfaout) -- (sink);
\end{tikzpicture}
\end{document}
I understand that your components are more complex than EDFA
because for this particular case an isosceles triangle
node with a label
will do the work and it can be used as a node
and not as a pic
:
\documentclass[]{article}
% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}[
block/.style={draw},
edfa/.style={isosceles triangle, minimum width=1cm,
draw, anchor=west, isosceles triangle stretches,
minimum height=1cm, label=-80:#1}
]
\node[block] (source) {Source};
\node[edfa=1, right=of source] (edfa) {};
\node[block, right= of edfa] (sink) {Sink};
\draw[->] (source) -- (edfa);
\draw[->] (edfa) -- (sink);
\end{tikzpicture}
\end{document}
Best Answer
Your example:
\draw (0,0) -- ++(1,0) -- ++(0,1)
means:(0,0)
.draw a line from the current point
(0,0)
to(0,0)+(1,0)
(vector addition) and move the current point to(0,0)+(1,0)
.next draw a line from the current point
(0,0)+(1,0)
to(0,0)+(1,0)+(0,1)
and move the current point to(0,0)+(1,0)+(0,1)
.Other examples are given as follows.
Remarks for TikZ:
\draw (110:2) -- +(0,-1);
The current point is(110:2)
. It draws a line from point(110:2)
to point(110:2)+(0,-1)
(vector addition). The current point is still at(110:2)
.\draw (110:2) -- ++(0,-1);
The current point is(110:2)
. It draws a line from point(110:2)
to point(110:2)+(0,-1)
(vector addition). The current point is moved to(110:2)+(0,-1)
.\draw (110:2) +(0,-1) -- +(0,1);
The current point is(110:2)
. It draws a line from point(110:2)+(0,-1)
to point(110:2)+(0,1)
. The current point is still at(110:2)
.\draw (110:2) ++(0,-1) -- +(0,1);
The current point is(110:2)+(0,-1)
. It draws a line from point(110:2)+(0,-1)
to point(110:2)+(0,-1)+(0,1)
. The current point is still at(110:2)+(0,-1)
.\draw (110:2) ++(0,-1) -- ++(0,1);
The current point is(110:2)+(0,-1)
. It draws a line from point(110:2)+(0,-1)
to point(110:2)+(0,-1)+(0,1)
. The current point is moved to(110:2)+(0,-1)+(0,1)
(which is equal to(110:2)
).Edit:
\draw (0,0) -- +(1,1) -- +(2,0)
meansthe current point is
(0,0)
.the first segment connecting
(0,0)
and(0,0)+(1,1)
.the current point is still
(0,0)
.the second segment connecting the previous point
(0,0)+(1,1)
and(0,0)+(2,0)
.The key is
A -- B
connectsA
andB
with a line no matter howA
andB
are defined.