you can create a node at each end of the lines and then connect these nodes. by adjusting the minimum size of node you can improve aesthetics.
(sorry for my google english)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows,decorations.pathmorphing,backgrounds,positioning,fit,petri,calc,shadows}
\begin{document}
\begin{tikzpicture}[
parent/.style={%
rounded corners,
thick,
draw=red!75,
fill=red!20,
thick,
inner ysep=2pt,
inner xsep=2pt,
minimum width = 4cm,
minimum height = 1.5cm,
align=center
},
child/.style={%
rounded corners,
thick,
draw=blue!90,
fill=blue!35,
thick,
inner ysep=2pt,
inner xsep=2pt,
minimum width = 4cm,
minimum height = 1.5cm,
align=center
},
grandchild/.style={%
rounded corners,
thick,
draw=green!90,
fill=green!35,
thick,
inner ysep=2pt,
inner xsep=2pt,
minimum width = 4cm,
minimum height = 1.5cm,
align=center
},
line/.style={%
semithick,
->,
shorten >=1pt,
>=stealth'
},
call/.style={%
blue,
semithick,
->,
shorten >=1pt,
>=stealth'
},
return/.style={%
red,
semithick,
->,
shorten >=1pt,
>=stealth'
}]
\node[child] (child) {Child};
\node[parent] at (-6,3) (parent 1) {Node 1\\I have manually\\connected this one};
\node[parent] at (0,3) (parent 2) {Node 2\\I have manually\\connected this one};
\node[parent] at (6,3) (parent 3) {Node 3\\I have manually\\connected this one};
\node[parent] at (-6,-3) (grandchild 1) {Node 4\\I have manually\\connected this one};
\node[parent] at (0,-3) (grandchild 2) {Node 5\\I have NOT manually\\connacted this one};
\node[parent] at (6,-3) (grandchild 3) {Node 6\\I have NOT manually\\connacted this one};
%draw three lines from each parent to each child
\draw [line] (parent 1.south east)node[above left](p1){} -- (child.north west)node[below right](c1){};
\draw [line] (parent 2.south)node[above](p2){} -- (child.north)node[below](c2){};
\draw [line] (parent 3.south west)node[above right](p3){} -- (child.north east) node[below left](c3){};
%draw three lines from each parent to each child
\draw [line] (grandchild 1.north east)node[below left,minimum size=2em](p4){} -- (child.south west)node[above right,minimum size=2em](c4){};
\draw [line] (grandchild 2.north)node[below,minimum size=2em](p5){} -- (child.south)node[above,minimum size=2em](c5){};
\draw [line] (grandchild 3.north west)node[below right](p6){} -- (child.south east)node[above left](c6){};
\foreach \nn in{1,2,3,4,5,6}{
\draw [call] (p\nn) to [bend right=15] (c\nn);
\draw [return] (c\nn) to [bend right=15] (p\nn);
}
\end{tikzpicture}
\end{document}!
(I feel certain that I've answered a similar question before, but I can't find it now.)
One solution is simply to change the order in which you draw things. Since the token list
node's position should depend on the length of the lexical analysis
node, draw the lexical analysis
one first.
\documentclass{article}
%\url{http://tex.stackexchange.com/q/46842/86}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node [rectangle,draw] (a) {source program};
\node[above right] at (a.east) (l) {lexical analysis};
\draw[->] (l.south west) -- (l.south east);
\node [rectangle,draw,right] at (l.south east) (b) {token list};
\end{tikzpicture}
\end{document}
To put the lexical analysis
and the node
commands in the same command, you could write
\draw[->] node [
above right,
append after command={
(\tikzlastnode.south west) -- (\tikzlastnode.south east)
}
] at (a.east) (l) {lexical analysis};
Result:
Best Answer
Three suggestions:
You could add it relative to another node, for example
This requires
\usetikzlibrary{positioning}
.You could place it relative to the current bounding box:
With this method you have to place the above line at the very end of the
tikzpicture
.You could specify the position. I think
(0,0)
is the default position for a node without coordinates, so yourstart
node is probably in(0,0)
. Hence, you could doto place it two units to the right, and one unit above, the
start
node.