Salta al contenuto principale
Working from scratch, following simplicity

Aggiungere un indice cliccabile ad un PDF

Sulla falsariga di quanto esposto per l’aggiunta dei segnalibri in un PDF, mostrerò con un semplice esempio come inserire un indice cliccabile, aggiornare la nuova numerazione di pagina nel documento risultante e allo stesso tempo dotare ogni pagina di un comodo collegamento all’indice. Tutto questo sempre grazie a LaTeX.

I segnalibri sono un valido strumento, ma un indice perfettamente integrato in un PDF, può rivelarsi più utile e versatile, soprattutto quando si legge dal lettore eBook. Con il mio DR-900 per accedere ai segnalibri devo: premere il tasto funzioni (in basso a destra), cliccare sul titolo del libro (lato superiore sinistro dello schermo) ed infine sulla voce Sommario.... Aspettare quindi i tempi di lettura dell’apparecchio e piano piano raggiungere il punto che mi interessa.

Con un indice cliccabile invece posso consultare e scorrere tutte le parti che compongono il documento e cliccare sulla parte di testo che mi interessa. Se poi ancoro tutte le pagine all’indice, mi evito la noia di premere il tasto funzioni, tenere premuto per 3 secondi il numero della pagina visualizzata (in alto a destra dello schermo) e nella nuova finestra che compare ricordarmi per tentativi la pagina dell’indice!

Tutte queste funzioni si possono ottenere usando LaTeX e scrivendo poche righe di codice. Per dimostrarlo userò il PDF oggetto dell'articolo Ritagliare un intero PDF con LaTeX che dopo la sforbiciata ha perso i segnalibri e durante la sua consultazione l'indice a video risulta poco funzionale.

PDF inizialePDF finale
Esempio visivo del PDF senza ipertestoEsempio visivo del PDF con ipertesto
da_two_side.pdf (senza ipertesto)add_toc.pdf (con ipertesto)

Requisiti

Latex con i seguenti pacchetti:

  • geometry, per definire le dimensioni del foglio e impostare la posizione del numero della pagina dal fondo;
  • pdfpages, per includere le pagine dei PDF in un documento LaTeX;
  • hyperref, per rendere il PDF un ipertesto;
  • color, per definire nuovi tipi di colore oltre agli otto standard.

Consiglio di leggere la documentazione allegata ad ogni pacchetto, per conoscerne tutte le proprietà, le caratteristiche e le eventuali incompatibilità. In questo articolo userò meno funzioni possibile in modo da non appesantire troppo la lettura e andare fuori tema.

Segnalibri e indice

Per avere i segnalibri nel PDF finale, il codice LaTeX sarà inserito nel preambolo del file, così:

\usepackage[pagebackref]{hyperref}

Per l'indice invece le righe di codice andranno inserite nel punto esatto del documento dove si vuole farlo comparire:

\tableofcontents
\addcontentsline{toc}{chapter}{Contents}
\label{contents}

Due precisazioni:

  1. L'etichetta “contents” deve essere definita per consentire di trovare l'esatta posizione dell'indice nel documento.
  2. Quando si andranno ad includere le pagine si dovrà evitare di inserire anche quelle che riguardano l'indice originale.

Nuova numerazione delle pagine e ancoraggio all’indice

L’unico modo è definire un nuovo stile di pagina personalizzato, che si occuperà di coprire la numerazione esistente e allo stesso tempo le darà la funzione di ancoraggio all'indice. Nel preambolo del documento si definisce il colore per rimarcare il nuovo numero di pagine e dopo si crea il nuovo stile in questo modo:

\usepackage{color}
\definecolor{Light}{gray}{.80}

\makeatletter
\def\ps@mystyle{%
  \let\@oddhead\@empty% header empty on odd pages
  \let\@evenhead\@empty% header empty on even pages
  \def\@oddfoot{\hfil\Huge{\colorbox{Light}{-\hyperref[contents]{\arabic{page}}-}}\hfil}%
  \def\@evenfoot{\hfil\Huge{\colorbox{Light}{-\hyperref[contents]{\arabic{page}}-}}\hfil}%
}
\makeatother

Il prefisso odd e even serve per definire lo stile di pagina dispari e pari rispettivamente, in questo caso mi interessava andare nel fondo pagina così ho lasciato vuoto il suffisso head e ho modificato solo il foot. Per centrare il numero di pagina infine ho usato due volte il comando \hfil all'inzio e alla fine, se per esempio avessi voluto inserirlo a destra avrei dovuto togliere quello a destra e viceversa a sinistra.

Questo nuovo stile poi dovrà essere richiamato nell'intestazione di includepdf in questo modo:

\includepdf[pages={%intervallo di pagine%},pagecommand=\thispagestyle{mystyle},addtotoc={
%
% tutte le pagine che costituiranno l'indice ed i segnalibri finali
%
}]{file pdf originale}

Risulato finale: add_toc.tex

\documentclass{book}
\usepackage[paperwidth=383pt,paperheight=696pt,includeheadfoot,margin=2.5pt]{geometry}
\usepackage{pdfpages}	
\author{Nicola Rainiero}
\title{Esempio di PDF con indice cliccabile}
\usepackage[pagebackref]{hyperref}

% Load this package and define these two new command to print the TOC into two columns
\usepackage{multicol}
\newcommand{\starttwocolumns}{\setlength{\columnsep}{10mm}\begin{multicols}{2}}
\newcommand{\stoptwocolumns}{\end{multicols}}

\usepackage{color}
\definecolor{Light}{gray}{.80}

\makeatletter
\def\ps@mystyle{%
  \let\@oddhead\@empty% header empty on odd pages
  \let\@evenhead\@empty% header empty on even pages
  \def\@oddfoot{\hfil\Huge{\colorbox{Light}{-\hyperref[contents]{\arabic{page}}-}}\hfil}%
  \def\@evenfoot{\hfil\Huge{\colorbox{Light}{-\hyperref[contents]{\arabic{page}}-}}\hfil}%
}
\makeatother

% If you want to remove the automatic sectioning
%\setcounter{secnumdepth}{-2}

\begin{document}

\includepdf[pages={1-2},addtotoc={
1,chapter,1,{Copertina},a
}]{da_two_side.pdf}

\frontmatter
%\includepdf[pages={3-4},pagecommand=\thispagestyle{mystyle},addtotoc={
%3,chapter,1,{Indice},a
%}]{da_two_side.pdf}

% Classical TOC
\tableofcontents
\addcontentsline{toc}{chapter}{Indice}
\label{contents}

% TOC into two columns (remove the comments)
%\starttwocolumns
%\tableofcontents
%\addcontentsline{toc}{chapter}{Contents}
%\label{Contents}
%\stoptwocolumns

\mainmatter
\includepdf[pages={5-10},pagecommand=\thispagestyle{mystyle},addtotoc={
5,chapter,1,{Primo capitolo},a,
5,section,1,{Introduzione},a,
6,section,1,{II Paragrafo},a,
6,section,1,{III Paragrafo},a,
9,chapter,1,{Secondo capitolo},a,
9,section,1,{I Paragrafo},a,
9,section,1,{II Paragrafo},a
}]{da_two_side.pdf}

\end{document}

N.B. Consiglio di eseguire la compilazione con pdflatex due o tre volte per avere l'indice e le corrispondenze dell'ipertesto corrette.

I PDF di questa guida e il corrispettivo file TEX sono stati compressi qui: Example_add_toc_pdf.zip

Prossimamente pubblicherò uno script bash per convertire in automatico l’output generato da JPDFBookmarks (un comodo editor java di segnalibri per PDF) in un codice digeribile da LaTeX, così la parte più rognosa, ovvero l'individuazione delle pagine che costituiranno l'indice e i segnalibri, diverrà infinitamente più veloce e semplice.

 

 


Sitografia

Magari fosse tutta farina del mio sacco! Per la stesura di questo articolo e l’ottimizzazione di alcune funzioni ho consultato questi siti e forum:

Aggiungi un commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web ed indirizzi e-mail diventano automaticamente dei link.
  • Linee e paragrafi vanno a capo automaticamente.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.

Aggiungi un commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web ed indirizzi e-mail diventano automaticamente dei link.
  • Linee e paragrafi vanno a capo automaticamente.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Sponsored Links
Pubblicità

Nicola Rainiero

Ingegnere civile specializzato in geotecnica con l'ambizione di facilitare la propria attività lavorativa usando e creando software libero per un sapere condiviso e collettivo. Mi occupo anche di energie rinnovabili ed in particolare di geotermia a bassa entalpia. Sono da sempre appassionato di web design e modellazione 3D.