Comprendere un comando in un file Cls.

  • Creatore
    Topic
  • #18095
    Up
    0
    Down
    ::


    Mi sto rompendo la testa per capire cosa fa questo comando che viene utilizzato in un file di classe cls per listare un elenco di autori, ma purtroppo non ne sto venendo fuori.
    il codice è il seguente:
    `
    \newcommand{\nxandlist}[4]{%
    \def\@andlistc##1{\toks@\@xp{\the\toks@##1}}%
    \toks@{\toks@\@emptytoks \@andlista{{#1}{#2}{#3}}}%
    \the\@xp\toks@#4\and\and
    \edef#4{\the\toks@}%
    \let\@andlistc\@iden}
    \def\@andlista#1#2\and#3\and{\@andlistc{#2}\@ifnotempty{#3}{%
    \@andlistb#1{#3}}}
    \def\@andlistb#1#2#3#4#5\and{%
    \@ifempty{#5}{%
    \@andlistc{#2#4}%
    }{%
    \@andlistc{#1#4}\@andlistb{#1}{#3}{#3}{#5}%
    }}

    `
    Grazie a chi saprà darmi lumi

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #18096
      Up
      0
      Down
      ::

      Mi sto rompendo la testa per capire cosa fa questo comando che viene utilizzato in un file di classe cls per listare un elenco di autori, ma purtroppo non ne sto venendo fuori.

      Occorre sapere che \toks@ indica un registro di token e che \@xp è un’abbreviazione di \expandafter.
      `\newcommand{\nxandlist}[4]{%`
      Stiamo definendo il comando \nxandlist con quattro argomenti.
      `\def\@andlistc##1{\toks@\@xp{\the\toks@##1}}%`
      L’espansione ridefinisce \@andlistc con un argomento; ogni chiamata di \@andlistc aggiunge al contenuto di \toks@ l’argomento; per esempio, se \toks@ contiene \xxx\yyy, dopo \@andlistc{\zzz} il contenuto di \toks@ sarà \xxx\yyy\zzz
      ` \toks@{\toks@\@emptytoks \@andlista{{#1}{#2}{#3}}}%`
      Inizializziamo il contenuto di \toks@ come scritto; \@emptytoks è un registro token sempre vuoto.
      ` \the\@xp\toks@#4\and\and`
      Emettiamo il contenuto della registro token \toks@ seguito dal quarto argomento (espanso) e da \and\and
      ` \edef#4{\the\toks@}%`
      Ridefiniamo il quarto argomento (che deve essere un comando) come il contenuto di \toks@
      ` \let\@andlistc\@iden}`
      Definiamo \@andlistc come la macro \@iden; la definizione di \@iden è \def\@iden#1{#1}.
      `\def\@andlista#1#2\and#3\and{\@andlistc{#2}\@ifnotempty{#3}{%
      \@andlistb#1{#3}}}`
      Questo non dovrebbe dare problemi: \@andlista ha tre argomenti; il primo non è delimitato, il secondo è delimitato da \and, il terzo anche.
      `\def\@andlistb#1#2#3#4#5\and{%
      \@ifempty{#5}{%
      \@andlistc{#2#4}%
      }{%
      \@andlistc{#1#4}\@andlistb{#1}{#3}{#3}{#5}%
      }}`
      Anche questo non dovrebbe dare problemi. Ora però occorre vedere che succede quando si chiama \nxandlist{a}{b}{c}{\d}. Il registro \toks@ sia vuoto e supponiamo che sia stato dato \def\d{xyz}

      La lista di token che viene sostituita è
      `\def\@andlistc#1{\toks@\@xp{\the\toks@#1}}
      \toks@{\toks@\@emptytoks \@andlista{{a}{b}{c}}}
      \the\@xp\toks@\d\and\and
      \edef\d{\the\toks@}
      \let\@andlistc\@iden`
      e, a questo punto, riparte l’espansione. La definizione di \@andlistc viene memorizzata. Il registro \toks@ assume il valore \toks@\@emptytoks \@andlista{{a}{b}{c}}

      Poi nella lista di token da esaminare viene inserito
      `\toks@\@emptytoks \@andlista{{a}{b}{c}}xyz\and\and`
      e quindi la lista a questo punto è
      `\toks@\@emptytoks \@andlista{{a}{b}{c}}xyz\and\and
      \edef\d{\the\toks@}\let\@andlistc\@iden`
      Occorre espandere \@andlista, i cui argomenti sono #1={a}{b}{c}, #2=xyz e #3 è vuoto. Quindi si trova
      `\@andlistc{xyz}\@ifnotempty{}{\@andlistb{a}{b}{c}{}}`
      L’espansione di \@andlistc è
      `\toks@\@xp{\the\toks@ xyz}`
      Siccome il primo argomento di \@ifnotempty è vuoto, l’espansione è vuota.

      Adesso puoi andare avanti. È chiaro che non succederà sempre così: se l’espansione di \d contiene \and, gli argomenti di \@andlista saranno diversi.

      Ciao
      Enrico

    • #18097
      Up
      0
      Down
      ::


      Molto istruttivo. Grazie.
      Comincio a desiderare un simile livello di comprensione.

      Ciao
      Agostino

    • #18098
      Up
      0
      Down
      ::


      Grazie mille, adesso spero di riuscire ad andare avanti e capire fino in fondo come funziona la funzione generale usata. Se volete posso postarla, serve a creare una lista di autori e ad attribuire ad ogni autore il corretto indirizzo e/o affiliazione.

      Enrico veramente grazie. Purtroppo senza studiare tutto il Texbook in dettaglio diventa difficile comprendere cosa si nasconde nelle varie macro di latex
      Ciao

    • #18099
      Up
      0
      Down
      ::

      Grazie mille, adesso spero di riuscire ad andare avanti e capire fino in fondo come funziona la funzione generale usata. Se volete posso postarla, serve a creare una lista di autori e ad attribuire ad ogni autore il corretto indirizzo e/o affiliazione.

      Enrico veramente grazie. Purtroppo senza studiare tutto il Texbook in dettaglio diventa difficile comprendere cosa si nasconde nelle varie macro di latex

      Quelle macro vengono dai pacchetti creati per l’AMS da Michael Downes, che era un genio della programmazione TeX. La funzione \nxandify serve per creare la lista degli autori lasciando la possibilità di introdurli semplicemente scrivendo più volte i comandi \author e \address. Lo scopo è di evitare espansioni premature delle macro contenute negli argomenti di questi comandi.

      Purtroppo la documentazione di questi pacchetti non è molto dettagliata.

      Ciao
      Enrico

    • #18100
      Up
      0
      Down
      ::


      Grazie della segnalazione, non avevo idea dell’origine dei pacchetti.

    • #18101
      Up
      0
      Down
      ::


      Mi era noto il significato sintattico di ‘#n’ ma per quanto concerne questa simbologia (##n) non ne so decifrare il nesso.
      Forse un parametro ripetuto???
      Lo stralcio è comunque molto molto istruttivo.
      Grazie ancora
      Alessandro

    • #18102
      Up
      0
      Down
      ::

      Mi era noto il significato sintattico di ‘#n’ ma per quanto concerne questa simbologia (##n) non ne so decifrare il nesso.
      Forse un parametro ripetuto???
      Lo stralcio è comunque molto molto istruttivo.

      Se devi definire una macro all’interno della definizione di una macro, puoi raddoppiare i #:
      [code]\def\xxx#1{\def#1##1##2{a ##1 ##2}}[/code
      Scrivendo \xxx\yyy, otterrai la definizione di \yyy come macro con due argomenti, come se si fosse scritto \def\yyy#1#2{a #1 #2}

      Ciao
      Enrico

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

Go to top