Imakeidx e riferimenti non alla pagina ma all’ambiente

  • Creatore
    Topic
  • #104571
    Up
    0
    Down
    ::


    Buon giorno e buon anno a tutti.

    Il titolo della discussione non è molto trasparente, ma il caso è facile da spiegare: per una monografia che contiene 350 schede con le descrizioni di antichi libri avrei bisogno che negli indici finali i riferimenti non fossero alla pagine del testo, ma al numero della scheda relativa.

    Ecco un esempio minimo:

    `
    \documentclass[12pt,a4paper]{book}
    \usepackage[T1]{fontenc}
    \usepackage{fontspec,polyglossia}
    \usepackage{lipsum,marginnote,biblatex}
    \usepackage{stabat-libro2}
    \setmainlanguage{italian}
    \usepackage{imakeidx,hyperref}
    \makeindex[title=Indice dei nomi,intoc=true]
    \makeindex[name=titoli,title=Indice dei titoli,intoc=true,columns=1]
    \makeindex[name=stampatori,title=Indice degli stampatori,intoc=true,columns=1]
    \makeindex[name=possessori,title=Indice dei possessori,intoc=true,columns=1]

    \begin{document}

    \begin{descrizione}{63}
    \autore{Boroi}{Lodovico}
    \titolo{Dialogo della santa oratione, ripieno di pie, dotte, bellissime, \& utilissime sentenze. Ove s'insegna sommariamente la differenza,
    ch'è fra l'oratione mentale, \& la vocale, \& che cosa siano ambedue essentialmente. Col vero modo d'orare al Signor Dio, \& invocar per intercessori i santi}
    \luogo{Trento}
    \stampatore{Giovanni Battista e Giacomo}{Gelmini}
    \anno{1590}

    \stampatitolo

    \index{Cognome, Nome}
    \lipsum
    \end{descrizione}

    \printindex[titoli]
    \cleardoublepage

    \printindex
    \cleardoublepage

    \printindex[stampatori]
    \cleardoublepage

    \printindex[possessori]
    \end{document}
    `

    e questo è il codice del pacchetto personale stabat-libro2.sty

    `\ProvidesPackage{stabat-libro2}

    \RequirePackage{etoolbox}

    \newcommand{\autore}[2]{%
    \def\contrib@cognome{#1}
    \def\contrib@nome{#2}}

    \newcommand{\titolo}[1]{\def\contrib@titolo{\textit{#1}}}
    \newcommand{\anno}[1]{\def\contrib@anno{#1}}
    \newcommand{\luogo}[1]{\def\contrib@luogo{#1}}

    \newcommand{\stampatore}[2]{%
    \def\contrib@stampatore{#1 #2}
    \def\contrib@nomestampatore{#1}
    \def\contrib@cognomestampatore{#2}}

    \renewcommand*{\raggedleftmarginnote}{\centering}
    \renewcommand*{\raggedrightmarginnote}{\centering}
    \renewcommand*{\marginfont}{}

    \newenvironment{descrizione}[1]
    {\def\contrib@stabatid{#1}\label{#1}
    \begin{refsection}\def\contrib@label{#1}\label{\contrib@label-start}}
    {\label{\contrib@label-end}\end{refsection}}

    \def\stampatitolo{\vspace{0.8em}\textsc{\contrib@nome\ \marginpar{\centerline{\large\contrib@stabatid}} \contrib@cognome}, \index{\contrib@cognome, \contrib@nome}\textit{\contrib@titolo}\index[titoli]{\contrib@titolo}, \contrib@luogo, \contrib@stampatore,\index[stampatori]{\contrib@cognomestampatore, \contrib@nomestampatore} \contrib@anno.\vspace{0.3em}}

    \endinput
    `

    Come si vede, è direttamente il comando \stampatitolo che genera i label per gli indici finali; in questo caso la scheda è la numero 63 e vorrei, quindi, che i riferimenti negli indici finali riportassero il numero 63, ma puntassero alla pagina dove si trova il comando \stampatitolo (oppure alla pagina dove si trova la nota marginale con il numero 63, che poi è sempre la stessa di \stampatitolo).

    Grazie in anticipo e a presto,

    Matteo

Visualizzazione 1 filone di risposte
  • Autore
    Risposte
    • #104572
      franen
      Partecipante
        Up
        0
        Down
        ::


        Ho fatto una cosa simile nel mio lavoro per i canzonieri, per fare in modo che gli indici vengano generati usando i numeri delle canzoni e non i numeri di pagina. https://github.com/franen/canzoniereonline
        Poniamo che si usi XeLaTeX e Makeindex (mai avuto problemi con le lettere accentate a inizio parola???)
        Ecco un file funzionante, non so quanto stabile però 🙂
        `\documentclass[12pt,a4paper]{book}
        \usepackage[T1]{fontenc}
        \usepackage{fontspec,polyglossia}
        \usepackage{lipsum,marginnote,biblatex}
        \usepackage{stabat-libro2}
        \setmainlanguage{italian}
        \usepackage{imakeidx}
        \usepackage[hyperindex=false]{hyperref}
        \makeindex[title=Indice dei nomi,intoc=true]
        \makeindex[name=titoli,title=Indice dei titoli,intoc=true,columns=1]
        \makeindex[name=stampatori,title=Indice degli stampatori,intoc=true,columns=1]
        \makeindex[name=possessori,title=Indice dei possessori,intoc=true,columns=1]

        \begin{document}

        \begin{descrizione}{63}
        \autore{Boroi}{Lodovico}
        \titolo{Dialogo della santa oratione, ripieno di pie, dotte, bellissime, \& utilissime sentenze. Ove s'insegna sommariamente la differenza,
        ch'è fra l'oratione mentale, \& la vocale, \& che cosa siano ambedue essentialmente. Col vero modo d'orare al Signor Dio, \& invocar per intercessori i santi}
        \luogo{Trento}
        \stampatore{Giovanni Battista e Giacomo}{Gelmini}
        \anno{1590}

        \stampatitolo

        \index{Cognome, Nome}
        \lipsum
        \end{descrizione}

        \printindex[titoli]
        \cleardoublepage

        \printindex
        \cleardoublepage

        \printindex[stampatori]
        \cleardoublepage

        \printindex[possessori]
        \end{document}`

        `\ProvidesPackage{stabat-libro2}

        \RequirePackage{etoolbox}

        \newcommand{\autore}[2]{%
        \def\contrib@cognome{#1}
        \def\contrib@nome{#2}}

        \newcommand{\titolo}[1]{\def\contrib@titolo{\textit{#1}}}
        \newcommand{\anno}[1]{\def\contrib@anno{#1}}
        \newcommand{\luogo}[1]{\def\contrib@luogo{#1}}

        \newcommand{\stampatore}[2]{%
        \def\contrib@stampatore{#1 #2}
        \def\contrib@nomestampatore{#1}
        \def\contrib@cognomestampatore{#2}}

        \renewcommand*{\raggedleftmarginnote}{\centering}
        \renewcommand*{\raggedrightmarginnote}{\centering}
        \renewcommand*{\marginfont}{}

        \newenvironment{descrizione}[1]
        {\def\contrib@stabatid{#1}\label{#1}\hypertarget{#1}{}
        \begin{refsection}\def\contrib@label{#1}\label{\contrib@label-start}}
        {\label{\contrib@label-end}\end{refsection}}

        \def\stampatitolo{%
        \vspace{0.8em}%
        \textsc{\contrib@nome\ \marginpar{\centerline{\large\contrib@stabatid}} \contrib@cognome}, %
        \index{\contrib@cognome, \contrib@nome|descrnumber{\contrib@stabatid}}%
        \textit{\contrib@titolo}%
        \index[titoli]{\contrib@titolo|descrnumber{\contrib@stabatid}}, \contrib@luogo, \contrib@stampatore, %
        \index[stampatori]{\contrib@cognomestampatore, \contrib@nomestampatore|descrnumber{\contrib@stabatid}} \contrib@anno.\vspace{0.3em}}

        \newcommand{\descrnumber}[2]{\hyperlink{#1}{#1}}
        \endinput
        `
        Nel file principale ho solo modificato la chiamata di hyperref, mettendola con hyperindex=false. Così non crea automaticamente i riferimenti incrociati negli indici, perché voglio crearli io a mano.
        Nel file di stile prima aggiungo un target per un hyperlink a inizio ambiente “descrizione” [tt]\hypertarget{#1}{}[/tt]. Questo target si chiama come il numero della scheda.
        Poi in fondo a ogni voce degli indici aggiungo [tt]|descrnumber{\contrib@stabatid}[/tt].
        In questo modo nel file idx ho:
        `\indexentry{Boroi, Lodovico|descrnumber{63}}{1}`
        che nell’ind diventa` \item Boroi, Lodovico, \descrnumber{63}{1}`
        Essendo che [tt]\descrnumber[/tt] è definito come `\newcommand{\descrnumber}[2]{\hyperlink{#1}{#1}}`, non consideriamo il secondo argomento (numero di pagina) e stampiamo solo il numero della scheda e creiamo un hyperlink.
        Se poi vuoi modificare l’aspetto dell’indice…basta scrivere un file di stile.

        Buon lavoro.

      • #104573
        Up
        0
        Down
        ::


        Carissimo, funziona alla meraviglia!

        Ho inserito nel file di stile un nuovo comando per far sì che anche le entry “messe a mano” si comportino nella stessa maniera:

        `\newcommand{\nindex}[1]{\index{#1|descrnumber{\contrib@stabatid}}}`

        e nel file principale inserisco

        `\nindex{Cognome, Nome}`

        Per far sì che il riferimento a Tizio sia alla scheda e non alla pagina, ma con il link che punta alla pagina.
        Ora devo solo modificare il vero file di stile (molto più complesso, anche perché contempla i casi di edizioni con due autori/opere anonime/due editori ecc.) e il gioco è fatto.

        Grazie ancora e a presto,
        Matteo

    Visualizzazione 1 filone di risposte
    • Devi essere connesso per rispondere a questo topic.

    Go to top