Re: Caso speciale di note a fine libro

#94888
franen
Partecipante
    Up
    0
    Down
    ::


    Dal momento che i numeri delle etichette sono consequenziali ho usato un altro approccio per la stampa delle etichette relative a una Parte: ho usato una \seq al posto di una \clist, in modo da poterne prelevare direttamente il primo e l’ultimo elemento, senza dover cercare il max e il min dei valori della clist (cosa necessaria se le etichette fossero in ordine sparso).
    Ogni volta che si usa un comando [tt]\chapterlabel[/tt] si aggiunge l’etichetta CBnn alla \seq \g_guido_partlist_ETICHETTA-DELLA-PARTE _seq.
    Viene creata una seq per ogni Parte.
    Alla fine si stampano i riferimenti prendendo il primo e l’ultimo elemento di ogni \seq che interessa.

    Francesco

    `\documentclass[12pt]{book}
    \usepackage{etoolbox,xparse,l3sort}
    \title{Test}

    % definisco un comando da usare all'interno del testo, magari appena dopo \chapter. Questo assegna a un'etichetta di facile memorizzazione (reArtu) l'etichetta che si vorrà usare nelle note (CB1, scritto senza spazi).

    % uso il linguaggio di programmazinoe LaTeX3, o almeno ci provo, mi scuso se non hai dimestichezza con questo tipo di codice, ma non saprei fare altrimenti.

    \ExplSyntaxOn

    \tl_new:N \g_guido_current_part_name_tl
    \NewDocumentCommand{\partlabel}{m m}
    {
    \csdef{#1}{#2}
    \tl_set:Nn \g_guido_current_part_name_tl {#1}
    \seq_new:c {g_guido_partlist_\tl_use:N \g_guido_current_part_name_tl _seq}
    }

    \NewDocumentCommand{\chapterlabel}{ m m}{
    \csdef{#1}{#2}
    \seq_gput_right:cn {g_guido_partlist_\tl_use:N \g_guido_current_part_name_tl _seq} {#2}
    }
    \tl_new:N \l_guido_first_part_tl
    \tl_new:N \l_guido_last_part_tl
    \NewDocumentCommand {\PrintNotePartLabel} {m}
    {
    \tl_set:Nn \l_tempa_tl {#1}
    \seq_get_left:cN {g_guido_partlist_\tl_use:N \l_tempa_tl _seq} \l_guido_first_part_tl
    \seq_get_right:cN {g_guido_partlist_\tl_use:N \l_tempa_tl _seq} \l_guido_last_part_tl
    \tl_remove_all:Nn \l_guido_first_part_tl {CB}
    \tl_remove_all:Nn \l_guido_last_part_tl {CB}
    CB~ \tl_use:N \l_guido_first_part_tl — \tl_use:N \l_guido_last_part_tl .
    }

    \tl_new:N \g_guido_numbers_tl %token list per memorizzare la serie di numeri delle etichette
    \fp_new:N \g_guido_numbers_max_value_fp % valore massimo delle etichette
    \fp_new:N \g_guido_numbers_min_value_fp % valore minimo delle etichette
    \clist_gclear_new:N \g_guido_labels_clist %clist in cui immagazzino le etichette compreso il CB
    \clist_gclear_new:N \g_guido_labels_numbers_clist % clist in cui immagazzino solo i numeri delle etichette
    \int_new:N \l_guido_list_population_int % intero che mi dice quanti elementi contiene una lista.

    % Alla fine del documento uso il comando \PrintNoteLabels per stampare la scritta “CB nn'' o “CB xx-yy''. Vule come argomento una lista separata da virgole
    %dei nomi assegnati ai libri (il reArtu di prima).
    \NewDocumentCommand{\PrintNoteLabel}{m}{\guido_print_labels_cs:n {#1}}

    % Il comando di cui sopra richiama un altro comando:
    \cs_new_protected:Npn \guido_print_labels_cs:n #1
    {
    \clist_gclear:N \g_guido_labels_clist % pulisco \g_guido_labels_clist
    \clist_gclear:N \g_guido_labels_numbers_clist %pulisco \g_guido_labels_numbers_clist
    \clist_gset:Nn \g_guido_labels_clist {#1} %assegno a \g_guido_labels_clist l'argomento di \PrintNoteLabel
    \clist_map_inline:Nn \g_guido_labels_clist {\guido_read_labels:n {##1}} % mappo la lista (eseguo un'operazione su ogni elemento della lista) eseguendo il comando
    % \guido_read_labels:n. Questo crea una lista contenente solo numeri, cioè se prima avevo CB1,CB2 ora ho 1,2.
    % Conto poi quanti elementi contiene la lista di soli numeri.
    \int_set:Nn \l_guido_list_population_int {\clist_count:N \g_guido_labels_numbers_clist}
    % se ho un solo elemento le cose sono semplici, e stampo l'etichetta
    \int_compare:nNnTF {\l_guido_list_population_int}={1}
    {CB~ \clist_use:Nnnn \g_guido_labels_numbers_clist {}{}{} . }
    % se ci sono più elementi devo fare un po' di operazioni.
    {
    % valuto il valore massimo e il valore minimo
    \tl_clear:N \g_guido_numbers_tl
    \clist_map_inline:Nn \g_guido_labels_numbers_clist
    { \tl_gput_right:Nn \g_guido_numbers_tl {,##1} }
    \tl_gremove_once:Nn \g_guido_numbers_tl {,}
    \fp_set:Nn \g_guido_numbers_max_value_fp {\fp_eval:n { max(\tl_use:N \g_guido_numbers_tl) }}
    \fp_set:Nn \g_guido_numbers_min_value_fp {\fp_eval:n { min(\tl_use:N \g_guido_numbers_tl) }}
    % e li uso per stampare l'etichetta nel formato CB xx-yy
    CB~ \fp_use:N \g_guido_numbers_min_value_fp — \fp_use:N \g_guido_numbers_max_value_fp .
    % volendo potresti stampare tutti i valori tipo CB 4, 5, 6 e 7
    %\clist_use:Nnnn \g_guido_labels_numbers_clist { ~e~ } { ,~ } { ,~e~ } .
    }
    }
    % NB. Se le note si riferissero a un insieme di libri tipo CB 1-4, 8, 10-13 occorrerebbe modificare il codice! Fammi sapere

    % la funzione richiamata prima, serve per togliere il CB dalle etichette e lasciare solo i numeri.
    \cs_new_protected:Npn \guido_read_labels:n #1
    {
    \tl_set:Nx \l_tempa_tl {\use:c {#1}}
    \tl_remove_once:Nn \l_tempa_tl {CB}

    \clist_gput_right:NV \g_guido_labels_numbers_clist \l_tempa_tl
    }
    \ExplSyntaxOff

    \begin{document}

    \maketitle

    \part{}
    \partlabel{interviste}{CB1e}
    \chapter{}
    \chapterlabel{tavolarotonda}{CB1}

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent
    consectetur nisi sit amet vulputate lacinia. Cras fermentum faucibus
    fermentum. Phasellus vel egestas velit, et sollicitudin leo.

    \chapter{}
    \chapterlabel{reArtu}{CB2}

    Morbi et
    hendrerit velit, sed volutpat purus. Lorem ipsum dolor sit amet,
    consectetur adipiscing elit. Duis at pharetra velit. Sed aliquam
    commodo tristique.

    \chapter {}
    \chapterlabel{remo}{CB3}

    Donec sit amet vulputate justo. Maecenas nulla
    enim, fermentum vitae dapibus at, rutrum vitae libero. Proin faucibus
    nulla eros, ac tincidunt diam rutrum vel.

    \part{}
    \partlabel{altreinterviste}{CB2e}
    \chapter{}
    \chapterlabel{tavolarotonde}{CB4}

    Aenean eu erat at justo malesuada consequat sed vel erat.

    \chapter {}
    \chapterlabel{reArte}{CB5}

    Vivamus gravida est quis sem semper, sed venenatis sem euismod.

    \chapter{}
    \chapterlabel{reme}{CB6}

    Etiam quis orci quam. Ut a massa lacus.

    \newpage

    \PrintNoteLabel{remo,tavolarotonda,reArtu,remo} Layamon – Historia Regum Britanniae […]

    \PrintNoteLabel{reme,reArte} Following is the text of an interview with Mr. Akira Inoue, Co-ordinator of Geoffrey of Monmouth Association.

    \PrintNoteLabel{tavolarotonde} According to the Historia Brittonum, and the writings of Gildas.

    \PrintNotePartLabel{interviste}
    \end{document}`

    Go to top