Tikz: inserire background

  • Creatore
    Topic
  • #53343
    Up
    0
    Down
    ::


    Ciao,
    come anticipato in un altro topic, apro questo argomeno. Non riesco a inserire il background in una figura fatta con tikz. Ecco l’esempio.
    `\documentclass{article}

    \usepackage[T1]{fontenc}
    \usepackage[latin1]{inputenc}
    \usepackage[italian]{babel}
    \usepackage{tikz}
    \usetikzlibrary{shapes,arrows}
    \usepackage{amsmath,bm,times}

    \usetikzlibrary{shapes.gates.logic.US,trees,positioning,arrows}

    \begin{document}
    Innanzitutto non capisco a che serva questo codice, trovato in un esempio in rete:

    \pgfdeclarelayer{background}
    \pgfdeclarelayer{foreground}
    \pgfsetlayers{background,main,foreground}

    \centering

    \begin{tikzpicture}
    %% Draw system flow diagram
    \begin{scope}[node distance=1.2cm,on grid,>=stealth',
    elabor/.style={rectangle,rounded corners,draw,
    text centered},
    results/.style={ellipse,draw,text centered}]
    \node [results] (a1) {risultato};
    \node [elabor] (a) [above=of a1] {f(x)} edge [->] (a1);
    \node [results] (b1) [above=of a] {y} edge [->] (a);
    \node [elabor,text width=2.cm] (b) [above=of b1] {\emph{Step 2}.\\ -FindRoot-} edge [->] (b1);
    \node [results] (c1) [above= of b] {ris.} edge [->] (b);
    \node [elabor,text width=2.cm] (c) [above=of c1] {\emph{Step 1}.\\ -FindRoot-} edge [->] (c1);
    \node [node distance=1.8cm] (d1) [above= of c] {} edge [->] (c);
    \end{scope}

    \begin{pgfonlayer}{background}
    \node [fill=black!30,fit=(a1) (a) (b1) (b) (c1) (c) (d1)] {};
    \end{pgfonlayer}

    \end{tikzpicture}

    \end{document}`

    Innanzitutto non riesco a capire a cosa serva questo codice, trovato in un esempio in rete:
    `\pgfdeclarelayer{background}
    \pgfdeclarelayer{foreground}
    \pgfsetlayers{background,main,foreground}
    `
    Secondo, non riesco a capire come mai mi dia errore. Ho copiato dal manuale di pgfplots le tre righe
    `\begin{pgfonlayer}{background}
    \node [fill=black!30,fit=(a1) (a) (b1) (b) (c1) (c) (d1)] {};
    \end{pgfonlayer} `

    Grazie,
    Daniele

Visualizzazione 3 filoni di risposte
  • Autore
    Risposte
    • #53344
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        La chiave fit produce l’errore perché non è definita nel codice che ripeorti; probabilmente era definita nell’esempio che ha ripreso in un’altra posizione del file.
        Comunque a me pare più ragionevole lasciare perdere i layers e ragionare solamente a livello di tikzpicture:
        `
        \documentclass{article}

        \usepackage[T1]{fontenc}
        \usepackage[latin1]{inputenc}
        \usepackage[italian]{babel}
        \usepackage{tikz}
        \usetikzlibrary{shapes,arrows}
        \usepackage{amsmath,bm,times}

        \usetikzlibrary{shapes.gates.logic.US,trees,positioning}

        \begin{document}
        Innanzitutto non capisco a che serva questo codice, trovato in un esempio in rete:

        \pgfdeclarelayer{background}
        \pgfdeclarelayer{foreground}
        \pgfsetlayers{background,main,foreground}

        \centering

        \begin{tikzpicture}
        %% Draw system flow diagram
        \begin{scope}[node distance=1.2cm,on grid,>=stealth',
        elabor/.style={rectangle,rounded corners,draw,
        text centered,fill=black!20!white},
        results/.style={ellipse,draw,text centered,fill=black!20!white}]
        \node [results] (a1) {risultato};
        \node [elabor] (a) [above=of a1] {f(x)} edge [->] (a1);
        \node [results] (b1) [above=of a] {y} edge [->] (a);
        \node [elabor,text width=2.cm] (b) [above=of b1] {\emph{Step 2}.\\ -FindRoot-} edge [->] (b1);
        \node [results] (c1) [above= of b] {ris.} edge [->] (b);
        \node [elabor,text width=2.cm,fill] (c) [above=of c1] {\emph{Step 1}.\\ -FindRoot-} edge [->] (c1);
        \node [node distance=1.8cm] (d1) [above= of c] {} edge [->] (c);
        \end{scope}

        \end{tikzpicture}

        \end{document}
        `
        Io toglierei le definizioni degli strati, che ho marcato in blu. Quelle tre righe servono per assegnare dei nomi agli strati e di dire in che ordine si trovano; ogni figura PostScript e PDF è fatta a strati; quei comandi servono per dare loro un nome in modo da impostare le caratteristiche di ciascuno, Puoi trovare le spiegazioni nel pgfmanual.

        Invece io metterei le specifiche dei colori nella definizione dei tipi di nodi, dove dici che forma hanno dove vuoi il testo, eccetera, aggiungi anche come ne vuoi riempire lo sfondo; in questo modo puoi distinguere i nodi non solo dalla forma ma anche dal colore di sfondo.

        Ho cambiato la percentuale di black in 20 e ho aggiunto white che dovrebbe essere di default, ma con i colori e le loro sfumature puoi giocare come vuoi usando la sintassi delle miscele di colori del pacchetto xcolors che viene caricato di default da tikz.

        Ho cancellato il nome arrows dai pacchetti tikz da usare perché l’avevi specificato due volte.

        Sei sicuro che f(x) debba restare in tondo e non debba andare in modo matematico? Capisco che il tuo è solo un esempio, ma giusto per fare attenzione a qual che si scrive come testo interno ai blocchi.

      • #53345
        Up
        0
        Down
        ::


        Innanzitutto ti ringrazio sentitamente Claudio. A proposito di arrows hai pienamente ragione, non mi ero accorto. Per quanto riguarda f(x) anche, normalente l’avrei scritto in matematico, ma siccome ho solo modificato il testo dei miei blocchi prima di postarli (niente di top segret, comunque ho preferito così, per lo meno sino a che non avrò consegnato la tesi), nella fretta mi è sfuggito.
        In ultimo, venendo al problema, la soluzione che mi hai prospettato non è male. Io però pensavo a una cosa come quella della figura dal titolo “Inertial navigation system” (la nona), presentata qui:
        http://www.texample.net/tikz/examples/tag/block-diagrams/
        http://media.texample.net/tikz/examples/PDF/inertial-navigation-system.pdf
        È da lì che ho scaricato il sorgente. Vorrei raggruppare i blocchi con un rettangolo tratteggiato. Non si può proprio riprodurre nel mio caso?

        Grazie ancora e buon fine settimana,
        Daniele

      • #53346
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Eccoti il background:
          `
          \documentclass{article}

          \usepackage[T1]{fontenc}
          \usepackage[latin1]{inputenc}
          \usepackage[italian]{babel}
          \usepackage{tikz}
          \usetikzlibrary{shapes,arrows}
          \usepackage{amsmath,bm,times}

          \usetikzlibrary{shapes.gates.logic.US,trees,positioning}

          \begin{document}
          Innanzitutto non capisco a che serva questo codice, trovato in un esempio in rete:

          \pgfdeclarelayer{background}
          \pgfdeclarelayer{foreground}
          \pgfsetlayers{background,main,foreground}

          \centering

          \begin{tikzpicture}
          %% Draw system flow diagram
          \begin{scope}[node distance=1.2cm,on grid,>=stealth',
          elabor/.style={rectangle,rounded corners,draw,
          text centered,fill=black!20!white},
          results/.style={ellipse,draw,text centered,fill=black!20!white}]
          \node [results] (a1) {risultato};
          \node [elabor] (a) [above=of a1] {f(x)} edge [->] (a1);
          \node [results] (b1) [above=of a] {y} edge [->] (a);
          \node [elabor,text width=2.cm] (b) [above=of b1] {\emph{Step 2}.\\ -FindRoot-} edge [->] (b1);
          \node [results] (c1) [above= of b] {ris.} edge [->] (b);
          \node [elabor,text width=2.cm,fill] (c) [above=of c1] {\emph{Step 1}.\\ -FindRoot-} edge [->] (c1);
          \node [node distance=1.8cm] (d1) [above= of c] {} edge [->] (c);

          % Draw background
          \begin{pgfonlayer}{background}
          \path (d1) + (-3,0.2) node (e){};
          \path (a1.south) + (3,-0.5) node (f) {};
          \path [fill=yellow!20!white, rounded corners, draw=black!50!white,dashed] (e) rectangle (f);
          \end{pgfonlayer}
          \end{scope}

          \end{tikzpicture}

          \end{document}
          `

          Se i nodi avessero dei nomi più significativi sarebbe meno facile sbagliare la definzione dei vertici (e) ed (f) del rettangolo. I colori scegliteli tu.

        • #53347
          Up
          0
          Down
          ::


          Grazie, magnifico.
          Adesso cercherò di adattarlo al mio codice. Spero di non dover più chiedere niente in merito.

          Ciao,
          Daniele

      Visualizzazione 3 filoni di risposte
      • Devi essere connesso per rispondere a questo topic.

      Go to top