Newsgroup: it.comp.software.tex
Titolo: orario di compilazione nel testo

Salve,
vorrei sapere se c'e' un comando che analogamente a \today forzi la stampa
dell'ora corrente (quella di compilazione) in un punto del documento.
grazie!
ciao
tommaso
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 dell'ora corrente (quella di compilazione)
\newcount\hour \newcount\minute
\hour=\time \divide \hour by 60
\minute=\time
\count99=\hour \multiply \count99 by -60
\advance \minute by \count99
\newcommand{\daytime}{%
  \ifnum\hour=0 00\else\ifnum\hour<10 0\fi\number\hour\fi:%
  \ifnum\minute<10 0\fi\number\minute%
}
...
\TeX\ \`e stato eseguito il \today\ alle \daytime.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 dell'ora corrente (quella di compilazione) in un punto del documento.
Non predefinito; è disponibile un parametro, \time, che contiene
il numero di minuti da mezzanotte al momento dell'inizio della 
compilazione (dato fornito dal sistema operativo):
\newcommand{\now}{{%
  \count0=\time \count2=\time % copio il valore di \time
  \divide\count0 by 60 % ottengo l'ora
  \number\count0 % la stampo
  \multiply\count0 by 60
  \advance\count2 by -\count0 % ottengo i minuti
  :\ifnum\count2<10 0\fi % separatore e 0 se necessario
  \number\count2 % stampo i minuti
}}
Con una moderna distribuzione si può usare anche la primitiva
\pdffilemoddate che fornisce la data di modifica di un file, nella
forma
D:YYYYMMDDHHMMSS+HH'MM'
(a destra del + c'è in ore e minuti la differenza fra tempo locale
e ora di Greenwich, può essere anche un -, naturalmente); puoi così
avere a disposizione tutti i dati:
\makeatletter
\def\@parsedate{\expandafter\@getyear\pdffilemoddate{\jobname.log}}
\def\@getyear #1#2#3#4#5#6{\def\@theyear{#3#4#5#6}\@getmonth}
\def\@getmonth #1#2{\def\@themonth{#1#2}\@getday}
\def\@getday #1#2{\def\@theday{#1#2}\@gethour}
\def\@gethour #1#2{\def\@thehour{#1#2}\@getminutes}
\def\@getminutes #1#2{\def\@theminutes{#1#2}\@getseconds}
\def\@getseconds #1#2{\def\@theseconds{#1#2}\@getpm}
\def\@getpm #1{\def\@thepm{#1}\@getdiff}
\def\@getdiff #1'#2'{\def\@thediff{#1:#2}}
\def\pdfnow{\@parsedate\@thehour:\@theminutes}
\def\pdfnowUTC{\@parsedate\@thehour:\@theminutes~%
  (UTC~$\@thepm$\@thediff)
\makeatother
Con \pdfnow hai l'ora attuale, con \pdfnowUTC aggiungi anche la
differenza con l'ora di Greenwich. Si possono ovviamente usare anche
gli altri dati. Se preferisci che l'ora non compaia con uno zero
iniziale, basta modificare la definizione di \pdfnow con
\def\pdfnow{\@parsedate\number\@thehour:\@theminutes}
Ciao
Enrico

 \TeX\ \`e stato eseguito il \today\ alle \daytime.
Non userei \count99, del quale non sai nulla; magari è il contatore
associato alle sottosezioni o qualcosa del genere. Nel caso peggiore,
\count99 potrebbe essere quello associato a \hour oppure a \minute! 
Secondo la legge di Murphy, questo evento è assai probabile. :-)
Si può usare \count255, invece.
Il test \ifnum\hour=0 non serve, perché se \hour vale 0, \number\hour
produce 0. Scrivere l'ora con due cifre mi sembra un po' troppo
militaresco.
Tutto sommato, usare due contatori per una cosa del genere è uno spreco.
Ciao
Enrico

 Scrivere l'ora con due cifre mi sembra un po' troppo militaresco.
a me piace...


Ho seguito il thread e mi è venuta una curiosità. E' possibile da LaTeX
leggere un comando di shell? Per esempio, chi usa (g)vim inserisce
abitualmente la data utilizzando ":r !date", oppure ":r !ls"  per leggere
la directory eccetera.
Esiste una primitiva del genere in LaTex? La consultazione di alcuni sacri
testi qui sul mio tavolo non ha avuto successo.
Grazie!
guido
-- 
http://docenti.unicatt.it/milanese_guido
 
http://www.arsantiqua.org

 a me piace...
Guarda questo:
\makeatletter
\def\@initparsedate{\count@=\@ne
  \expandafter\@startparsedate\pdffilemoddate{\jobname.log}}
\def\@datebytedef#1{\@namedef{@datebyte\number\count@}{#1}}
\def\@datebyteuse#1{\@nameuse{@datebyte#1}}
\def\@startparsedate#1#2#3{\@datebytedef{#3}\@parsedate}
\def\@parsedate#1{\advance\count@\@ne
  \@datebytedef{#1}%
  \ifnum\count@<21
    \expandafter\@parsedate
  \fi}
\AtBeginDocument{\@initparsedate}
\def\pdfnow{\@datebyteuse{9}\@datebyteuse{10}:%
  \@datebyteuse{11}\@datebyteuse{12}}
\def\pdfnowbetter{\number\@datebyteuse{9}\@datebyteuse{10}\relax:%
  \@datebyteuse{11}\@datebyteuse{12}}
\makeatother
Occorre pdftex version 1.30 o superiore, ma ogni distribuzione moderna
lo usa anche per latex. Non è così complicato come appare: in sostanza
eseguo ricorsivamente la macro \@parsedate su ciascun carattere della
stringa prodotta da \pdffilemoddate, partendo dal terzo; a ogni chiamata
il contatore aumenta di uno e vengono definite le macro
\csname @datebyte1\endcsname
\csname @datebyte2\endcsname
...
\csname @datebyte21\endcsname
alle quali si accede con \@datebyteuse{<numero fra 1 e 21>}.
In questo modo si ha accesso a ciascuno dei byte della stringa prodotta 
da \pdffilemoddate; \pdfnow produce la data come piace a te, 
\pdfnowbetter come piace a me. Se poi la vuoi all'americana (con am e 
pm), si può definire
\newif\if@am
\def\pdfnowUSA{\@amtrue
  \count@=\@datebyteuse{9}\@datebyteuse{10}\relax
  \ifnum\count@>11 \@amfalse\fi
  \ifnum\count@=0
    12%
  \else
    \ifnum\count@>12 \advance\count@ -12 \fi
    \number\count@\relax
  :\@datebyteuse{11}\@datebyteuse{12}~\if@am a\else p\fi m
  \fi}
La data prodotta da pdftex è qualcosa come D:20080206153202+01’00’;
la riscrivo indicando sotto ciascuno il numero del byte
2  0  0  8  0  2  0  6  1  5  3  2  0  2  +  0  1  ’  0  0  ’
1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21
Ciao
Enrico

 testi qui sul mio tavolo non ha avuto successo.
Devi chiamare latex (o pdflatex) con l'opzione -shell-escape e
puoi allora eseguire comandi di sistema con 
\immediate\write18{<comando di shell>}
Il risultato non è però direttamente accessibile a TeX, occorre
dirigere l'output su un file temporaneo e leggerlo con \input oppure
con \read, nel caso si debbano manipolare i risultati.
Con il futuro LuaTeX si potranno fare cose molto più complesse. Nel
frattempo puoi guardare perlTeX.
Ciao
Enrico

Grazie a enrico per la segnalazione di perlTeX, che avevo già installato
senza saperlo!
Per l'ora di compilazione, forse una soluzione semplicissima potrebbe essere
uno script di tipo:
#/bin/sh
date >datefile.tmp
latex $1
rm -f datefile.tmp
ovviamente inserendo nel comando 'date' tutto quello che serve (per esempio
+%r per avere solo ora minuti secondi senza giorno mese anno) e inserendo
una volta per tutte l'indicazione di input nel file latex. Ovviamente si
potrebbe inserire un controllo sull'esistenza di datefile.tmp per eseguire
la compilazione LaTeX, o più semplicemente legare le due prime istruzioni
con '&&'.
Ovviamente solo Unix vari, non windows.
