Utilizzare il risultato di comandi unix dentro LaTex

  • Creatore
    Topic
  • #28025
    greenant
    Partecipante
      Up
      0
      Down
      ::


      Salve a tutti, questo è il mio primo post, anche se ho letto il forum per un po di tempo.

      Sto eseguendo delle simulazioni ed il simulatore alla fine mi crea dei grafici contenenti i vari risultati. Io vorrei creare un report con latex inserendo i grafici creati ma anche creando una tabella utilizzando i vari valori dei parametri utilizzati dentro la simulazione.

      Tutti questi parametri sono scritti in un file di testo che viene fornito al simulatore e quindi io per estrarli dovrei fare dei semplici grep.

      Per farla breve quello che chiedo io è se si può fare in latex come in uno script della shell nel quale assegni ad una variabile l’output di un comando unix.
      Qualcosa del tipo
      `La temperatura iniziale del sistema è `cat file.txt“

      Altrimenti per me potrebbe andare bene anche usare delle variabili all’interno del codice e passare il loro valore a pdflatex in fase di compilazione.

      Esiste una simile possibilità o la mia unica speranza è di creare in modo dinamico il sorgente latex e darlo in pasto al compilatore?

    Visualizzazione 7 filoni di risposte
    • Autore
      Risposte
      • #28026
        Up
        0
        Down
        ::

        Salve a tutti, questo è il mio primo post, anche se ho letto il forum per un po di tempo.

        Sto eseguendo delle simulazioni ed il simulatore alla fine mi crea dei grafici contenenti i vari risultati. Io vorrei creare un report con latex inserendo i grafici creati ma anche creando una tabella utilizzando i vari valori dei parametri utilizzati dentro la simulazione.

        Tutti questi parametri sono scritti in un file di testo che viene fornito al simulatore e quindi io per estrarli dovrei fare dei semplici grep.

        Per farla breve quello che chiedo io è se si può fare in latex come in uno script della shell nel quale assegni ad una variabile l’output di un comando unix.
        Qualcosa del tipo
        `La temperatura iniziale del sistema è `cat file.txt“

        Altrimenti per me potrebbe andare bene anche usare delle variabili all’interno del codice e passare il loro valore a pdflatex in fase di compilazione.

        Esiste una simile possibilità o la mia unica speranza è di creare in modo dinamico il sorgente latex e darlo in pasto al compilatore?

        Ci sono vari modi. Il tuo esempio è piuttosto semplice:
        `\input{file.txt}\unskip{}`
        (Ci vuole \unskip per motivi TeXnici.)

        Se i tuoi dati sono già strutturati puoi usare lo stesso sistema: supponiamo che il file tabella.dat sia
        `a & b\\
        c & d\\`
        puoi sempiicemente dire
        `\begin{tabular}{cc}
        \input{tabella.dat}
        \end{tabular}`
        Se i tuoi dati sono delimitati in altro modo, occorre lavorare un pochino di più. Però una soluzione “già pronta” c’è, il pacchetto csvtools.

        Ciao
        Enrico

      • #28027
        greenant
        Partecipante
          Up
          0
          Down
          ::


          Volendo semplificare la cosa, ho fatto l’esempio sbagliato. Sto ancora imparando a padroneggiare le espressioni regolari, quindi potrei scrivere delle fesserie, ma immagina di avere una roba del tipo
          `La temperatura è `grep -E 'Temp=[0-9]+' file.txt“

          Poi magari imparerò ad ottenere solo il numero senza il nome della variabile, ma questo è OT

        • #28028
          Up
          0
          Down
          ::

          Volendo semplificare la cosa, ho fatto l’esempio sbagliato. Sto ancora imparando a padroneggiare le espressioni regolari, quindi potrei scrivere delle fesserie, ma immagina di avere una roba del tipo
          `La temperatura è `grep -E 'Temp=[0-9]+' file.txt“

          Poi magari imparerò ad ottenere solo il numero senza il nome della variabile, ma questo è OT

          Puoi dare un’occhiata al pacchetto tobiShell.

          Ciao
          Enrico

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

            Volendo semplificare la cosa, ho fatto l’esempio sbagliato. Sto ancora imparando a padroneggiare le espressioni regolari, quindi potrei scrivere delle fesserie, ma immagina di avere una roba del tipo
            `La temperatura è `grep -E 'Temp=[0-9]+' file.txt“

            Poi magari imparerò ad ottenere solo il numero senza il nome della variabile, ma questo è OT

            Uno strumento meno specifico per questo problema ma di cui potrebbe essere interessante vagliarne l’utilizzo è perlTeX.

            All’interno del sorgente LaTeX è possibile sistemare codice in linguaggio perl, molto potente per quanto riguarda l’elaborazione del testo e le espressioni regolari.

            Il perlTeX è disponibile su CTAN e vari articoli su TUG Boat ne presentano uso e struttura d’implementazione.
            Occorre però compilare il sorgente con comandi non standard (non che sia particolarmente un problema questo).

            Bye

          • #28030
            greenant
            Partecipante
              Up
              0
              Down
              ::

              Puoi dare un’occhiata al pacchetto tobiShell.

              Ciao
              Enrico

              Ho guardato ma non mi piace molto l’idea, poichè lui semplicemente esegue gli script che gli fornisco e mi chiede di caricare il file con l’output prodotto. A questo punto posso farlo io uno script io che genera questi files senza scomodare tobiShell

              Forse un giusto compromesso è creare uno script shell che mi estrae tutti i numeri che mi interessano e che me li mette ordinati in un file csv. A questo punto posso caricarli con latex e csvtools

            • #28031
              greenant
              Partecipante
                Up
                0
                Down
                ::


                Per la cronaca, alla fine ho creato uno script in AWK che mi estrae tutti i valori di interesse dal file di output e mi crea un file latex composto da vari newcommand, tipo `\newcommand{\AirTemp}{125}`
                All’inizio del mio file latex principale includo questo file generato automaticamente tramite un \input e più avanti nel file, all’interno delle mie tabelle, utilizzo ad esempio \AirTemp per riferirmi alla temperatura

              • #28032
                Up
                0
                Down
                ::

                Per la cronaca, alla fine ho creato uno script in AWK che mi estrae tutti i valori di interesse dal file di output e mi crea un file latex composto da vari newcommand, tipo `\newcommand{\AirTemp}{125}`
                All’inizio del mio file latex principale includo questo file generato automaticamente tramite un \input e più avanti nel file, all’interno delle mie tabelle, utilizzo ad esempio \AirTemp per riferirmi alla temperatura

                Sono riuscito a trovare qualcosa che forse fa per te:
                `% nel preambolo
                \newread\shellcommand
                \newcommand{\doshellcommand}[1]{%
                \immediate\openin\shellcommand=”|#1″
                \loop\unless\ifeof\shellcommand
                \read\shellcommand to \next
                \unless\ifx\next\parcs
                \next\unskip
                \fi
                \repeat}
                \def\parcs{\par}`
                Nel tuo documento (che devi compilare con “pdflatex -shell-escape”) puoi scrivere, per esempio
                `\doshellcommand{grep temp temp.dat}`
                e se il file temp.dat contiene una riga che a sua volta contiene la stringa “temp” il comando la stampa.

                Come argomento di \shellcommand puoi dare un comando qualsiasi. Con cautela, ovviamente, non ti consiglio \shellcommand{rm -fr *} 😯

                È solo un abbozzo, naturalmente; una macro davvero utile dovrà essere diversa, per esempio se vuoi stampare più righe o scegliere qualcosa che ti serve dall’output. Il trucco sta nel dare come primo carattere del nome di file per \openin un | (pipe). Le virgolette servono solo come delimitatori.

                Ciao
                Enrico

              • #28033
                greenant
                Partecipante
                  Up
                  0
                  Down
                  ::


                  ottimo. Appena ho un po di tempo provo a vedere.

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

              Go to top