Re: pgfcalendar, contatore ed errore dimension too large

#89633
OldClaudio
Partecipante
    Up
    0
    Down
    ::


    Non c’è dubbio che usando la libreria floating point di pgf tu possa calcolare il valore che ti aspetti in un intervallo fra 0 e 1.

    A me sembra che si ammazzi una zanzara con un cannone; le indicazioni che ti avevo invitato a usare porterebbero ad un codice di questo genere ([tt]\strp@pt[/tt] è una macro interna di LaTeX che serve per eliminare l’indicazione `pt’ dal valore di una lunghezza in punti;[tt]\p@[/tt] è una dimensione interna di LaTeX che vale 1pt):`
    \documentclass{article}
    \usepackage{tikz}
    \usepackage{pgfcalendar}
    \newcount\datax % è il contatore che conserva il numero di giorni che intercorrono da \datamin
    \newcount\datamin % è il contatore che conserva la data più piccola
    \newcount\deltadata % è il contaotre che contiene la differenza delle date
    \pgfcalendardatetojulian{1920-01-01}{\datamin} % scrive in \datax il numero di giorni da \datamin

    \newcommand\tfdata[1]{%
    \pgfcalendardatetojulian{#1}{\datax}
    \advance\datax -\datamin\relax
    }
    \newcommand\calcdeltadata[1]{%
    \pgfcalendardatetojulian{#1}{\deltadata}
    \advance\deltadata -\datamin\relax
    }
    \calcdeltadata{2013-12-01} % è la data più alta; mi aspetto un rapporto in un intervallo tra 0 e 1

    \makeatletter
    \newcommand\rapportodate[2]{% calcolo del rapporto fra le differenze di 2 date giuliane
    \strip@pt\dimexpr\p@*#1/#2\relax
    }

    \makeatother
    \begin{document}

    \tfdata{2010-12-01}
    \begin{tikzpicture}
    \draw (\rapportodate{\datax}{\deltadata},0) — (-90:1mm);
    \end{tikzpicture}
    \end{document}`

    ho aggiunto solo un contatore e due macro solo per scrivere più pulito; se ne potrebbe fare a meno ma il codice sarebbe più contorto e a distanza di tempo diventerebbe incomprensibile.

    Con il valore di data di 2010-12-01 si ottiene un valore fratto di circa 0,9; con la data massima si ottiene 1. e non ci sono overflow di nessun genere né numerici né dimensionali.

    L’operazione \dimexpr/ è descritta col nome di “scaling” nel paragrafo Expressions del documento etex. Il tutto è calcolato nei registri interni del processore senza ricorrere a sviluppi di macro; ecco, quindi, lo schiaccia zanzare adatto; non il cannone delle “infinite” macro della libreria floaitng point di pgf. Per carità, anche quella libreria va benissimo, ma rallenta non poco i calcoli; ha senso quando si debbano calcolare funzioni trascendenti ma per un semplice rapporto sembra una cosa eccessiva.

    Go to top