Re: Sezioni dell’indice analitico nella ToC generale

#80175
franen
Partecipante
    Up
    0
    Down
    ::


    Ho approfittato di questo topic per rispolverare un po’ di LaTeX3. Propongo una soluzione che funziona (per quanto ho potuto sperimentare). Necessita di due compilazioni perché usa hyperref e non il pacchetto bookmark per creare i segnalibri. Spero che le spiegazioni nel codice siano abbastanza chiare.
    Se qualcuno volesse dare consigli sulla struttura del codice, sarei felice.
    Riporto file .te x e .ist.

    Fran

    .tex:`\documentclass{book}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[italian]{babel}
    \usepackage{xparse}
    \usepackage{expl3}

    \ExplSyntaxOn
    % creo una \seq avendo cura di accertarmi che sia vuota.
    %In questa sequenza inserirò tutti i segnalibri
    % man mano che verranno creati
    \NewDocumentCommand{\createlists}{}{
    \seq_clear_new:N \g_indexbkm_seq
    % creo una \tl che conterrà il testo dei segnalibri
    \tl_gclear_new:N \g_bkmtext_tl
    % e una \tl che conterrà il testo dell'ultimo segnalibro creato
    \tl_gclear_new:N \g_lastused_bkm_tl
    }
    % creo la funzione che inserisce i segnalibri nell'indice
    \cs_new:Npn \create_bkm:n #1 { % l'unico argomento è l'argomento di \indexgroup (vedere il file .ist)
    % estraggo da \lista_bkm il testo che il segnalibro deve mostrare,
    % in funzione della lettera (cioè se ho la lettera B il segnalibro deve essere A-C).
    % Inserisco questo testo nella tl \g_bkmtext_tl
    \prop_get:NnN \lista_bkm {#1} \g_bkmtext_tl
    % poi vedo qual è l'ultimo elemento di \g_indexbkm_seq,
    % cioè l'ultimo segnalibro inserito e lo associo a \g_lastused_bkm_tl
    \seq_get_right:NN \g_indexbkm_seq \g_lastused_bkm_tl
    % se \g_lastused_bkm_tl e \g_bkmtext_tl sono uguali vuol dire
    % che ho già inserito il segnalibro, altrimenti inserisco il segnalibro con \pdfbookmark
    \tl_if_eq:NNTF \g_bkmtext_tl \g_lastused_bkm_tl {\scan_stop:} {
    \pdfbookmark[1]{\tl_use:N \g_bkmtext_tl}{name-\g_bkmtext_tl}}
    % inserisco il segnalibro appena creato nella \g_indexbkm_seq
    \seq_put_right:Nx \g_indexbkm_seq { \g_bkmtext_tl }
    }
    % qui sotto la prop list con lettere e segnalibri associati.
    \prop_new:N \lista_bkm
    \prop_put:Nnn \lista_bkm {Numbers}{Numbers}
    \prop_put:Nnn \lista_bkm {Numeri}{Numeri}
    \prop_put:Nnn \lista_bkm {Symbols}{Symbols}
    \prop_put:Nnn \lista_bkm {Simboli}{Simboli}
    %%%%% la gestione di queste prime 4 voci è da ottimizzare%%%%
    \prop_put:Nnn \lista_bkm {A}{A-C}
    \prop_put:Nnn \lista_bkm {B}{A-C}
    \prop_put:Nnn \lista_bkm {C}{A-C}
    \prop_put:Nnn \lista_bkm {D}{D-F}
    \prop_put:Nnn \lista_bkm {E}{D-F}
    \prop_put:Nnn \lista_bkm {F}{D-F}
    \prop_put:Nnn \lista_bkm {G}{G-I}
    \prop_put:Nnn \lista_bkm {H}{G-I}
    \prop_put:Nnn \lista_bkm {I}{G-I}
    \prop_put:Nnn \lista_bkm {J}{J-L}
    \prop_put:Nnn \lista_bkm {K}{J-L}
    \prop_put:Nnn \lista_bkm {L}{J-L}
    \prop_put:Nnn \lista_bkm {M}{M-O}
    \prop_put:Nnn \lista_bkm {N}{M-O}
    \prop_put:Nnn \lista_bkm {O}{M-O}
    \prop_put:Nnn \lista_bkm {P}{P-R}
    \prop_put:Nnn \lista_bkm {Q}{P-R}
    \prop_put:Nnn \lista_bkm {R}{P-R}
    \prop_put:Nnn \lista_bkm {S}{S-U}
    \prop_put:Nnn \lista_bkm {T}{S-U}
    \prop_put:Nnn \lista_bkm {U}{S-U}
    \prop_put:Nnn \lista_bkm {V}{V-X}
    \prop_put:Nnn \lista_bkm {W}{V-X}
    \prop_put:Nnn \lista_bkm {X}{V-X}
    \prop_put:Nnn \lista_bkm {Y}{Y-Z}
    \prop_put:Nnn \lista_bkm {Z}{Y-Z}
    % la funzione richiamata in stile.ist
    \NewDocumentCommand{\insertmybookmark}{m}{%
    \create_bkm:n {#1}
    }
    \ExplSyntaxOff

    \usepackage{imakeidx}
    \makeindex[options= -s stile.ist]
    \usepackage{hyperref}

    \begin{document}
    Ciao
    \index{Albatros}
    \index{Burgundi}
    \index{Èremo}
    \index{Saltimbanco}
    \index{Seppia}
    \index{Toro}
    \printindex
    \end{document}` stile.ist:`% stile.ist
    preamble ”
    \\begin{theindex}
    \\createlists
    \\providecommand*\\indexgroup[1]{\\indexspace
    \\item \\textbf{#1}\\insertmybookmark{#1}\\nopagebreak}

    postamble “\n\n\\end{theindex}\n”

    group_skip ” %\n \\indexspace\n %\n”

    headings_flag 1
    heading_prefix ” %\n \\indexgroup{”
    heading_suffix “}\n %\n”

    numhead_positive “Numbers”;
    numhead_negative “Numbers”;
    symhead_positive “Symbols”;
    symhead_negative “Symbols”;`Edit: tolto dal codice un messaggio di errore che mi serviva per il debug.

    Go to top