viernes, marzo 24, 2017

Tablas de contenidos por sección en LaTeX

Siguiendo con la elaboración de mi recetario, hace un tiempo se me planteó un problema: Quería generar una tabla de contenidos por cada sección de recetas que tuviese, además de una tabla general con todos los contenidos. Es decir, tener algo similar a lo que se ve en esta captura de pantalla:


Captura del PDF con el índice principal y un subíndice en el primer capítulo

De esta manera, tendría al comienzo de casa sección (platos principales, postres, dulces, pastas, ...) las recetas que contiene.

¿Y de qué manera se puede conseguir este formato en LaTeX? Pues con ayuda de los paquetes de macros titlesec, titletoc e hyperref: Se va a redefinir la macro que inicia las secciones, \chapter para que cuando se inicie una, nos escriba las tablas de contenido de todo lo que hay dentro.

\titleformat{\chapter}[display]
{\bfseries\huge\bfseries\filcenter}{\thechapter}{25pt}{\Large}
 [%
  \startcontents
  \printcontents{}{1}{\setcounter{tocdepth}{3}}%
  \newpage%
  ]

Cuando se use esa nueva definición de la macro \chapter, LaTeX y las utilidades asociadas serán capaces de generar las tablas de contenido de todas las secciones que se usen.

\chapter*{Capítulo 1}
    \addcontentsline{toc}{chapter}{Capítulo 1}
    \section*{Sección 1}
      \addcontentsline{toc}{section}{Sección 1}
      \lipsum[1-2]
    \section*{Section 2}
\addcontentsline{toc}{section}{Sección 2}
\lipsum[1-2]

Sobre las líneas anteriores hay que tener en cuenta lo siguiente:

  • Se está usando la versión de la macro acabada en un asterisco, \chapter*. Esto hace que no se utilice la numeración para las secciones, al menos en el tipo de documento report que es el que estoy usando.
  • Para que cada sección se añada a la tabla de contenidos es necesario usar la macro \addcontentsline.
  • La macro \lipsum no es más que un generador de texto lorem ipsum.

El código completo de un ejemplo que se puede procesar con pdflatex puede encontrarse en este repo de github, junto con el PDF generado. El código fuente del ejemplo completo es:

% Tipo de documento
\documentclass[10pt,a4paper]{report}
% UTF-8 and friends
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{titlesec}
\usepackage{titletoc}
\usepackage{hyperref}
\usepackage{lipsum}
% Para los capitulos
\titleformat{\chapter}[display]
{\bfseries\huge\bfseries\filcenter}{\thechapter}{25pt}{\Large}
 [%
  \startcontents
  \printcontents{}{1}{\setcounter{tocdepth}{3}}%
  \newpage%
  ]
\title{Testing subcapítulos}
\begin{document}
  \maketitle
  \newpage
  \tableofcontents
  \chapter*{Capítulo 1}
    \addcontentsline{toc}{chapter}{Capítulo 1}
    \section*{Sección 1}
      \addcontentsline{toc}{section}{Sección 1}
      \lipsum[1-2]
    \section*{Section 2}
\addcontentsline{toc}{section}{Sección 2}
\lipsum[1-2]
\chapter*{Capítulo 2}
\addcontentsline{toc}{chapter}{Capítulo 2}
\section*{Sección 1}
\addcontentsline{toc}{section}{Sección 1}
\lipsum[1-2]
\section*{Sección 2}
\addcontentsline{toc}{section}{Sección 2}
\lipsum[1-2]
\end{document}

No hay comentarios: