Problema tree e tikz con formule matematiche

  • Creatore
    Topic
  • #100754
    Up
    0
    Down
    ::


    Sto continuando ad aiutare la mia amica per la tesi in matematica.
    Mi ha sottoposto un quesito niente male: usare in una formula matematica un albero per impostare 2 scelte. Ho pensato che usare tikz e tree fossero la scelta migliore.
    Ho scritto del codice, ma, purtroppo, non riesco a ottenere un risultato ottimale a video, senza capire dove sbaglio.

    Vi posto il codice, ridotto all’osso, ma funzionante:

    `
    \documentclass{article}

    \usepackage{tikz}
    \usetikzlibrary{trees}
    \begin{document}

    % Set the overall layout of the tree
    \tikzstyle{level 1}=[level distance=3cm, sibling distance=3cm]
    \tikzstyle{level 2}=[level distance=3cm, sibling distance=2cm]

    % Define styles for bags and leafs
    \tikzstyle{bag} = [text width=2em, text centered]
    \tikzstyle{end} = [circle, minimum width=3pt,fill, inner sep=0pt]

    \begin{tikzpicture}[grow=right, sloped]
    \node[bag]
    % testo prima delle frecce
    {
    $
    \frac{d}{dy}
    \int_{0}^{y} u(x) \ dx
    $
    }
    % nodo giù
    child
    {
    node[bag] {0 per quanto sopra}
    }
    % nodo su
    child
    {
    node[bag] {u(y) per il teorema di …}
    }
    ;
    \end{tikzpicture}

    \end{document}
    `

Visualizzazione 13 filoni di risposte
  • Autore
    Risposte
    • #100755
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        La documentazione di amsmath presenta come farlo senza ricorrere a cose che in una tesi di matematica non stannao assolutamante bene;

        Confronta la mia soluzione con la tua:`\documentclass{article}
        \usepackage[T1]{fontenc}
        \usepackage{lmodern}
        \usepackage[utf8]{inputenc}
        \usepackage[italian]{babel}
        \usepackage{amsmath}
        \DeclareMathOperator{\diff}{\mathrm{d}\!}
        \usepackage{tikz}
        \usetikzlibrary{trees}

        \begin{document}
        Le scelte con amsmath:
        \begin{equation}
        \frac{\diff}{\diff y}\int_0^y u{x}\diff x =
        \begin{cases}
        0 & \text{per quanto sopra}\\
        u(y) & \text{per il teorema di PincoPallo}
        \end{cases}
        \end{equation}

        Le scelte con TikZ:
        % Set the overall layout of the tree
        \tikzstyle{level 1}=[level distance=3cm, sibling distance=3cm]
        \tikzstyle{level 2}=[level distance=3cm, sibling distance=2cm]

        % Define styles for bags and leafs
        \tikzstyle{bag} = [text width=2em, text centered]
        \tikzstyle{end} = [circle, minimum width=3pt,fill, inner sep=0pt]

        \begin{tikzpicture}[grow=right, sloped]
        \node[bag]
        % testo prima delle frecce
        {
        $
        \frac{d}{dy}
        \int_{0}^{y} u(x) \ dx
        $
        }
        % nodo giù
        child
        {
        node[bag] {0 per quanto sopra}
        }
        % nodo su
        child
        {
        node[bag] {u(y) per il teorema di …}
        }
        ;
        \end{tikzpicture}

        \end{document}
        `

      • #100756
        Up
        0
        Down
        ::


        A quella soluzione ci ero arrivato anche io! Il problema è che il prof. vuole le due sbarrette (o linee o frecce, chiamatele come viene meglio) e non la parentesi graffa 😀

      • #100757
        claudio
        Partecipante
          Up
          0
          Down
          ::


          una guardata al pacchetto forest l’hai data?
          ciao
          claudio

        • #100758
          Up
          0
          Down
          ::


          La soluzione corretta è quella proposta da OldClaudio: è una tesi, deve essere scritta come si deve!

          Ovviamente, usare una struttura ad albero in questo caso è un suicidio. Una soluzione più apprezzabile è sfruttare la proprietà della tikzmark macro (si veda guida tematica apposita):`\documentclass{article}
          \usepackage[T1]{fontenc}
          \usepackage{lmodern}
          \usepackage[utf8]{inputenc}
          \usepackage[italian]{babel}
          \usepackage{amsmath}
          \DeclareMathOperator{\diff}{\mathrm{d}\!}
          \usepackage{tikz}
          \usetikzlibrary{trees}

          \newcommand{\tikzmark}[2][0pt]{\tikz[baseline=#1,remember picture]\node[coordinate](#2){};}

          \begin{document}
          Le scelte con amsmath:
          \begin{equation}
          \frac{\diff}{\diff y}\int_0^y u{x}\diff x =
          \begin{cases}
          0 & \text{per quanto sopra}\\
          u(y) & \text{per il teorema di PincoPallo}
          \end{cases}
          \end{equation}

          Le scelte con TikZ:
          % Set the overall layout of the tree
          \tikzstyle{level 1}=[level distance=3cm, sibling distance=3cm]
          \tikzstyle{level 2}=[level distance=3cm, sibling distance=2cm]

          % Define styles for bags and leafs
          \tikzstyle{bag} = [text width=2em, text centered]
          \tikzstyle{end} = [circle, minimum width=3pt,fill, inner sep=0pt]

          \begin{tikzpicture}[grow=right, sloped]
          \node[bag]
          % testo prima delle frecce
          {
          $
          \frac{d}{dy}
          \int_{0}^{y} u(x) \ dx
          $
          }
          % nodo giù
          child
          {
          node[bag] {0 per quanto sopra}
          }
          % nodo su
          child
          {
          node[bag] {u(y) per il teorema di …}
          }
          ;
          \end{tikzpicture}

          Usando meglio Ti\textit{k}Z:
          \begin{equation}
          \frac{\diff}{\diff y}\int_{0\tikzmark{y}}^{y\tikzmark[-0.5ex]{x}} u{x}\diff x
          \end{equation}
          \begin{tikzpicture}[remember picture,overlay]
          \draw[stealth-](x)–++(30:1cm)node[above right]{u(y) per il teorema di …};
          \draw[stealth-](y)–++(-30:1cm)node[below right]{0 per quanto sopra};
          \end{tikzpicture}
          \end{document}` Mi raccomando di compilare due volte.

          Avvertenza: la soluzione che propongo deve essere usata con cautela. Segmenti troppo lunghi faranno si che l’annotazione si vada a sovrapporre con il testo superiore o inferiore. Non che sia complicato fare le dovute correzioni, ma è sempre bene avvertire.

          Ciao
          Claudio

        • #100759
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Eccoti una soluzione con le frecce; ripeto, non è professionale, perché in matematica si usa la costruzione cona la graffa e non è un caso che sia quella la realizzazione della American Mathematical Society. Adogni modo nel file che segue ci sono tre soluzioni; una è quella corretta e professionale, una è quella con le frecce; una è la tua leggermente modificata eprché assegnare 2em alla larghezza delle bag è un chiaro sengo che non si ha l’idea di quanto sia grande o piccolo 1em.`\documentclass{article}
            \usepackage[T1]{fontenc}
            \usepackage{lmodern}
            \usepackage[utf8]{inputenc}
            \usepackage[italian]{babel}
            \usepackage{amsmath}
            \DeclareMathOperator{\diff}{\mathrm{d}\!}
            \usepackage{tikz}
            \usetikzlibrary{trees}

            \begin{document}
            \begin{equation}
            \frac{\diff}{\diff y}\int_0^y u(x)\diff x =
            \begin{cases}
            0 & \text{per quanto sopra}\\
            u(y) & \text{per il teorema di PincoPallo}
            \end{cases}
            \end{equation}

            \begin{equation}\unitlength0.1\baselineskip\arraycolsep=3pt
            \frac{\diff}{\diff y}\int_0^y u(x)\diff x =
            \begin{picture}(10,20)(0,8)
            \put(0,10){\vector(1,1){10}}
            \put(0,10){\vector(1,-1){10}}
            \end{picture}
            \begin{array}{ll}
            0 & \text{ per quanto sopra}\\[2.5ex]
            u(y) & \text{ per il teorema di PincoPallo}
            \end{array}
            \end{equation}

            % Set the overall layout of the tree
            \tikzstyle{level 1}=[level distance=3cm, sibling distance=3cm]
            \tikzstyle{level 2}=[level distance=3cm, sibling distance=2cm]

            % Define styles for bags and leafs
            \tikzstyle{bag} = [text width=15em, text centered]
            \tikzstyle{end} = [circle, minimum width=3pt,fill, inner sep=0pt]

            \begin{tikzpicture}[grow=right, sloped]
            \node[bag]
            % testo prima delle frecce
            {
            $
            \frac{d}{dy}
            \int_{0}^{y} u(x) \ dx
            $
            }
            % nodo giù
            child
            {
            node[bag] {0 per quanto sopra}
            }
            % nodo su
            child
            {
            node[bag] {u(y) per il teorema di …}
            }
            ;
            \end{tikzpicture}

            \end{document}
            `

          • #100760
            Up
            0
            Down
            ::


            il seguente codice potrebbe andar bene

            `
            \documentclass{article}
            \usepackage[T1]{fontenc}
            \usepackage{lmodern}
            \usepackage[utf8]{inputenc}
            \usepackage[italian]{babel}
            \usepackage{amsmath}
            \DeclareMathOperator{\diff}{\mathrm{d}\!}
            \usepackage{tikz}
            \usetikzlibrary{trees}

            \newcommand{\tikzmark}[2][0pt]{\tikz[baseline=#1,remember picture]\node[coordinate](#2){};}

            \begin{document}

            % Set the overall layout of the tree
            \tikzstyle{level 1}=[level distance=3cm, sibling distance=3cm]
            \tikzstyle{level 2}=[level distance=3cm, sibling distance=2cm]

            % Define styles for bags and leafs
            \tikzstyle{bag} = [text width=15em, text centered]
            \tikzstyle{end} = [circle, minimum width=3pt,fill, inner sep=0pt]

            \begin{tikzpicture}[grow=right, sloped]
            \node[bag]
            % testo prima delle frecce
            {
            $
            \frac{d}{dy}
            \int_{0}^{y} u(x) \ dx
            $
            }
            % nodo giù
            child
            {
            node[bag] {0 per quanto sopra}
            }
            % nodo su
            child
            {
            node[bag] {u(y) per il teorema di …}
            }
            ;
            \end{tikzpicture}

            \end{document}
            `

            Ma a mio avviso ci sono i seguenti punti da migliorare (e non saprei come fare, nel senso che non ne vengo a capo):
            – la scritta dall’integrale fino a dx deve essere più grande
            – le “frecce” devono partire dopo dx
            – u(y) e 0 devono partire dalla fine delle “frecce”

            Grazie ancora! 🙂

            Modifica meno “elegante”:

            `
            \documentclass{article}
            \usepackage[T1]{fontenc}
            \usepackage{lmodern}
            \usepackage[utf8]{inputenc}
            \usepackage[italian]{babel}
            \usepackage{amsmath}
            \DeclareMathOperator{\diff}{\mathrm{d}\!}
            \usepackage{tikz}
            \usetikzlibrary{trees}

            \begin{document}

            \begin{tikzpicture}[level distance=4cm,
            sibling distance=2cm,
            % every node/.style={fill=blue!30,circle,inner sep=5pt},
            % arrow/.style={edge from parent/.style={draw,-latex}}
            ]

            \node
            {
            \begin{Large}
            $
            \frac{d}{dy}
            \int_{0}^{y} u(x) \ dx
            $
            \end{Large}
            }
            [grow=right]
            {
            child {node{\hspace{1cm} 0 per quanto sopra}}
            child {node{\hspace{2cm} u(y) per il teorema di …}}
            % child[arrow] {node{60}}
            };
            \end{tikzpicture}

            \end{document}
            `

          • #100761
            Up
            0
            Down
            ::


            Non è più semplice utilizzare [tt]\tikmark[/tt] come ti ha già mostrato @cfiandra?
            `
            \documentclass{article}
            \usepackage[T1]{fontenc}
            \usepackage{lmodern}
            \usepackage[utf8]{inputenc}
            \usepackage[italian]{babel}
            \usepackage{amsmath}
            \DeclareMathOperator{\diff}{\mathrm{d}\!}
            \usepackage{tikz}
            \usetikzlibrary{trees}

            \newcommand{\tikzmark}[2][0pt]{\tikz[baseline=#1,remember picture]\node[coordinate](#2){};}

            \begin{document}

            % Set the overall layout of the tree
            \tikzset{
            level 1/.style = {level distance=3cm, sibling distance=3cm} ,
            level 2/.style = {level distance=3cm, sibling distance=2cm} ,
            % Define styles for bags and leafs
            bag/.style = {text width=15em, text centered} ,
            end/.style = {circle, minimum width=3pt,fill, inner sep=0pt}
            }

            Usando meglio Ti\textit{k}Z:
            \begin{equation}
            \frac{\diff}{\diff y}\int_{0}^{y} u{x}\diff x\tikzmark[-1ex]{x}\tikzmark{y}
            \end{equation}
            \begin{tikzpicture}[remember picture,overlay]
            \draw[stealth-](x)–++(15:1cm)node[above right]{$u(y)$ per il teorema di …};
            \draw[stealth-](y)–++(-15:1cm)node[below right]{$0$ per quanto sopra};
            \end{tikzpicture}
            `

            Piccola osservazione: [tt]\tikzstyle[/tt] è un comando deprecato: resta ancora per questioni di retrocompatibilità, ma si consiglia l’uso di [tt]\tikzset[/tt] 😉

          • #100762
            Up
            0
            Down
            ::


            userò \tikzset
            per il codice: quello che hai dato tu funziona, ma ci sono due problemi:
            – non ci devono essere le frecce con le punte, ma solo linee
            – si potrebbe spostare più a destra l’equazione? perchè il testo delle due parti continua (il testo delle diramazioni), quindi non si deve sfociare troppo oltre la pagina

          • #100763
            Up
            0
            Down
            ::

            skevin93″ post=100481Non è più semplice utilizzare [tt]\tikmark[/tt] come ti ha già mostrato @cfiandra?

            Probabilmente si 😉

            skevin93″ post=100481Piccola osservazione: [tt]\tikzstyle[/tt] è un comando deprecato: resta ancora per questioni di retrocompatibilità, ma si consiglia l’uso di [tt]\tikzset[/tt] 😉

            OT: io onestamente è un pezzo che ho lasciato perdere di farlo notare… il problema, a monte, è che le persone prendono il codice su texample.net senza preoccuparsi se nel frattempo sono passati 5/6 anni e quindi quel codice non è più adeguato. Mi pare anche di averlo fatto notare a Stefan, ma capisco che sarebbe un lavoraccio sistamare tutto.. Poi capitano problemi come questo!

            Ciao
            Claudio

          • #100764
            Up
            0
            Down
            ::

            golden_boy” post=100483userò \tikzset
            per il codice: quello che hai dato tu funziona, ma ci sono due problemi:
            – non ci devono essere le frecce con le punte, ma solo linee

            È sufficiente rimuovere [tt]stealth-[/tt] dalle opzioni di TikZ.

            – si potrebbe spostare più a destra l’equazione? perchè il testo delle due parti continua (il testo delle diramazioni), quindi non si deve sfociare troppo oltre la pagina

            Il problema è come funziona la macro [tt]\tikzmark[/tt]: essa ti permette di segnare un punto nella tua pagina, da riutilizzare dopo con TikK, ma il testo viene sovrapposto a tutto il resto (l’opzione [tt]overlay[/tt] che passi a TikZ.

            Prova a vedere se così ti va bene:
            `
            \documentclass{article}
            \usepackage{tikz}

            \begin{document}
            \begin{equation}
            \frac{\diff}{\diff y}\int_{0}^{y} u(x)\diff \begin{tikzpicture}[remember picture,baseline=(x.base)]
            \node(x)[inner sep=0pt,outer sep=1pt]{$x$};
            \draw(x)–++(15:1cm)node[above right,align=justify]{$u(y)$ per il teorema di …};
            \draw(x)–++(-15:1cm)node[below right,align=justify]{$0$ per quanto sopra};
            \end{tikzpicture}
            \end{equation}
            \end{document}
            `

          • #100765
            Up
            0
            Down
            ::



            @skevin93
            : non so perchè ma la tua soluzione funziona aggiungendo qualcosa:

            `
            \documentclass{article}

            %\usepackage[T1]{fontenc}
            %\usepackage{lmodern}
            %\usepackage[utf8]{inputenc}

            \usepackage[italian]{babel}
            \usepackage{amsmath}

            \DeclareMathOperator{\diff}{\mathrm{d}\!}
            \usepackage{tikz}
            %\usetikzlibrary{trees}

            \begin{document}

            \begin{equation}
            \frac{\diff}{\diff y}\int_{0}^{y} u(x)\diff
            \begin{tikzpicture}[remember picture,baseline=(x.base)]
            \node(x)[inner sep=0pt,outer sep=1pt]{$x$};
            \draw(x)–++(15:1cm)node[above right,align=justify]{$u(y)$ per il teorema di …};
            \draw(x)–++(-15:1cm)node[below right,align=justify]{$0$ per quanto sopra};
            \end{tikzpicture}
            \end{equation}

            \end{document}
            `

            Inoltre, se provo a inserire quei pezzi di codice nella tesi dà errore, proprio riguardo al \Declare

          • #100766
            Up
            0
            Down
            ::

            skevin93″ post=100486

            – si potrebbe spostare più a destra l’equazione? perchè il testo delle due parti continua (il testo delle diramazioni), quindi non si deve sfociare troppo oltre la pagina

            Il problema è come funziona la macro [tt]\tikzmark[/tt]: essa ti permette di segnare un punto nella tua pagina, da riutilizzare dopo con TikZ, ma il testo viene sovrapposto a tutto il resto (l’opzione [tt]overlay[/tt] che passi a TikZ.

            Secondo me è sufficiente dare una dimensione opportuna alla lunghezza dei segmenti bilanciando la dimensione dei nodi tramite chiavi [tt]minimum width[/tt] e [tt]minimum heigh[/tt].

            golden_boy” post=100488 @skevin93: non so perchè ma la tua soluzione funziona aggiungendo qualcosa:

            `
            \documentclass{article}

            %\usepackage[T1]{fontenc}
            %\usepackage{lmodern}
            %\usepackage[utf8]{inputenc}

            \usepackage[italian]{babel}
            \usepackage{amsmath}

            \DeclareMathOperator{\diff}{\mathrm{d}\!}
            \usepackage{tikz}
            %\usetikzlibrary{trees}

            \begin{document}

            \begin{equation}
            \frac{\diff}{\diff y}\int_{0}^{y} u(x)\diff
            \begin{tikzpicture}[remember picture,baseline=(x.base)]
            \node(x)[inner sep=0pt,outer sep=1pt]{$x$};
            \draw(x)–++(15:1cm)node[above right,align=justify]{$u(y)$ per il teorema di …};
            \draw(x)–++(-15:1cm)node[below right,align=justify]{$0$ per quanto sopra};
            \end{tikzpicture}
            \end{equation}
            \end{document}
            `

            Inoltre, se provo a inserire quei pezzi di codice nella tesi dà errore, proprio riguardo al \Declare

            Commentare le chiamate a pacchetti così importanti è un suicidio. Essere vaghi come continui ripetutamente a fare è controproducente per te, non certo per noi. Quale errore ottieni, come è costruito il preambolo della tesi? Anche avendo un’ottima sfera di cristallo non si può prevedere tutto.

            Ciao
            Claudio

          • #100767
            Up
            0
            Down
            ::


            Non è vaghezza la mia, ho solo scritto che il codice di skevin93 per funzionare non è completo e non compila. Ho mostrato il codice necessario per farlo funzionare, commentando pacchetti comuni, nel senso che quei pacchetti sono sicuramente utili, ma ciò che serve per la compilazione è la riga con \Declare…

            Inoltre, essendo una tesi di laurea, non mia, non posso pubblicare il lavoro (per privacy e per rispetto, visto che non è stata ancora stampata) , ma devo modificare il file originale senza comprometterne nè l’errore nè la sintassi.

            Ho scoperto da solo dove era l’errore: riguarda la posizione dove collocavo
            `
            \DeclareMathOperator{\diff}{\mathrm{d}\!} % inserisce il differenziale nelle formule
            \usepackage{tikz}
            `

            le ho inserite prima del \begin{document} e dopo tutti i package e \theoremstyle e \newtheorem e ora funziona 🙂

            L’errore era perchè inserivo le due righe come primi package. Errore di posizione, banale, ma non scontato 😉

          • #100768
            Up
            0
            Down
            ::

            golden_boy” post=100491Non è vaghezza la mia, ho solo scritto che il codice di skevin93 per funzionare non è completo e non compila. Ho mostrato il codice necessario per farlo funzionare, commentando pacchetti comuni, nel senso che quei pacchetti sono sicuramente utili, ma ciò che serve per la compilazione è la riga con \Declare…

            Questo è vero, ma concorderai che quel comando è stato utilizzato in tutti i messaggi precedenti. Anche un altro codice di skevin del messaggio #100481 non funziona perché manca un [tt]\end{document}[/tt], che chiaramente è semplice da inserire.

            Quello che voglio dire è che bisogna distinguere i casi in cui l’aggiunta di una riga risolve la situazione rispetto a quelli in cui non si sa come sia composto il preambolo.

            golden_boy” post=100491Inoltre, essendo una tesi di laurea, non mia, non posso pubblicare il lavoro (per privacy e per rispetto, visto che non è stata ancora stampata) , ma devo modificare il file originale senza comprometterne nè l’errore nè la sintassi.

            Ho scoperto da solo dove era l’errore: riguarda la posizione dove collocavo
            `
            \DeclareMathOperator{\diff}{\mathrm{d}\!} % inserisce il differenziale nelle formule
            \usepackage{tikz}
            `

            le ho inserite prima del \begin{document} e dopo tutti i package e \theoremstyle e \newtheorem e ora funziona 🙂

            L’errore era perchè inserivo le due righe come primi package. Errore di posizione, banale, ma non scontato 😉

            Francamente non capisco. Sai di quante tesi di laurea ci sono i preamboli su questo forum? Chiaramente sarebbe un discorso diverso per il contenuto, ma qui stiamo parlando del preambolo! Oltretutto, stiamo anche parlando di quella tesi di cui dicevi la consegna fosse imminente (si veda la discussione in questo filone)…

            Detto questo, felice che tu abbia risolto il problema. Era un errore di posizione si, direi però scontato: lasciamo perdere la question dell’operatore, bastava la chiamata ad un pacchetto all’interno di [tt]\begin{document}[/tt] a far nascere dei sospetti.

            Ciao
            Claudio

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

        Go to top