[RISOLTO]TiKZ: sintassi dei comandi

  • Creatore
    Topic
  • #102783
    Up
    0
    Down
    ::


    Ciao,
    come detto nel mio precedente post, ho iniziato ad usare TiKz con grande sodisfazione.
    Dopo gli esempi trovati, ora, vorrei aggiungere qualche cosa di mio.
    Come dicevo, lo utilizzerò principalmente per produrre flow chart.

    Il mio primo dubbio è questo:
    – vorrei che il primo flow chart, inizi dall’ angolo in alto a siniostra della pagina.
    Credo che questa debba essere una opzione del “contenitore principale” \begin{tikzpicture}. Giusto? se non sbaglio, come faccio ad indicare dove deve iniziare?

    Oppure, devo specificarlo nei “contenitori” contenuti nella tikzpicture (ad esempio lo scope)?

    Potreste darmi una risposta (anche solo indicare un “buon vecchio” syntax reference)

    Grazie

    Renato

Visualizzazione 9 filoni di risposte
  • Autore
    Risposte
    • #102784
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        renareto” post=102692Ciao,
        come detto nel mio precedente post, ho iniziato ad usare TiKz con grande sodisfazione.
        Dopo gli esempi trovati, ora, vorrei aggiungere qualche cosa di mio.
        Come dicevo, lo utilizzerò principalmente per produrre flow chart.

        Il mio primo dubbio è questo:
        – vorrei che il primo flow chart, inizi dall’ angolo in alto a siniostra della pagina.
        Credo che questa debba essere una opzione del “contenitore principale” \begin{tikzpicture}. Giusto? se non sbaglio, come faccio ad indicare dove deve iniziare?

        Oppure, devo specificarlo nei “contenitori” contenuti nella tikzpicture (ad esempio lo scope)?

        Potreste darmi una risposta (anche solo indicare un “buon vecchio” syntax reference)

        Grazie

        Renato

        Ciao.
        La figura generata da TikZ è un box normale quindi per posizionarlo in alto a destra basta premettere \noindent. Se va nel documento come oggetto mobile allora includila in un ambiente figure, ecc.
        Una seconda via è quella di gestire l’intera pagina attraverso un ambiente TikZ.
        La terza soluzione è quella del posizionamento assoluto ma richiede almeno due compilazioni perciò io non l’ho mai usato.

        Esiste anche la possibilità di generare i flow chart a parte e includerli come file pdf nel documento. Questo metodo permette di evitare di generare l’immagine ogni volta. Se il tuo flow chart è già stato generato addirittura quello che rimane da fare è un semplice \includegraphics.

        Per un mio progetto che non ho reso pubblico nonostante fosse previsto di farlo, ho gestito la pagina interamente come oggetto grafico.
        L’importante è quindi il codice TikZ perché poi a includerlo nel documento può essere anche molto semplice.
        Saluti.
        R.

      • #102785
        Up
        0
        Down
        ::


        Ciao, ho visto la tua risposta solo adesso (in verità già sabato ma ero inpossibilato a rispondere). Diciamo che ora l’ ho letta 🙄

        La figura generata da TikZ è un box normale quindi per posizionarlo in alto a destra basta premettere \noindent. Se va nel documento come oggetto mobile allora includila in un ambiente figure, ecc.

        questo `\begin{document}
        \noindent
        \begin{tikzpicture}[node distance=2cm]` mi sposta “leggermente”a sinistra, ma non abbastanza. Mi spiego: io vorrei che tutto il flowchart sia sempre centrato nella pagina. Ovvero: se è un blocco o sono due o più…
        L’opzione \noindent, sposta, leggermente sulla sinistra, (evidentemente all’ interno dei margini della pagina)

        Una seconda via è quella di gestire l’intera pagina attraverso un ambiente TikZ.

        questo è stato il mio primo pensiero. E stavo cercando proprio una cosa del genere: ovvero una opzione di \begin{tikzpicture}

        La terza soluzione è quella del posizionamento assoluto ma richiede almeno due compilazioni perciò io non l’ho mai usato.

        no, come dicevo, vorrei provare la seconda alternativa, anche perchè mi sembra quella più ovvia…

        Esiste anche la possibilità di generare i flow chart a parte e includerli come file pdf nel documento.

        e questo cosa è? E’ un altro ambiente per generare flowchart?

        Renato

      • #102786
        Up
        0
        Down
        ::


        Secondo me dipende molto da cosa vuoi fare.

        Se devi generare soltanto i flow chart, allora opterei per la classe standalone con opzione [tt]tikz[/tt]. A quel punto sei a posto perché la pagina conterrà soltanto i diagrammi.

        Se invece i grafici devono essere inseriti in un documento, puoi considerare le opzioni che Roberto ha suggerito. Come detto, ogni ambiente tikzpicture è una “scatola” e come tale deve essere trattata: ecco perché se usi [tt]\noindent[/tt] la figura risulta spostata leggermente, che poi altro non fa se non eliminare il rientro della prima riga.

        Con la prima opzione suggerita da Roberto, puoi considerare il pacchetto textpos: ti permette di posizionare in modo arbitrario sulla pagina ogni tipo di “scatola”.

        Per gestire completamente con TikZ l’intera pagina ci sono un sacco di opzioni. Nella stragrande maggioranza dei casi la prima cosa da fare è dichiarare nell’ambiente qualcosa come `\useasboundingbox (0,0)rectangle(\the\paperwidth,\the\paperheight);` in modo tale che la figura copra l’intera pagina. In seguito, o lavori con le coordinate (per esempio (1,2)), oppure con riferimenti assoluti sulla pagina tramite la libreria calc (per esempio ($(0,0)!0.5!(\the\paperwidth,0)$)). In alternativa, puoi racchiudere in un ambiente scope tutta la figura e usare riferimenti fra 0 e 1: `\begin{scope}[x={(0,0)},y={(\the\paperwidth,\the\paperheight)}]`. Come ultima opzione puoi usare il metodo di “sovraimpressione” con opzioni [tt]remember picture,overlay[/tt] e i riferimenti di pagina del pacchetto tikzpagenodes. Questo sistema richiede di compilare almeno 2 volte.

        La terza soluzione sostazialmente consiste nell’esternalizzare la figura: il codice viene compilato a parte, con classe standalone per esempio, e incluso tramite includegraphics come una figura qualsiasi. A quel punto per inserirlo dove vuoi tu si tratta di tornare alla soluzione 1, per cui userei textpos.

        Ma ripeto: se vuoi soltanto i grafici e non li devi includere in documenti, creali con standalone e basta.

        Ciao
        Claudio

      • #102787
        Up
        0
        Down
        ::

        Se devi generare soltanto i flow chart, allora opterei per la classe standalone con opzione tikz. A quel punto sei a posto perché la pagina conterrà soltanto i diagrammi.

        provata! E’ quello che cercavo. Ora dovrò un pochino lavorarci…ma questo è.

        Grazie

        Renato

      • #102788
        Up
        0
        Down
        ::


        Ciao,
        sto proseguendo con la conoscenza di di TiKZ…e inevitabilmente, vengono fuori nuove richieste:???:

        Utilizzando \scope, per racchiudere parte del mio codice, vorrei che il codice \scope seguente, si allinei al primo scope + 1 cm.
        Es: ho un primo ramo del mio flowchart, racchiuso in uno \scope, vorrei che il secondo ramo (sempre racchiuso in uno scope) inizi 1 cm a destra del primo.
        Ho trovato come farlo per i nodi, ma per gli scope è possibile?

        Grazie

        Renato

      • #102789
        Up
        0
        Down
        ::

        renareto” post=102769Utilizzando \scope, per racchiudere parte del mio codice, vorrei che il codice \scope seguente, si allinei al primo scope + 1 cm.
        Es: ho un primo ramo del mio flowchart, racchiuso in uno \scope, vorrei che il secondo ramo (sempre racchiuso in uno scope) inizi 1 cm a destra del primo.

        Se hai il primo “scope” nell’origine, prova con: `
        \begin{scope}[xshift=cm]
        ` Ho messo [tt]x[/tt] e non 1 perché ogni spostamento dipende da quanti oggetti hai nel primo ambiente e come sono disposti. Quindi cambia quel valore a piacere.

        Ciao
        Claudio

      • #102790
        Up
        0
        Down
        ::


        Ciao,
        utilizzo già questa sintassi `\begin{scope}[xshift=cm]`
        ma, in realtà (non mi sono spiegato bene) vorrei che il secondo (e anche il terzo, il quarto etc…) fossero distanziati di x cm, dallo scope precedente.

        Attualmente, riesco a inpostare la distanza solo dal primo scope. Quindi: per il secondo scope, metto `\begin{scope}[xshift=8cm]`, per il terzo scope (che è contenuto sempre dentro lo stesso `\begin{tikzpicture}`, devo mettere `\begin{scope}[xshift=16cm]`…e cosi via.

        Io, invece vorrei che il successivo \scope, venga distanziato di 8 cm dal precedente, sia che esista un unico \scope, che, come nel codice che sto scrivendo ora, esistano 7 o “n” scope.

        Ribadisco che, vorrei fare il codice più generico possibile, perchè io, ad ora, non so quanti scope avrò in futuro. Ricordo che il fine ultimo è quello di riuscire a produrre dinamicamente questo codice (ma questo lo affronterò dopo 🙁 )

        Grazie

        Renato

        ps
        ho però visto, che la distanza fra gli elementi \scope, è relativa solo al primo \scope, quindi forse la possibilità che sto cercando semplicemente “non esiste”. Ma la possibilità di raggruppare i vari rami del flusso, continua a farmi molto comodo. Potrei sostituire \scope con altro e ottenere lo stesso scopo?

      • #102791
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          renareto” post=102779Ciao,
          utilizzo già questa sintassi `\begin{scope}[xshift=cm]`
          ma, in realtà (non mi sono spiegato bene) vorrei che il secondo (e anche il terzo, il quarto etc…) fossero distanziati di x cm, dallo scope precedente.

          Attualmente, riesco a inpostare la distanza solo dal primo scope. Quindi: per il secondo scope, metto `\begin{scope}[xshift=8cm]`, per il terzo scope (che è contenuto sempre dentro lo stesso `\begin{tikzpicture}`, devo mettere `\begin{scope}[xshift=16cm]`…e cosi via.

          Io, invece vorrei che il successivo \scope, venga distanziato di 8 cm dal precedente, sia che esista un unico \scope, che, come nel codice che sto scrivendo ora, esistano 7 o “n” scope.

          Ribadisco che, vorrei fare il codice più generico possibile, perchè io, ad ora, non so quanti scope avrò in futuro. Ricordo che il fine ultimo è quello di riuscire a produrre dinamicamente questo codice (ma questo lo affronterò dopo 🙁 )

          Grazie

          Renato

          ps
          ho però visto, che la distanza fra gli elementi \scope, è relativa solo al primo \scope, quindi forse la possibilità che sto cercando semplicemente “non esiste”. Ma la possibilità di raggruppare i vari rami del flusso, continua a farmi molto comodo. Potrei sostituire \scope con altro e ottenere lo stesso scopo?

          Ciao.
          Io non ho capito bene cosa intendi ma forse puoi usare le “pic”, sezione 18 del manuale di pgf.
          Se non lo sai, il manuale lo puoi aprire all’istante con il comando da terminale $ texdoc pgf

          Alla prossima.
          R.

        • #102792
          Up
          0
          Down
          ::

          renareto” post=102779Attualmente, riesco a inpostare la distanza solo dal primo scope. Quindi: per il secondo scope, metto `\begin{scope}[xshift=8cm]`, per il terzo scope (che è contenuto sempre dentro lo stesso `\begin{tikzpicture}`, devo mettere `\begin{scope}[xshift=16cm]`…e cosi via.

          Io, invece vorrei che il successivo \scope, venga distanziato di 8 cm dal precedente, sia che esista un unico \scope, che, come nel codice che sto scrivendo ora, esistano 7 o “n” scope.

          Ribadisco che, vorrei fare il codice più generico possibile, perchè io, ad ora, non so quanti scope avrò in futuro. Ricordo che il fine ultimo è quello di riuscire a produrre dinamicamente questo codice (ma questo lo affronterò dopo 🙁 )

          Non dico che non sia possibile, ma è piuttosto complicato. Mi spiego. L’ambiente scope serve soltanto per fornire proprietà simili a un gruppo di elementi, anche eterogenei. Perciò non si è mai avuta la necessità di dotarlo di un meccanismo di labeling per cui tu possa identificare un ambiente e fare sì che un secondo ambiente sia posizionato in qualche modo rispetto al primo. Questa è una peculiarità dei nodi. Perciò, se proprio vuoi farlo, l’unica soluzione che vedo è:

          – usare la libreria fit;
          – creare un nodo all’interno di ciascun ambiente scope che “fitti” tutti i nodi presenti;
          – dare un nome a quel nodo;
          – i nodi di riferimento dei successivi ambienti scope saranno posizionati rispetto al nodo “fit” creato.

          Seconda cosa: ho lavorato molto generalizzando e automatizzando la generazione delle figure. Secondo me è fondamentale partire da un esempio semplice per poi passare a cose più complesse. Se non riesci a rendere semplice gli esempi base, non ci siamo.

          Per esempio, non capisco per quale motivo tu abbia bisogno degli ambienti scope. Infatti, prendendo come riferimento http://tex.stackexchange.com/q/46007/13304 puoi vedere che ogni nodo ha una label. Ora, a priori tu non sai quanti flow chart avrai, perciò dovendo avere nomi univoci non puoi etichettare un nodo con “planning”. Dovrai avere un nome del tipo 1-1, dove il primo 1 si riferisce al grafico e il secondo al primo nodo del primo grafico. Poi avrai 1-2, 1-3 e così via. In questo modo, quando devi posizionare il primo nodo del secondo flow chart (2-1), dirai qualcosa tipo: `\node[opzioni varie, xshift=2cm](2-1)at(1-1.east){Qualcosa};`
          Ciao
          Claudio

        • #102793
          Up
          0
          Down
          ::


          Ciao Claudio,
          non volendo, ho fatto quello che mi hai scritto tu nel post precedente.
          Ho estratto il codice, usando un singolo \scope (che a questo punto, non ha neanche più senso) e così cerco di capire bene come funziona.
          SORPRESA!
          Non capisco per quale motivo, le scritte, che dovrebbero stare nelle linee della decision icon (ovvero lo “yes” e il “no”), mi vengono spostate e non centratee in mezzo alla linea. Perch?!

          mi sono accorto che non avevo riportato il codice, che è questo:
          `\documentclass[crop=true,border=2cm (all sides)
          i]{standalone}
          \usepackage[utf8]{inputenc}
          \usepackage{tikz}
          \usetikzlibrary{calc}
          \usetikzlibrary{shapes.geometric, arrows}

          \tikzstyle{startstop} = [rectangle, rounded corners, minimum width=5cm, minimum height=1cm,text centered, draw=black, fill=red!50]

          \tikzstyle{io} = [trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=blue!30]

          \tikzstyle{process} = [rectangle, minimum width=3cm, minimum height=1cm, text centered, text width=3cm, draw=black, fill=orange!30]

          \tikzstyle{decision} = [diamond, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=green!30]

          \tikzstyle{arrow} = [thick,->,>=stealth]

          \begin{document}
          %\noindent
          \begin{tikzpicture}[node distance=2cm]
          \coordinate (cone) at (0,0);
          \begin{scope} [name=scope1]%[thin]%——————–inizio primo blocco (scope)———–
          \node (start) [startstop,align=left] {Start};
          \node (in1) [io, below of=start] {Input};
          \node (pro1) [process, below of=in1] {Process 1};
          \node (dec1) [decision, below of=pro1, yshift=-0.5cm] {Decision 1};
          \node (pro2a) [process, left of=dec1, xshift=-2cm] {Process 2a text text text text text text text text text text};
          \node (pro2b) [process, right of=dec1, xshift=2cm] {Process 2b};
          \node (out1) [io, below of=pro2a] {Output};
          \node (stop) [startstop, below of=out1] {Stop};

          %————————inizio linee di collegamento
          \draw [arrow] (start) — (in1);
          \draw [arrow] (in1) — (pro1);
          \draw [arrow] (pro1) — (dec1);
          \draw [arrow] (dec1) — node[anchor=east] {yes} (pro2a);
          %\draw [arrow] (dec1) — node[anchor=east] {yes} (pro2a);
          \draw [arrow] (dec1) — node[anchor=west] {no} (pro2b);
          %\draw [arrow] (dec1) |- node[anchor=south] {no} (pro1);
          \draw [arrow] (pro2b) |- (pro1);
          \draw [arrow] (pro2a) — (out1);
          \draw [arrow] (out1) — (stop);
          \end{scope}

          \end{tikzpicture}
          `
          I 6/7 scope, mi sono serviti per:
          1- conoscere le potenzialità
          2- pensavo di dover fare un certo lavoro, invece pare non ce ne sia bisogno, quindi, utilizzerò gli \scope per altro, ma non mi serve allinearli.

          Comunque, mi è già servito no?

          Renato

          ps
          ora guardo anche l’ esempio di cui mi hai mandato il link

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

      Go to top