Calcoli temporali (date, età, ecc.)

  • Creatore
    Topic
  • #23789
    Up
    0
    Down
    ::


    Ciao a tutti,
    tempo fa, la lettura della discussione Fare calcoli in (La)TeX (http://www.guit.sssup.it/phpBB2/viewtopic.php?t=1304) mi aveva fatto pensare a come poter eseguire a LaTeX dei calcoli «temporali».

    Cerco di spiegarmi meglio. Ad esempio, il pacchetto «datetime» (non è detto che si debba tirare in ballo questo per forza) mette a disposizione il comando
    `\newdate{name}{day}{month}{year}`
    per «salvare» una data, ma, a parte il fatto di potervi fare riferimento, non permette di fare elaborazioni più complesse.

    Tuttavia, immaginando di salvare una data con nome «data», sarebbe fantastico poter scrivere
    `Il pacchetto è stato spedito \calcolaGiorni{data} giorni fa e non l'ho ancora ricevuto`
    oppure
    `Io ho \calcolaAnni{data} anni`
    volendo, anche in un modo diverso
    `Il pacchetto è stato spedito \calcola{giorni}{data} giorni fa…
    […]
    Io ho \calcola{anni}{data} anni`
    o in altri modi ancora, per esempio facendo seguire il tutto da una stringa («giorni», «anni», ecc.) decisa a seconda del valore dell’opzione, prendendo in prestito una (parte) di concetto da «varioref». Ad ogni modo, ciò che mi interessa di più è fare i calcoli.

    È possibile fare quello che chiedo?

    Mi riallaccio con la discussione indicata all’inizio: sono consapevole dell’esistenza di R e del fatto che è molto potente. Tuttavia anch’io, come Gus, cercavo una soluzione «interna» a LaTeX, o magari implementata da un pacchetto.

    P.S. scusate se per caso l’argomento è stato già trattato; non ne ho trovato traccia…

    Grazie e a presto!

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #23790
      Up
      0
      Down
      ::

      Ciao a tutti,
      tempo fa, la lettura della discussione Fare calcoli in (La)TeX (http://www.guit.sssup.it/phpBB2/viewtopic.php?t=1304) mi aveva fatto pensare a come poter eseguire a LaTeX dei calcoli «temporali».

      Cerco di spiegarmi meglio. Ad esempio, il pacchetto «datetime» (non è detto che si debba tirare in ballo questo per forza) mette a disposizione il comando
      `\newdate{name}{day}{month}{year}`
      per «salvare» una data, ma, a parte il fatto di potervi fare riferimento, non permette di fare elaborazioni più complesse.

      Tuttavia, immaginando di salvare una data con nome «data», sarebbe fantastico poter scrivere
      `Il pacchetto è stato spedito \calcolaGiorni{data} giorni fa e non l'ho ancora ricevuto`
      oppure
      `Io ho \calcolaAnni{data} anni`
      volendo, anche in un modo diverso
      `Il pacchetto è stato spedito \calcola{giorni}{data} giorni fa…
      […]
      Io ho \calcola{anni}{data} anni`
      o in altri modi ancora, per esempio facendo seguire il tutto da una stringa («giorni», «anni», ecc.) decisa a seconda del valore dell’opzione, prendendo in prestito una (parte) di concetto da «varioref». Ad ogni modo, ciò che mi interessa di più è fare i calcoli.

      È possibile fare quello che chiedo?

      Mi riallaccio con la discussione indicata all’inizio: sono consapevole dell’esistenza di R e del fatto che è molto potente. Tuttavia anch’io, come Gus, cercavo una soluzione «interna» a LaTeX, o magari implementata da un pacchetto.

      P.S. scusate se per caso l’argomento è stato già trattato; non ne ho trovato traccia…

      Non so se esiste un pacchetto appropriato. Così, a occhio, direi che occorre una funzione che converta una data nel numero di giorni da un “epoch” fissato arbitrariamente, in modo che poi le differenze in giorni, mesi o anni siano calcolabili in modo abbastanza semplice (per i mesi facendo una media di 30 giorni a mese e per gli anni una media di 365 giorni; si può anche rendere la cosa più “precisa”, volendo). Penso che sia molto più semplice affidarsi a un programma esterno.

      In un sistema Unix il comando “date” ha queste possibilità.

      Ciao
      Enrico

    • #23791
      Up
      0
      Down
      ::


      Grazie per la risposta.

      Alla fine mi sono “arreso” e ho deciso di utilizzare R. Ai fini della risoluzione del mio problemino è come usare una bomba atomica per ammazzare una mosca, ma comunque…

      Probabilmente in futuro si potrà fare di meglio. Ad ogni modo, posto il codice che ho usato io. Il file prova.Rtex:

      `\documentclass{minimal}

      \begin{document}

      \begin{Scode}{echo=FALSE}
      calcola.tempo <- function(data) { spedizione <- as.Date(data) oggi <- Sys.Date() tempo <- as.integer(oggi - spedizione) return(tempo) } calcola.eta <- function(data) { nascita <- as.Date(data) giorni <- calcola.tempo(nascita) eta <- as.integer(giorni / 365) return(eta) } \end{Scode} Il pacchetto è stato spedito \Sexpr{calcola.tempo("2009-11-16")} giorni fa e non l'ho ancora ricevuto Io ho \Sexpr{calcola.eta("1981-08-10")} anni \end{document}` Da un terminale: `$ echo -e "Sweave(\"prova.Rtex\")" | R --slave[Invio] $ pdflatex prova.tex[Invio]` Grazie e alla prossima.

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

        Grazie per la risposta.

        Alla fine mi sono “arreso” e ho deciso di utilizzare R. Ai fini della risoluzione del mio problemino è come usare una bomba atomica per ammazzare una mosca, ma comunque…

        Probabilmente in futuro si potrà fare di meglio. Ad ogni modo, posto il codice che ho usato io. Il file prova.Rtex:

        `\documentclass{minimal}

        \begin{document}

        \begin{Scode}{echo=FALSE}
        calcola.tempo <- function(data) { spedizione <- as.Date(data) oggi <- Sys.Date() tempo <- as.integer(oggi - spedizione) return(tempo) } calcola.eta <- function(data) { nascita <- as.Date(data) giorni <- calcola.tempo(nascita) eta <- as.integer(giorni / 365) return(eta) } \end{Scode} Il pacchetto è stato spedito \Sexpr{calcola.tempo("2009-11-16")} giorni fa e non l'ho ancora ricevuto Io ho \Sexpr{calcola.eta("1981-08-10")} anni \end{document}` Da un terminale: `$ echo -e "Sweave(\"prova.Rtex\")" | R --slave[Invio] $ pdflatex prova.tex[Invio]` Grazie e alla prossima.

        Per certi documenti mi capita di dover determinare la differenza in giorni tra due date od anche determinare la data che cade dopo un numero di giorni stabilito a partire da una data base.

        Il conteggio deve essere assolutamente preciso come se contassi i giorni su un calendario.

        Risolvo questo problema utilizzando un foglio di calcolo dove le date vengono gestite internamente come numeri a partire da un istante zero che se non ricordo male è il 1/01/1900 alle ore 0.00 per Excel e Calc (OpenOffice.org).

        Tuttavia, se si rimane nell’ambito del conteggio dei giorni, credo non sia difficile implementare il calcolo in TeX utilizzando la matematica dei contatori.
        Potrebbe essere un esercizio interessante ed una funzionalità utile per gli utenti di LaTeX.

        Potrebbe essere anche un occasione per sperimentare un lavoro di squadra nel senso che, stabilito un team di sviluppo, si potrebbe lavorare a distanza ciascuno con il proprio compito arrivando alla stesura di un pacchetto eventualmente da distribuire attraverso CTAN, oppure alla stesura di un articolo da pubblicare su ArsTeXnica.

        Obiettivi:
        — Imparare la programmazione TeX;
        — Condividere esperienze di lavoro a distanza e quindi se riesce, giungere a risultati altrimenti non possibili;
        — Produrre una funzionalità utile per gli altri utenti;
        — Prepararsi al futuro prossimo implementando la stessa funzione in luatex.

        A sembra un progetto interessante. Tempo fa pensavo che lo stesso forum dovrebbe avere una board dedicata allo sviluppo, od almeno una cosa simile per favorire le collaborazioni a distanza via web, su progetti comuni.
        Roberto.

      • #23793
        Up
        0
        Down
        ::

        Per certi documenti mi capita di dover determinare la differenza in giorni tra due date od anche determinare la data che cade dopo un numero di giorni stabilito a partire da una data base.

        Il conteggio deve essere assolutamente preciso come se contassi i giorni su un calendario.

        Risolvo questo problema utilizzando un foglio di calcolo dove le date vengono gestite internamente come numeri a partire da un istante zero che se non ricordo male è il 1/01/1900 alle ore 0.00 per Excel e Calc (OpenOffice.org).

        Tuttavia, se si rimane nell’ambito del conteggio dei giorni, credo non sia difficile implementare il calcolo in TeX utilizzando la matematica dei contatori.
        Potrebbe essere un esercizio interessante ed una funzionalità utile per gli utenti di LaTeX.

        In luatex esistono os.clock(), os.time(), os.date()
        `
        \starttext
        \ctxlua{tex.write(os.date())}
        \stoptext
        `

      • #23794
        Up
        0
        Down
        ::


        Il pacchetto datenumber non è sufficiente?
        http://texcatalogue.sarovar.org/entries/datenumber.html

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

          Per certi documenti mi capita di dover determinare la differenza in giorni tra due date od anche determinare la data che cade dopo un numero di giorni stabilito a partire da una data base.

          Il conteggio deve essere assolutamente preciso come se contassi i giorni su un calendario.

          Risolvo questo problema utilizzando un foglio di calcolo dove le date vengono gestite internamente come numeri a partire da un istante zero che se non ricordo male è il 1/01/1900 alle ore 0.00 per Excel e Calc (OpenOffice.org).

          Tuttavia, se si rimane nell’ambito del conteggio dei giorni, credo non sia difficile implementare il calcolo in TeX utilizzando la matematica dei contatori.
          Potrebbe essere un esercizio interessante ed una funzionalità utile per gli utenti di LaTeX.

          In luatex esistono os.clock(), os.time(), os.date()
          `
          \starttext
          \ctxlua{tex.write(os.date())}
          \stoptext
          `

          Tanto per giocare vi riporto il codice luatex per calcolare la differenza tra due date in giorni (si può fare molto di più e molto semplicemente …).
          `%
          % a luatex test: Days within two date
          %

          \def\datediff#1#2{\directlua{
          local date1 = os.time({#1})
          local date2 = os.time({#2})
          local secperdays = 24*60*60
          local daysdiff = (date2 – date1) / secperdays

          tex.print(math.floor(daysdiff))}}

          Test della funzione:
          dal 1 dicembre 1998 al 7 gennaio 1999 sono trascorsi
          \datediff{day=1,month=12,year=1998}{day=7,month=1,year=1999} giorni.

          Invece per il periodo lungo dal 22/09/1950 al 12/12/1996 sono trascorsi
          \datediff{day=22,month=09,year=1950}{day=12, month=12, year=1996} giorni.

          Vediamo come se la cava con gli anni bisestili:

          dal 1/01/2011 al 1/01/2012 passano \datediff{year=2011, month=1, day=1}{year=2012, month=1, day=1} giorni;

          dal 1/01/2012 al 1/01/2013 passano \datediff{year=2012, month=1, day=1}{year=2013, month=1, day=1} giorni.

          Sembra proprio che funzioni!!! ma…

          dal 28/02/2010 al 29/02/2010 dovrebbe passare \datediff{day=28,month=2,year=2010}{day=29,month=2,year=2010} giorno. Peccato che il 2010 non \`e bisestile.
          \end`

          Compilate il tutto con il comando: luatex test.tex, ne vedrete delle belle!

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

      Go to top