
\tikzstyle{block} = [draw, fill=blue!20, rectangle,
minimum height=3em, minimum width=6em]
\tikzstyle{sum} = [draw, fill=blue!20, circle, node distance=1cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]
% The block diagram code is probably more verbose than necessary
\begin{tikzpicture}[auto, node distance=2cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right of=input] (sum) {};
\node [block, right of=sum] (controller) {Controller};
\node [block, right of=controller, pin={[pinstyle]above:Disturbances},
node distance=3cm] (system) {System};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[name=u] {$u$} (system);
\node [output, right of=system] (output) {};
\node [block, below of=system] (measurements) {Measurements};
\node [block, left of=measurements ] (sensor) {Sensor};
\draw [<-] (measurements) -- node[name=k] {$k$} (sensor);
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {$r$} (sum);
\draw [->] (sum) -- node {$e$} (controller);
\draw [->] (system) -- node [name=y] {$y$}(output);
\draw [->] (y) |- (measurements);
\draw [->] (sensor) -| node[pos=0.99] {$-$}
node [near end] {$y_m$} (sum);
\end{tikzpicture}
Responder1
Substituir left of=measurements
por below=of controller
.
Três notas menores:
As chaves
left of
,right of
etc estão obsoletas. Agora é recomendado usarleft=of ...
em vez deleft of=...
etc. Isso requer\usetikzlibrary{positioning}
. Esta mudança é mais do que uma transposição de letras. O novo posicionamento é mais robusto e flexível do que o antigo.Você pode escrever
block/.style = {...}
(como uma opçãotikzpicture
ou como argumento para\tikzset
) em vez de\tikzstyle{block} = [...]
. Pelo que entendi, o primeiro método (que também usei abaixo) está mais alinhado com as convenções atuais do tikz. O segundo método é uma sintaxe bastante singular, não usada em nenhum outro lugar do tikz.Como Zarko observou nos comentários, a distância do nó pode ser escolhida de forma diferente na direção xey, especificando, por exemplo
node distance=1cm and 2cm
.
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows}
\tikzset
{block/.style =
{draw, fill=blue!20, rectangle, minimum height=3em, minimum width=6em},
sum/.style = {draw, fill=blue!20, circle, node distance=1cm},
input/.style = {coordinate},
output/.style = {coordinate},
pinstyle/.style = {pin edge={to-,thin,black}}
}
\begin{document}
% The block diagram code is probably more verbose than necessary
\begin{tikzpicture}[auto, node distance=1cm and 2cm,>=latex']
% We start by placing the blocks
\node [input, name=input] {};
\node [sum, right=of input] (sum) {};
\node [block, right=of sum] (controller) {Controller};
\node [block, right=of controller, pin={[pinstyle]above:Disturbances},
node distance=3cm] (system) {System};
% We draw an edge between the controller and system block to
% calculate the coordinate u. We need it to place the measurement block.
\draw [->] (controller) -- node[name=u] {$u$} (system);
\node [output, right=of system] (output) {};
\node [block, below=of system] (measurements) {Measurements};
\node [block, below=of controller] (sensor) {Sensor};
\draw [<-] (measurements) -- node[name=k] {$k$} (sensor);
% Once the nodes are placed, connecting them is easy.
\draw [draw,->] (input) -- node {$r$} (sum);
\draw [->] (sum) -- node {$e$} (controller);
\draw [->] (system) -- node [name=y] {$y$}(output);
\draw [->] (y) |- (measurements);
\draw [->] (sensor) -| node[pos=0.99] {$-$}
node [near end] {$y_m$} (sum);
\end{tikzpicture}
\end{document}
Responder2
Como complemento aoGernot(nem tanto) resposta "detalhada", espero que seja mais concisa :) Nela eu uso calc
uma quotes
biblioteca:
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows, calc, positioning, quotes}
\tikzset{
block/.style = {rectangle, draw, fill=blue!20, minimum height=3em, minimum width=6em},
sum/.style = {circle, draw, fill=blue!20},
every pin/.style = {pin edge={<-,black}},
> = latex'
}
\begin{document}
\begin{tikzpicture}[auto,
node distance = 6mm and 12mm]
% placing the blocks
\coordinate (in);
\node (sum) [sum, right=of in] {};
\node (controller) [block, right=of sum] {Controller};
\node (system) [block, pin=above:Disturbances,
right=of controller] {System};
\coordinate[right=of system] (out);
\node (measurement) [block, below=of controller] {Measurements};
\node (sensor) [block, below=of system] {Sensor};
% edges between blocks
\draw[->] (in) edge ["$r$"] (sum)
(sum) edge ["$e$"] (controller)
(controller) edge["$u$"] (system)
(system) edge["$y$"] (out)
(sensor) edge["$k$"] (measurement)
(measurement) -| (sum)
node [pos=0.75] {$y_m$}
node [pos=0.95] {$-$};
\draw[->] ($(system.east)!0.5!(out)$) |- (sensor);
\end{tikzpicture}
\end{document}
Editar:Mudança considerandoCarLaTeXcomentar, os comentários no código agora são mais significativos. Ainda acredito que minha ordem sugerida de blocos "sensor" e "medição" está correta. Porém até que esses blocos sejam lineares, a ordem não é essencial :)
Responder3
Acho que você também poderia usar um TikZ matrix
.
Observe que arrows
a biblioteca está obsoleta. Do Manual TikZ e PGF, para. 16.1:
Observação: As bibliotecas arrows e arrows.spaced estão obsoletas. Use arrows.meta em vez disso/adicionalmente, o que permite fazer tudo o que as bibliotecas antigas ofereciam e muito mais. No entanto, as bibliotecas antigas ainda funcionam e você pode até misturar pontas de setas antigas e novas (apenas as pontas de setas antigas não podem ser configuradas da maneira descrita no restante desta seção; dizer que escala=2 para uma seta de látex não tem efeito para por exemplo, enquanto para setas de látex seu tamanho dobra como seria de esperar.)
Além disso, como gernot já disse, \tikzset
deveria ser usado em vez de \tikzstyle
(veraqui).
\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,matrix,positioning}
\begin{document}
\tikzset{%
block/.style={draw, fill=blue!20, rectangle,
minimum height=3em, text width=7em,align=center},
sum/.style={draw, fill=blue!20, circle},
pinstyle/.style={pin edge={latex-,thin,black}},
mylabup/.style={midway,above},
>=latex,
}
\begin{tikzpicture}
\matrix[column sep=3em, row sep=4ex]{%
\coordinate (input);
&
\node [sum] (sum) {};
&
\node [block] (controller) {Controller};
&
\node [block, pin={[pinstyle]above:Disturbances}] (system) {System};
&
\coordinate (output);
\\
&
&
\node [block] (sensor) {Sensor};
&
\node [block] (measurements) {Measurements};
\\
};
\draw [->] (controller) -- node[mylabup] {$u$} (system);
\draw [->] (measurements) -- node[mylabup] {$k$} (sensor);
\draw [->] (input) -- node[mylabup] {$r$} (sum);
\draw [->] (sum) -- node[mylabup] {$e$} (controller);
\draw [->] (system) -- node [name=y,mylabup] {$y$} (output);
\draw [->] (y) |- (measurements);
\draw [->] (sensor) -|
node [near end, left] {$y_m$} (sum);
\node[below left = -2pt and -1pt of sum] {$-$};
\end{tikzpicture}
\end{document}