Ridefinire comando-creazione iniziale puntata di una parola

  • Creatore
    Topic
  • #84216
    Up
    0
    Down
    ::


    Ciao, avrei la seguente questione.
    Ho creato il comando \nome{} con il quale, neanche a dirlo, identifico dei nomi di battesimo che compaiono nel testo. Ora, per ragioni di privacy (eccessive) mi è stato imposto di utilizzare solo l’iniziale di questi.
    Ho provato a cercare in internet se esiste un qualche pacchetto che può fare al mio caso, ma sono adatti a gestire acronimi e abbreviazioni e non a risistemare un comando.

    Per fare un esempio di cosa mi servirebbe

    \nome{Alberto} produce A. nel pdf

    Se qualcuno ha tempo o sa come aiutarmi sarei curioso di capire se esiste un modo texnico per ottenere il risultato ridefinendo il comando \nome{} , altrimenti con un po’ di pazienza correggo a mano (anche se a dire il vero mi dispiace perdere i nomi… nomina nuda tenemus…).

    grazie
    Andrea

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #84217
      Up
      0
      Down
      ::

      And” post=83441Ciao, avrei la seguente questione.
      Ho creato il comando \nome{} con il quale, neanche a dirlo, identifico dei nomi di battesimo che compaiono nel testo. Ora, per ragioni di privacy (eccessive) mi è stato imposto di utilizzare solo l’iniziale di questi.
      Ho provato a cercare in internet se esiste un qualche pacchetto che può fare al mio caso, ma sono adatti a gestire acronimi e abbreviazioni e non a risistemare un comando.

      Per fare un esempio di cosa mi servirebbe

      \nome{Alberto} produce A. nel pdf

      Se qualcuno ha tempo o sa come aiutarmi sarei curioso di capire se esiste un modo texnico per ottenere il risultato ridefinendo il comando \nome{} , altrimenti con un po’ di pazienza correggo a mano (anche se a dire il vero mi dispiace perdere i nomi… nomina nuda tenemus…).

      grazie
      Andrea

      Se i nomi non hanno iniziale con accenti stravaganti, la cosa è semplice:
      `\makeatletter
      \newcommand{\nome}[1]{\get@initial#1\@nil}
      \def\get@initial#1#2\@nil{#1.}
      \makeatother`
      Ciao
      Enrico

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


        Ecco una versione con LaTeX3:
        `\documentclass{article}
        \usepackage{expl3}
        \usepackage{xparse}

        \ExplSyntaxOn

        \cs_new:Npn \my_parsename:w #1 #2 \q_stop
        {
        #1 .
        }

        \NewDocumentCommand \initial { m }
        {
        \my_parsename:w #1 \q_stop
        }

        \ExplSyntaxOff

        \begin{document}
        \initial{Albert Einstein}
        \initial{B.}
        \initial{Carl Popper}
        \end{document}`
        Saluti.
        R.

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


          Eccomi di nuovo.
          Il codice seguente, migliorabile, scritto in LaTeX3, inserisce le sole iniziali anche per argomenti con più nomi:
          `\documentclass{article}
          \usepackage{expl3}
          \usepackage{xparse}

          \ExplSyntaxOn
          \cs_new:Npn \my_parsename:w #1 #2 \q_stop
          {
          #1 . ~
          }

          \cs_new:Npn \my_level_func:n #1
          {
          \my_parsename:w #1 \q_stop
          }

          \NewDocumentCommand \initials { >{ \SplitList { ~ } } m }
          {
          \ProcessList { #1 } { \my_level_func:n }
          }
          \ExplSyntaxOff

          \begin{document}
          La teoria elaborata da \initials{Albert Einstein Junior}, tuttora un segreto\dots

          \initials{B.}
          \initials{Carl Popper}
          \end{document}`

          R.
          Ps.
          Grazie Enrico per la correzione…

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


            Versione migliorata: si fa uso di una sequence per eliminare il problema dello spazio tra le iniziali:
            `\documentclass{article}
            \usepackage{expl3}
            \usepackage{xparse}

            \ExplSyntaxOn
            \seq_new:N \l_my_initials_seq

            \cs_new:Npn \my_parsename:w #1 #2 \q_stop
            {
            \seq_put_right:Nn \l_my_initials_seq { #1 . }
            }

            \cs_new:Npn \my_level_func:n #1
            {
            \my_parsename:w #1 \q_stop
            }

            \NewDocumentCommand \initials { >{ \SplitList { ~ } } m }
            {
            \seq_clear_new:N \l_my_initials_seq
            \ProcessList { #1 } { \my_level_func:n }
            \seq_use:Nnnn \l_my_initials_seq { ~ } { ~ } { ~ }
            }
            \ExplSyntaxOff

            \begin{document}
            La teoria elaborata da \initials{Albert Einstein Junior}, tuttora un segreto\dots

            Un famoso filosofo \initials{Carl Popper} disse\dots

            Il comando tratta ovviamente anche nomi unici come \initials{Paperino} che è amico di \initials{Topolino}
            \end{document}
            `

            Basta sostituire \seq_put_right:Nn con \seq_put_left:Nn per reversare le iniziali…
            R.

          • #84221
            Up
            0
            Down
            ::


            Occorre
            `\cs_new_protected:Npn \my_parsename:w`
            perché questa funzione usa funzioni “non espandibili”, in questo caso [tt]\seq_put_right:Nn[/tt]. Ma, a questo punto, anche [tt]\my_level_function:n[/tt] dovrà essere [tt]protected[/tt]. Non lo era nella versione precedente, perché quella lavorava per pura espansione.

            Ciao
            Enrico

          • #84222
            Up
            0
            Down
            ::


            Grazie mille Enrico!

            p.s.
            LaTex3 sembra essere veramente oscuro…

          • #84223
            Up
            0
            Down
            ::

            And” post=83494Grazie mille Enrico!

            p.s.
            LaTex3 sembra essere veramente oscuro…

            Perché? La prima versione di robitex è esattamente identica alla mia. Vediamole a confronto.
            `\makeatletter
            \newcommand{\nome}[1]{\get@initial#1\@nil}
            \def\get@initial#1#2\@nil{#1.}
            \makeatother`
            La macro [tt]\nome[/tt] prende un argomento qualsiasi e trasforma [tt]\nome{Alberto}[/tt] in
            `\get@initial Alberto\@nil`
            La macro [tt]\get@initial[/tt] ha due argomenti, uno non delimitato e uno delimitato da [tt]\@nil[/tt]. Siccome dopo [tt]\get@initial[/tt] non c’è una graffa, avremo [tt]#1<-A[/tt] e [tt]#2<-lberto[/tt]. La macro restituisce [tt]A.[/tt]. Vediamo la versione di robitex. `\ExplSyntaxOn \cs_new:Npn \my_parsename:w #1 #2 \q_stop { #1 . } \NewDocumentCommand \initial { m } { \my_parsename:w #1 \q_stop } \ExplSyntaxOff` L'unica vera differenza è che fra [tt]\ExplSyntaxOn[/tt] e [tt]\ExplSyntaxOff[/tt] gli spazi e i fine riga sono ignorati, quindi si ha maggiore libertà nello scrivere il codice. La macro [tt]\initial[/tt] fa esattamente lo stesso della mia [tt]\nome[/tt]: prende un argomento obbligatorio (indicato con [tt]m[/tt]) e trasforma [tt]\initial{Alberto}[/tt] in `\my_parsename:w Alberto\q_stop` E qui succede lo stesso di prima, solo che invece di [tt]\@nil[/tt] c'è [tt]\q_stop[/tt]. La macro ausiliaria ha un nome che dice di sé di avere argomenti "strani" (la finale [tt]:w[/tt] sta per "weird"). Ma la definizione è esattamente la stessa di [tt]\get@initial[/tt]. Ciao Enrico

          • #84224
            Up
            0
            Down
            ::


            Mmm, non dico di aver capito, ma seguo …

            Tenterò un nuovo assalto a “Appunti di programmazione in Latex e Tex” 🙂

            Ancora grazie,

            Andrea

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

        Go to top