Creazione tabelle con ciclo e contatore

  • Creatore
    Topic
  • #115568
    Up
    0
    Down
    ::


    Buongiorno a tutti, mi sono avvicinato al mondo TEX da pochi giorni per esigenze lavorative; premetto subito che sto usando il tanto odiato LYX e il capoccia vuole che si usi questo perché ci sono già determinati documenti stilati con LYX. Anche grazie a questo forum sono riuscito a fare ciò che mi ha chiesto, quindi mi ha (giustamente?) chiesto di fare ulteriori passaggi.

    Senza scendere troppo nei dettagli, un ufficio della nostra azienda compila una determinata pagina sul nostro software con voci definite, una volta compilato ciò si ha come output un file .tex che poi attraverso LYX andiamo a leggere per avere in uscita un documento PDF specifico per quel prodotto.

    Ora, io devo generare una tabella con la funzione \tabular e vorrei farlo utilizzando ciclo while-do e contatore. Il ciclo sono riuscito, dopo vari problemi, a farlo andare dentro \tabular; la questione ora è come far leggere al contatore le varie voci con cui compilare la tabella (il codice per la tabella l’ho già completato, ma è lunghissimo e ho scritto riga per riga, so che al massimo sono 18, e attraverso la funzione \ifthenelse stampo solo quelle necessarie; funziona tutto, vorrei solo snellire il codice).

    Nel file .tex i parametri sono definiti attraverso \newcommand{Nome}{Argomento}, ma nel {Nome} non mi permette di inserire numeri e non riesco a trovare come si possa fare.

    La mia idea sarebbe di fare una cosa di questo tipo (vengo da poco dall’università con studi in C++):

    `\def\ecomm{&} %il modo che ho trovato per far andare il ciclo whiledo dentro tabular
    \newcounter{PIPPO}
    \setcounter{PIPPO}{1}
    {%inizio \tabular
    \whiledo{\value{PIPPO}<19}
    {
    \ifthenelse{\equal{ASSEPIPPO}{1}}{\TipoASSEPIPPO \ecomm \NumeroASSEPIPPO \ecomm \MotorePIPPO \ecomm \RapportoRiduzionePIPPO eccetera eccetera, in totale 9 colonne}{}
    \addtocounter{PIPPO}{1}
    }
    %fine tabular}`

    Ovvero, cerco un attimo di spiegare: definisco la variabile PIPPO e la setto a 1, inizio il ciclo e controllo se la voce ASSE1, che si trova nel file .tex, è uguale a “1” o “0” (l’idea è di rendere dal nostro software l’uscita in questo modo), se è “1” stampo la linea corrispondente (le cui voci sono sempre nel file .tex) se no niente; a ‘sto punto aumento di uno PIPPO e verifico la voce ASSE2 e via dicendo. Il contatore lo definisco fuori da \tabular ovviamente; \tabular, l’intestazione e la prima riga l’ho omesso dal codice che ho riportato perché fosse più snello.

    Due domande:
    1_si può fare questa cosa? ha senso?
    2_se si può fare, come si fa mettere in \newcommand una voce alfanumerica e non sono “letterale”?

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #115569
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        RichiBolgio” post=115958Buongiorno a tutti, mi sono avvicinato al mondo TEX da pochi giorni per esigenze lavorative; premetto subito che sto usando il tanto odiato LYX e il capoccia vuole che si usi questo perché ci sono già determinati documenti stilati con LYX. Anche grazie a questo forum sono riuscito a fare ciò che mi ha chiesto, quindi mi ha (giustamente?) chiesto di fare ulteriori passaggi.

        Senza scendere troppo nei dettagli, un ufficio della nostra azienda compila una determinata pagina sul nostro software con voci definite, una volta compilato ciò si ha come output un file .tex che poi attraverso LYX andiamo a leggere per avere in uscita un documento PDF specifico per quel prodotto.

        Ora, io devo generare una tabella con la funzione \tabular e vorrei farlo utilizzando ciclo while-do e contatore. Il ciclo sono riuscito, dopo vari problemi, a farlo andare dentro \tabular; la questione ora è come far leggere al contatore le varie voci con cui compilare la tabella (il codice per la tabella l’ho già completato, ma è lunghissimo e ho scritto riga per riga, so che al massimo sono 18, e attraverso la funzione \ifthenelse stampo solo quelle necessarie; funziona tutto, vorrei solo snellire il codice).

        Nel file .tex i parametri sono definiti attraverso \newcommand{Nome}{Argomento}, ma nel {Nome} non mi permette di inserire numeri e non riesco a trovare come si possa fare.

        La mia idea sarebbe di fare una cosa di questo tipo (vengo da poco dall’università con studi in C++):

        `\def\ecomm{&} %il modo che ho trovato per far andare il ciclo whiledo dentro tabular
        \newcounter{PIPPO}
        \setcounter{PIPPO}{1}
        {%inizio \tabular
        \whiledo{\value{PIPPO}<19}
        {
        \ifthenelse{\equal{ASSEPIPPO}{1}}{\TipoASSEPIPPO \ecomm \NumeroASSEPIPPO \ecomm \MotorePIPPO \ecomm \RapportoRiduzionePIPPO eccetera eccetera, in totale 9 colonne}{}
        \addtocounter{PIPPO}{1}
        }
        %fine tabular}`

        Ovvero, cerco un attimo di spiegare: definisco la variabile PIPPO e la setto a 1, inizio il ciclo e controllo se la voce ASSE1, che si trova nel file .tex, è uguale a “1” o “0” (l’idea è di rendere dal nostro software l’uscita in questo modo), se è “1” stampo la linea corrispondente (le cui voci sono sempre nel file .tex) se no niente; a ‘sto punto aumento di uno PIPPO e verifico la voce ASSE2 e via dicendo. Il contatore lo definisco fuori da \tabular ovviamente; \tabular, l’intestazione e la prima riga l’ho omesso dal codice che ho riportato perché fosse più snello.

        Due domande:
        1_si può fare questa cosa? ha senso?
        2_se si può fare, come si fa mettere in \newcommand una voce alfanumerica e non sono “letterale”?

        Ciao e benvenuto sul forum.
        Come regola dovresti postare il codice minimo compilabile, dovresti cioé mostrare come vengono dichiarate le macro \TipoASSEPIPPO e seguenti.

        A naso a me sembra che possa funzionare anche se penso che non sia il migliore modo di procedere.
        Questo volevo dire d’importante: trovare la soluzione migliore necessita di aver campo libero sulle scelte procedurali e sui formati.
        Per esempio, si può usare Lua per definire dati e produrre l’output desiderato in LuaLaTeX.
        Questa è una buona base di partenza. Tuttavia l’obbligo di usare LyX mi fa pensare che la soluzione debba rimanere all’interno di TeX.

        TeX è uno strumento molto potente per comporre oggetti tipografici ma non è progettato per gestire dati, per esempio, risiedenti in database relazionali.
        Ecco che LuaTeX, aggiungendo il linguaggio Lua a TeX, rende possibile usare TeX come un sofisticatissimo motore di reporting e generare documenti assai complessi.

        Devo però dire che le recenti vicende hanno reso LuaTeX un programma dal futuro incerto.
        Ho investito molte risorse per conoscere a fondo LuaTeX e risolvere problemi simili al tuo.
        Sono arrivato alla conclusione che LuaTeX è adatto a quelli che ho chiamato report complessi, ovvero documenti in ambito aziendale difficilmente “standardizzabili”.
        Speriamo.
        Alla prossima.
        R.

      • #115570
        Up
        0
        Down
        ::

        robitex” post=115959
        Ciao e benvenuto sul forum.
        Come regola dovresti postare il codice minimo compilabile, dovresti cioé mostrare come vengono dichiarate le macro \TipoASSEPIPPO e seguenti.

        Ok, allora scrivo l’esempio di come ho fatto e poi cerco di far capire come lo vorrei io; non copio per tutte le 18 righe corrispondenti agli assi da includere o meno, altrimenti risulta lunghissimo inutilmente, copio le prime 3.
        Inoltre le definizioni delle macro, per esempio \TipoASSEx, avvengono sul file .tex, io le riporto in cima al codice che mostro. Dal momento che nel nome del \newcommand non mi permette di mettere numeri, per distinguerli ho usato lettere a mo’ di numeri romani.
        Tenete presente che sto lavorando su un file .tex già esistente, ma tutte queste aggiunte degli assi le ho messe io per provare il codice; poi dal nostro software faremo risultare queste voci come suo output, non so se sto riuscendo a spiegarmi.

        `
        %INIZIO ASSE I
        \newcommand{\ASSEI}{1}
        \newcommand{\TIPOASSEI}{Avanzamento carri} \newcommand{\NUMEROASSEI}{11} \newcommand{\MOTOREI}{2x Mot Ace Gr112L B5} \newcommand{\RAPPORTORIDUZIONEI}{65} \newcommand{\VELOCITAMAXI}{} \newcommand{\ACCELMAXI}{} \newcommand{\COPPIAMAXI}{} \newcommand{\CORSAMAXI}{15000} \newcommand{\CORSAMINI}{0}
        %FINE ASSE I
        %INIZIO ASSE II
        \newcommand{\ASSEII}{0}
        \newcommand{\TIPOASSEII}{Apertura Forche} \newcommand{\NUMEROASSEII}{12} \newcommand{\MOTOREII}{2x Mot Ace Gr90L} \newcommand{\RAPPORTORIDUZIONEII}{40} \newcommand{\VELOCITAMAXII}{} \newcommand{\ACCELMAXII}{} \newcommand{\COPPIAMAXII}{} \newcommand{\CORSAMAXII}{214} \newcommand{\CORSAMINII}{86}
        %FINE ASSE II
        %INIZIO ASSE III
        \newcommand{\ASSEIII}{1}
        \newcommand{\TIPOASSEIII}{Sollevamento Forche} \newcommand{\NUMEROASSEIII}{13} \newcommand{\MOTOREIII}{1x Mot Ace Gr112L B5} \newcommand{\RAPPORTORIDUZIONEIII}{80} \newcommand{\VELOCITAMAXIII}{} \newcommand{\ACCELMAXIII}{} \newcommand{\COPPIAMAXIII}{} \newcommand{\CORSAMAXIII}{350} \newcommand{\CORSAMINIII}{95}
        %FINE ASSE III

        %altri 15 assi definiti allo stesso modo, sempre con numerazione romana
        `
        Questo è come vengono definite le macro sul file .tex

        `
        {\begin{tabular}{p{1.8cm}p{1.6cm}p{1.7cm}p{1.8cm}p{1.6cm}p{1.6cm}p{1.6cm}p{1.6cm}p{1.6cm}} %definisco le 9 colonne, non posso lasciarle automatiche altrimenti non ci stanno nella pagina, e alcune sono di lunghezza diversa per via di ciò che va scritto, esteticamente non è il massimo ma per ora è il minore dei problemi
        \toprule
        Tipo\newline ASSE & Numero ASSE & Motore & Rapporto\newline riduzione & Velocità MAX & Accel. MAX & Coppia MAX & Corsa MAX & Corsa MIN\\
        \midrule
        \ifthenelse{\equal{\ASSEI}{1}}{\scriptsize \TIPOASSEI & \NUMEROASSEI & \scriptsize \MOTOREI & \hspace{0.2cm}\RAPPORTORIDUZIONEI & \VELOCITAMAXI & \ACCELMAXI & \COPPIAMAXI & \CORSAMAXI & \CORSAMINI\\}{} %stampo riga ASSE I se presente
        \ifthenelse{\equal{\ASSEII}{1}}{\scriptsize \TIPOASSEII & \NUMEROASSEII & \scriptsize \MOTOREII & \hspace{0.2cm}\RAPPORTORIDUZIONEII & \VELOCITAMAXII & \ACCELMAXII & \COPPIAMAXII & \CORSAMAXII & \CORSAMINII\\ }{} %stampo riga ASSE II se presente
        \ifthenelse{\equal{\ASSEIII}{1}}{\scriptsize \TIPOASSEIII & \NUMEROASSEIII & \scriptsize \MOTOREIII & \hspace{0.2cm}\RAPPORTORIDUZIONEIII & \VELOCITAMAXIII & \ACCELMAXIII & \COPPIAMAXIII & \CORSAMAXIII & \CORSAMINIII\\ }{} %stampo riga ASSE III se presente
        %per altre 15 volte questo codice, così da controllare ed eventualmente stampare tutti i 18 assi definiti dalle macro nel .tex
        \end{tabular}}
        `

        Questo codice funziona, stampa correttamente la tabella ma il mio intento è snellire il codice, che come vedete è molto pesante.

        Per questo voglio usare un contatore, ma dovrei poter definire le macro come:
        `
        %INIZIO ASSE1
        \newcommand{\ASSE1}{1}
        \newcommand{\TIPOASSE1}{Avanzamento carri} \newcommand{\NUMEROASSE1}{11} \newcommand{\MOTORE1}{2x Mot Ace Gr112L B5} \newcommand{\RAPPORTORIDUZIONE1}{65} \newcommand{\VELOCITAMAX1}{} \newcommand{\ACCELMAX1}{} \newcommand{\COPPIAMAX1}{} \newcommand{\CORSAMAX1}{15000} \newcommand{\CORSAMIN1}{0}
        %FINE ASSE1
        %INIZIO ASSE2
        \newcommand{\ASSE2}{0}
        \newcommand{\TIPOASSE2}{Apertura Forche} \newcommand{\NUMEROASSE2}{12} \newcommand{\MOTORE2}{2x Mot Ace Gr90L} \newcommand{\RAPPORTORIDUZIONE2}{40} \newcommand{\VELOCITAMAX2}{} \newcommand{\ACCELMAX2}{} \newcommand{\COPPIAMAX2}{} \newcommand{\CORSAMAX2}{214} \newcommand{\CORSAMIN2}{86}
        %FINE ASSE2
        %INIZIO ASSE3
        \newcommand{\ASSE3}{1}
        \newcommand{\TIPOASSE3}{Sollevamento Forche} \newcommand{\NUMEROASSE3}{13} \newcommand{\MOTORE3}{1x Mot Ace Gr112L B5} \newcommand{\RAPPORTORIDUZIONE3}{80} \newcommand{\VELOCITAMAX3}{} \newcommand{\ACCELMAX3}{} \newcommand{\COPPIAMAX3}{} \newcommand{\CORSAMAX3}{350} \newcommand{\CORSAMIN3}{95}
        %FINE ASSE3

        %altri 15 assi definiti allo stesso modo, ma questa volta coi numeri
        `

        e quindi poter fare la tabella con contatore:
        `
        \newcounter{j}
        \setcounter{j}{1}
        \def\ecomm{&}
        {\begin{tabular}{p{1.8cm}p{1.6cm}p{1.7cm}p{1.8cm}p{1.6cm}p{1.6cm}p{1.6cm}p{1.6cm}p{1.6cm}} %definisco le 9 colonne, non posso lasciarle automatiche altrimenti non ci stanno nella pagina, e alcune sono di lunghezza diversa per via di ciò che va scritto, esteticamente non è il massimo ma per ora è il minore dei problemi
        \toprule
        Tipo\newline ASSE & Numero ASSE & Motore & Rapporto\newline riduzione & Velocità MAX & Accel. MAX & Coppia MAX & Corsa MAX & Corsa MIN\\
        \midrule
        \whiledo{\value{j}<4}
        {
        \ifthenelse{\equal{ASSEj}{1}}{\TIPOASSEj \ecomm \NUMEROASSEj \ecomm \MOTOREj \ecomm \RAPPORTORIDUZIONEj \ecomm \VELOCITAMAXj \ecomm \ACCELMAXj \ecomm \COPPIAMAXj \ecomm \CORSAMAXj \ecomm CORSAMINj\\}{}
        \addtocounter{j}{1}
        }
        \end{tabular}}
        `

        Ho costruito il codice per le 3 macro che ho messo.

        Chiedevo se fosse possibile fare questo, in quanto non riesco a definire le macro con valore alfanumerici (se metto un numero interrompe il nome) così da poter effettivamente sfruttare il contatore. Non so se è chiaro.

      • #115571
        Up
        0
        Down
        ::


        Ho provato con questa soluzione, ma non funziona:

        `
        \usepackage{graphicx}
        \usepackage{ifthen}

        \setlength{\parindent}{0pt}
        \expandafter\def\csname agent1 \endcsname{Agente 1}
        \expandafter\def\csname agent2 \endcsname{Agente 2}
        \csname agent1 \endcsname\\
        \csname agent2 \endcsname\\
        \newcounter{j}
        \setcounter{j}{1}
        \whiledo{\value{j}<3}{
        \csname agentj \endcsname\\
        \arabic{j}\\
        \addtocounter{j}{1}
        }
        `

        Stampa correttamente Agente 1 e Agente 2 iniziali, stampa correttamente il valore del contatore che aumenta ma ignora completamente la stampa di Agente 1 e Agente 2 del ciclo.

        Non c’è alcun modo per fargli leggere la come il valore che ha in quel momento e quindi riferirsi a agent1 e agent2?

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

    Go to top