Argomenti delimitati: lettura di un solo carattere

  • Creatore
    Topic
  • #42630
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Dunque,
      volendo utilizzare macro con argomenti delimitati, per esempio una coppia di valori separati da un punto e virgola, scriverò:`
      \def\test#1;#2{\def\one{#1}\def\two{#2}}`

      Se poi vado a vedere l’applicazione:`\test pippo;pluto
      \one

      \two`come mai il secondo argomento consiste di un solo carattere?

      Naturalmente se metto un delimitatore finale, il secondo argomento viene letto per intero.
      Immagino che sia il comportamento stantard di TeX, ma se qualcuno mi può dare qualche spiegazione TeXnica in più gli sarei grato.
      Bye

    Visualizzazione 4 filoni di risposte
    • Autore
      Risposte
      • #42631
        Up
        0
        Down
        ::

        Dunque,
        volendo utilizzare macro con argomenti delimitati, per esempio una coppia di valori separati da un punto e virgola, scriverò:`
        \def\test#1;#2{\def\one{#1}\def\two{#2}}`

        Se poi vado a vedere l’applicazione:`\test pippo;pluto
        \one

        \two`come mai il secondo argomento consiste di un solo carattere?

        Naturalmente se metto un delimitatore finale, il secondo argomento viene letto per intero.
        Immagino che sia il comportamento stantard di TeX, ma se qualcuno mi può dare qualche spiegazione TeXnica in più gli sarei grato.
        Bye

        La macro \test ha due argomenti, il primo delimitato (da ;), il secondo non delimitato che quindi obbedisce alle regole usuali: è il primo token trovato o, se questo token è una graffa aperta (più precisamente un carattere di categoria 1), tutto ciò che va dalla graffa aperta alla graffa chiusa che la bilancia.

        L’argomento denotato da #k (k è una cifra da 0 a 9) è delimitato quando nel della definizione è seguito da un token che non è l’indicatore di parametro successivo (se k=1, per esempio, l’indicatore di parametro successivo è #2) o dalla graffa che introduce il .

        è, più o meno, la sintassi per un comando , cioè \def, \edef, \gdef o \xdef; è il comando da definire (un token simbolico o un carattere attivo); è una qualsiasi lista di token dove sono ammessi token di tipo speciale, cioè gli indicatori di parametro. Prima di #1 possono esserci altri token, ma questi “delimitano il comando”, non l’argomento.

        Ciao
        Enrico

      • #42632
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          Dunque,
          volendo utilizzare macro con argomenti delimitati, per esempio una coppia di valori separati da un punto e virgola, scriverò:`
          \def\test#1;#2{\def\one{#1}\def\two{#2}}`

          Se poi vado a vedere l’applicazione:`\test pippo;pluto
          \one

          \two`come mai il secondo argomento consiste di un solo carattere?

          Naturalmente se metto un delimitatore finale, il secondo argomento viene letto per intero.
          Immagino che sia il comportamento stantard di TeX, ma se qualcuno mi può dare qualche spiegazione TeXnica in più gli sarei grato.
          Bye

          La macro \test ha due argomenti, il primo delimitato (da ;), il secondo non delimitato che quindi obbedisce alle regole usuali: è il primo token trovato o, se questo token è una graffa aperta (più precisamente un carattere di categoria 1), tutto ciò che va dalla graffa aperta alla graffa chiusa che la bilancia.

          L’argomento denotato da #k (k è una cifra da 0 a 9) è delimitato quando nel della definizione è seguito da un token che non è l’indicatore di parametro successivo (se k=1, per esempio, l’indicatore di parametro successivo è #2) o dalla graffa che introduce il .

          è, più o meno, la sintassi per un comando , cioè \def, \edef, \gdef o \xdef; è il comando da definire (un token simbolico o un carattere attivo); è una qualsiasi lista di token dove sono ammessi token di tipo speciale, cioè gli indicatori di parametro. Prima di #1 possono esserci altri token, ma questi “delimitano il comando”, non l’argomento.

          Ciao
          Enrico

          Capito.
          Del resto se TeX non si fermasse ad un solo token (salvo parentesi graffe), non saprebbe quando fermarsi a leggere l’argomento.
          Capisco anche perché al comando \newcommand è possibile specificare il senza parentesi graffe
          esempio:`\newcommand\mycmd[1]{something with #1})`
          Immagino che se non metto le parentesi graffe a circondare un argomento con un solo token, TeX svolga il suo lavoro più velocemente, anche se la sintassi del linguaggio in questo caso produce qualche tipo di incoerenza (la regola “delimitare un argomento obbligatorio con le graffe” può essere disattesa):
          `\newcommand{\mycmd}[1]{something with #1}
          \newcommand\mycmd[1]{something with #1}`
          Grazie delle informazioni!

        • #42633
          Up
          0
          Down
          ::

          Del resto se TeX non si fermasse ad un solo token (salvo parentesi graffe), non saprebbe quando fermarsi a leggere l’argomento.

          D’altra parte, però, l’uso di argomenti delimitati è indispensabile per certe applicazioni, magari insieme ad argomenti non delimitati:
          `\def\@car#1#2\@nil{#1}`
          permette di estrarre il primo token di una stringa di token che passiamo come “argomento” a \@car: con
          `\def\stampaprimo#1{\@car#1\@nil}`
          (con le precauzioni solite per @), \stampaprimo stampa il primo carattere del suo argomento. Per esempio \stampaprimo{pippo} stampa la “p”. Nota come nel testo della definizione, #1 è “nudo” e così può essere visto come sequenza di token.

          Un argomento delimitato può facilmente essere vuoto: sarebbe il caso di \stampaprimo{A} che, con l’espansione, diventa \@car A\@nil, così che #1 è “A”, mentre #2 è vuoto. Per passare un argomento non delimitato vuoto occorre scrivere una coppia di graffe {}.

          Capisco anche perché al comando \newcommand è possibile specificare il senza parentesi graffe
          esempio:`\newcommand\mycmd[1]{something with #1})`
          Immagino che se non metto le parentesi graffe a circondare un argomento con un solo token, TeX svolga il suo lavoro più velocemente, anche se la sintassi del linguaggio in questo caso produce qualche tipo di incoerenza (la regola “delimitare un argomento obbligatorio con le graffe” può essere disattesa):
          `\newcommand{\mycmd}[1]{something with #1}
          \newcommand\mycmd[1]{something with #1}`

          Anche \frac12 funziona, ma non è consigliabile al principiante.

          Curiosità: $a^\frac{1}{2}$ funziona, ma non funziona $a^\cong$. Esercizio per l’incauto lettore. 🙂

          Ciao
          Enrico

        • #42634
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            Curiosità: $a^\frac{1}{2}$ funziona, ma non funziona $a^\cong$. Esercizio per l’incauto lettore. 🙂

            Provo a dire qualcosa: \cong è un simbolo di relazione (definito con la primitiva \mathrel), pertanto funziona $a^{\cong}$ perché significa metti in esponente ad a la relazione \cong.

            Senza parentesi graffe invece a^ viene interpretato come il primo elemento della relazione ma non è corretto perché manca la definizione stessa dell’esponente.
            In effetti $a^{}\cong$ funziona, dove alla relazione manca il termine di destra.

            Così l’esempio di \frac funziona perché consiste in un solo token.

            Tutto chiaro allora…

          • #42635
            Up
            0
            Down
            ::

            Curiosità: $a^\frac{1}{2}$ funziona, ma non funziona $a^\cong$. Esercizio per l’incauto lettore. 🙂

            Provo a dire qualcosa: \cong è un simbolo di relazione (definito con la primitiva \mathrel), pertanto funziona $a^{\cong}$ perché significa metti in esponente ad a la relazione \cong.

            Senza parentesi graffe invece a^ viene interpretato come il primo elemento della relazione ma non è corretto perché manca la definizione stessa dell’esponente.
            In effetti $a^{}\cong$ funziona, dove alla relazione manca il termine di destra.

            Così l’esempio di \frac funziona perché consiste in un solo token.

            Tutto chiaro allora…

            Tutto sbagliato. 🙂 La faccenda del tipo di atomi (relazioni, operazioni, operatori, eccetera) entra in gioco durante la composizione, ma prima bisogna passare per l’espansione. Il token ^ funziona quasi come un comando con un argomento, ma con una differenza sostanziale: che espande il token che segue (se è espandibile) per cercare un’eventuale graffa implicita o esplicita.

            Perciò $2^a$ oppure $2^{a}$ sono del tutto equivalenti, perché “a” e “{” non sono espandibili.

            Una volta trovata la graffa di apertura, TeX si comporta come con un normale comando con un argomento. Ma qui nasce il piccolo inghippo: con $2^\cong$ l’espansione di “\cong” comincia con \mathrel e questo token diventa l’argomento: ovviamente questo produce un errore.

            Più curiosa è la spiegazione del perché $a^\frac12$ funzioni correttamente. Esercizio. Evidentemente non è perché “\frac” è un solo token.

            Il tutto per rendere chiaro che è consigliabile, in caso di dubbi, mettere le graffe attorno a ciò che si vuole come esponente. Il principiante lo faccia sempre.

            Ciao
            Enrico

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

        Go to top