Re: Eliminare pt dall’espansione di \the

#76076
robitex
Amministratore del forum
    Up
    0
    Down
    ::

    OldClaudio” post=75303Non è vero che \dimexpr divida solo per numeri interi, anzi esegue l’operazione a*b/c nell’ordine conservando il risultato parziale della moltiplicazione in un registro a 64 bit, per cui non ci sono pericoli di overflow, almeno nella moltiplicazione.

    Ma se devi calcolare il rapporto di due lunghezze a e c, metti usi per b la lungezza \p@ (che è una lunghezza di 1pt, e assegni il risultato di \dimexr a una dimensione. Credo di avere gia provato a metter \dimexpr come argomento di \the e mi pare di ricordare di non avere avuto bisogno di disturbare un registro temporaneo; mi pare di ricordare di aver eseguito cose del tipo [tt]\strip@pt\dimexpr a*b/c\relax[/tt] senza nessun problema. Il vantoggio è che tutte le operazioni eseguite da \dimexpr sono eseguite nei registri della cpu e non richiedono conversioni da e per cs di LaTeX.

    Ricorda solo che \dimexpr arrotonda il risultato all’intero più vicino, mentre \divide semplicemente tronca, ma non è necessario ricorrere a \divide. Io lo facevo anni fa, quando le estensioni di eTeX non erano ancora incorporate dentro pdftex e xetex. luatex non ne ha bisogno perché sa fare i calcoli con lua. Avevo implementato con i comandi tradizionali di TeX la “long division” estraendo una cifra alla volta del quoziente, calcolando il resto, moltiplicando per 10 e ricominciando. Funzionava benissimo, ma ovviamente richiedeva di lavorare con gli scaled points e gestire il separatore decimale a parte. Tikz e pgfplots, con la loro libreria matematica non esistevano ancora…:wink:

    Ciao Claudio,
    ho provato a dividere due dimensioni ma con strani risultati, per esempio:
    `\documentclass{article}

    \newdimen\numer
    \newdimen\denom

    \numer=150pt
    \denom=150pt

    \divide\numer by \denom

    \begin{document}
    \the\numer% -> 0.00002pt invece di 1pt
    \end{document}`

    Con \dimexpr ho fatto questo tentativo:
    `\documentclass{article}

    \newdimen\numer
    \newdimen\denom

    \numer=150pt
    \denom=150pt

    \begin{document}
    \the\dimexpr\numer/\denom\relax% -> 0.00002pt invece di 1pt
    \end{document}`

    Evidentemente mi serve leggere la documentazione…
    Ecco l’ho fatto (quella di e-TeX) 🙂
    occorre moltiplicare per 65536 giusto?
    \the\dimexpr\numer/\denom*65536\relax
    tuttavia la soluzione con \pgfmath mi soddisfa.
    Grazie.
    Un saluto.
    R.

    Go to top