Re: \numexpr ed i comandi di pstricks

#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.

    Go to top