evitare che makeidx “condensi” l’indice analitico

  • Creatore
    Topic
  • #6286
    Up
    0
    Down
    ::


    Ciao,

    stò scrivendo un documento in formato book composto da molte sezioni
    corte, e vorrei raggiungere ognuna di queste tramite “parole chiave”
    riunite nell’indice analitico.

    Purtroppo mi sono accorto che se la stessa voce di indice è ripetuta
    su più pagine consecutive il risultato nell’indice è qualcosa del
    genere:

    parola chiave 51-56

    mentre io vorrei ottenere questo:

    parola chiave 51, 52, 52, 53, 54, 55, 56

    In pratica vorrei avere elencato nell’indice ogni singola occorrenza di “parola chiave”; il doppio 52 significa che in quella pagina vi sono 2 sezioni che trattano dell’argomento.
    Esiste un modo per evitare che makeidx mi accorpi la numerazione delle
    pagine, od esiste un’altro pacchetto che mi permetta di ottenere
    questo?

    Grazie in anticipo
    Jimmi

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #6287
      Up
      0
      Down
      ::

      stò scrivendo un documento in formato book composto da molte sezioni
      corte, e vorrei raggiungere ognuna di queste tramite “parole chiave”
      riunite nell’indice analitico.
      Purtroppo mi sono accorto che se la stessa voce di indice è ripetuta
      su più pagine consecutive il risultato nell’indice è qualcosa del
      genere:

      parola chiave 51-56

      mentre io vorrei ottenere questo:

      parola chiave 51, 52, 52, 53, 54, 55, 56

      In pratica vorrei avere elencato nell’indice ogni singola occorrenza di “parola chiave”; il doppio 52 significa che in quella pagina vi sono 2 sezioni che trattano dell’argomento.
      Esiste un modo per evitare che makeidx mi accorpi la numerazione delle
      pagine, od esiste un’altro pacchetto che mi permetta di ottenere
      questo?

      Non mi pare che makeidx accorpi i numeri di pagina da solo; è l’utente che lo fa con`\index{parolachiave|(}
      \index{parolachiave|)}`Sinceramente, il ripetere il numero di pagina per indicare ripetizione dell’occorrenza non mi sembra una buona idea. Non credo che makeindex possa fare quello che chiedi, se non con un bieco trucco, che richiede di usare comandi diversi.`
      \newcommand{\xxa}[1]{#1}
      \newcommand{\xxb}[1]{#1}
      \newcommand{\xxc}[1]{#1}

      \index{parolachiave|xxa}

      \index{parolachiave|xxb}`
      Se i due comandi index cadono nella stessa pagina, saranno indicizzati due volte. Puoi definire quanti comandi del tipo \xx vuoi. Proviamo?`\newcommand{\xxa}[1]{#1}
      \newcommand{\xxb}[1]{#1}
      \newcommand{\xxc}[1]{#1}
      \newcommand{\xxd}[1]{#1}
      \newcommand{\xxe}[1]{#1}
      \newcommand{\xxf}[1]{#1}

      \newcounter{idxcount}

      \newcommand{\idxsuffix}{\ifcase\value{idxcount}%
      a\or b\or c\or d\or e\or f\fi}

      \newcommand{\myindex}[1]{%
      \index{#1|xx\idxsuffix}%
      \stepcounter{idxcount}%
      \ifnum\value{idxcount}=6\relax
      \setcounter{idxcount}{0}\fi}`
      Così usi \myindex per quelle parole chiave che soffrono del tuo problema. Hai un limite di sei occorrenze su una pagina, ma credo siano sufficienti. Se no, dovrebbe essere chiaro come si può aumentarle. Chiedo scusa in anticipo, visto che non ho usato il pacchetto ifthen e ho mostrato alcuni trucchi segreti dei maghi.

      Ciao
      Enrico

      PS: dimenticavo! “Sto” si scrive senza accento.

    • #6288
      Up
      0
      Down
      ::

      Non mi pare che makeidx accorpi i numeri di pagina da solo; è l’utente che lo fa con`\index{parolachiave|(}
      \index{parolachiave|)}`

      Ti devo contraddire, ho costruito un semplice esempio composto da:

      `\section{sezione}\index{uno}\index{due}
      testo testo …

      \section{sezione}\index{uno}\index{due}
      testo testo …`

      ripetuto diverse volte fino a riempire 4 pagine ed il risultato è stato:

      Index
      due, 1–4
      uno, 1–4

      Sinceramente, il ripetere il numero di pagina per indicare ripetizione dell’occorrenza non mi sembra una buona idea.

      Infatti neanche a me ora piace molto usare makeidx per questo scopo, ma è l’unica soluzione che conosco, essendo un pò agli inizi. Sapete suggerirmi qualche altro mezzo più efficace per costruire un “database” di occorrenze ?

      8–
      Proviamo?
      8–

      Urca! 😯 Potente scorre la Forza nei tuoi tasti, o grande maestro.
      Proverò a seguire umilmente la tua ombra studiandomi come usare ifthen. 😉

      PS: dimenticavo! “Sto” si scrive senza accento.

      E ciài raggione… E sono anche figlio di una maestra, se mi vedesse ora. 😥

    • #6289
      Up
      0
      Down
      ::

      Non mi pare che makeidx accorpi i numeri di pagina da solo; è l’utente che lo fa con`\index{parolachiave|(}
      \index{parolachiave|)}`

      Ti devo contraddire, ho costruito un semplice esempio composto da:

      “\section{sezione}\index{uno}\index{due}
      testo testo …

      \section{sezione}\index{uno}\index{due}
      testo testo …”

      ripetuto diverse volte fino a riempire 4 pagine ed il risultato è stato:

      Index
      due, 1–4
      uno, 1–4

      Cito dalla manpage di makeindex:`
      -r Disable implicit page range formation; page ranges must be
      created by using explicit range operators; see SPECIAL
      EFFECTS below. By default, three or more successive pages
      are automatically abbreviated as a range (e.g. 1–5).`
      Devo dire che non ricordavo questa proprietà di makeindex. Dunque, usare makeindex -r, che così non accorpa.

      Quanto alle ripetizioni nell’indice analitico: il numero di pagina da solo dice che il termine compare in quella pagina. Se compare più volte in sezioni diverse, dovrebbe bastare. Altrimenti dovresti arricchire l’indice; per esempio con numero di pagina e numero di sezione, magari fra parentesi. Come si può fare? Mi viene in mente una soluzione.
      `
      \def\sectionlabel#1{\label{#1}%
      \def\currentlabel{#1}%
      \expandafter\edef\csname richindex#1\endcsname##1{##1~(\ref{\currentlabel})}}

      \newcommand{\myindex}[1]{\index{#1|richindex\currentlabel}}
      `
      Poi usi la faccenda così:`
      \section{Prima}\sectionlabel{uno}
      Testo…\myindex{prima}…

      \section{Seconda}\sectionlabel{due}
      Testo…\myindex{seconda}…
      `
      Attento che come argomento di \sectionlabel puoi usare solo lettere, non come in una \label normale; puoi usare \ref al modo usuale, però. Prima di usare makeindex devi assicurarti che i riferimenti incrociati siano risolti (cioè che non ci siano più avvisi del tipo “Label(s) may have changed. Rerun to get cross-references right.”).

      Wow 8) Ho usato: \expandafter, \edef, \csname…\endcsname e anche una definizione con parametro dentro una definizione 😮 Roba da duri 😀

      Ciao
      Enrico

    • #6290
      Up
      0
      Down
      ::

      Cito dalla manpage di makeindex:

      Azz! lo sapevo che prima o poi un bel RTFM me lo beccavo 😳
      Comunque -r funziona egregiamente, per ora un bel miglioramento.

      Quanto alle ripetizioni nell’indice analitico:
      8–

      E con questo ne ho da studiare per un pò 😮

      Ti ringrazio molto per la pazienza, magari quando ho trovato la soluzione ottimale posto il risultato.

      Ciao
      Jimmi

    • #6291
      Up
      0
      Down
      ::

      Quanto alle ripetizioni nell’indice analitico:
      8–

      E con questo ne ho da studiare per un pò 😮

      Ti ringrazio molto per la pazienza, magari quando ho trovato la soluzione ottimale posto il risultato.

      Non c’è molto da studiare. La parte fondamentale è`\def\sectionlabel#1{\label{#1}%
      \def\currentlabel{#1}%
      \expandafter\edef\csname richindex#1\endcsname##1{##1~(\ref{\currentlabel})}}
      `A parte i trucchi magici, guarda dove c’è scritto`{##1~(\ref{\currentlabel})}`Qui ho messo come uscirà l’indice: numero di pagina (##1), uno spazio (senza a capo) e, fra parentesi, il numero di sezione (\ref{\currentlabel}). Nota che \currentlabel non è un comando standard, così come \sectionlabel. Infatti \currentlabel produce l’ultima etichetta introdotta con il comando \sectionlabel. Lì puoi sbizzarrirti e decidere il formato come ti pare. Vuoi le parentesi quadre e il numero in nero? Attento al \noexpand (non è una bestia pericolosa, ma va trattata con cautela :D).
      `{##1~[\noexpand\textbf{\ref{\currentlabel}}]}`
      Con una opportuna ridefinizione di “theindex” puoi anche indicare che formato stai usando
      `\makeatletter
      \renewenvironment{theindex}
      {\if@twocolumn
      \@restonecolfalse
      \else
      \@restonecoltrue
      \fi
      \twocolumn[\section*{\indexname}%
      \myexplanation]%
      \@mkboth{\MakeUppercase\indexname}%
      {\MakeUppercase\indexname}%
      \thispagestyle{plain}\parindent\z@
      \parskip\z@ \@plus .3\p@\relax
      \columnseprule \z@
      \columnsep 35\p@
      \let\item\@idxitem}
      {\if@restonecol\onecolumn\else\clearpage\fi}
      \newcommand{\myexplanation}{{\small Per ogni elemento dell'indice \`e
      indicato il numero di pagina in cui compare e, tra parentesi,
      il numero di sezione\par}\bigskip}
      \makeatother`Ovviamente in \myexplanation puoi mettere quello che ti pare.

      E, suvvia, “pò” è come “stò”: un errore. 😉

      Ciao
      Enrico

    • #6292
      Up
      0
      Down
      ::

      E, suvvia, “pò” è come “stò”: un errore. 😉

      Uff..! 😳

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

Go to top