Fare calcoli in (La)TeX

  • Creatore
    Topic
  • #7434
    Gus
      Up
      0
      Down
      ::


      Ciao a tutti,

      ho una domanda generale per i TeXnici. E’ possibile fare calcoli (aritmetici) in TeX/LaTeX? Mi spiego. So che usando i primitivi di TeX o il pacchetto
      calc è possibile usare operazioni aritmetiche per esempio per calcolare lunghezze e spazi ecc. E anche per gestire i contatori, che però sono solo interi. Tuttavia mi chiedo se ci sia un modo generale di fare calcoli, indipendente dalla natura delle quantità in questione (lunghezze, contatori, ecc.) So che (La)TeX è un programma tipografico, ma TeX è un linguaggio di programmazione e come tale dovrebbe essere in grado di fare quello che fanno gli altri.

      Un esempio: calcolare il totale necessario da avere sul conto corrente per coprire le spese di gestione, note le spese stesse e l’interesse annuo. Io ho risolto usando calc e definendo alcuni comandi e contatori (per prendere i numeri sopra come input) in questo modo:
      `
      \spese{65}
      \interesse{0.365}
      % Calcolo:
      \setcounter{totale}{100 * \@spese / \real{\@interesse}}`
      ma mi sembra macchinoso e poco pulito. Senza contare che il totale, essendo un contatore, viene troncato.

      Insomma, spero di aver spiegato il problema. La comodità starebbe nell’unire semplici calcoli all’ottima presentazione dei risultati ottenibile con Latex. E non usare Excel.

      Ciao,

      Gus

    Visualizzazione 6 filoni di risposte
    • Autore
      Risposte
      • #7435
        Up
        0
        Down
        ::


        ciao,
        la risposta interessa pure me, ma non so la risposta. puoi provare a guardare sul texbook, sicuro che si trova qualche cosa. anche a me piacerebbe saper implementare le operazioni elementari. credo comunque che la cosa non sarà mai pulitissima, visto che si sta utilizzando uno strumento con una lieve forzatura. per questo motivo ti suggerisco di leggere il report del guitmeeting05 su R. in questo modo potresti utilizzare in sinergia un programma per l’impaginazione e uno per il calcolo. ognuno dei quali è dedicato, quindi perfettamente funzionale ed efficente. da quello che ho visto l’interazione è praticamente perfetta, ma mau ci deve aver sudato abbastanza.
        ciao ciao
        f

      • #7436
        Up
        0
        Down
        ::

        Ciao a tutti,

        ho una domanda generale per i TeXnici. E’ possibile fare calcoli (aritmetici) in TeX/LaTeX? Mi spiego. So che usando i primitivi di TeX o il pacchetto
        calc è possibile usare operazioni aritmetiche per esempio per calcolare lunghezze e spazi ecc. E anche per gestire i contatori, che però sono solo interi. Tuttavia mi chiedo se ci sia un modo generale di fare calcoli, indipendente dalla natura delle quantità in questione (lunghezze, contatori, ecc.) So che (La)TeX è un programma tipografico, ma TeX è un linguaggio di programmazione e come tale dovrebbe essere in grado di fare quello che fanno gli altri.

        Un esempio: calcolare il totale necessario da avere sul conto corrente per coprire le spese di gestione, note le spese stesse e l’interesse annuo. Io ho risolto usando calc e definendo alcuni comandi e contatori (per prendere i numeri sopra come input) in questo modo:`\spese{65}
        \interesse{0.365}
        % Calcolo:
        \setcounter{totale}{100 * \@spese / \real{\@interesse}}`ma mi sembra macchinoso e poco pulito. Senza contare che il totale, essendo un contatore, viene troncato.

        Insomma, spero di aver spiegato il problema. La comodità starebbe nell’unire semplici calcoli all’ottima presentazione dei risultati ottenibile con Latex. E non usare Excel.

        LaTeX usa ormai da tempo e-TeX come motore e mette a disposizione comandi come \numexpr e \dimexpr. Possono esserti utili. Guarda a pagina 8 del manuale di e-teX che dovresti trovare nella tua distribuzione come etex-man.dvi o etex-man.pdf (oppure su sarovar). Non sono “espandibili”, ma possono essere usati anche dove non si possono fare “assegnazioni” (come \divide o \advance).

        Quanto al troncamento, siccome TeX opera solo con interi, occorre fare i calcoli con la precisione richiesta e poi usare una piccola macro per “mettere la virgola” al posto giusto. Per esempio, un calcolo con due cifre significative si fa usando come unità i centesimi (o i millesimi o oltre, dipende da quello che devi fare).
        Ciao
        Enrico

      • #7437
        Gus
          Up
          0
          Down
          ::


          Grazie a tutti delle risposte. Il pacchetto fp (e altri che si trovano su Sarovar cercando ‘arithmetic’) sembra interessante (e dal readme – unica documentazione! – anche piuttosto potente), ma devo ancora provarlo.
          A presto,

          gus

        • #7438
          Gus
            Up
            0
            Down
            ::


            Il pacchetto fp sembra piuttosto comodo; il semplice problema che ponevo sopra viene risolto così:
            `
            \usepackage{fp}

            \FPset{\spese}{65} % le spese annuali sono…
            \FPset{\interesse}{0.36} % l'interesse netto annuo è…..
            \FPmul{\percentuale}{\spese}{100} % (calcolo)
            \FPdiv{\totale}{\percentuale}{\interesse} % il totale è il rapporto fra…
            \FPprint{\totale} % stampa il totale
            `
            e immagino che sia possibile saltare il passaggio intermedio (il terzo), anche se non ho guardato come.
            Sarei curioso di vedere come è implementato il pacchetto, ma temo mi verrà mal di testa…

            Ciao,

            Gus

          • #7439
            Gus
              Up
              0
              Down
              ::

              ciao,
              per questo motivo ti suggerisco di leggere il report del guitmeeting05 su R. in questo modo potresti utilizzare in sinergia un programma per l’impaginazione e uno per il calcolo. ognuno dei quali è dedicato, quindi perfettamente funzionale ed efficente. da quello che ho visto l’interazione è praticamente perfetta, ma mau ci deve aver sudato abbastanza.
              ciao ciao
              f

              Dimenticavo di rispondere a questo suggerimento. Molto bello l’articolo, complimenti agli autori. Ma a parte il fatto che dovrei impararmi R (che comunque ho scaricato), che sarebbe sprecato per quello che ho in mente di fare, cercavo una soluzione “interna” a LaTeX.
              Ciao,

              gus

            • #7440
              Up
              0
              Down
              ::


              Io ho fatto dei semplici calcoli in un documento che riceveva i parametri da un file csv esterno. Il pacchetto datatool, oltre a far questo, ti mette a disposizione una serie di operazioni elementari (\DTLmul, \DTLadd ecc.) anche di numeri decimali o in formato valuta.

            • #7441
              Up
              0
              Down
              ::


              Ciao a tutti.
              Incollo qui un esempio d’uso del pacchetto fp con pstricks.
              Per chi ha voglia di ispezionare il codice segnalo l’uso di \FPeval insieme alla funzione trunc.

              `
              \documentclass{article}
              \usepackage{amsmath}
              \usepackage{fp}
              \usepackage{pstricks,pst-plot,pstricks-add}

              \definecolor{mydarkgreen}{rgb}{0.03,0.47,0.03}
              \definecolor{mydarkblue}{rgb}{0.07,0.08,0.4}
              \definecolor{mylightblue}{rgb}{.8, .8, 1}
              \definecolor{mylightgray}{rgb}{0.95,0.95,0.95}
              \definecolor{mydarkgray}{rgb}{0.35,0.35,0.35}
              \definecolor{myblue}{rgb}{.4,.4,1}

              \begin{document}
              \resetOptions

              \psset{unit=9}%
              %\psset{xunit=12cm,yunit=6cm}%<--!!! % \FPeval\XCLL{trunc( 0.45 ,3)}% Corner Lower Left \FPeval\YCLL{trunc( -0.25,3)}% Corner Lower Left \FPeval\XCUR{trunc( 1.5 ,3)}% Corner Upper Right \FPeval\YCUR{trunc( 1.0,3)}% Corner Upper Right % \begin{pspicture}(\XCLL,\YCLL)(\XCUR,\YCUR)% % . . . . . . . . . . . . . . . . . . . . . . . . . . . . % grid % . . . . . . . . . . . . . . . . . . . . . . . . . . . . \psgrid[subgriddiv=20,subgriddots=4,gridcolor=gray,subgridcolor=gray,% gridlabels=0%, <-- !!! ](\XCLL,\YCLL)(\XCUR,\YCUR)% % . . . . . . . . . . . . . . . . . . . . . . . . . . . . % axes @ bottom % . . . . . . . . . . . . . . . . . . . . . . . . . . . . \psaxes[% axesstyle=frame,%axis tickstyle=top,% linewidth=1pt,% Dx=0.1,% Dy=0.2,% linecolor=mydarkblue,% %\ifMYFONTS %xLabel={\fontfamily{pfu}\fontseries{n}\fontshape{n}\selectfont% % \color{mydarkblue}\small},% futura %yLabel={\fontfamily{pfu}\fontseries{n}\fontshape{n}\selectfont% % \color{mydarkblue}\small},% futura %\fi Ox=0.0,% origin of labels Oy=0.0,% origin of labels %labelsep=15pt ]%{->}
              (0.0,0.0)% axes intersection
              (0.0,0.0)(1.0,1.0)% opposite corners

              % . . . . . . . . . . . . . . . . . . . . . . . . . . . .
              % data
              % . . . . . . . . . . . . . . . . . . . . . . . . . . . .

              \FPeval\Radius{trunc( 0.9 ,3)}

              \FPeval\EulerAngleDeg{trunc( 35 ,3)}
              \FPeval\EulerAngleRad{trunc( (\EulerAngleDeg)/57.3 ,3)}

              \FPeval\cMu{trunc( cos(\EulerAngleRad) ,3)}
              \FPeval\sMu{trunc( sin(\EulerAngleRad) ,3)}

              \FPeval\Vcos{trunc( (\Radius)*cos(\EulerAngleRad) ,3)}
              \FPeval\Vsin{trunc( (\Radius)*sin(\EulerAngleRad) ,3)}

              \FPeval\xN{trunc( 0.5 ,3)}% N
              \FPeval\yN{trunc( 0.9 ,3)}%

              \FPeval\xP{trunc( (\xN)+(\Radius)*sin( 10 / 57.3 ) ,3)}% P'x
              \FPeval\yP{trunc( (\yN)-(\Radius)*cos( 10 / 57.3 ) ,3)}% P'y

              \pnode(\xN,\yN){nN}
              \pnode(\xP,\yP){nP}

              \psRelNode[angle=\EulerAngleDeg](nN)(nP){1}{nP1}% needs pstricks-add v. 2.57
              \psRelNode[angle=0](nN)(nP){\cMu}{nPm}

              %\qdisk(nP2){3.0pt}
              \FPeval\cc{trunc( cos( 45 / 57.3 ) ,3)}%
              \FPeval\dd{trunc( 0.2 ,3)}%
              \FPeval\dc{trunc( (\dd)*(\cc) ,3)}%
              \psRelNode[angle=45](nPm)(nP1){\dd}{nPmm}
              \psRelNode[angle=0](nPm)(nP1){\dc}{nPm1}
              \psRelNode[angle=90](nPm)(nP1){\dc}{nPm2}

              \psline[linewidth=1pt,linecolor=red,fillcolor=red!50,fillstyle=solid]
              (nPm)(nPm1)(nPmm)(nPm2)

              \ncline[linecolor=red,linewidth=5.0pt,arrows=->,arrowinset=0,arrowscale=1.2]%
              {nN}{nP}%
              \bput[0.02]{0}(0.92)
              {\Large$\vec{v}_{\perp}$}%

              \ncline[linecolor=red,linewidth=5.0pt,arrows=->,arrowinset=0,arrowscale=1.2]%
              {nN}{nP1}%
              \aput[0.03]{0}(0.5)
              {\Large$\vec{v}\,'_{\!\perp}$}%

              \ncline[linecolor=mydarkblue,linewidth=3.0pt,arrows=->,arrowinset=0,arrowscale=1.2]%
              {nPm}{nP1}%
              \ncline[linecolor=mydarkblue,linewidth=3.0pt,arrows=->,arrowinset=0,arrowscale=1.2]%
              {nN}{nPm}%

              \psarc[showpoints=false,linewidth=2pt,linestyle=dashed,arrows=-]
              (nN){\Radius}{270}{320}

              \psRelNode[angle=0](nN)(nP){0.3}{nMu1}
              \psRelNode[angle=0](nN)(nP1){0.3}{nMu2}
              \ncarc[arcangle=-15,linewidth=2pt,linestyle=solid,arrows=->]{nMu1}{nMu2}
              \aput[0.03]{0}(0.5){\Large$\mu$}%

              \psRelNode[angle=0](nPm)(nP1){1.2}{nA1}
              \psRelNode[angle=0](nPm)(nP1){1.5}{nA2}
              \ncline[linecolor=mydarkblue,linewidth=3.3pt,arrows=->,arrowinset=0,arrowscale=1.2]%
              {nA1}{nA2}%
              \aput[-0.02]{0}(0.8)
              {\large$\frac{\displaystyle1}{\displaystyle|\vec{v}_{\perp}|}\,\vec{e}\wedge\vec{v}_{\perp}$}%

              \psRelNode[angle=0](nN)(nP){1.07}{nA3}
              \psRelNode[angle=0](nN)(nP){1.25}{nA4}
              \ncline[linecolor=mydarkblue,linewidth=3.3pt,arrows=->,arrowinset=0,arrowscale=1.2]%
              {nA3}{nA4}%
              \aput[0.01]{0}(0.7)
              {\large$\frac{\displaystyle1}{\displaystyle|\vec{v}_{\perp}|}\,\vec{v}_{\perp}$}%

              \qdisk(nN){4.0pt}\uput{0.03}[90]{0}(nN){\large$N$}%
              \qdisk(nP){4.0pt}\uput{0.03}[-120]{0}(nP){\large$P$}%
              \qdisk(nPm){4.0pt}\uput{0.03}[180]{0}(nPm){\large$H$}%
              \qdisk(nP1){4.0pt}\uput{0.03}[-40]{0}(nP1){\large$P'$}%

              \end{pspicture}%

              \end{document}
              `

              Il codice riportato sopra produce il risultato seguente:

              Ciao,
              Agostino

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

          Go to top