OldClaudio” post=80166
Ciao e bentornato
Grazie epr il bentornato; certo sono tornato un poco sul forum e lo faccio quando riesco a trovere una free WiFi. In realtà sono a circa 17 000 km di distanza nello stato di Vittoria, in Australia:smile:
Tornado al tuo problema Lo scalamanto di una lunghezza andrebbe fatto nel modo migliore sia per precisione, sia per velocità ricorrendo alle estensioni di eTeX che da diversi anni sono incorporate dentro ogni motore di composizione moderno, pdftex, xetex,luatex e forse anche altri. Questi sono i nomi dei veri programmi di composizione che insieme al file di formato latex.ltx formano pdflatex, xelatex, lualatex.
Allora per scalare di un fattore 0.25 ovvero 1/4 hai queste possibilità:`\dimen0= \dimexpr \dimen0 * 0.25pt / 1pt \relax`oppure` \dimen0 = \dimexpr \dimen0 * 1pt / 4pt \relax`
I due \relax sono facoltativi se non ci sono ambiguità con quel che segue; le dimensioni in puti tipografic possono venire rappresentate come multipli di \p@.
Il bello della \dimexpr è che la prima moltiplicazione viene eseguita in un registro da 64 bit (invece della lunghezza normale di 32 bit), quidi senza troncamenti né overflow. La divisione viene eseguite con il numeratore intero a doppia precisione e arrotondato, non troncato come succede con \divide. Sono due operazioni eseguite direttamente nei registri della CPU, quindi richiedono il minimo tempo macchina possibile. Il manuale di eTeX raccomanda di eseguire le operazioni di scalamento in questo modo. texdoc etex è illuminante a questo proposito.
Ciao
Claudio
Temo che non sia proprio vero. L’esecuzione di
`\dimen2=\dimexpr\dimen0*3/2\relax`
richiede essenzialmente lo stesso tempo di
`\dimen2=\dimen0 \multiply\dimen2 by 3 \divide\dimen2 by 2`
La sintassi che proponi
`\dimexpr \dimen0 * 0.25pt / 1pt \relax`
è scorretta. Se infatti provi questa sessione interattiva
`$ pdftex
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
restricted \write18 enabled.
**\relax
entering extended mode
*\dimen0=1cm
*\dimen0=\dimexpr \dimen0 * 0.25pt / 1pt \relax
*\showthe\dimen0
> 0.0pt.
<*> \showthe\dimen0
?
*\bye
[1{/usr/local/texlive/2012/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
Output written on texput.pdf (1 page, 11260 bytes).
Transcript written on texput.log.`
scopri che \dimexpr finisce con lo 0 e troverai “.25pt / 1pt” nel PDF finale.
Ciao
Enrico