funzioni con un numero variabile di parametri [Risolto]

  • Questo topic ha 6 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 18 anni fa da egreg9.
  • Creatore
    Topic
  • #26560
    Up
    0
    Down
    ::


    Vorrei costruire una funzione con un numero variabile di parametri.
    Qualcosa tipo:
    `\multilinea{p0}{p1}…{pn}`
    che mi disegna n linee, ciascuna tra p(i) e p(i+1). (e.g. p(i) potrebbero essere dei nomi di nodi in PSTricks, ma questo è irrilevante)
    NB non conosco a priori il numero di argomenti!
    sapreste aiutarmi?

    grazie!

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #26561
      Up
      0
      Down
      ::

      Vorrei costruire una funzione con un numero variabile di parametri.
      Qualcosa tipo:
      `\multilinea{p0}{p1}…{pn}`
      che mi disegna n linee, ciascuna tra p(i) e p(i+1). (e.g. p(i) potrebbero essere dei nomi di nodi in PSTricks, ma questo è irrilevante)
      NB non conosco a priori il numero di argomenti!
      sapreste aiutarmi?

      Puoi usare questo:
      `\makeatletter
      \def\multilinea#1{%
      \@for\next:=#1\do
      {}}
      \makeatother`
      e poi
      `\multilinea{a,b,c,d}`
      Il comando esegue un ciclo sulla lista data come argomento. Se uno degli elementi della lista contiene una virgola, basta racchiuderlo tra graffe.

      Al posto di sostituisci l’azione che desideri eseguire, sapendo che a ogni passo, \next si espande all’elemento corrispondente della lista.

      Ciao
      Enrico

    • #26562
      Up
      0
      Down
      ::


      grazie appena riesco provo!

    • #26563
      Up
      0
      Down
      ::


      No con il tuo metodo non sono riuscito.
      Ad ogni modo ho risolto, definendo un comando latex ricorsivo con ifthenelse.

      Ciao

    • #26564
      Up
      0
      Down
      ::

      No con il tuo metodo non sono riuscito.
      Ad ogni modo ho risolto, definendo un comando latex ricorsivo con ifthenelse.

      Segreto militare? Si impara sempre a vedere le cose fatte da altri: perché non mostri la soluzione? E dici dove il suggerimento non funzionava?

      Ciao
      Enrico

    • #26565
      Up
      0
      Down
      ::


      hai ragione scusate
      il \for non sono riuscito a usarlo … ma potrebbe essere perchè non ho mai usato i comandi tex 😆 in particolare,facendo come scrivi sopra io riesco a usare solo un argomento per volta, e non due, quindi non riesco a disegnare linee (o fare qls altra cosa che richieda 2 argomenti)

      con il latex invece ce l’ho fatta ma in maniera un po’ contorta:

      `
      \usepackage{ifthen}

      \newcounter{multicounter}

      \newcommand{\multilinea}[3] {
      \setcounter{multicounter}{#1}
      \multilineainnerproc{#2}{#3}
      }

      \newcommand{\multilineainnerproc}[2] {
      LINEA (#1,#2)\\
      \addtocounter{multicounter}{-1}
      \ifthenelse{\value{multicounter}>1}
      {\multilineainnerproc{#2}} %notare: richiamo con 1 argomento solo…
      {}
      }
      `

      da richiamare con: \multilinea{num-punti}{p1}…{pn} (e ci devono essere almeno 2 punti…)
      Sarebbe bello generare un warning se num-punti è < 2, ma non sono capace. Magari apro un'altro topic sull'argomento. P.S. forse segreto militare no.. ma cmq mi sento molto orgoglioso di questo pezzetto di codice ;)

    • #26566
      Up
      0
      Down
      ::

      hai ragione scusate
      il \for non sono riuscito a usarlo … ma potrebbe essere perchè non ho mai usato i comandi tex 😆 in particolare,facendo come scrivi sopra io riesco a usare solo un argomento per volta, e non due, quindi non riesco a disegnare linee (o fare qls altra cosa che richieda 2 argomenti)

      con il latex invece ce l’ho fatta ma in maniera un po’ contorta:

      `
      \usepackage{ifthen}

      \newcounter{multicounter}

      \newcommand{\multilinea}[3] {
      \setcounter{multicounter}{#1}
      \multilineainnerproc{#2}{#3}
      }

      \newcommand{\multilineainnerproc}[2] {
      LINEA (#1,#2)\\
      \addtocounter{multicounter}{-1}
      \ifthenelse{\value{multicounter}>1}
      {\multilineainnerproc{#2}} %notare: richiamo con 1 argomento solo…
      {}
      }
      `

      da richiamare con: \multilinea{num-punti}{p1}…{pn} (e ci devono essere almeno 2 punti…)
      Sarebbe bello generare un warning se num-punti è < 2, ma non sono capace. Magari apro un'altro topic sull'argomento. P.S. forse segreto militare no.. ma cmq mi sento molto orgoglioso di questo pezzetto di codice ;)

      Con la sintassi che vuoi è impossibile, LaTeX non saprebbe identificare l’ultimo argomento. Con quella che ti ho proposto sì:
      `\makeatletter
      \def\multilinea#1{%
      \let\ml@end\@empty
      \@for\next:=#1\do
      {\ifx\ml@end\@empty
      \edef\ml@end{\next}%
      \else
      \edef\ml@start{\ml@end}%
      \edef\ml@end{\next}%
      \message{\ml@start–\ml@end}%
      \fi}}
      \makeatother`
      La riga con \message è quella che dovrai modificare per i tuoi scopi: il punto iniziale è disponibile con \ml@start, quello finale con \ml@end. Ho messo questa per mostrarti che il comando identifica correttamente i parametri: \multilinea{a,b,c,d} produce i messaggi “a–b”, “b–c” e “c–d”.

      Si può anche studiare di inserire il messaggio di errore, ma meglio prima lavorare sui casi interessanti e lasciare alla fine di dettagli.

      Ciao
      Enrico

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

Go to top