Ottenere espansione dei comandi nel file idx dell’indice

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


      Quando si compone un indice analitico i comandi eventualmente presenti nell’argomento di [tt]\index[/tt] non vengono espansi, così l’esempio `\documentclass{article}
      \usepackage{imakeidx}\makeindex

      \def\myentry{Testo}
      \begin {document}
      Prova\index{\myentry}
      \printindex
      \end {document}` mi porta ad avere nel file .idx:`\indexentry{\myentry}{1}` e nel file .ind: ` \item \myentry, 1` che poi viene espanso correttamente, ma tutto ciò porta a un errato ordine delle voci. C’è un modo per controllare l’espansione di [tt]\myentry[/tt] in modo che il mio file .idx contenga già il testo di sostituzione?

    Visualizzazione 7 filoni di risposte
    • Autore
      Risposte
      • #89836
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Con un paio di \expandafter non dovrebbero esserci problemi. Tuttavia..

          Ma a che ti serve? L’indice analitico non dovrebbe essere fatto così.

          D’altra parte se vuoi inserire, per esempio, una sigla contenuta nella macro \LaTeX, il concetto sarebbe quello di scrivere`\LaTeX\index{LaTeX@\LaTeX}|`

          La parte che viene prima di @ serve appunto per dire dove deve andare la voce, sia come ordinamento alfabetico, sia come livello di subordinazione, tipo:
          `\emph{mark up}\index{markup}@\emph{mark up}}
          \LaTeX\index{markup!LaTeX@\LaTeX}`

        • #89837
          franen
          Partecipante
            Up
            0
            Down
            ::


            Immaginavo sarebbe giunta questa risposta! 🙂
            Il caso reale è più complesso, non devo fare un indice analitico, ma un indice alfabetico delle canzoni di un canzoniere. Purtroppo alcuni titoli contengono dei punti esclamativi, e non volendo eliminarli sto cercando delle soluzioni. L’idea era di far digerire i titoli delle canzoni a un [tt]\StrSubstitute[/tt] che mi sostituisca ! con “!. Un esempio non funzionante (perché LaTeX scrive i comandi non espansi nell’idx) è:`\documentclass{article}
            \usepackage{xstring}
            \usepackage{imakeidx}
            \makeindex
            \usepackage[noindexes]{songs}%songs.sourceforge.net

            \renewcommand{\makeprelude}{%
            \resettitles\songtitle
            \index{\StrSubstitute{\songtitle}{!}{“!}}
            }

            \begin {document}
            \begin{songs}{}
            \beginsong{Prima}
            \endsong
            \beginsong{Seconda}
            \endsong
            \beginsong{Terza}
            \endsong
            \beginsong{Quarta}
            \endsong
            \end{songs}
            \printindex
            \end {document}`

          • #89838
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              C’è un’altra via: quella di definire un file ist (stile dell’indice analitico, in cui il ruolo del punto esclamativo è svolto da una carattere che non compare mai nei tuoi titoli (oltre beneinteso usare \index{“!} direttamente); per esempio il file di stile che viene usato da memoir usa tutti segni diversi per svolgere le funzioni di @, !, “, |, perché deve indicizzare anche voci che li contengono. Puoi prendere ispirazioni di lì; poi se usi imakeidx, puoi far fare tutto il lavoro a pdflatex, devi solo specificare nelle opzioni del comando \makeindex, il nome del file di stile che ti sei creato.
              Documentazione con texdoc ind da terminale.

              Per esempio: tenuto conto che è quanto mai desiderabile usare caratteri ASCII, un carattere che difficilmente compare nei tuoi titoli di canzoni è <. Dunque potresti crearti un tuo file di stile per l'indice analitico in questo modo:`$ Il mio stile per liberare l'uso del punto esclamativo % ! is a valid character in some entries level '<' % < instead of ! ` salva come miostile.ist Poi o dai il comando di indicizzazione a mano da terminale:`makeindex -s miostile.ist canzonario` oppure, usi imakeidx e aggiungi un'opzione al comando [tt]\makeindex[/tt], così: ` \makeindex[options={-1 miostile.ist}] ` cosicché quando lanci pdflatex sul tuo canzonario, pdflatex ti compone anche l'indice usando il tuo stile.

            • #89839
              franen
              Partecipante
                Up
                0
                Down
                ::


                Grazie, è un’ottima soluzione.
                Solo che uso xindy, e non sono riuscito a trovare come scrivere il codice equivalente a quello che mi hai dato

                Fran

              • #89840
                franen
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Leggendo l’introduzione del file tex2xindy.l si capisce che sarebbe anche fattibile usare altri caratteri per indicare i livelli dei lemmi, ma servirebbe modificare il file stesso e ricompilarlo.
                  Avevo provato con gli \expandafter:`\expandafter\index\expandafter{\StrSubstitute{\songtitle}{!}{“!}}`ma senza risultato.

                • #89841
                  OldClaudio
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    Non so dove hai trovato \Str@substitute, ma è certo che così non può funzionare se non gli viene specificata la stinga su cui agire, ma che cosa ti ci vuole a fare una sostituzione globale impostando le stringe ca cercare e da sostituire con

                    search: ! e replace:”!

                    direttamente nei file sorgente? eviti l’uso di stringhe protette, l’uso di macro di dubbia origine e non documentate,

                    Certo corri il rischio di sostituire dove non devi; ma tutti gli editor permettono di cliccare “cerca” oppure “sostituisci e cerca”, così decidi tu che cosa sostituire e che cosa lasciar stare; scommetto che cambi tutto in 30 secondi con questo volgare metodo manuale.

                  • #89842
                    Up
                    0
                    Down
                    ::

                    franen” post=89404Leggendo l’introduzione del file tex2xindy.l si capisce che sarebbe anche fattibile usare altri caratteri per indicare i livelli dei lemmi, ma servirebbe modificare il file stesso e ricompilarlo.
                    Avevo provato con gli \expandafter:`\expandafter\index\expandafter{\StrSubstitute{\songtitle}{!}{“!}}`ma senza risultato.

                    Ehm, no: una sola espansione di [tt]\StrSubstitute[/tt] non funziona, ma nemmeno l’espansione completa, perché [tt]\StrSubstitute[/tt] non funziona per pura espansione.
                    `\newcommand{\eindex}[1]{%
                    \StrSubstitute{#1}{!}{“!}[\tempstring]\expandafter\index\expandafter{\tempstring}%
                    }`
                    dovrebbe fare quello che chiedi con [tt]\eindex{\songtitle}[/tt].

                    Ciao
                    Enrico

                  • #89843
                    franen
                    Partecipante
                      Up
                      0
                      Down
                      ::


                      @Caludio
                      Il comando \StrSubstitute è definito nel pacchetto xstring, e la stringa su cui agisce è l’espansione del comando \songtitle. Non posso fare un cerca-sostituisci nel file perché i punti esclamativi devono rimanere tali quando stampo i titoli al di fuori dell’indice (ad esempio nell’intestazione delle canzoni).


                      @Enrico

                      grazie… era molto semplice… rimanendo all’interno della definizione di \makeprelude (il codice che crea l’intestazione delle canzoni) non serve nemmeno un \expandafter:`\documentclass{article}
                      \usepackage{xstring}
                      \usepackage{imakeidx}
                      \makeindex
                      \usepackage[noindexes]{songs}%songs.sourceforge.net
                      \renewcommand{\makeprelude}{%
                      \resettitles\songtitle
                      \StrSubstitute{\songtitle}{!}{“!}[\tempstring]
                      \index{\tempstring}
                      }
                      \begin {document}
                      \begin{songs}{}
                      \beginsong{Prima!}
                      \endsong
                      \beginsong{Seconda}
                      \endsong
                      \end{songs}
                      \printindex
                      \end {document}`

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

                  Go to top