Array in TeX

  • Creatore
    Topic
  • #21330
    Up
    0
    Down
    ::


    Salve a tutti,
    qualcuno saprebbe dirmi se è possibile creare e gestire in TeX un qualcosa che assomigli ad un array?

    Mi spiego meglio.
    Mi chiedo, ad esempio, come potrei fare a manipolare un vettore di stringhe del tipo:
    `
    ={a,b,pippo,pluto,tizio,caio}
    `
    ed all’occorrenza estrarre un elemento. Esempio:
    `
    \begin{tabular}{ll}
    uno &
    [1] \\
    2 &
    [2] \\
    tre &
    [3] \\
    4 &
    [4]
    \end{tabular}
    `

    Scusate l’ingenuità della domanda. Direi che ci sarebbero dei thread
    interessanti su questo forum in merito a questo argomento.
    Purtroppo non riesco a “decifrarne” il contenuto, essendo per me
    piuttosto avanzati.

    Grazie,
    Agostino

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

      Salve a tutti,
      qualcuno saprebbe dirmi se è possibile creare e gestire in TeX un qualcosa che assomigli ad un array?

      Mi spiego meglio.
      Mi chiedo, ad esempio, come potrei fare a manipolare un vettore di stringhe del tipo:
      `
      ={a,b,pippo,pluto,tizio,caio}
      `
      ed all’occorrenza estrarre un elemento. Esempio:
      `
      \begin{tabular}{ll}
      uno &
      [1] \\
      2 &
      [2] \\
      tre &
      [3] \\
      4 &
      [4]
      \end{tabular}
      `

      Scusate l’ingenuità della domanda. Direi che ci sarebbero dei thread
      interessanti su questo forum in merito a questo argomento.
      Purtroppo non riesco a “decifrarne” il contenuto, essendo per me
      piuttosto avanzati.

      Esiste il pacchetto arrayjob che fa cose del genere. Più tardi posso provare a trovare qualcosa di meno complicato.

      Ciao
      Enrico

    • #21332
      Up
      0
      Down
      ::


      Ciao Enrico,
      grazie della segnalazione. Il pacchetto arrayjob mi sembra un ottimo riferimento, ricco di esempi.

      Agostino

    • #21333
      Up
      0
      Down
      ::

      Ciao Enrico,
      grazie della segnalazione. Il pacchetto arrayjob mi sembra un ottimo riferimento, ricco di esempi.

      Se però hai bisogno di meno, ecco qui una roba semplice. Ammettiamo che tu abbia salvato la tua lista con
      `\newcommand{\mylist}{aaa,bbb,ccc,ddd,eee}`
      Per estrarre il terzo campo della lista puoi scrivere \extract{\mylist}{3}, dove la definizione di \extract è la seguente:
      `\makeatletter
      \newcommand{\extract}[2]{{%
      \count@=\z@
      \@for\next:=#1\do
      {\advance\count@\@ne
      \ifnum#2=\count@ \expandafter\ignorespaces\next\unskip\fi}%
      }}
      \makeatother`
      Uso due graffe per tenere locali i cambiamenti al valore di \count@ che è un registro numerico temporaneo che azzero. La macro \@for è quella del nucleo di LaTeX che gestisce proprio le liste di stringhe separate da virgole. Dopo \@for va il nome di un comando temporaneo (\next va benissimo); poi :=, poi il nome di una macro la cui espansione sia una lista; poi \do; poi una lista di token da eseguire per ogni elemento della lista, qui \next si espande proprio come la stringa che si sta esaminando in quel momento.

      La lista di token è: avanza il contatore di 1 e confronta il suo valore con il secondo argomento di \extract (il primo è il nome della lista): se sono uguali, stampa la stringa, eliminando eventuali spazi prima e dopo.

      Ci sono limitazioni: se la lista contiene 5 elementi e si scrive \extract{\mylist}{6} (o un numero maggiore), non succede nulla.

      Ciao
      Enrico

    • #21334
      Up
      0
      Down
      ::


      Grazie!
      L’esempio è perfetto.

      Ci sono limitazioni: se la lista contiene 5 elementi e si scrive \extract{\mylist}{6} (o un numero maggiore), non succede nulla

      Questo va bene: una funzione che non funziona non deve recare danni al programma chiamante.

      A questo punto, mi chiedo come potrebbe essere definita una macro che conta gli elementi di \mylist. Ad esempio si potrebbero fare cose del genere:
      `
      \def\n=\howmany{\mylist}
      \extract{\mylist}{\n}
      `

      Ciao,
      Agostino

    • #21335
      Up
      0
      Down
      ::

      Grazie!
      L’esempio è perfetto.

      Ci sono limitazioni: se la lista contiene 5 elementi e si scrive \extract{\mylist}{6} (o un numero maggiore), non succede nulla

      Questo va bene: una funzione che non funziona non deve recare danni al programma chiamante.

      A questo punto, mi chiedo come potrebbe essere definita una macro che conta gli elementi di \mylist. Ad esempio si potrebbero fare cose del genere:
      `
      \def\n=\howmany{\mylist}
      \extract{\mylist}{\n}
      `

      `\makeatletter
      \def\@nameedef#1{\expandafter\edef\csname #1\endcsname}%non c'è nel kernel
      \newcommand{\buildlist}[2]{\@namedef{list@#1}{#2}}
      \newcommand{\appendtolist}[2]{\@nameedef{list@#1}{\@nameuse{list@#1},#2}}
      \newcommand{\prependtolist}[2]{\@nameedef{list@#1}{#2,\@nameuse{list@#1}}}
      \let\@xp\expandafter
      \newcommand\extract[2]{{%
      \count@\z@
      \edef\the@list{\@nameuse{list@#1}}%
      \@for\next:=\the@list\do
      {\advance\count@\@ne\ifnum#2=\count@ \expandafter\ignorespaces\next\unskip\fi}%
      }}
      \newcommand\@listlength[1]{{%
      \count@\z@
      \edef\the@list{\@nameuse{list@#1}}%
      \@for\next:=\the@list\do
      {\advance\count@\@ne}%
      \xdef\@@listlength{\the\count@}%
      }}
      \newcommand\extractlast[1]{\@listlength{#1}\extract{#1}{\@@listlength}}
      \makeatother`
      Adesso puoi dire, più convenientemente,
      `\buildlist{mylist}{aaa,bbb,ccc,ddd,eee}
      \extract{mylist}{2}
      \extractlast{mylist}`
      La cosa è come prima; solo che invece di definire un comando come \mylist, ne definisco uno interno e tratto il nome della lista come una semplice stringa (come con i contatori LaTeX). Per contare il numero di elementi di una lista, eseguo un ciclo sulla lista che fa semplicemente scattare di uno il contatore; poi definisco globalmente (perché siamo in un gruppo) un comando interno che contiene il valore ottenuto.

      Puoi anche aumentare una lista a destra o a sinistra con i comandi \appendtolist e \prependtolist.

      Ciao
      Enrico

    • #21336
      Up
      0
      Down
      ::


      Davvero grazie.
      Codice snello, efficiente ed utile.

      Ripensando ai vari costrutti che sono a disposizione degli utenti
      TeX/LaTeX mi viene da immaginare un parallelo tra i classici argomenti
      trattati nei testi di programmazione ed un possibile tutorial per
      LaTeX orientato ai programmatori.

      Con i vari \, \, \, \ e questo genere di
      strutture dati, cioè liste e funzioni di manipolazione degli elementi, arrays,
      operazioni varie, ecc.(messi a disposizione da questo o quel pacchetto,
      ad esempio ifthen o calc o arrayjob), si potrebbe impostare un discorso
      rivolto all’utente che si sente anche “programmatore”.
      Ovviamente ciascun linguaggio ha i suoi punti di forza ed un dominio
      applicativo di dimensioni finite.
      LaTeX non si presta certo al supercalcolo 😉
      Ma ha delle peculiarità ben precise, basate sul concetto
      di espansione.

      [Mumble mumble… ]

      Ciao
      Agostino

      Ciao

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

Go to top