Songs, modifica catcode.

  • Creatore
    Topic
  • #75470
    franen
    Partecipante
      Up
      0
      Down
      ::


      Titolo enigmatico, ma non ho trovato di meglio.
      Uso il pacchetto songs per scrivere canzoni. Talvolta quando si scrivono gli accordi e si vuole indicare la nota di basso da suonare si usa una barra seguita dalla nota, spesso in corpo più piccolo. Ho un bel po’ di canzoni in cui questi accordi si prensentano nella forma `Sol/Do, Re/Fa` quindi non vorrei definire un nuovo comando per le note di basso. L’idea è di rendere la / un carattere attivo, così:`% !TEX encoding = UTF-8 Unicode
      \documentclass{article}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \usepackage[noindexes]{songs} %(songs 2.14 da http://songs.sourceforge.net/)

      \newcommand{\bassfont}{/\footnotesize}
      \catcode`/=13
      \def/{\bassfont}

      \begin{document}
      \begin{songs}{}
      \beginsong{Casa}
      \beginverse
      \[Re]Ciao a \[Do{/Mi&} Fa]tutti
      \endverse
      \endsong
      \end{songs}
      \end{document}` Tutto funziona benissimo, ma ovviamente la “/” ora è attiva in tutto il documento, e io vorrei che lo fosse solo all’interno degli accordi. Il problema è che non sono riuscito a trovare il comando giusto da ridefinire in songs.sty. Mi rendo conto che il pacchetto non sia dei più diffusi e che non è semplice da interpretare, ma se qualcuno volesse accettare la sfida… 🙂

      Fran

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

        franen” post=74621Titolo enigmatico, ma non ho trovato di meglio.
        Uso il pacchetto songs per scrivere canzoni. Talvolta quando si scrivono gli accordi e si vuole indicare la nota di basso da suonare si usa una barra seguita dalla nota, spesso in corpo più piccolo. Ho un bel po’ di canzoni in cui questi accordi si prensentano nella forma `Sol/Do, Re/Fa` quindi non vorrei definire un nuovo comando per le note di basso. L’idea è di rendere la / un carattere attivo, così:`% !TEX encoding = UTF-8 Unicode
        \documentclass{article}
        \usepackage[utf8]{inputenc}
        \usepackage[T1]{fontenc}
        \usepackage[noindexes]{songs} %(songs 2.14 da http://songs.sourceforge.net/)

        \newcommand{\bassfont}{/\footnotesize}
        \catcode`/=13
        \def/{\bassfont}

        \begin{document}
        \begin{songs}{}
        \beginsong{Casa}
        \beginverse
        \[Re]Ciao a \[Do{/Mi&} Fa]tutti
        \endverse
        \endsong
        \end{songs}
        \end{document}` Tutto funziona benissimo, ma ovviamente la “/” ora è attiva in tutto il documento, e io vorrei che lo fosse solo all’interno degli accordi. Il problema è che non sono riuscito a trovare il comando giusto da ridefinire in songs.sty. Mi rendo conto che il pacchetto non sia dei più diffusi e che non è semplice da interpretare, ma se qualcuno volesse accettare la sfida… 🙂

        Fran

        Proverei prima di tutto con questo:
        `\begingroup\lccode`~=`/
        \lowercase{\endgroup\def~}{/\footnotesize}
        \makeatletter
        \expandafter\def\expandafter\SB@loadactives\expandafter{\SB@loadactives\ifchorded\catcode`/=\active\fi}
        \makeatother`
        La definizione di [tt]\SB@loadactives[/tt] è data in modo assai bizzarro; la riporto
        `\newcommand\SB@loadactives{}
        {
        \catcode`&\active
        \catcode`#\active
        \catcode`|\active
        \catcode`^\active
        \global\let&\flt
        \global\let#\shrp
        \global\let|\measurebar
        \global\let^\SB@activehat
        \gdef\SB@loadactives{%
        \catcode`^\ifchorded\active\else9 \fi%
        \catcode`|\ifmeasures\active\else9 \fi%
        \def\[{\SB@bracket}%
        }
        }`
        È del tutto ovvio che
        `\def\SB@loadactives{%
        \catcode`^\ifchorded\active\else9 \fi
        \catcode`|\ifmeasures\active\else9 \fi
        \def\[{\SB@bracket}%
        }`
        sarebbe del tutto equivalente. Il codice di prima evita di dover sapere come precisamente è definita la macro [tt]\SB@loadactives[/tt] e aggiunge l’attivazione di [tt]/[/tt] solo quando [tt]\ifchorded[/tt] è “vero”.

        Ciao
        Enrico

      • #75472
        franen
        Partecipante
          Up
          0
          Down
          ::


          Grazie, però non basta 🙁
          Il condiziona \ifchorded non mi dice se mi trovo all’interno di un accordo, ma solo se ho deciso di stampare gli accordi della canzone, oltre al testo. Quindi anche nel testo della mia canzone la “/” resta attiva.`% !TEX encoding = UTF-8 Unicode
          \documentclass{article}
          \usepackage[utf8]{inputenc}
          \usepackage[T1]{fontenc}
          \usepackage[noindexes]{songs} %(songs 2.14 da http://songs.sourceforge.net/)
          \begingroup\lccode`~=`/
          \lowercase{\endgroup\def~}{/\footnotesize}
          \makeatletter
          \expandafter\def\expandafter\SB@loadactives\expandafter{\SB@loadactives\ifchorded\catcode`/=\active\fi}
          \makeatother
          \begin{document}
          \begin{songs}{}
          \beginsong{Casa}
          \beginverse
          \[Re]Ci/ao a \[Dol{/Mi&} Fa]tut\[La4/7]ti
          \endverse
          \endsong
          \end{songs}
          \end{document}` (Non vale la risposta: “ma quando mai userai una barra nel testo di una canzone!?” 🙂 )
          Intanto studio il tuo codice… ma a che serve considerare l’\uccode della tilde?

          Fran

          EDIT: per completezza, un link a una discussione in cui Enrico spiega il gioco con \lccode http://tex.stackexchange.com/questions/38008/using-simple-quotes-instead-of-text

        • #75473
          Up
          0
          Down
          ::


          Temo che ci sia poco da fare. Ogni uso di [tt]\[…][/tt] è in comandi in cui l’argomento è già stato pescato, quindi cambiare il codice di categoria di [tt]/[/tt] è inutile.

          Ciao
          Enrico

        • #75474
          franen
          Partecipante
            Up
            0
            Down
            ::


            Sob!, pazienza, grazie mille!
            Fran

          • #75475
            franen
            Partecipante
              Up
              0
              Down
              ::


              Che testa… c’è il comando \chorlocals che è fatto apposta per ridefinire localmente tutto quello che si vuole all’interno degli accordi!
              Ho differenziato \bassfont a seconda che dopo la / ci sia una lettera o un numero. Ma c’è un modo più elegante per dire “se il codice di categoria di quel che segue è 11…” rispetto a quel che ho scritto io?

              Fran
              `% !TEX encoding = UTF-8 Unicode
              \documentclass{article}
              \usepackage[utf8]{inputenc}
              \usepackage[T1]{fontenc}
              \usepackage[noindexes]{songs} %(songs 2.14 da http://songs.sourceforge.net/)

              \makeatletter
              \def\bassfont{\futurelet\next\@bassverify}
              \def\@basstrue{\hspace{-0.3em}/\hspace{-0.1em}\footnotesize}
              \def\@bassfalse{/}
              \def\@bassverify{%
              \ifcat\next f
              \@basstrue
              \else
              \@bassfalse
              \fi}
              \makeatother
              \renewcommand{\chordlocals}{\catcode`/\active}
              {\chordlocals\global\let/\bassfont}

              \begin{document}
              \begin{songs}{}
              \beginsong{Casa}
              \beginverse
              \[D]Cia/o a \[C/E]tut\[A7/4]ti
              \endverse
              \endsong
              \end{songs}
              \end{document}`

            • #75476
              Up
              0
              Down
              ::


              Se sei certo che dopo \bassfont ci siano solo lettere o numeri il test è sicuro.

              Ciao
              Enrico

            • #75477
              franen
              Partecipante
                Up
                0
                Down
                ::


                Grazie, e congratulazioni per i tuoi 100000 su TeX.sx!
                Fran

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

            Go to top