
저는 Tikz를 처음 사용하는 사람입니다. 오늘부터 작업을 시작했는데 해결 방법을 찾을 수 없는 몇 가지 어려움을 겪었습니다. 나는 예제를 기반으로 블록 다이어그램을 만들고 있습니다.예: 제어 시스템 원리. 예를 들어 블록 위에 텍스트를 추가하는 경우 필요에 따라 수정하려고 했습니다 \node [above of=controller, node distance=1.2cm] (MP:1) {$MP_1$};
. 이것이 올바른 방법인지 모르겠습니다. 나의 이상적인 시나리오는 이 텍스트를 핀 스타일 tin
과 오른쪽 화살표로 연결하는 것입니다 tout/tin
. 이름을 지정할 수 없기 때문에 명령을 사용할 수 없으며 tin
작동 하지 않습니다. 삽입하여 시도했지만 출력이 다시 올바르지 않습니다. Tikz 매뉴얼을 살펴보던 중 . 결과는 또 올바르지 않습니다.tout/tin
\draw [draw,->] (tin) -- node [name=line] {} (MP:1);
\draw [->, right of=MP:1, node distance=1.5cm] {};
\draw [<-] (20mm,10mm) -- (0mm,10mm);
그래서 내 첫 번째 질문은 내가 삽입하는 텍스트입니다. 참조로 텍스트에 이름을 제공하는 방법이 올바른가요? 아니면 더 좋은 방법이 있습니까? 두 번째 질문은 텍스트를 올바르게 삽입하면 핀 스타일에 대한 참조 이름을 만들 수 있다는 것입니다. 그렇지 않은 경우 어떻게 선을 그릴 수 있습니까? 내 코드 샘플은 테스트 목적과 출력 그림을 위해 아래에 제공됩니다.
\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}
답변1
향상된 버전:
\tikzsetstyle
이전 구문을 더 적절한 구문으로 변경했습니다\tikzset
.노드 이름에 연산자를 적용하면 특별한 의미가 있으므로 노드 이름
:
에는 사용하지 않는 것이 좋습니다 .:
라이브러리 를 로드 하고 더 이상 사용되지 않는 구문을 구문으로
positioning
변경했습니다 (결과 코드의 경제성에 주목).of=
=of
핀 대신
mytext
노드 스타일을 사용했습니다. 이것은 더 나은 결과를 제공합니다.개선의 여지: 여기서 체인을 사용하면 코드가 단순화될 수 있습니다. 이것은 연습문제로 남겨둡니다.
코드:
\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}
draw
스타일 에서 옵션을 삭제하세요 mytext
.
초기 버전:
A는 pin
단지 특수 노드이므로 name=<string>
연결하는 데 사용할 이름을 지정할 수 있습니다.
\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}
\tikzsetstyle
이전 구문을 더 적절한 구문으로 변경했습니다 \tikzset
. 또한 노드 이름에 연산자를 적용하면 특별한 의미가 있으므로 노드 이름 :
에는 사용하지 않는 것이 좋습니다 .:
또한 위치 지정 라이브러리를 로드하고 더 이상 사용되지 않는 of=
구문을 해당 구문으로 변경하는 것이 좋습니다 =of
.
답변2
Gonzalo는 이미 매우 좋은 답변을 제공했지만정기적인계획 matrix
노드는 좋은 옵션입니다. 모든 노드를 수동으로 배치할 필요가 없으며 matrix of nodes
옵션(라이브러리를 로드해야 함 matrix
)을 사용하면 많은 입력 시간을 절약할 수 있습니다.
\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}