Catturare e formattare la prima parola di una frase

  • Creatore
    Topic
  • #60844
    Up
    0
    Down
    ::


    Salve a tutti, ho il seguente problema:
    ho una sequenza di parole (separate da spazi) ;
    la sequenza va stampata in corsivo
    e prima parola va stampata anche in grassetto.

    Vorrei poter avere un comando tale che
    `
    \newcommand{\mytext}{\itshape This has to be tested}
    \fmtfirsttoken{\bfseries}{\mytext}
    `
    restituisca:
    This has to be tested

    Come si potrebbe implementare una macro come \fmtfirsttoken ?

    Ciao,
    Agostino

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

      Salve a tutti, ho il seguente problema:
      ho una sequenza di parole (separate da spazi) ;
      la sequenza va stampata in corsivo
      e prima parola va stampata anche in grassetto.

      Vorrei poter avere un comando tale che
      `
      \newcommand{\mytext}{\itshape This has to be tested}
      \fmtfirsttoken{\bfseries}{\mytext}
      `
      restituisca:
      This has to be tested

      Come si potrebbe implementare una macro come \fmtfirsttoken ?

      Ciao,
      Agostino

      `\documentclass[a4paper]{article}

      \makeatletter
      \def\fmtfirsttoken#1#2{\expandafter\@fmtfirsttoken\expandafter#1#2 \@nil}
      \def\@fmtfirsttoken#1#2 #3\@nil{\itshape
      {#1#2}\if\relax\detokenize{#3}\relax
      \else\space#3\unskip\fi}
      \makeatletter

      \newcommand{\mytext}{This has to be tested}

      \begin{document}
      \fmtfirsttoken{\bfseries}{\mytext}X

      \renewcommand{\mytext}{Ciao}
      \fmtfirsttoken{\bfseries}{\mytext}X
      \end{document}`
      Ciao
      Enrico

    • #60846
      Up
      0
      Down
      ::


      Ciao, scusate se mi intrometto ma, per esercizio, voglio provare a leggere la macro che ha fornito egreg9.

      Allora:

      La macro \fmtfirsttoken passa due dei tre input della macro \@fmtfirsttoken e nello specifico lo stile della prima parola(#1) ed il testo della frase da cui essa viene presa(#2) in modo tale che sia espansa prima la seconda(#2) e la terza(#3).

      Quindi definito \mytext come nell’esempio, scrivere
      `\fmtfirsttoken{\bfseries}{\mytext}`
      è come scrivere
      `@fmtfirsttoken{\bfseries}{This has to be tested}{}`
      giusto?

      Se si, non ho capito quale parte del codice che non ho ancora descritto permette di prendere la prima parola, visto che le variabili #1 e #2 stanno entrambi dentro le graffe.

      Saluti

      Michele

    • #60847
      Up
      0
      Down
      ::

      Ciao, scusate se mi intrometto ma, per esercizio, voglio provare a leggere la macro che ha fornito egreg9.

      Allora:

      La macro \fmtfirsttoken passa due dei tre input della macro \@fmtfirsttoken e nello specifico lo stile della prima parola(#1) ed il testo della frase da cui essa viene presa(#2) in modo tale che sia espansa prima la seconda(#2) e la terza(#3).

      Quindi definito \mytext come nell’esempio, scrivere
      `\fmtfirsttoken{\bfseries}{\mytext}`
      è come scrivere
      `@fmtfirsttoken{\bfseries}{This has to be tested}{}`
      giusto?

      Ritenta, sarai più fortunato. 🙂

      #1 è il primo argomento di \fmtfirsttoken, che nell’esempio è \bfseries.

      Ciao
      Enrico

    • #60848
      Up
      0
      Down
      ::


      Ritento la fortuna. Eccome come espande la macro senza @

      `\@fmtfirsttoken{\bfseries}{This}{has to be tested}`

      ed a sua volta

      `\itshape\bfseries{This} has to be tested`

      Domanda: quando \@fmtfirsttoken “legge” #2, tutti caratteri prima della spazio sono considerati un unico token?

    • #60849
      Up
      0
      Down
      ::

      Ritento la fortuna. Eccome come espande la macro senza @

      `\@fmtfirsttoken{\bfseries}{This}{has to be tested}`

      ed a sua volta

      `\itshape\bfseries{This} has to be tested`

      Domanda: quando \@fmtfirsttoken “legge” #2, tutti caratteri prima della spazio sono considerati un unico token?

      Assumiamo che \mytext si espanda a “This has to be tested” (senza le virgolette):
      `\fmtfirsttoken{\bfseries}{\mytext}
      \expandafter\@fmtfirsttoken\expandafter\bfseries\mytext*\@nil
      \@fmtfirsttoken\bfseries This*has*to*be*tested*\@nil`
      Siccome qui gli spazi sono significativi, mostro con * quelli “veri”; per esempio quello dopo \bfseries c’è solo per motivi “tipografici”, ma non per TeX.

      Il primo argomento di \@fmtfirsttoken è il primo token (o il primo gruppo tra graffe che si incontra, ma in questo caso c’è solo \bfseries); il secondo argomento è tutto ciò che segue fino al primo spazio, il terzo argomento tutto ciò che va da quello spazio fino al primo \@nil. Dunque in questo caso

      #1 <- \bfseries #2 <- This #3 <- has*to*be*tested* Se l'espansione di \mytext fosse solo "This", il terzo argomento sarebbe vuoto; per questo c'è uno spazio "in più" prima di \@nil nella definizione di \fmtfirsttoken. Non confondere "token" con "argomento", se vuoi addentrarti nelle macro con argomenti delimitati. :) Ciao Enrico

    • #60850
      Up
      0
      Down
      ::


      Grazie Enrico per la macro e per le delucidazioni.
      Nella tua soluzione ha un ruolo la macro \detokenize il cui significato
      è spiegato qui: http://tex.stackexchange.com/questions/20059/what-detokenize-command-does

      Ciao,
      Agostino

    • #60851
      Up
      0
      Down
      ::

      Grazie Enrico per la macro e per le delucidazioni.
      Nella tua soluzione ha un ruolo la macro \detokenize il cui significato
      è spiegato qui: http://tex.stackexchange.com/questions/20059/what-detokenize-command-does

      \detokenize è una primitiva di e-TeX; il suo uso per verificare se un argomento è vuoto l’ho imparato da H. Oberdiek. Siccome \if espande ciò che lo segue fino a quando trova due token non più espandibili per poterli confrontare, succede questo:

        1. \relax non è espandibile, andiamo avanti
        2. \detokenize è espandibile, quindi espandiamolo
        3. l’espansione di \detokenize consiste nel contenuto del “general text” che lo segue come se a ogni token nel “balanced text” fosse applicato il comando \string; il risultato è una successione di caratteri di categoria 12 (o 10 per gli spazi)
        4. se tra le graffe dopo \detokenize non c’è niente, cioè l’argomento è vuoto, \if trova dopo il primo \relax un altro \relax: sono uguali, perciò si segue il ramo “vero”, cioè tutto quanto va dal secondo \relax a \else (o a \fi se \else non c’è)
        5. se tra le graffe c’è qualcosa, \if confronta il primo \relax con il primo carattere: non sono uguali, perciò si segue il ramo “falso”; tutto quello che segue il primo carattere fino a \else fa parte del ramo “falso”, quindi viene ignorato; se non c’è \else ma solo \fi, viene tutto buttato via

      “general text”: {“balanced text”}
      “balanced text”: qualsiasi codice TeX che sia bilanciato rispetto alle graffe esplicite.

      Suppongo che non ci voglia tanta fantasia per capire di chi è la spiegazione nella pagina che indichi. 🙂

      Ciao
      Enrico

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

Go to top