MakeIndex: formattazione lemmi con comando personalizzato

  • Creatore
    Topic
  • #115744
    MatteoF
    Partecipante
      Up
      0
      Down
      ::


      Buongiorno,
      ho la necessità di evidenziare alcuni lemmi nell’indice analitico mediante un asterisco.

      Ho definito la seguente macro
      `\newcommand*\idxstar[1]{\leavevmode\llap{*\,}#1}`

      che utilizzo per la creazione delle voci asteriscate, nella forma σ@τ propria di MakeIndex, ovvero
      `\index{@\idxstar{}}`

      Premetto che ho competenze elementari nella programmazione di TeX/LaTeX e sicuramente il mio comando può essere migliorato in termini di efficienza ed eleganza del codice (ogni suggerimento è ben accetto).

      La mia volontà, comunque, è quella di spingermi oltre e poter utilizzare un comando ([tt]\indexstar[/tt]) che risolva la formattazione del lemma in tutte le possibili configurazioni, da quella più semplice
      `\indexstar{}`
      a quella più complessa
      `\indexstar{!!@|}`

      Immagino che tutto ciò implichi un livello di programmazione molto avanzato.
      Inoltre, si dovrebbe considerare la compatibilità con quei pacchetti e/o classi (es. [tt]imakeidx[/tt] o [tt]memoir[/tt]) che espandono le funzionalità standard di indexing e che ormai sono imprescindibili per la creazione di indici di una certa complessità.

      Qualcuno vuole provare a cimentarsi nell’impresa? 😛

    Visualizzazione 10 filoni di risposte
    • Autore
      Risposte
      • #115745
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Usa il pacchetto xparse, studiantelo bene; i suoi comandi definiscono macro robuste. Il comando principe sarebbe `\NewDocumentCommand{\indexstar{ o o o m o}{}`
          dove i primi tre argomenti opzionali sono vuoti di default se non li specicifchi e ne puoi testare il contenuto con \IfValueTF{}{}{}; ognuno sta per item, sub item, subsubitem. Quello mandatory è ovviamante la voce da indicizzare, e il quarto argomento opzionale contine l’encap. Ovviamente la definzione devi trovarteal da solo a seocnda di quello che vuoi fare con il tuo comando.

        • #115746
          MatteoF
          Partecipante
            Up
            0
            Down
            ::


            Grazie Claudio,
            la mia intenzione era di creare un comando con un unico argomento obbligatorio, al pari del comando originale [tt]\index[/tt].

            In tal senso bisognerebbe riuscire ad analizzare l’argomento ed isolare quei token riconducibili al testo dell’indice oggetto della formattazione, in modo che`\indexstar{!!@|}`corrisponda a`\index{!!@\cmd{}|}`dove `\cmd{}` sia la macro con le istruzioni di formattazione.

            Leggendo la documentazione (abbastanza scarna) di [tt]xparse[/tt] posso intuire che si potrebbe arrivare a qualcosa di buono (sfruttando ovviamente gli argomenti avanzati, tipo: [tt]\SplitArgument[/tt], u-type, e-type, …), ma veramente ho competenze troppo elementari per uscirne da solo 🙁

            Grazie comunque per i suggerimenti.
            Matteo

          • #115747
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              A me non pare difficile; la butto lì senza collaudo, tanto per indicare come fare in generale, senza garantire che funzioni:`\NewDocumentCommand\indexstar{ o o o m o}{%
              \IfValueTF{#1}{%
              #1\IfValueTF{#2}{%
              !#2\IfValueTF{#3}{%
              !#3}{@}%
              }{@}%
              }{\relax@}#4\IfValueTF{#5}{|#5}{\relax}%
              }`Ti ripeto: non l’ho collaudata: forse c’è qualcosa da aggiustare, ma l’idea è quella.

            • #115748
              MatteoF
              Partecipante
                Up
                0
                Down
                ::


                Claudio, il tuo comando prevede di utilizzare argomenti opzionali, ma è ciò che io non voglio fare.

                Come ho scritto nei post precedenti (forse mi sono spiegato male e me ne scuso) vorrei creare un comando con un unico argomento obbligatorio, mantenendo la stessa sintassi di [tt]\index[/tt].

                Perché non ho interesse ad utilizzare un comando nella forma [tt]{ o o o m o }[/tt]?
                Semplicemente perché scrivere`\indexstar[Norvegia][comuni][Osbroon]{Øsbroon}[textbf]` non semplificherebbe nulla rispetto a `\index{Norvegia!comuni!Osbroon@\idxstar{Øsbroon}|textbf}` (in cui [tt]\idxstar[/tt] è la macro di formattazione)

                Il vero automatismo sarebbe creare un comando che mantenga la normale sintassi di MakeIndex, in cui `\indexstar{Norvegia!comuni!Osbroon@Øsbroon|textbf}` corrisponda a `\index{Norvegia!comuni!Osbroon@\idxstar{Øsbroon}|textbf}`

                Matteo

                PS: esiste il pacchetto [tt]\xstring[/tt] per analizzare e manipolare stringhe di testo. Potrebbe essere la soluzione. Vedrò se avrò tempo e modo di proseguire nell’intento.

              • #115749
                OldClaudio
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Mi scuso se ho capito male, ma il tuo problema diventa quello di usare un comando ad argomenti delimitati, una cosa del genere:`\def\indexstar#1@#2{\index#1@\idxstar{#2}|textbf}`che si usa come in questo esempio:`\indexstar Norvegia!comuni!Osbroon@{Øsbroon}`

                • #115750
                  MatteoF
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    Grazie Claudio per la perseveranza.

                    Avevo già provato a ragionare sui delimited parameter di TeX (concetto inesistente in LaTeX).

                    Il problema è che la presenza dei caratteri che fungerebbero da delimitatori (sia [tt]@[/tt] che [tt]|[/tt]) è puramente facoltativa. Pertanto, un banale [tt]\indexstar{pippo}[/tt] andrebbe in errore.
                    Inoltre anche la sintassi del comando (nell’utilizzo delle graffe) cambia.

                    Penso che la soluzione debba rimanere in un contesto LateX, con l’aiuto di un pacchetto che possa analizzare e manipolare l’argomento del comando. [tt]xstring[/tt]? [tt]l3regex[/tt]? Ma come ho già scritto: vedrò se avrò tempo e modo di proseguire nell’intento.

                    Matteo

                  • #115751
                    OldClaudio
                    Partecipante
                      Up
                      0
                      Down
                      ::


                      Ma vedi che ti contraddici? O non ti esprimi in modo chiaro. O io non capisco quello che dici.

                      Non voglio essere perseverante, ma se vuoi usare \indexstar come \indexstar{pippo}, sbagli la sintassi: devi scrivere \indexstar@{pippo}.

                      Invece se l’encap è facoltativo allora le cose cambiano e bisogna ricorrere ai grandi mezzi con un parser della stringa che passi a \indexstar. Posso pensare ad un’altra cosa:`% nel preambolo
                      \usepackage{etoolbox}
                      %
                      \def\indexstar#1@#2|#3?{\bgroup
                      \edef\x{\egroup\noexpand\index{#1@\idxstar{#2}\ifstrempty{#3}{}{|#3}}}\x}`Controlla che ci siano tutte el graffe aperte e chiuse.

                      Il gichetto di definirre una macro \x che espande il suo argomento dentro un gruppo che si chiude da solo quando la macro va in secuzione è un trucco noto che si trova a piene mani nel nucleo di LaTeX; Usare etoolbox per sfruttare il suo comando \ifstrempty permette di avere un test robusto risparmiando alcune definizioni intermedie; la sintassi richede oppligatoriamente la chiocciola anche quando non vuoi usare i livelli di subordinazione’ quindi puoi usare il comando co oa qualunqu delle seguenti sintassi`\indexstar@pippo|?
                      \indexstar primo@pippo|?
                      \indexstar primo!secondo@pippo|?
                      \indexstar primo!secondo!terzo@pippo|?
                      \indexstar@pippo|textbf?
                      \indexstar primo@pippo|textbf?
                      \indexstar primo!secondo@pippo|textbf?
                      \indexstar primo!secondo!terzo@pippo|textbf?`
                      Così non va bene?

                    • #115752
                      MatteoF
                      Partecipante
                        Up
                        0
                        Down
                        ::


                        Forse le incomprensioni sono nate dagli esempi che ho utilizzato nei vari post.

                        Se rileggo la mia richiesta iniziale, avevo scritto:

                        MatteoF” post=116137
                        La mia volontà, comunque, è quella di spingermi oltre e poter utilizzare un comando ([tt]\indexstar[/tt]) che risolva la formattazione del lemma in tutte le possibili configurazioni, da quella più semplice
                        `\indexstar{}`
                        a quella più complessa
                        `\indexstar{!!@|}`

                        Claudio, intanto ti ringrazio della pazienza, ma a me il tuo codice non funziona se abbinato con la mia definizione `\newcommand*\idxstar[1]{\leavevmode\llap{*\,}#1}`
                        In verità, nemmeno con una definizione più semplice, tipo `\newcommand*\idxstar[1]{\emph{#1}}`.

                        Di seguito il emc
                        `
                        % !TEX encoding = UTF-8 Unicode
                        % !TEX TS-program = lualatex

                        \documentclass{book}
                        \usepackage{makeidx}
                        \usepackage{etoolbox}

                        \newcommand*\idxstar[1]{\leavevmode\llap{*\,}#1}

                        \def\indexstar#1@#2|#3?{\bgroup
                        \edef\x{\egroup\noexpand\index{#1@\idxstar{#2}\ifstrempty{#3}{}{|#3}}}\x}

                        \makeindex
                        \begin{document}

                        pippo\indexstar@pippo|?

                        pippo\indexstar primo@pippo|?

                        pippo\indexstar primo!secondo@pippo|?

                        pippo\indexstar primo!secondo!terzo@pippo|?

                        pippo\indexstar@pippo|textbf?

                        pippo\indexstar primo@pippo|textbf?

                        pippo\indexstar primo!secondo@pippo|textbf?

                        pippo\indexstar primo!secondo!terzo@pippo|textbf?

                        \printindex
                        \end{document}
                        `

                        Il documento viene compilato, ma il file .ind rimane vuoto.

                      • #115753
                        OldClaudio
                        Partecipante
                          Up
                          0
                          Down
                          ::


                          Ho visto.
                          ci sono argomenti fragili e macro che non possono essere usate al momento spagliato del loro sviluppo.
                          Ho trovato come fare per eliminare certi esrrori, ma ne appaiono degli altri.
                          Ora è tardi e vado a nanna. ma la strada è quella giusta; ci vuoe un parser un po’ più intelligente che non ciò che si ottiene con gli argomenti delimitati.
                          A domani

                        • #115754
                          OldClaudio
                          Partecipante
                            Up
                            0
                            Down
                            ::


                            A mente fresca, dopo un buon sonno ristoratore, le cose vengono meglio. Questo codice a me funziona:`\documentclass{book}
                            \usepackage{imakeidx}
                            \usepackage{xparse,etoolbox}

                            \NewDocumentCommand\idxstar{ m }{\makebox[0pt][r]{$\star$\kern0.166666em}#1}
                            \NewDocumentCommand\indexstar{ o m o }{%
                            \IfValueTF{#1}{\IfNoValueTF{#3}{\index{#1!#2@\idxstar{#2}}}{\index{#1!#2@\idxstar{#2}|#3}}}%
                            {\IfNoValueTF{#3}{\index{#2@\idxstar{#2}}}{\index{#2@\idxstar{#2}|#3}}}}

                            \makeindex
                            \begin{document}

                            pippo\indexstar{pippo}

                            pippo\indexstar[primo]{pippo}

                            pluto\indexstar[primo]{pluto}

                            pippo\indexstar[primo!secondo]{pippo}

                            pippo\indexstar{pippo}[textbf]

                            pippo\indexstar[primo]{pippo}[textbf]

                            pippo\indexstar[primo!secondo]{pippo}[textbf]

                            paperino\indexstar{paperino}

                            ciccio\indexstar{ciccio}

                            nonna papera\indexstar{nonna papera}

                            \printindex
                            \end{document}`Come vedi ho trovato comodo usare xparse, come era stato nel mio primo messaggio.

                            La sintassi ora è simile a quella che hai segnalato di voler usare, solo che le parti opzionali, i livelli e l’encap sono fra parentesi quadre. Non ci sono da usare nè punti escalmantivi dopo l’ultimo livello, né chiocciole. Ci pensano le macro a mettere quei segni dove ci vogliono. Ho definito anche \idxstar con i comandi di xparse, perché così facendo il comando è robusto; infatti se apri il file .idx vedi che nulla è stato sviluppato. Il file elaborato da makeindex (attraverso gli automatismi di imakeidx) è pulito e contiene solo quello che serve. Nessuna segno particolare che potrebbe confondere makeindex e poi eventualmente anche i programma di composizione.

                            Hai ragione, non è banale scrivere questo codice e forse lo si potrebbe scrivere meglio; ma se te lo studi con la documentazione di xparse sotto gli occhi, ne capisci la logica e vedi che usare xparse e i suoi meravigliosi comandi non è poi così difficile.

                          • #115755
                            MatteoF
                            Partecipante
                              Up
                              0
                              Down
                              ::


                              Ora funziona, grazie per la disponibilità.

                              Matteo

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

                          Go to top