Campi delimitati in tex con \ o {

  • Creatore
    Topic
  • #18109
    Up
    0
    Down
    ::


    Devo dividere un token in tex delimitato in questo modo
    `
    xxx\hbox {{\mathsurround \z@ \ensuremath {^{\unhbox \voidb@x \hbox {\fontsize 6\z@ \normalfont \unskip 1}}}}}`
    o alternativamente così
    `
    xxx{1}
    `
    Ho provato a creare il comando
    `
    \def\@taglia#1\hbox{#1}

    \def\@taglia#1\char123{#1}
    `
    per ottenere solo xxx
    ma mi da un errore di extra parentesi nell’argomento della funzione.

    Qualcuno ha qualche suggerimento? Grazie in anticipo.

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #18110
      Up
      0
      Down
      ::

      Devo dividere un token in tex delimitato in questo modo
      `
      xxx\hbox {{\mathsurround \z@ \ensuremath {^{\unhbox \voidb@x \hbox {\fontsize 6\z@ \normalfont \unskip 1}}}}}`
      o alternativamente così
      `
      xxx{1}
      `
      Ho provato a creare il comando
      `
      \def\@taglia#1\hbox{#1}

      \def\@taglia#1\char123{#1}
      `
      per ottenere solo xxx
      ma mi da un errore di extra parentesi nell’argomento della funzione.

      Non che si capisca molto bene, sai? Provo a sfogliare i tarocchi e vediamo se indovino.

      Hai una lista di token che contiene qualcosa seguita da una graffa aperta, cose che non ti interessano e finalmente una graffa chiusa. Ciò che vuoi è estrarre ciò che viene prima delle graffe. Il problema è che solo l’ultimo argomento può essere delimitato da una graffa aperta e questo si fa precedendo la graffa di apertura nella definizione con #.
      Devi prima trovare il tuo argomento xxx, poi buttare via la parte fra graffe.
      `\def\@taglia#1#{#1\@gobble}`
      La macro \@gobble è una funzione del nucleo di LaTeX:
      `\def\@gobble#1{}`
      Vediamo che succede con la chiamata \@taglia xxx{1}: \@taglia cerca il suo argomento, che è delimitato da una graffa aperta, quindi diventa xxx; una volta trovato l’argomento, lo rimette nella lista di token e ci aggiunge \@gobble in fondo che cerca il suo argomento, cioè il gruppo tra graffe e se lo mangia.

      Attento però che \@taglia{xxx{1}} si mangia tutto, perché l’argomento di \@taglia è vuoto. Se vuoi usarlo così, devi fare in un altro modo
      `\def\@@taglia#1#{#1\@gobble}
      \def\@taglia#1{\@@taglia #1}`
      Annotazione spero utile: \char123 non equivale a scrivere una graffa nella lista di token, ma è un comando per stampare il carattere 123.

      Ma questo è solo l’assaggio. Il tuo problema è che dopo xxx ci può essere \hbox. Io intanto passerei la lista di token come argomento completo a una macro
      `\def\@taglia#1{\@taglia@i #1\hbox\@nil}
      \def\@taglia@i#1\hbox#2\@nil{%
      \@taglia@ii #1{}}
      \def\@taglia@ii#1#{%
      \def\@taglia@iii{#1}%
      \expandafter\@taglia@iii\@gobble}`
      Adesso \@taglia{xxx{1}} si espande come xxx{}, mentre \@taglia{xxx\hbox{1}} si espande come xxx. Se non ti va quella coppia di graffe in più, bisogna lavorarci ancora.

      Se poi oltre a \hbox puoi avere altro, be’, il lavoro è assai più complicato.

      Ciao
      Enrico

    • #18111
      Up
      0
      Down
      ::


      Aggiungo alla risposta precedente. C’è una soluzione, più lenta, al problema più generale di trattare una lista di token della forma
      `\comando{}`
      oppure
      `{}`
      ed ottenere solo i iniziali, con la restrizione che il deve avere un solo argomento.
      `\def\@@taglia#1{\def\@collect@taglia{}\@@@taglia #1\@nil}
      \def\@@@taglia{%
      \futurelet\@taglia@next\@do@taglia}
      \def\@do@taglia#1{%
      \ifx\@taglia@next\@nil
      \let\next\relax
      \else
      \ifcat\noexpand\@taglia@next\bgroup
      \let\next\@gobble
      \else
      \ifcat\noexpand\@taglia@next\relax
      \let\next\@gobbletwo
      \else
      \edef\@collect@taglia{\@collect@taglia #1}%
      \let\next\@@@taglia
      \fi\fi\fi
      \next}`
      Dopo \@@taglia{xxx{1}} oppure \@@taglia{xxx\hbox{1}}, la stringa xxx si troverà nella macro \@collect@taglia.

      Adesso puoi definire l’azione che desideri. Per esempio, per stampare la stringa, puoi dire
      `\def\@taglia#1{\@@taglia{#1}\@collect@taglia}`
      passando la lista di token originale a \@taglia come argomento.

      Ciao
      Enrico

    • #18112
      Up
      0
      Down
      ::


      San Enrico,
      i tuoi tarocchi fanno miracoli!!!

      Devo precisare però che usare

      `
      \@taglia{xxx{1}}
      `
      restituisce correttamente xxx e non l’argomento vuoto, quindi non c’è bisogno di creare

      `
      \def\@@taglia#1#{#1\@gobble}
      \def\@taglia#1{\@@taglia #1}
      `

      Funziona benissimo, non so come ringraziarti!!!!
      Ho appena iniziato a leggere il libro di Knuth, mi sa che è fondamentale
      Ancora GRAZIE

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

Go to top