
Soy nuevo en Tikz. Empecé a trabajar con él hoy y me encontré con algunas dificultades a las que no puedo encontrar solución. Estoy produciendo un diagrama de bloques basado en el ejemplo deEjemplo: principios del sistema de control. Intenté modificarlo según mis necesidades, donde agrego texto encima de los bloques, por ejemplo \node [above of=controller, node distance=1.2cm] (MP:1) {$MP_1$};
. No sé si esta es la forma correcta de hacerlo. Mi escenario ideal es conectar este texto con flechas hacia la izquierda y hacia la derecha con los pinstyles tin
y tout/tin
. Como no puedo darles un nombre, no puedo usar el comando, tin
no funcionará. Lo intenté insertando pero el resultado nuevamente no es correcto. Estaba revisando el manual de Tikz y de alguna manera encontré una solución a mi problema usando coordenadas como . El resultado nuevamente no es correcto.tout/tin
\draw [draw,->] (tin) -- node [name=line] {} (MP:1);
\draw [->, right of=MP:1, node distance=1.5cm] {};
\draw [<-] (20mm,10mm) -- (0mm,10mm);
Entonces, mi primera pregunta es el texto que estoy insertando, ¿es correcto para proporcionar un nombre al texto como referencia o hay una manera mejor? Mi segunda pregunta es, si estoy insertando el texto correctamente, es posible crear nombres de referencia para los estilos de pin, si no, ¿cómo puedo dibujar las líneas? A continuación se proporciona una muestra de mi código para fines de prueba y también una imagen del resultado.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document}
\tikzstyle{block} = [draw, rectangle, minimum height=2em, minimum width=5em] %fill=blue!20
\tikzstyle{sum} = [draw, circle, node distance=2.0cm, minimum size=6mm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]
\begin{figure}[!ht]
\begin{center}
\makebox[\textwidth][c]{
\begin{tikzpicture}[auto, node distance=1.5cm,>=latex']
\node [input, name=input] {};
\node [sum, right of=input, pin={[pinstyle]above:$t_{in}$}, node distance=1.5cm] (sum) {MP};
\draw [draw,->] (input) -- node [name=begging] {UE} (sum);
\node [block, right of=sum, node distance=2.0cm] (controller) {Node B};
% Text above of GGSN (MP1)
\node [above of=controller, node distance=1.2cm] (MP:1) {$MP_1$};
\draw [<-] (20mm,10mm) -- (0mm,10mm);
%\draw [->, right of=MP:1, node distance=1.5cm] {};
\draw [->] (sum) -- node {} (controller);
\node [sum, right of=controller, pin={[pinstyle]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_2) {MP};
\draw [->] (controller) -- node [name=u] {} (sum_2);
\node [block, right of=sum_2, node distance=2.0cm] (controller_2) {RNC};
% Text above of GGSN (MP2)
\node [above of=controller_2, node distance=1.2cm] (MP:2) {$MP_2$};
\draw [->] (sum_2) -- node [name=u2] {} (controller_2);
\node [sum, right of=controller_2, pin={[pinstyle]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_3) {MP};
\draw [->] (controller_2) -- node [name=u3] {} (sum_3);
\node [block, right of=sum_3, node distance=2.0cm] (controller_3) {SGSN};
% Text above of GGSN (MP3)
\node [above of=controller_3, node distance=1.2cm] (MP:3) {$MP_3$};
\draw [->] (sum_3) -- node [name=u4] {} (controller_3);
\node [sum, right of=controller_3, pin={[pinstyle]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_4) {MP};
\draw [->] (controller_3) -- node [name=u5] {} (sum_4);
\node [block, right of=sum_4, node distance=2.0cm] (controller_4) {GGSN};
% Text above of GGSN (MP4)
\node [above of=controller_4, node distance=1.2cm] (MP:4) {$MP_4$};
\draw [->] (sum_4) -- node [name=u6] {} (controller_4);
\node [sum, right of=controller_4, pin={[pinstyle]above:$t_{out}$}, node distance=2.0cm] (sum_5) {MP};
\draw [->] (controller_4) -- node [name=u8] {} (sum_5);
\node [output, right of=sum_5] (output) {};
\draw [->] (sum_5) -- node [name=end] {PDN}(output);
\node [block, above of=sum_3, node distance=2.5cm] (pipeline) {Pipeline};
\draw [->] (begging) |- (pipeline);
\draw [->] (pipeline) -| (end);
\end{tikzpicture} } % End of makebox
\caption{Test}
\label{fig:blockdiagram}
\end{center}
\end{figure}
\end{document}
Respuesta1
Versión mejorada:
Cambié la sintaxis anterior
\tikzsetstyle
a la más apropiada\tikzset
.Le sugiero que no lo use
:
en el nombre de un nodo, ya que el:
operador tiene un significado especial cuando se aplica al nombre de un nodo.Cargué la
positioning
biblioteca y cambié laof=
sintaxis obsoleta a la=of
sintaxis (observe la economía en el código resultante).En lugar de pines utilicé un
mytext
estilo para nodos; esto da mejores resultados.Margen de mejora: quizás el uso de cadenas aquí simplifique el código. Esto se deja como ejercicio.
El código:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning}
\begin{document}
\tikzset{
block/.style={
draw,
rectangle,
minimum height=2em,
minimum width=5em
},
sum/.style={
draw,
circle,
minimum size=6mm
},
input/.style={coordinate},
output/.style={coordinate},
mytext/.style={
draw,
text depth=4pt,
text height=10pt
}
}
\begin{figure}[!ht]
\begin{center}
\makebox[\textwidth][c]{%
\begin{tikzpicture}[auto,node distance=1cm and 0.8cm,>=latex']
\node[
input,
name=input] {};
\node[
sum,
right = of input
]
(sum) {MP};
\node[
mytext,
above=of sum.center,
name=tin1
]
{$t_{in}$};
\draw[->]
(input) -- node [name=begging] {UE} (sum);
\node[
block,
right = of sum
]
(controller) {Node B};
% Text above of GGSN (MP1)
\node[
mytext,
above = of controller.center
]
(MP1) {$MP_1$};
%\draw [->, right = of MP:1, node distance=1.5cm] {};
\draw[->]
(sum) -- node {} (controller);
\node[
sum,
right = of controller
]
(sum_2) {MP};
\node[
mytext,
above=of sum_2.center,
name=toti1
]
{$t_{out}/t_{in}$};
\draw[->]
(controller) -- node [name=u] {} (sum_2);
\node[
block,
right = of sum_2
]
(controller_2) {RNC};
% Text above of GGSN (MP2)
\node[
mytext,
above = of controller_2.center
]
(MP2) {$MP_2$};
\draw[->]
(sum_2) -- node [name=u2] {} (controller_2);
\node[
sum,
right = of controller_2,
]
(sum_3) {MP};
\node[
mytext,
above=of sum_3.center,
name=toti2
]
{$t_{out}/t_{in}$};
\draw[->]
(controller_2) -- node [name=u3] {} (sum_3);
\node[
block,
right = of sum_3
]
(controller_3) {SGSN};
% Text above of GGSN (MP3)
\node[
mytext,
above = of controller_3.center
]
(MP3) {$MP_3$};
\draw[->]
(sum_3) -- node [name=u4] {} (controller_3);
\node[
sum,
right = of controller_3,
]
(sum_4) {MP};
\node[
mytext,
above=of sum_4.center,
name= toti3
] {$t_{out}/t_{in}$};
\draw[->]
(controller_3) -- node [name=u5] {} (sum_4);
\node[
block,
right = of sum_4
]
(controller_4) {GGSN};
% Text above of GGSN (MP4)
\node[
mytext,
above = of controller_4.center
]
(MP4) {$MP_4$};
\draw[->]
(sum_4) -- node [name=u6] {} (controller_4);
\node[
sum,
right = of controller_4
]
(sum_5) {MP};
\node[
mytext,
above=of sum_5.center,
name=tout1
]
{$t_{out}$};
\draw[->]
(controller_4) -- node [name=u8] {} (sum_5);
\node[
output,
right = of sum_5
]
(output) {};
\draw[->]
(sum_5) -- node [name=end] {PDN}(output);
\node[
block,
above = 2cm of sum_3
]
(pipeline) {Pipeline};
\draw[->]
(begging) |- (pipeline);
\draw[->]
(pipeline) -| (end);
\draw[->]
(tin1) -- (sum);
\draw[->]
(toti1) -- (sum_2);
\draw[->]
(toti2) -- (sum_3);
\draw[->]
(toti3) -- (sum_4);
\draw[->]
(tout1) -- (sum_5);
\draw[<->]
(tin1) -- (MP1);
\draw[<->]
(MP1.east) -- (toti1.west|-MP1.east);
\draw[<->]
(toti1.east) -- (MP2.west|-toti1.east);
\draw[<->]
(MP2.east) -- (toti2.west|-MP2.east);
\draw[<->]
(toti2.east) -- (MP3.west|-toti2.east);
\draw[<->]
(MP3.east) -- (toti3.west|-MP3.east);
\draw[<->]
(toti3.east) -- (MP4.west|-toti3.east);
\draw[<->]
(MP4.east) -- (tout1.west|-MP4.east);
\end{tikzpicture}} % End of makebox
\caption{Test}
\label{fig:blockdiagram}
\end{center}
\end{figure}
\end{document}
Elimina la draw
opción del mytext
estilo.
Versión inicial:
A pin
es solo un nodo especial, por lo que puedes usarlo name=<string>
para darles un nombre que se usará para conectarlos:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\begin{document}
\tikzset{
block/.style={
draw,
rectangle,
minimum height=2em,
minimum width=5em
},
sum/.style={
draw,
circle,
node distance=2.0cm,
minimum size=6mm
},
input/.style={coordinate},
output/.style={coordinate},
pinstyle/.style={
pin edge={to-,thin,black}
}
}
\begin{figure}[!ht]
\begin{center}
\makebox[\textwidth][c]{
\begin{tikzpicture}[auto, node distance=1.5cm,>=latex']
\node [input, name=input] {};
\node [sum, right of=input, pin={[pinstyle,name={tin1}]above:$t_{in}$}, node distance=1.5cm] (sum) {MP};
\draw [draw,->] (input) -- node [name=begging] {UE} (sum);
\node [block, right of=sum, node distance=2.0cm] (controller) {Node B};
% Text above of GGSN (MP1)
\node [above of=controller, node distance=1.2cm] (MP1) {$MP_1$};
\draw [<-] (20mm,10mm) -- (0mm,10mm);
%\draw [->, right of=MP:1, node distance=1.5cm] {};
\draw [->] (sum) -- node {} (controller);
\node [sum, right of=controller, pin={[pinstyle,name=toti1]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_2) {MP};
\draw [->] (controller) -- node [name=u] {} (sum_2);
\node [block, right of=sum_2, node distance=2.0cm] (controller_2) {RNC};
% Text above of GGSN (MP2)
\node [above of=controller_2, node distance=1.2cm] (MP2) {$MP_2$};
\draw [->] (sum_2) -- node [name=u2] {} (controller_2);
\node [sum, right of=controller_2, pin={[pinstyle,name=toti2]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_3) {MP};
\draw [->] (controller_2) -- node [name=u3] {} (sum_3);
\node [block, right of=sum_3, node distance=2.0cm] (controller_3) {SGSN};
% Text above of GGSN (MP3)
\node [above of=controller_3, node distance=1.2cm] (MP3) {$MP_3$};
\draw [->] (sum_3) -- node [name=u4] {} (controller_3);
\node [sum, right of=controller_3, pin={[pinstyle,name=toti3]above:$t_{out}/t_{in}$}, node distance=2.0cm] (sum_4) {MP};
\draw [->] (controller_3) -- node [name=u5] {} (sum_4);
\node [block, right of=sum_4, node distance=2.0cm] (controller_4) {GGSN};
% Text above of GGSN (MP4)
\node [above of=controller_4, node distance=1.2cm] (MP4) {$MP_4$};
\draw [->] (sum_4) -- node [name=u6] {} (controller_4);
\node [sum, right of=controller_4, pin={[pinstyle,name=tout1]above:$t_{out}$}, node distance=2.0cm] (sum_5) {MP};
\draw [->] (controller_4) -- node [name=u8] {} (sum_5);
\node [output, right of=sum_5] (output) {};
\draw [->] (sum_5) -- node [name=end] {PDN}(output);
\node [block, above of=sum_3, node distance=2.5cm] (pipeline) {Pipeline};
\draw [->] (begging) |- (pipeline);
\draw [->] (pipeline) -| (end);
\draw[<->] (tin1.east) -- (MP1.west|-tin1.east);
\draw[<->] (MP1.east) -- (toti1.west|-MP1.east);
\draw[<->] (toti1.east) -- (MP2.west|-toti1.east);
\draw[<->] (MP2.east) -- (toti2.west|-MP2.east);
\draw[<->] (toti2.east) -- (MP3.west|-toti2.east);
\draw[<->] (MP3.east) -- (toti3.west|-MP3.east);
\draw[<->] (toti3.east) -- (MP4.west|-toti3.east);
\draw[<->] (MP4.east) -- (tout1.west|-MP4.east);
\end{tikzpicture} } % End of makebox
\caption{Test}
\label{fig:blockdiagram}
\end{center}
\end{figure}
\end{document}
Cambié la sintaxis anterior \tikzsetstyle
a la más apropiada \tikzset
. Además, le sugiero que no lo utilice :
en el nombre de un nodo, ya que el :
operador tiene un significado especial cuando se aplica al nombre de un nodo.
También le sugeriría que cargue la biblioteca de posicionamiento y cambie la of=
sintaxis obsoleta a la =of
sintaxis.
Respuesta2
Gonzalo ya dio una muy buena respuesta, pero por talregularLos nodos de esquemas matrix
son una buena opción. No necesita colocar manualmente cada nodo y con matrix of nodes
la opción (debe cargar matrix
la biblioteca) puede ahorrar mucho tiempo de escritura.
\documentclass{article}
\usepackage{tikz}
\usepackage{adjustbox}
\usetikzlibrary{shapes,matrix,arrows}
\begin{document}
\tikzset{
block/.style={
draw,
rectangle,
minimum height=2em,
minimum width=5em
},
sum/.style={
draw,
circle,
minimum size=6mm
},
input/.style={coordinate},
output/.style={coordinate},
mytext/.style={
text depth=4pt,
text height=10pt
}
}
\begin{figure}[!ht]
\centering
\adjustbox{width=\linewidth}{
\begin{tikzpicture}[>=latex']
\matrix (D) [matrix of nodes,
column sep=1cm,
row sep=0.8cm,
row 1/.style={nodes={block,anchor=center}},
row 3/.style={nodes={block,anchor=center}},
row 2/.append style={nodes={mytext,anchor=center}},
]
{
& & & & & Pipeline \\
& $t_in$ & $MP_1$ & $t_{out}/t_{in}$ & $MP_2$ & $t_{out}/t_{in}$ & $MP_3$ & $t_{out}/t_{in}$ & $MP_4$ & $t_{out}$ & \\
|[input]| &|[sum]| MP & Node B &|[sum]| MP & RNC &|[sum]| MP & SGSN &|[sum]| MP & GGSN &|[sum]| MP & |[input]|\\
};
\foreach \i [remember=\i as \lasti (initially 1)] in {2,...,11}
\draw[->] (D-3-\lasti)--(D-3-\i);
\foreach \i [remember=\i as \lasti (initially 2)] in {3,...,10}
\draw[<->] (D-2-\lasti)--(D-2-\i);
\foreach \i in {2,4,6,8,10}
\draw[->] (D-2-\i)--(D-3-\i);
\path (D-3-1)--(D-3-2) node [above,midway] (UE) {UE};
\path (D-3-10)--(D-3-11) node [above,midway] (PDN) {PDN};
\draw[->] (UE) |- (D-1-6);
\draw[<-] (PDN) |- (D-1-6);
\end{tikzpicture}}
\caption{Test}
\label{fig:blockdiagram}
\end{figure}
\end{document}