Comando con ciclo

  • Questo topic ha 8 risposte, 4 partecipanti ed è stato aggiornato l'ultima volta 8 anni fa da marcopisto.
  • Creatore
    Topic
  • #67317
    Up
    0
    Down
    ::


    Ciao a tutti,

    vorrei realizzare un nuovo comando che implementa al suo interno un ciclo. Vi scrivo in “pseudocodice” come vorrei che funzionasse (il maiuscoletto non indica voce alta):
    `\newcommand{\comando}{
    PER i CHE VA DA 1 AL VALORE DEL CONTATORE “contatore”
    \stampa{i}
    FINE CICLO
    }`
    Come posso farlo?

    Grazie mille e buona giornata,
    Marco.

    P.S. C’è qualche documentazione dove si possono imparare queste nozioni?

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #67318
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        texdoc ifthen

      • #67319
        Up
        0
        Down
        ::


        Ciao Claudio,

        grazie della risposta.

        Senza consultare la documentazione del pacchetto ifthen (andando a intuito) credo di essere riuscito a implementare il condizionale “if” come mi serve. Poi, quando ho letto la tua risposta, ho consultato la documentazione di ifthen per quanto riguarda il ciclo “for”. Siccome non ho trovato niente che avesse a che fare con un ciclo “for” (potrebbe essere colpa del mio inglese), ho provato a implementare lo stesso ciclo, ma usando un ciclo “while” in questo modo:
        `\newcommand{\stampaTutto}{%
        \newcounter{contatoreTemporaneo}%
        \addtocounter{contatoreTemporaneo}{1}%
        \whiledo{\value{contatoreTemporaneo}<\value{contatore1}}{\stampa{\thecontatoreTemporaneo}\addtocounter{contatoreTemporaneo}{1}}% }` Se quello che ho fatto è poco elegante, o c'è un modo migliore di farlo (o, ancora, c'è effettivamente la possibilità di implementare un ciclo "for"), invito chiunque voglia farlo a darmi qualche consiglio. Intanto ciao e grazie mille, Marco.

      • #67320
        Up
        0
        Down
        ::

        Marco87″ post=66255Ciao Claudio,

        grazie della risposta.

        Senza consultare la documentazione del pacchetto ifthen (andando a intuito) credo di essere riuscito a implementare il condizionale “if” come mi serve. Poi, quando ho letto la tua risposta, ho consultato la documentazione di ifthen per quanto riguarda il ciclo “for”. Siccome non ho trovato niente che avesse a che fare con un ciclo “for” (potrebbe essere colpa del mio inglese), ho provato a implementare lo stesso ciclo, ma usando un ciclo “while” in questo modo:
        `\newcommand{\stampaTutto}{%
        \newcounter{contatoreTemporaneo}%
        \addtocounter{contatoreTemporaneo}{1}%
        \whiledo{\value{contatoreTemporaneo}<\value{contatore1}}{\stampa{\thecontatoreTemporaneo}\addtocounter{contatoreTemporaneo}{1}}% }` Se quello che ho fatto è poco elegante, o c'è un modo migliore di farlo (o, ancora, c'è effettivamente la possibilità di implementare un ciclo "for"), invito chiunque voglia farlo a darmi qualche consiglio. Intanto ciao e grazie mille, Marco.

        Mai inserire \newcounter in una macro (eccetto casi particolari che non hanno nulla a che fare con questo): stai allocando un nuovo contatore a ogni chiamata di \stampaTutto, sprecando risorse.
        `\newcounter{contatoreTemporaneo}
        \newcommand{\stampaTutto}{%
        \setcounter{contatoreTemporaneo}{1}%
        \whiledo{\value{contatoreTemporaneo}<\value{contatore1}}{\stampa{\thecontatoreTemporaneo}\addtocounter{contatoreTemporaneo}{1}}% }` Ciao Enrico

      • #67321
        Up
        0
        Down
        ::


        Ciao Enrico,

        grazie mille.

        Marco.

      • #67322
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Il ciclo for è implementato dentro il nucleo di plain TeX, anzi plain TeX è quasi tutto contenuto nel nucleo di LaTeX; Ogni cosa è descritta nel TeXbook.

          Ma a parte questo il ciclo for e il ciclo while sono sostanzialmente la stessa cosa, ecco perché il pacchetto ifthen definisce solo while.
          Un informatico mi darebbe dell’ignorante se prendesse alla lettera la mia affermazione di prima; for a while sono due cicli sostanzialmente diversi, ma differiscono solo per il momento in cui viene verificata la condizione, dopo o prima del corpo del ciclo; di fatto tutto sta a definire il test in modo adeguato e poi tutti e due i cicli portano allo stesso risultato.

          se poi ne test e nel ciclo usi dei contatori TeX scratch, non hai bisogno di definire niente, e quando hai finito il ciclo abbandoni lì i contatori scratch e se vengono usati da altri brani di testo non ha più importanza. Sarebbe diverso se volessi dei cicli ricorsivi,[erché allora dovresti proteggere i tuoi contatori dentro dei gruppi, perché non vengano sovrascritti da altri pezzi di programma. Ma qui, me ne rendo conto, vuol dire scendere a dettagli di programmazione in linguaggio primitivo, che certamente possono essere ottenuti anche con comandi di livello superiore, meno efficaci, ma più comprensibili.

        • #67323
          Up
          0
          Down
          ::


          Buongiorno, sto leggendo tutta la documentazione ma non riesco proprio a risolvere il problema:
          Ho bisogno di creare un file che mi automatizzi la produzione di relazioni, facciamo l’esempio che debba inserire una serie di immagini chiamate c1 c2 c3 c4 … c24
          Esiste un modo di implementare un ciclo per cui
          for i=1:25
          \includegraphics{c”i”.png}
          end for
          chiedo gentilmente aiuto, non sono riuscito a farlo in alcun modo.

        • #67324
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Il pacchetto ifthen (fa parte dei pacchetti essenziali) definisce il comando \whiledo con la sintassi \whiledo(espressione booleana}{cose da fare}; leggine la documentazione con texdoc ifthen cercando nella pagina 2)

            Il pacchetto etoolbox definisce invece una macro \whielboolexpression che ha la sintassi \whileboolexprassion{espressione booleana}{cose da fare}
            Tutto sommato molto simile al caso precedente. Però l’espressione booleana ha una forma diversa e forse permette una maggiore versatilità.

            Il cuore di LaTeX contiene invece il comando \@wilenum verifica numerica\do{cose da fare}; mi pare decisamente più comodo solo che c’è di mezzo il carattere @ che non è valido se non nei file di classe e nei moduli di estensione; aggiri il problema in questo modo`\newcommand\wilenum[2]{\csname @whilenum#1\endcsname\do{#2}}` In modo che la sintassi del tuo nuovo comando diventa \whilenum{verificanumerica}{cose da fare}.

            In tutti i casi (esemplificherò solo con l’ultimo) devi procedere con questo codice`\documentclass[…]{…]

            \newcount \MYcontat
            \newcommand\whilenum[1]{\unless\ifnum \MYcontat>#1}{\includegraphics[…]{\expandafter c\the\MYcontat}\advance\MYcontat by 1}

            \begin{document}

            \MYcontat=1
            \whilenum{24}

            \end{document}`

            Ovviamante questo è solo un esempio che va adattato alle circostanze; Supponi infatti di avere figure che si chimano c1, c2, c3, …,c24; d1, d2, d3,…,d15; e1, e2, e3, e4; e vie di questo passo; La lettera iniziale di numeri è diversa a secodna dei gruppi, quinaid devi prevedere nell’uso di \whilenum delle cose in più in modo da poter adattare la definizione di whilenum in modo che consenta un maggior numero di parametri; per esempio`\newcommand\whilenum[2]{\unless\ifnum\MYcontat>1}{\includegraphics[…]{\expandafter#2\the\MYcontat}\advance \Mycontat by 1}}`
            In sostanza aggiusta le tue definizione a qual che ti pare.

          • #67325
            Up
            0
            Down
            ::


            Ringrazio tanto per la risposta celere e precisa. Ad ogni modo per ispirazione divina sono riuscito a compilare un codice che fa il suo lavoro, come esempio ulteriore lo posto:
            `\newcounter{icount}
            \makeatletter
            \newcommand\curvec[1]{%
            \setcounter{icount}{0}%
            \@whilenum{\value{icount}<#1}\do{% \stepcounter{icount} \section*{Risultato analisi \theicount} \begin{figure}[h!tb] \centering \includegraphics[width=\textwidth,clip]{c\theicount.png} \caption{Curva di capacità analisi \theicount} \label{fig:cc\theicount} \end{figure} \newpage }} \makeatother` e poi dentro il documento: `\curvec{24}`

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

        Go to top