.png)
저는 현재 Tikz 사용법을 배우고 있으며 오토마타(특히 Simulink와 유사한 상태 모델) 그리기를 조사하고 있습니다. 현재는 이러한 상태 모델을 그릴 때 노력을 최소한으로 줄일 수 있는 스타일을 만들고 있습니다. 불행히도 다음을 수행하는 방법을 알 수 없는 것 같습니다.
특정 스타일(이 경우 Ramp)을 사용하는 모든 노드를 기준으로 두 개의 선을 그립니다.
이것이 내가 현재 가지고 있는 것입니다:
\documentclass[preview]{standalone}
\usepackage[dutch]{babel}
\usepackage{mathtools}
\usepackage{mathdots}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{automata}
\usetikzlibrary{arrows}
\begin{document}
\tikzstyle{colorful} = [fill=gray!10]
\tikzstyle{block} = [draw, colorful, rectangle, minimum height=3em, minimum width=3em]
\tikzstyle{ramp} = [block, pin={below:Ramp}]
\tikzstyle{sum} = [draw, colorful, circle, node distance=1cm]
\tikzstyle{gain} = [draw, colorful, regular polygon, regular polygon sides=3, shape border rotate=30]
\tikzstyle{integrator} = [block, right=of gain, pin={below:Integrator}]%, node contents = $\frac{1}{s}$]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{node} = [coordinate]
\tikzset{every pin/.style={pin distance = 1mm}}
\tikzset{every pin edge/.style={draw=none}}
\begin{tikzpicture}[auto, node distance=1cm,>=latex']
\node [ramp] at (0,0) (input) {};
\node [block, right=of input] (prod) {$\times$};
\node [gain, right=of prod] (gain) {$-1$};
\node [integrator] (system) {$\frac{1}{s}$};
\node [output, right=of system] (output) {};
\draw [draw,->] (gain) -- node [name=dy] {$\dot{y}$} (system);
\draw [draw,->] (system) -- node [name=y] {$y$} (output);
\draw [draw,->] (input) -- node {$t$} (prod);
\draw [draw,->] (prod) -- node {} (gain);
\node [node, below=of y] (node1) {};
\node [node, below=of prod] (node2) {};
\draw [->] (y) |- (node1) |- (node2) -- (prod);
\draw (-1/3,-1/3) -- (-1/10,-1/3) -- (1/3,1/3);
% \draw (-1/3,-1/3) -- ++(7/30,0) -- ++(13/30,2/3);
\end{tikzpicture}
\end{document}
하단의 선 중 하나는 램프 스타일의 모든 노드를 기준으로 그려야 합니다.
답변1
다음은 스타일을 사용하여 노드를 그리는 방법의 두 가지 예입니다.
\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
test1/.style={
draw=red,
minimum size=2cm,
alias=thisone,
append after command={(thisone.south west) -- (thisone.north east)}
},
test2/.style={
draw=blue,
minimum size=2cm,
node contents={\tikz\draw circle(3mm);}
}
}
\begin{document}
\begin{tikzpicture}
\draw (0,0) node[test1,]{}
(3,0) node[test2]{};
\end{tikzpicture}
\end{document}
편집하다:구체적인 예에서는 다음 스타일을 추가할 수 있습니다.
\tikzset{
with axes/.style={
alias=thisone,
append after command={
([shift={(2.1mm,2.1mm)}]thisone.south west) edge[red] +(2mm,0)
++(2mm,0) edge[red] ++(5mm,7mm)
}
}
}
그런 다음 예를 들어 ramp
다음과 같은 스타일로 사용하십시오.
\tikzstyle{ramp} = [block, pin={below:Ramp},with axes]
답변2
업데이트:(2014/12/22) OP는 그림이 스타일에 통합되기를 원합니다. 이를 위해 pic
7개의 인수를 사용하는 스타일이 추가되었습니다.
#1=color, #2=x1, #3=y1, #4=edge style #5=x2, #6=y2, #7=label
\tikzset{pics/.cd,
myinput/.style args={#1#2#3#4#5#6#7}{
code={ % #1=color, #2=x1, #3=y1, #4=edge style, #5=x2, #6=y2, #7=label
\draw[color=#1] (input) +(#2,#3) edge[#4] +(#5,#6); % input function
\draw[] (input) +(-9pt,-12pt) -- +(-9pt,12pt); % y-axis
\draw[rotate=90] (input) +(-9pt,-12pt) --node[below=0.3cm,midway](){#7} +(-9pt,12pt);}}% x-axis
}
암호
\documentclass[border=1cm]{standalone}
\usepackage[dutch]{babel}
\usepackage{mathtools}
\usepackage{mathdots}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{automata}
\usetikzlibrary{arrows}
\tikzset{pics/.cd,
myinput/.style args={#1#2#3#4#5#6#7}{
code={% #1=color, #2=x1, #3=y1, #4=edge style #5=x2,#6=y2, #7=label
\draw[color=#1] (input) +(#2,#3) edge[#4] +(#5,#6);
\draw[](input) +(-9pt,-12pt) -- +(-9pt,12pt);
\draw[rotate=90] (input) +(-9pt,-12pt) --node[below=0.3cm,midway](){#7} +(-9pt,12pt);}}
}
\begin{document}
\tikzstyle{colorful} = [fill=gray!10]
\tikzstyle{block} = [draw, colorful, rectangle, minimum height=3em, minimum width=3em]
\tikzstyle{ramp}=[block,pin={below:Ramp}]
\tikzstyle{sum} = [draw, colorful, circle, node distance=1cm]
\tikzstyle{gain} = [draw, colorful, regular polygon, regular polygon sides=3, shape border rotate=30]
\tikzstyle{integrator} = [block, right=of gain, pin={below:Integrator}]%, node contents = $\frac{1}{s}$]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{node} = [coordinate]
\tikzset{every pin/.style={pin distance = 1mm}}
\tikzset{every pin edge/.style={draw=none}}
\begin{tikzpicture}[auto, node distance=1cm,>=latex']
\node [block] at (0,0) (input) {};
\node [block, right=of input] (prod) {$\times$};
\node [gain, right=of prod] (gain) {$-1$};
\node [integrator] (system) {$\frac{1}{s}$};
\node [output, right=of system] (output) {};
\draw [draw,->] (gain) -- node [name=dy] {$\dot{y}$} (system);
\draw [draw,->] (system) -- node [name=y] {$y$} (output);
\draw [draw,->] (input) -- node {$t$} (prod);
\draw [draw,->] (prod) -- node {} (gain);
\node [node, below=of y] (node1) {};
\node [node, below=of prod] (node2) {};
\draw [->] (y) |- (node1) |- (node2) -- (prod);
% ramp function
\pic {myinput={red}{-9pt}{-9pt}{out=45,in=225}{12pt}{12pt}{}};
% step function
\pic {myinput={blue}{-9pt}{5pt}{out=0,in=180}{12pt}{5pt}{}};
% parabolic function
\pic {myinput={cyan}{-9pt}{-9pt}{out=0,in=-110}{12pt}{12pt}{}};
\end{tikzpicture}
\end{document}
step
, ramp
및 parabolic
기능이 제공되는 경우 가능한 솔루션입니다 . 여기서 솔루션은 unit
단위 단계 함수와 para
포물선 함수에 대해 두 개의 블록을 더 추가합니다.
TikZ 스타일을 정의하려면 \tikzset 또는 \tikzstyle을 사용해야 합니까?
암호
\documentclass[border=1cm]{standalone}
\usepackage[dutch]{babel}
\usepackage{mathtools}
\usepackage{mathdots}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{automata}
\usetikzlibrary{arrows}
\begin{document}
\tikzstyle{colorful} = [fill=gray!10]
\tikzstyle{block} = [draw, colorful, rectangle, minimum height=3em, minimum width=3em]
\tikzstyle{ramp}=[block,pin={below:Ramp}]
\tikzstyle{unit}=[block,pin={below:Step}]
\tikzstyle{para}=[block,pin={below:Parablic}]
\tikzstyle{sum} = [draw, colorful, circle, node distance=1cm]
\tikzstyle{gain} = [draw, colorful, regular polygon, regular polygon sides=3, shape border rotate=30]
\tikzstyle{integrator} = [block, right=of gain, pin={below:Integrator}]%, node contents = $\frac{1}{s}$]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{node} = [coordinate]
\tikzset{every pin/.style={pin distance = 1mm}}
\tikzset{every pin edge/.style={draw=none}}
\begin{tikzpicture}[auto, node distance=1cm,>=latex']
\node [ramp] at (0,0) (input) {};
\node[unit, above = of input] (unit){};
\node[para, below = of input] (para){};
\node [block, right=of input] (prod) {$\times$};
\node [gain, right=of prod] (gain) {$-1$};
\node [integrator] (system) {$\frac{1}{s}$};
\node [output, right=of system] (output) {};
\draw [draw,->] (gain) -- node [name=dy] {$\dot{y}$} (system);
\draw [draw,->] (system) -- node [name=y] {$y$} (output);
\draw [draw,->] (input) -- node {$t$} (prod);
\draw [draw,->] (prod) -- node {} (gain);
\node [node, below=of y] (node1) {};
\node [node, below=of prod] (node2) {};
\draw [->] (y) |- (node1) |- (node2) -- (prod);
% ramp function
\draw[rotate=-45] (input) +(0,-12pt) -- +(0,16pt);
\draw[]([xshift=-9pt]input) +(0,-12pt) -- +(0,12pt);
\draw[rotate=90] ([xshift=-9pt]input) +(0,-12pt) -- +(0,12pt);
% step function
\draw[] (unit) +(-9pt,5pt) -- +(12pt,5pt);
\draw[]([xshift=-9pt]unit) +(0,-12pt) -- +(0,12pt);
\draw[rotate=90] ([xshift=-9pt]unit) +(0,-12pt) -- +(0,12pt);
% parabolic function
\draw[] (para) +(-9pt,-9pt) edge[bend right] +(12pt,12pt);
\draw[]([xshift=-9pt]para) +(0,-12pt) -- +(0,12pt);
\draw[rotate=90] ([xshift=-9pt]para) +(0,-12pt) -- +(0,12pt);
\end{tikzpicture}
\end{document}