tikz i rysowanie węzłów

Sep 27 2020

Chciałbym rozszerzyć ten przykład „węzłów”, dodając 6 kolejnych węzłów, ale nie widziałem logiki stojącej za tym przykładowym kodem. Nie udało mi się uzyskać relacji (a), (b) i (c) oraz tego, jak są one faktycznie używane. Czy ktoś może mi to wyjaśnić? Oto link wyjściowy:https://texample.net/tikz/examples/nav1d/

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\pagestyle{empty}
%
\tikzstyle{int}=[draw, fill=blue!20, minimum size=2em]
\tikzstyle{init} = [pin edge={to-,thin,black}]

\begin{tikzpicture}[node distance=2.5cm,auto,>=latex']
    \node [int, pin={[init]above:$v_0$}] (a) {$\frac{1}{s}$};
    \node (b) [left of=a,node distance=2cm, coordinate] {a};
    \node [int, pin={[init]above:$p_0$}] (c) [right of=a] {$\frac{1}{s}$};
    \node [coordinate] (end) [right of=c, node distance=2cm]{};
    \path[->] (b) edge node {$a$} (a);
    \path[->] (a) edge node {$v$} (c);
    \draw[->] (c) edge node {$p$} (end) ;
\end{tikzpicture}

\end{document}

Odpowiedzi

2 Zarko Sep 27 2020 at 13:15
  • twoje pytanie nie jest do końca jasne ...
  • użyty przykład jest raczej stary, w związku z czym używa obecnie przestarzałej składni ( tikzstylezamiast tikzsetitd.)
  • zakładając, że wszystkie węzły są w łańcuchu, mają ten sam rozmiar i zawartość, niż można je narysować za pomocą chainsbiblioteki, dla etykiet krawędzi użyj quotesbiblioteki i zdefiniuj styl dla każdej krawędzi i sworznia:
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows.meta,
                chains,
                positioning,
                quotes}

\begin{document}
    \begin{tikzpicture}[
node distance = 12mm,
  start chain = going right, 
   int/.style = {draw, fill=blue!20, minimum size=2em, font=\large, 
                 on chain},
 every edge/.style = {draw, -Latex},
every edge quotes/.style = {auto, font=\footnotesize, text depth=0.25ex},
  every pin/.style = {pin edge={Latex-,thin,black}, font=\footnotesize}
                        ]
% nodes vith pin above
\coordinate[on chain] (in);
\node (a) [int, pin=$v_0$] {$\frac{1}{s}$};
\node (b) [int, pin=$p_0$] {$\frac{1}{s}$};
\node (c) [int, pin=$p_1$] {$\frac{1}{s}$};
\node (d) [int, pin=$p_2$] {$\frac{1}{s}$};
\node (e) [int, pin=$p_3$] {$\frac{1}{s}$};
\coordinate[on chain] (out);
% connection between nodes
\draw   (in)    edge ["$a$"] (a) 
        (a)     edge ["$v$"] (b) 
        (b)     edge ["$p$"] (c)
        (c)     edge ["$p_1$"] (d)
        (d)     edge ["$p_2$"] (e)
        (e)     edge ["$p_3$"] (out) ;
    \end{tikzpicture}
\end{document}

Jeśli chcesz mieć więcej węzłów w łańcuchu, po prostu dodaj je do już istniejących. Jeśli nie potrzebujesz warunku początkowego, po prostu upuść pinje.

Edycja: podany przez Ciebie przykład składa się z dwóch części:

  • Definicje stylów (gdzie używana jest przestarzała składnia, dziś powinna być zapisana jako:
\tikzset{
  int/.style = {draw, fill=blue!20, minimum size=2em},
 init/.style = {pin edge={to-,thin,black}}
         }

lub jako opcje tikzpicture:

\begin{tikzpicture}[node distance=2.5cm,auto,>=latex',
 int/.style = {draw, fill=blue!20, minimum size=2em},
init/.style = {pin edge={to-,thin,black}}
               ]
  • Treść obrazu, w której rysujesz to, co chcesz na obrazie. Możesz to zrobić na wiele różnych sposobów. Na przykład,
    • używając bezwzględnego pozycjonowania węzłów:
\node (<name>) [<style>] at (<x coordinate>,<y coordinate>) {<node content>};
  • używając względnego pozycjonowania węzłów:
\node (<name 1>) [<style 1>] at (<x coordinate>,<y coordinate>) {<node content>};
\node (<name 2>) [<style 2>, above right=of <name 1>]  {<node content>};

gdzie <node 2>zostanie umieszczony powyżej i na lewo od węzła <node 2>dla zadeklarowanej odległości węzła w tikzsetopcji lub jako opcja, jak pokazano w powyższym przykładzie.

  • linie, które możesz rysować jako
\draw[<option>] (<coordinate 1>) -- (<coordinate 2>);

gdzie <option>możesz użyć na przykład inittak, jak jest to zrobione w pokazanym MWE (minimalny przykład roboczy) w swoim pytaniu, a dla współrzędnych użyj nazw węzłów.

lub użyj bardziej zaawansowanego podejścia, które jest używane w mojej odpowiedzi.

  • w przypadku innych opcji musisz lepiej zapoznać się z pakietem TikZ i jego bibliotekami. Podręcznik jest częścią Twojej instalacji LaTeX lub możesz go znaleźć na CTAN (użyj google dla tikz.sty ).
  • Manula jest ogromna, więc na początek przeczytaj część I Poradniki i wytyczne, a następnie część III: TikZ ist kein Zeichenprogramm .
  • Jeśli utkniesz w rysowaniu jakiegoś obrazu, poproś tutaj o konkretną pomoc. W tym miejscu proszę o dostarczenie MWE, które odtwarza Twój problem, że ludzie mogą Ci łatwiej pomóc (Przygotowanie MWE, przykład w mojej odpowiedzi, wiele razy pomogę Ci znaleźć rozwiązanie lub samodzielnie odkryć błąd w kodzie)
  • Witryna nie ma na celu udzielania ogólnych wskazówek dotyczących korzystania z tikzpakietu.
2 jsbibra Sep 27 2020 at 08:01

Pełne wyjaśnienie znajduje się poniżej:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary {arrows.meta,graphs,shapes.misc}
\usetikzlibrary{arrows}
\begin{document}
    \pagestyle{empty}
    %no headers and footers just a blank page
    \tikzstyle{int}=[draw, fill=blue!20, minimum size=2em]
    %macro for (draw)ing square, (fill) inside color blue, default size 2em
    \tikzstyle{init} = [pin edge={to-,thin,black}]
    %macro for arrows/ edges
    
    \begin{tikzpicture}[node distance=2.5cm,auto,>=latex']
        %separation between nodes 2.5cm, type of arrows defined with >=latex
        \node [int, pin={[init]above:$v_0$}] (a) {$\frac{1}{s}$};
        %call the int macro for square named (a), and the init macro for the arrow 
        pointing (to-a), label above the arrow is v_0, and text inside the named node 
        is  {$\frac{1}{s}$}
        \node (b) [left of=a,node distance=2cm, coordinate] {a};
        %node named (b) placed left of node named (a), tec=xt inside the node is {a}
        \node [int, pin={[init]above:$p_0$}] (c) [right of=a] {$\frac{1}{s}$};
        %same as first node named (a)
        \node [coordinate] (end) [right of=c, node distance=2cm]{};
        %same as node named (end) after node named (c)
        \path[->] (b) edge node {$a$} (a);
        %draw an arrow from node b to node a, label above the arrow  {$a$}
        \path[->] (a) edge node {$v$} (c);
        %same as arrow above
        \draw[->] (c) edge node {$p$} (end) ;
        %same as arrow above
    \end{tikzpicture}
\end{document}