\numexpr ed i comandi di pstricks

  • Creatore
    Topic
  • #42363
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Vorrei far calcolare valori dalla funzione \numexpr di pdftex modalità estesa all’interno di comandi pstricks, ma quando il calcolo riguarda valori decimali ricevo l’errore:`! Illegal unit of measure (pt inserted).
      `

      Di seguito riporto il codice di un esempio minimo compilabile che riproduce sul mio sistema (TeX Live 2009) il problema.
      `\documentclass[a4paper]{article}
      \usepackage{pstricks}

      \pagestyle{empty}
      \psset{unit=1mm}

      \begin{document}
      \psline(\numexpr0.5\relax,0.5)(65.5,38.5)
      \end{document}
      `

      Come vedete il calcolo per \numexpr in questo caso è il più semplice possibile, mentre il risultato di:`\number\numexpr0.55555\relax`
      è correttamente 0.55555 con il punto decimale.

      Naturalmente se vengono tolti di mezzo i decimali tutto funziona.
      `\documentclass[a4paper]{article}
      \usepackage{pstricks}

      \pagestyle{empty}
      \psset{unit=1mm}

      \begin{document}
      \psline(\numexpr5\relax,0.5)(65.5,38.5)
      \end{document}`

      Grazie e Saluti.

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #42364
        Up
        0
        Down
        ::

        Vorrei far calcolare valori dalla funzione \numexpr di pdftex modalità estesa all’interno di comandi pstricks, ma quando il calcolo riguarda valori decimali ricevo l’errore:`! Illegal unit of measure (pt inserted).
        `

        Di seguito riporto il codice di un esempio minimo compilabile che riproduce sul mio sistema (TeX Live 2009) il problema.
        `\documentclass[a4paper]{article}
        \usepackage{pstricks}

        \pagestyle{empty}
        \psset{unit=1mm}

        \begin{document}
        \psline(\numexpr0.5\relax,0.5)(65.5,38.5)
        \end{document}
        `

        Come vedete il calcolo per \numexpr in questo caso è il più semplice possibile, mentre il risultato di:`\number\numexpr0.55555\relax`
        è correttamente 0.55555 con il punto decimale.

        Naturalmente se vengono tolti di mezzo i decimali tutto funziona.
        `\documentclass[a4paper]{article}
        \usepackage{pstricks}

        \pagestyle{empty}
        \psset{unit=1mm}

        \begin{document}
        \psline(\numexpr5\relax,0.5)(65.5,38.5)
        \end{document}`

        \numexpr gestisce solo numeri interi. Un \relax termina la lista da dare in pasto a \numexpr ed è ignorato. Questo spiega perché il secondo esempio funziona: l’espansione di “\numexpr 5\relax” è “5”; nel primo esempio, invece, il token “.” che non è espandibile e non fa parte di quelli ammessi dalla sintassi di \numexpr, termina l’espressione e l’espansione finale di “\numexpr0.5\relax” è “0.5\relax” che a PSTricks non va bene.

        Se vuoi trattare numeri decimali devi usare \dimexpr, magari in congiunzione con \strip@pt:
        `\documentclass[a4paper]{article}
        \usepackage{pstricks}
        \makeatletter
        \let\strippt\strip@pt
        \makeatother

        \pagestyle{empty}
        \psset{unit=1mm}

        \begin{document}
        \psline(\strippt\dimexpr0.5pt\relax,0.5)(65.5,38.5)
        \end{document}`
        Adopera i numeri decimali come se fossero numeri puri, ma aggiungendo l’unità di misura “pt”, \strippt si occupa di toglierla.

        Ciao
        Enrico

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

          Vorrei far calcolare valori dalla funzione \numexpr di pdftex modalità estesa all’interno di comandi pstricks, ma quando il calcolo riguarda valori decimali ricevo l’errore:`! Illegal unit of measure (pt inserted).
          `

          Di seguito riporto il codice di un esempio minimo compilabile che riproduce sul mio sistema (TeX Live 2009) il problema.
          `\documentclass[a4paper]{article}
          \usepackage{pstricks}

          \pagestyle{empty}
          \psset{unit=1mm}

          \begin{document}
          \psline(\numexpr0.5\relax,0.5)(65.5,38.5)
          \end{document}
          `

          Come vedete il calcolo per \numexpr in questo caso è il più semplice possibile, mentre il risultato di:`\number\numexpr0.55555\relax`
          è correttamente 0.55555 con il punto decimale.

          Naturalmente se vengono tolti di mezzo i decimali tutto funziona.
          `\documentclass[a4paper]{article}
          \usepackage{pstricks}

          \pagestyle{empty}
          \psset{unit=1mm}

          \begin{document}
          \psline(\numexpr5\relax,0.5)(65.5,38.5)
          \end{document}`

          \numexpr gestisce solo numeri interi. Un \relax termina la lista da dare in pasto a \numexpr ed è ignorato. Questo spiega perché il secondo esempio funziona: l’espansione di “\numexpr 5\relax” è “5”; nel primo esempio, invece, il token “.” che non è espandibile e non fa parte di quelli ammessi dalla sintassi di \numexpr, termina l’espressione e l’espansione finale di “\numexpr0.5\relax” è “0.5\relax” che a PSTricks non va bene.

          Se vuoi trattare numeri decimali devi usare \dimexpr, magari in congiunzione con \strip@pt:
          `\documentclass[a4paper]{article}
          \usepackage{pstricks}
          \makeatletter
          \let\strippt\strip@pt
          \makeatother

          \pagestyle{empty}
          \psset{unit=1mm}

          \begin{document}
          \psline(\strippt\dimexpr0.5pt\relax,0.5)(65.5,38.5)
          \end{document}`
          Adopera i numeri decimali come se fossero numeri puri, ma aggiungendo l’unità di misura “pt”, \strippt si occupa di toglierla.

          Ciao
          Enrico

          Non sapevo che \numexpr supporta solo gli interi (perché non l’hanno chiamato \intexpr!!!).
          Comunque l’alternativa con \dimexpr soffre del solito errore non appena si tenta di lavorare con i contatori:`\documentclass[a4paper]{article}
          \usepackage{pstricks}
          \makeatletter
          \let\strippt\strip@pt
          \makeatother

          \pagestyle{empty}
          \psset{unit=1mm}

          \begin{document}
          \newcount\pippo
          \pippo=12
          \psline(\strippt\dimexpr\pippo*0.5pt\relax,0.5)(65.5,38.5)
          \end{document}
          `
          Provo a consultare la documentazione di etex.
          Grazie Enrico.

        • #42366
          Up
          0
          Down
          ::

          Non sapevo che \numexpr supporta solo gli interi (perché non l’hanno chiamato \intexpr!!!).

          Perché per TeX è sempre e solo intero.

          Comunque l’alternativa con \dimexpr soffre del solito errore non appena si tenta di lavorare con i contatori:`\documentclass[a4paper]{article}
          \usepackage{pstricks}
          \makeatletter
          \let\strippt\strip@pt
          \makeatother

          \pagestyle{empty}
          \psset{unit=1mm}

          \begin{document}
          \newcount\pippo
          \pippo=12
          \psline(\strippt\dimexpr\pippo*0.5pt\relax,0.5)(65.5,38.5)
          \end{document}
          `
          Provo a consultare la documentazione di etex.

          Il moltiplicatore intero per una dimensione va dopo:
          `\psline(\strippt\dimexpr0.5pt*\pippo\relax,0.5)(65.5,38.5)`


            |

          Ciao
          Enrico

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

            Non sapevo che \numexpr supporta solo gli interi (perché non l’hanno chiamato \intexpr!!!).

            Perché per TeX è sempre e solo intero.

            Comunque l’alternativa con \dimexpr soffre del solito errore non appena si tenta di lavorare con i contatori:`\documentclass[a4paper]{article}
            \usepackage{pstricks}
            \makeatletter
            \let\strippt\strip@pt
            \makeatother

            \pagestyle{empty}
            \psset{unit=1mm}

            \begin{document}
            \newcount\pippo
            \pippo=12
            \psline(\strippt\dimexpr\pippo*0.5pt\relax,0.5)(65.5,38.5)
            \end{document}
            `
            Provo a consultare la documentazione di etex.

            Il moltiplicatore intero per una dimensione va dopo:
            `\psline(\strippt\dimexpr0.5pt*\pippo\relax,0.5)(65.5,38.5)`


              |

            Ciao
            Enrico

            D’accordo. Adesso funziona.
            Grazie mille.

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

        Go to top