Decisione errata in base a confronto tra dimensioni

  • Creatore
    Topic
  • #81309
    Liverpool
    Partecipante
      Up
      0
      Down
      ::


      Non riesco a capire perché questo codice non funzioni correttamente (la parte che conta è il blocco [tt]ifdim[/tt], non c’è bisogno che vi concentriate sul resto):
      `\documentclass{article}
      \usepackage{tikz}
      \makeatletter
      \pgfarrowsdeclare{*}{*}
      {
      \pgfutil@tempdima=\pgfgetarrowoptions{*}%
      \advance\pgfutil@tempdima by -0.5\pgflinewidth%
      \pgfarrowsleftextend{+-0.5\pgflinewidth}
      \pgfarrowsrightextend{+\pgfutil@tempdima}
      }
      {
      \pgfutil@tempdima=\pgfgetarrowoptions{*}%
      \ifdim\pgfutil@tempdima>5pt%
      \PackageWarning{TikZ}{* arrow: tip length is too short for the selected line width}
      \fi
      \advance\pgfutil@tempdima by -\pgflinewidth%
      \divide\pgfutil@tempdima by 2%
      \pgfsetdash{}{+0pt}
      \pgfpathcircle{\pgfqpoint{\pgfutil@tempdima}{0pt}}{\pgfutil@tempdima}
      \pgfusepathqfillstroke
      }
      \makeatother
      \pgfsetarrowoptions{*}{3pt}
      \begin{document}
      \begin{tikzpicture}
      \draw[-*] (0,0) — (1,0);
      \end{tikzpicture}
      \end{document}`
      [tt]\pgfutil@tempdima[/tt] è registro dimensione definito da [tt]TikZ[/tt]. Essendo uguale a 3 pt, non dovrei avere l’avviso; invece si comporta al contrario di come dovrebbe. Ho notato che il comportamento cambia a seconda dei valori che scelgo.

      Altra domanda: riesco ad ottenere l’asterisco dell’avviso nel file di log, ma non nella finestrella dei messaggi di Texmaker. Come faccio a visualizzare l’asterisco anche lì?

      Grazie e ciao

    Visualizzazione 6 filoni di risposte
    • Autore
      Risposte
      • #81310
        Up
        0
        Down
        ::

        Liverpool” post=80543Non riesco a capire perché questo codice non funzioni correttamente (la parte che conta è il blocco [tt]ifdim[/tt], non c’è bisogno che vi concentriate sul resto):
        `\documentclass{article}
        \usepackage{tikz}
        \makeatletter
        \pgfarrowsdeclare{*}{*}
        {
        \pgfutil@tempdima=\pgfgetarrowoptions{*}%
        \advance\pgfutil@tempdima by -0.5\pgflinewidth%
        \pgfarrowsleftextend{+-0.5\pgflinewidth}
        \pgfarrowsrightextend{+\pgfutil@tempdima}
        }
        {
        \pgfutil@tempdima=\pgfgetarrowoptions{*}%
        \ifdim\pgfutil@tempdima>5pt%
        \PackageWarning{TikZ}{* arrow: tip length is too short for the selected line width}
        \fi
        \advance\pgfutil@tempdima by -\pgflinewidth%
        \divide\pgfutil@tempdima by 2%
        \pgfsetdash{}{+0pt}
        \pgfpathcircle{\pgfqpoint{\pgfutil@tempdima}{0pt}}{\pgfutil@tempdima}
        \pgfusepathqfillstroke
        }
        \makeatother
        \pgfsetarrowoptions{*}{3pt}
        \begin{document}
        \begin{tikzpicture}
        \draw[-*] (0,0) — (1,0);
        \end{tikzpicture}
        \end{document}`
        [tt]\pgfutil@tempdima[/tt] è registro dimensione definito da [tt]TikZ[/tt]. Essendo uguale a 3 pt, non dovrei avere l’avviso; invece si comporta al contrario di come dovrebbe. Ho notato che il comportamento cambia a seconda dei valori che scelgo.

        Altra domanda: riesco ad ottenere l’asterisco dell’avviso nel file di log, ma non nella finestrella dei messaggi di Texmaker. Come faccio a visualizzare l’asterisco anche lì?

        Grazie e ciao

        Credo che tu debba comunque dichiarare l’espressione `\pgfutil@tempdima=\pgfgetarrowoptions{*}%` come dimensione; quindi `\pgfmathsetlength{\pgfutil@tempdima}{\pgfgetarrowoptions{*}}%` dovrebbe essere il modo corretto.

        Ciao
        Claudio

      • #81311
        Liverpool
        Partecipante
          Up
          0
          Down
          ::

          cfiandra” post=80544Credo che tu debba comunque dichiarare l’espressione `\pgfutil@tempdima=\pgfgetarrowoptions{*}%` come dimensione; quindi `\pgfmathsetlength{\pgfutil@tempdima}{\pgfgetarrowoptions{*}}%` dovrebbe essere il modo corretto.

          Ma da qualche parte nel sorgente di [tt]pgf[/tt] è stato definito [tt]\newdimen\pgfutil@tempdima[/tt]. Dici che non è sufficiente? Se provi a stampare il valore del registro ti dice [tt]3.0pt[/tt].

          Ciao

        • #81312
          Up
          0
          Down
          ::

          Liverpool” post=80545[..]Dici che non è sufficiente?[…]

          In realtà non so spiegare correttamente il perché non sia sufficiente. La mia supposizione è che nonostante la definizione iniziale, le assegnazioni tra dimensioni vadano comunque fatte con [tt]\pgfmathsetlenght[/tt] o [tt]\pgfmathaddtolenght[/tt] altrimenti la stampa è esatta solo per qualche barbatrucco interno.

          Onestamente ho provato a vedere come sono definite [tt]\pgfmathsetlenght[/tt] e [tt]\pgfmathaddtolenght[/tt] per giustificare la mia ipotesi, ma non è facile capire al volo quel codice. Per chi fosse interessato, basta digitare da terminale:`gedit $(kpsewhich pgfmathcalc.code.tex)&`

          Ciao
          Claudio

        • #81313
          Up
          0
          Down
          ::


          Metti i [tt]%[/tt] dove non servono e non li metti dove servono. 🙁 Ma il problema è che non termini l’espansione di [tt]\pgfgetarrowoptions{*}[/tt] e quindi [tt]\ifdim[/tt] è espanso prima che la dimensione sia assegnata.

          `\documentclass{article}
          \usepackage{tikz}
          \makeatletter
          \pgfarrowsdeclare{*}{*}
          {%
          \pgfutil@tempdima=\pgfgetarrowoptions{*}\relax
          \advance\pgfutil@tempdima by -0.5\pgflinewidth
          \pgfarrowsleftextend{+-0.5\pgflinewidth}%
          \pgfarrowsrightextend{+\pgfutil@tempdima}%
          }
          {%
          \pgfutil@tempdima=\pgfgetarrowoptions{*}\relax
          \ifdim\pgfutil@tempdima>5pt
          \PackageWarning{TikZ}{* arrow: tip length is too short for the selected line width}%
          \fi
          \advance\pgfutil@tempdima by -\pgflinewidth
          \divide\pgfutil@tempdima by 2
          \pgfsetdash{}{+0pt}%
          \pgfpathcircle{\pgfqpoint{\pgfutil@tempdima}{0pt}}{\pgfutil@tempdima}%
          \pgfusepathqfillstroke
          }
          \makeatother
          \pgfsetarrowoptions{*}{3pt}
          \begin{document}
          \begin{tikzpicture}
          \draw[-*] (0,0) — (1,0);
          \end{tikzpicture}

          \pgfsetarrowoptions{*}{10pt}
          \begin{tikzpicture}
          \draw[-*] (0,0) — (1,0);
          \end{tikzpicture}

          \end{document}`
          Nel primo caso [tt]\relax[/tt] non è strettamente necessario, perché il token che segue è [tt]\advance[/tt], non espandibile. Nel secondo caso è decisivo.

          Quando un condizionale dà un risultato inaspettato, il problema è quasi sempre perché viene eseguito prima che ai termini da confrontare siano stati attribuiti i valori corretti. L’assegnazione [tt]\pgfutil@tempdima=\pgfgetarrowoptions{*}[/tt] funziona perché evidentemente la macro [tt]\pgfgetarrowoptions[/tt] è completamente espandibile. Ma la sua espansione è, nel tuo caso, [tt]3pt[/tt] e in un’assegnazione
          `\pgfutil@tempdima=3pt`
          TeX cerca di espandere sempre il token che segue, nei due casi [tt]\advance[/tt] e [tt]\ifdim[/tt]. Nel primo caso non succede nulla, perché il token non è espandibile; nel secondo è espandibile! Ops! L’assegnazione non è ancora completa e [tt]\pgfutil@tempdima[/tt] ha ancora il valore precedente. Puoi scegliere se lasciare uno spazio dopo la graffa o mettere [tt]\relax[/tt]. Meglio il secondo.

          Nota che
          `\ifdim\pgfgetarrowoptions{*}>5pt
          \PackageWarning{TikZ}{* arrow: tip length is too short for the selected line width}%
          \fi`
          funzionerebbe, ma comunque vuoi assegnare quel valore a [tt]\pgfutil@tempdima[/tt], quindi tanto vale farlo prima.

          Ciao
          Enrico

        • #81314
          Liverpool
          Partecipante
            Up
            0
            Down
            ::

            egreg9″ post=80548Metti i [tt]%[/tt] dove non servono e non li metti dove servono. 🙁

            Perché copio! Chi ha scritto le librerie di frecce per [tt]TikZ[/tt] ha adottato quel sistema e io mi sono adattato 8)
            Avevo notato che usando direttamente [tt]\pgfgetarrowoptions[/tt] tutto andava bene, ma non mi volevo arrendere perché, come hai detto tu, dopo lo devo usare comunque.

            E per la seconda domanda, hai una risposta? Come faccio a mostrare l’asterisco anche nella finestra dei messaggi di Texmaker e non solo nel file log?

            Grazie mille

            P.S.: il problema è sempre quello: vogliamo guidare la Ferrari prima di sapere dove sia il freno 😮

            Ciao

          • #81315
            Up
            0
            Down
            ::

            Liverpool” post=80550E per la seconda domanda, hai una risposta? Come faccio a mostrare l’asterisco anche nella finestra dei messaggi di Texmaker e non solo nel file log?

            Non ne ho la minima idea. Con TeXStudio esce.

            Ciao
            Enrico

          • #81316
            Up
            0
            Down
            ::

            Liverpool” post=80550E per la seconda domanda, hai una risposta? Come faccio a mostrare l’asterisco anche nella finestra dei messaggi di Texmaker e non solo nel file log?

            Texmaker rimuove esplicitamente tutti gli asterischi dagli avvisi (forse lo fa per ripulire gli avvisi LaTeX3; comunque è un bug).

            Ciao,
            Antonio

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

        Go to top