Newsgroup: it.comp.software.tex
Titolo: Fare di conto

Ciao, volevo sapere come fare dei semplici calcoli matematici in LaTeX.
Il problema sarebbe questo: io fisso un valore tramite un comando:
\newcommand{\valore}{100}
Poi su quel valore dovrei calcolare altri valori, tipo:
\newcommand{\valore1}{\valore * 1.4}
\newcommand{\valore2}{\valore * 0.2}
Come faccio a fare il calcolo? Come ho scritto sopra non funziona...
Ho inserito il pacchetto calc ma non se sia quello giusto e come si usa.
Grazie
Marco
+-----------------------------+
| Marco <no private messages> |
|                             |
| Software is like sex...     |
| It's better when it's free. |
+-----------------------------+

 Ho inserito il pacchetto calc ma non se sia quello giusto e come si usa.
[...]
Con il package calc, dovresti provare con il \setcounter:
\setcounter{x}{6/2}
Studiati, ad ogni modo, questo documento:
http://www.esm.psu.edu/courses/latex-course/sample-docs/calc.pdf
Spero d'esserti stato d'aiuto.
Ciao
B.
-- 
   +---__,--------------------------------+
   |  (,'>    B i a g i o    R a u c c i  |
   |  
http://digilander.iol.it/braucci
    |
   |                * * *                 |
   | O mordo tua nuora o aro un autodromO |
   +--------------------------------------+

 
http://www.esm.psu.edu/courses/latex-course/sample-docs/calc.pdf
Ho letto, ma non ho trovato la risposta.
L'unica alternativa per i numeri reali sembra usare i length anzichč i
counter, ma non mi sembra che funzioni granchč.


 counter, ma non mi sembra che funzioni granchč.
The calc package also allows multiplication and division by 
real numbers. However, a special syntax is required: you must use 
\real{decimal constant} or \ratio{dimen expression}{dimen expression} 
to denote a real value to be used for multiplication/division. The first 
form has the obvious meaning, and the second form denotes the number 
obtained by dividing the value of the first expression by the value of 
the second expression.
Il brano č tratto dal documento citato, a pagina 3. Ci sono anche
esempi.
Ciao
Enrico

Ho letto tutto, ma il problema rimane perchč:
- se uso i counter il compilatore pretende numeri interi, e anche se uso
\real i decimali vengono comunque troncati
- se al posto del counter, uso i length, forse funziona perň non so come
visualizzare il valore di un length, perchč \arabic non funziona. Cioč ho
fatto:
\newlength{valore}
\setlength{valore}{100.00}
Poi, come visualizzo il valore? \valore non va, \arabic{valore} e
\arabic{\valore} nemmeno.
Ciao


Volevo precisare una cosa.
Nella guida segnalata, fa alcuni esempi relativi a delle "dimensioni" da
usare nel documento.
Io devo fare dei calcoli tipo foglio di calcolo con numeri in virgola
mobile.
Sono 4 operazioni in tutto, che io devo fare e di cui devo visualizza il
risultato.
So che LaTeX non č un foglio di calcolo, ma io devo fare solo 4
operazioncine.


 \arabic{\valore} nemmeno.
I contatori accettano solo interi.
\newlength{\valore} % nota il segno \
\setlenght{\valore}{100.34pt} % devi dare una dimensione
\the\valore restituisce la stringa contenente il
valore della tua lunghezza *in punti*.
Se poi lo vuoi come numero assoluto, devi usare un truccaccio
infame
{\catcode`t=12\catcode`p=12\gdef\noPT#1pt{#1}} 
\def\strippt #1{\expandafter\noPT\the#1}
e allora \strippt{\valore} ti dà il numero senza l'unità di misura.
Ciao
Enrico

 operazioncine.
E falle con le dimensioni; esempio per l'addizione:
\newlength{\lA}
\newcommand{\ADD}[2]{
 \setlength{\lA}{#1pt}%
 \addtolength{\lA}{#2pt}%
 \strippt{\lA}}
Per moltiplicazione e divisione direi che ci vuole
il pacchetto calc. Attento che gli arrotondamenti sono
abbastanza "stravaganti": i calcoli interni sono fatti
in unità sp, dove 65536sp fanno 1pt.
Ciao
Enrico

 in unità sp, dove 65536sp fanno 1pt.
Ho notato: 100.00 * 1.20 = 119.9997
Non c'è modo di fargli fare i conti per bene, immagino.
Le operazioni mi servirebbero per compilare una fattura...  :-(


 \def\strippt #1{\expandafter\noPT\the#1}
Così è perfetto, ma cosa significa?
Me lo spieghi?


 Non c'è modo di fargli fare i conti per bene, immagino.
Si chiamano "errori di arrotondamento" ed "errori di approssimazione",
e sono inevitabili.
Tu stai cercando di usare [La]TeX per qualcosa che non e' nella sua
natura; usalo per comporre la pagina, ed usa qualcos'altro per i
conti: ad esempio un programma in C o in BASIC che scriva del testo
da includere con \input, se non una intera tabella con tutti i suoi
comandi; oppure del testo da elaborare in comandi LaTeX con una
semplice procedura in awk o perl.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 Me lo spieghi?
Intanto ti dico che per calcolare fatture, con IVA eccetera,
bastano gli interi, esprimendo tutti i numeri in centesimi
di Euro. Non ti dovrebbe essere difficile scrivere una macro
che data una somma in centesimi la scrive come EURO,CENT
tenendo conto che \divide tronca.
Ora vediamo se riesco a spiegarti l'arcana formula precedente.
Il comando \the serve per ottenere il contenuto di un registro
di TeX. Se \the è seguito dal nome di un registro di dimensione,
l'espansione è il valore di quel registro in punti.
Ad esempio, se si dà 
\newlength{\pippo}
\setlength{\pippo}{1in}
il risultato di \the\pippo è la stringa di caratteri
"72.27pt" (senza le virgolette) in cui tutti i caratteri
hanno codice di categoria 12. Di solito i caratteri "p" e
"t" sono di categoria 11 (quella delle lettere dell'alfabeto).
Si può usare il concetto di "macro con argomenti delimitati"
che è estraneo a LaTeX a livello utente, ma è ovviamente usato
internamente.
Se scrivo
\def\xxx#1:#2:{#2 #1}
posso usare la macro \xxx nel modo seguente:
\xxx Gregorio:Enrico:
e il risultato dell'espansione è "Enrico Gregorio". Se
scrivo
\xxx Giulini:Carlo Maria:
\xxx Benedetti Michelangeli:Arturo:
le espansioni sono proprio i nomi e cognomi. Nota che non c'è
bisogno di mettere le graffe: l'argomento numero 1 è ciò che sta
fra il nome della macro e il primo ":" che segue; l'argomento numero
2 è ciò che sta fra il primo e il secondo ":".
Siccome l'espansione di \the\pippo contiene sempre la finale "pt",
si può pensare di estrarre la parte numerica usando una macro
delimitata; però c'è il problema del codice di categoria,
il delimitatore deve essere esattamente la stessa coppia 
(codice carattere,codice categoria).
Questo spiega la prima riga (la riscrivo meglio per
evitare di dover spiegare un biechissimo trucco dell'autore
di quel frammento TeX):
{\catcode`p=12 \catcode`t=12 \gdef\noPT#1pt{#1}}
1) ci mettiamo in un gruppo per evitare di cambiare globalmente
il codice di categoria, che verrà rimesso a posto alla fine
del gruppo;
2) cambiamo il codice di categoria di "p" da 11 a 12; fortunatamente
"catcode" non contiene la "p", quindi possiamo ancora usare il
comando \catcode per cambiare il codice di "t";
3) definiamo *globalmente* una macro delimitata dai caratteri
"pt" di categoria 12.
Adesso vediamo la seconda riga
\def\strippt #1{\expandafter\noPT\the#1}
Il problema è che non possiamo dire
\noPT\the\pippo
perché \noPT non troverebbe mai i caratteri che delimitano
l'argomento e arriverebbe al primo \par (o riga vuota) generando
un errore. Quindi dobbiamo procurarci *l'espansione* di
\the\pippo, che contiene i caratteri richiesti.
Qui viene a fagiolo \expandafter, che legge il token successivo (qui
\noPT) e lo tiene da parte, espande il token successivo (qui \the)
e prosegue l'espansione finché necessario, poi rimette di fronte
a ciò che si è ottenuto il token immagazzinato.
Risultato di \expandafter\noPT\the\pippo
1) \noPT viene messo da parte;
2) \the viene espanso; siccome \the espande ciò che
   viene dopo (detto in soldoni), ciò che si ottiene
   è la stringa "72.27pt" di caratteri di categoria 12;
3) viene messo davanti alla stringa \noPT, che quindi
   ora vede il delimitatore dell'argomento ed è felice
4) l'espansione finale è la stringa "72.27".
La definizione di \strippt è solo un contenitore generico,
per usare un qualunque registro dimensionale.
Ciao
Enrico

 Ora vediamo se riesco a spiegarti l'arcana formula precedente.
Wow, sono molto colpito. La mia conoscenza di Latex č veramente
superficiale.
Dove si trova una guida che spieghi tutte queste cose?
Sono molto interessato all'argomento.
Ciao


Era una notte buia e tempestosa e *Marco* disse:
:: Dove si trova una guida che spieghi tutte queste cose?
:: Sono molto interessato all'argomento.
Per quanto riguarda le fatture non saprei, tuttavia per quanto
riguarda il TeX potresti partire dal "TeXbook" di Donald
E. Knuth.
Altro libro molto completo è "TeX By Topic",
scaricabile gratuitamente all'indirizzo:
http://www.eijkhout.net/tbt/
.
Non bisogna mai dimenticare che il TeX è un linguaggio
di programmazione tale e quale a molti altri linguaggi, anche
se dedicato alla composizione tipografica e non allo sviluppo
di applicazioni.
--
*Emanuele*
 (¯`·.¸(¯`·.¸( 
www.GuIT.it
 )¸.·´¯)¸.·´¯)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Gruppo Utilizzatori Italiani di TeX
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 di applicazioni.
Lo so perfettamente. Ma ho sempre usato Latex come un utente.
Tuttavia avendolo adottato come strumento per redigere tutta la mia
documentazione di lavoro, voglio approfondire la conoscenza.


 Le operazioni mi servirebbero per compilare una fattura...  :-(
Se non emetti fatture per importi multimilionari (nel qual caso
presumibilmente ti potresti permettere l'acquisto di un programma di
fatturazione :) la soluzione č molto semplice. Si trasformano tutti i
numeri reali in interi applicando fattori di scala che vengono poi
compensati nel risultato finale. L'esempio dovrebbe chiarire il
meccanismo.
\documentclass{minimal}
\usepackage{calc}
\newcounter{importo}
\newcounter{euro}
\begin{document}
%
% 999999,99EUR + IVA 20% 
%
\setcounter{importo}{99999999}%              cent
\setcounter{importo}{\value{importo} * 12}%  fattore di scala: 10
\addtocounter{importo}{5}%                   arrotondamento: 5 decimi di cent
\setcounter{importo}{\value{importo} / 10}%  compensa il fattore di scala
%					  
\setcounter{euro}{\value{importo} / 100}%
\arabic{euro},%
\setcounter{importo}{\value{importo} - \value{euro} * 100}% 
\ifnum \value{importo} < 10 0\fi
\arabic{importo}EUR\par
\end{document}
-- 
   Gianfranco Boggio-Togna
   Milano