Re: Caso speciale di note a fine libro

#94886
Up
0
Down
::


Grazie mille per il codice, funziona benissimo, ed è commentato benissimo. Ottimo per poter imparare di più!

Riporto il suo codice con i capitoli e le etichette messe come sarebbero. Inoltre ho aggiunto delle parti:

`
\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).
\newcommand{\chapterlabel}[2]{%
\csdef{#1}{#2}}

% 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_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{}

\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{}

\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.

\end{document}
`

Il suo codice fa tutto quello di cui avevo bisogno, ma lo stesso avrei due domande:

1. Un commento dice: “volendo potresti stampare tutti i valori tipo CB 4, 5, 6 e 7” Come potrei fare per aver quella funzione?

2. Dal mio esempio modificato, avrà visto che c’è una sola etichetta per capitolo, e che i capitoli sono raggruppati in parti. Come si potrebbe fare per avere una nota del tipo “CB 1-4”, che includa automaticamente tutti i capitoli di una parte?

Cioè, se avessi:

`
\part{}
\partlabel{interviste}{CB1e}
`

e quella parte contenesse i capitoli con etichette: {tavolarotonda}{CB1}, {reArtu}{CB2}, {remo}{CB3},

un nuovo comando tipo

`
\PrintNotePartLabel{interviste}
`

stamperebbe automaticamente il riferimento a tutti i capitoli contenuti in quella parte:

CB 1-3. [ecc]

(Noti che il codice del curatore per parti ha una e finale, per “aggiunta da ‘e’ditor”)

Grazie di cuore per il suo tempo e l’esempio. Molto più di quello che speravo, e una grande ispirazione ad imparare LaTeX3.

Grazie!

Guido

Go to top