2.3 Tabla de estructuras de contenidos

Una tabla de contenidos (TOC) es una lista especial en la que se enumeran los títulos de las unidades de las secciones, generalmente junto con los números de página que indican el inicio de las secciones. Esta lista puede ser bastante complicada si se incluyen unidades de varios niveles de anidamiento, y debe formatearse con cuidado porque juega un papel importante como ayuda de navegación para el lector.

Existen listas similares que contienen información de referencia sobre los elementos flotantes de un documento, es decir, la lista de tablas y la lista de figuras. La estructura de estas listas suele ser más sencilla, ya que su contenido, los títulos de los elementos flotantes, normalmente están todos en el mismo nivel (pero consulte subflotantes en la Sección 7.5).

Standard \(\LaTeX\) puede crear automáticamente estas tres listas de contenidos. De forma predeterminada, \(\LaTeX\) ingresa texto de uno de los argumentos de cada comando de sección en el archivo .toc. Si bien la información de todos los niveles de sección se agrega al archivo .toc, no todos se utilizan al producir la tabla de contenido. El nivel hasta el cual se muestra la información del rumbo está controlado por el contador “toc Depth”. Se puede cambiar, por ejemplo, con la siguiente declaración:

\setcounter{tocdepth}{1}

En este caso, se mostrará la información del encabezado de la sección hasta el primer nivel (por ejemplo, en la parte, capítulo y sección de la clase “informe”).

Este contador define globalmente qué entradas se escriben en la tabla de contenido. A veces, sin embargo, es necesario un control más granular; por ejemplo, es posible que desee mostrar menos o más niveles de encabezado en un apéndice, etc. Para tales casos de uso, puede probar el paquete tocvsec2 de Peter Wilson. Proporciona comandos para ajustar el nivel dentro del documento.

De manera similar, \(\LaTeX\) mantiene dos archivos más, uno para la lista de figuras (.lof) y otro para la lista de tablas (.lot), que contienen el texto especificado como argumento del \captioncomando para figuras y tablas.

Cuando se utiliza \tableofcontents, \listoffigures o \listoftables, la información escrita en estos archivos durante una ejecución anterior de \(\LaTeX\) se lee y se compone (normalmente al principio de un documento), y al final Al final de la ejecución, la información recién recopilada se vuelve a escribir en los archivos.

Por lo tanto, para generar estas tablas de referencias cruzadas, siempre es necesario ejecutar \(\LaTeX\) al menos dos veces: una para recopilar la información relevante y una segunda para volver a leer la información y escribirla en el lugar correcto del documento. Debido al material adicional que se va a componer en la segunda ejecución, la información de referencias cruzadas puede cambiar, lo que hace necesaria una tercera ejecución de \(\LaTeX\). Esta es una de las razones de la tradición de utilizar diferentes sistemas de numeración de páginas para la portada y el texto principal: en la época de la composición tipográfica manual, cualquier iteración adicional encarecía mucho el producto final.

Normalmente los archivos de contenido son generados automáticamente por \(\LaTeX\) usando internamente los comandos \addcontentsline, \addtocontents y \numberline; consulte la Sección 2.3.4 en la página 70. Con cierto cuidado, esta interfaz también se puede utilizar para ingresar información directamente en estos archivos para complementar las acciones del estándar \(\LaTeX\).

Por ejemplo, en el caso de la forma destacada de los comandos de sección, no se escribe ninguna información en el archivo .toc. Si no desea un número de encabezado (formato con estrella) pero sí desea una entrada en el archivo .toc, puede usar \addcontentsline con o sin \numberline como se muestra en el siguiente ejemplo.

\tableofcontents \section*{Foreword} \addcontentsline{toc}{section} {\protect\numberline{}Foreword} A starred heading with the TOC entry manually added. Compare this to the form used for the bibliography.  \section{Thoughts} We find all in \cite{k1}. \subsection{Contact info} E-mail Ben at \cite{k2}. \begin{thebibliography}{9} \addcontentsline{toc}{section} {\refname} \bibitem{k1} Ben User, Some day will never come, 2010 \bibitem{k2} BUser@earth.info \end{thebibliography}

El uso de \numberline como en el “Prólogo” produce una entrada de “sección” con sangría en la tabla de contenido, dejando libre el espacio donde quedaría libre el número de sección. En este caso se requiere el \protect delante; consulte la página 70 para obtener más detalles. Omitir el comando \numberline (como se hizo para la entrada de bibliografía) escribiría el encabezado a la izquierda. Agregar una línea similar después del inicio de “theindex” significa que el “Índice” aparecerá en la tabla de contenido. Desafortunadamente, este enfoque no se puede utilizar para incluir la lista de figuras o tablas en la tabla de contenido porque \listoffigures o \listoftables podrían generar una lista de varias páginas y, en consecuencia, el número de página seleccionado por \addcontentsline. podría estar equivocado. Y ponerlo antes del comando tampoco ayuda, porque a menudo estos comandos de lista inician una nueva página. Una posible solución es copiar la definición del comando del archivo de clase y poner \addcontentsline directamente en él.

En el caso de clases estándar o derivadas cercanas, puede utilizar el paquete tocbibind creado por Peter Wilson para obtener la “Lista de. . .”, “Índice” o “Bibliografía” enumeradas en la tabla de contenido sin más adiciones a la fuente. El paquete ofrece una serie de opciones como notbib, notindex, nottoc, notlof y notlot (no agregue la entrada correspondiente a la tabla de contenido).

También existen las opciones numbib y numindex (numerar el título correspondiente), y con la sección puedes solicitar sección en lugar de títulos de capítulo en clases de documentos como informe o libro.

De forma predeterminada, la sección “Contenido” aparece dentro de la tabla de contenido, lo cual rara vez es deseable: nottoc para deshabilitar este comportamiento.|


Hay una serie de paquetes que amplían o alteran el mecanismo de tabla de contenidos estándar de \(\LaTeX\). El paquete hyperref cambia las partes internas para admitir anclajes de hipervínculos; en particular, esto cambia las estructuras de archivos de contenidos internos. Se aborda brevemente en la página 72; una cobertura extensa de ese paquete se encuentra en la Sección 2.4.6 en la página 96.

El paquete tocdata proporciona una interfaz para agregar datos especiales, como nombres de autores, a los archivos de contenido. Se analiza en la siguiente sección. Luego pasaremos a personalizar el diseño de dichas listas con la ayuda del paquete titletoc. Hay paquetes alternativos disponibles para esto, por ejemplo, tocloft de Peter Wilson o tocstyle de Markus Kohm, pero titletoc proporciona una buena interfaz de propósito general adecuada para la mayoría de las necesidades, así que nos concentramos en eso.

La sección final relacionada con los datos del archivo de contenido analiza la interfaz de bajo nivel que ya proporciona \(\LaTeX\) y se incluye principalmente como referencia (en una fuente más pequeña) porque a menudo se encuentran sus comandos en archivos de clases más antiguos.

2.3.1 tocdata - Proporcionar datos adicionales para el TOC

En antologías u otras obras de varios autores, es bastante común enumerar los diferentes autores en el índice junto a sus entradas. El paquete tocdata de Brian Dunn proporciona un marco para esto que le permite colocar dichos datos en la entrada TOC tipográfica justo antes del número de página. El paquete funciona bien con la mayoría de las clases de documentos y admite paquetes TOC como titletoc o tocloft.

En el siguiente ejemplo hemos agregado nombres de autores a las dos subsecciones; la sección en sí no muestra datos adicionales. Los datos adicionales se formatean con la ayuda del comando \tocdataformat, que de forma predeterminada establece el material en una pequeña fuente en cursiva. Aquí agregamos color y un tablero.

\usepackage{color,tocdata} \renewcommand\tocdataformat[1]{\textnormal{% \textcolor{blue}{--- \small\itshape#1}}} \tableofcontents  \section{On Cookies} \tocdata{toc}{Ben User} \subsection{Preparing cookies} Text of his recipes \ldots  \tocdata{toc}{Cookie Monster} \subsection{Eating cookies} How to do it \ldots

De manera similar, puede agregar a la lista figuras o tablas para indicar el artista que hizo una determinada imagen o la fuente de los datos de la tabla, etc. Todo lo que necesita hacer es especificar en el primer argumento \tocdata la extensión de archivo de destino de destino correcta, por ejemplo, lof para la lista de figuras o lot para la lista de tablas.

El comando \tocdata utilizado en el ejemplo anterior le permite agregar datos a cualquier archivo “tipo TOC”, pero a menudo también desea proporcionar esta información dentro de su documento.

Para tales casos de uso, el paquete ofrece un conjunto de comandos especiales que combinan \tocdata con un encabezado o un comando de título. Mostramos la sintaxis para el encabezado \part, pero existen comandos correspondientes para los encabezados \chapter (si lo admite la clase de documento), \section y \subsection.

\partauthor[list-entry]{title}[prefix]{first}{last}[suffix] \partauthor*    {title}[prefix]{first}{last}[suffix]

El primer formulario ejecuta el siguiente conjunto de comandos por usted

\todata{toc}{first last} \part[list-entry]{title\nopagebreak \tocdatapartprint{prefix}{first}{last}{suffix}} \index{last, first}

mientras que la forma de estrella en la segunda línea omite \tocdata, ya que el encabezado no está escrito en la tabla de contenido. El comando \tocdatapartprint formatea el nombre y lo agrega como parte del título del encabezado. Al redefinir este comando, se pueden realizar varios diseños. Tenga en cuenta que prefijo y sufijo se usan solo allí: los comandos \tocdata e \index reciben solo primero y último.

Si bien primero es un argumento obligatorio, se puede dejar vacío si el autor no tiene nombre. En este caso, la coma en \index también se elimina automáticamente como se muestra en el ejemplo.

\usepackage{makeidx} \makeindex % enable indexing % save some space in the index: \renewcommand\indexspace{\par\vspace{2pt}}  \usepackage{tocdata}  \tableofcontents \smallskip  \section{On Cookies} \subsectionauthor{Preparing cookies} [Sir]{Ben}{User} Text of his recipes \ldots  \subsectionauthor{Eating cookies} {}{Cookie Monster}[!!] How to do it \ldots  \printindex

Para los títulos de figuras (o tablas) existen dos comandos con una sintaxis similar a \partauthor, pero con un argumento adicional opcional texto extra. Están pensados para usarse en lugar del comando normal \caption:

\captionartist[list-entry]{title}[extra-text][prefix]{first}{last}[suffix]

Los argumentos lista-entrada y título corresponden a los argumentos habituales \caption, y primero y último se utilizan para agregar el nombre del artista a la lista de figuras y producir una entrada de índice (si se crea un índice). ). Nuevamente, prefijo y sufijo se usan solo cuando se muestra el nombre del artista como parte del flotador. Finalmente, el texto extra le permite colocar información adicional junto al título del título que no aparece en la lista de figuras.

Tenga en cuenta que si desea utilizar el prefijo opcional pero no el texto adicional, debe proporcionar un argumento opcional vacío para que este último identifique para \(\LaTeX\) cuál es cuál.

Para influir en la justificación del nombre, hay varias declaraciones disponibles de la forma \tdartist donde… es justify, left, center o right, y para el texto adicional tiene \tdartisttext… con las mismas posibilidades.

Para cambiar el formato de manera más drástica, también puede redefinir los comandos \tocdataartistprint (recibiendo prefijo, primero, último y sufijo como argumentos para formatear el nombre) y \tocdataartisttextprint ( responsable del formato texto extra). Consulte la documentación del paquete para obtener más detalles.

\usepackage{graphicx,tocdata} \tdartistright \begin{figure} \centering \includegraphics{cat} \captionartist{A cat}[This has been already used\\ in the first edition of TLC] {Sebastian}{Rahtz}[ (1955--2016)] \end{figure}

En lugar del comando \captionartist puedes usar \captionauthor con exactamente la misma sintaxis (y los comandos de configuración correspondientes). La diferencia entre los dos es el formato predeterminado: \captionartist escribe el nombre centrado, mientras que \captionauthor lo coloca al ras a la derecha. Este último puede verse mejor en fotografías amplias.

Si usa el paquete caption, que admite el comando \caption*, entonces \captionartist y \captionauthor también aceptarán una estrella.

2.3.2 titletoc - Enfoque de alto nivel para el diseño de listas de contenidos

El paquete titletoc escrito por Javier Bezos se desarrolló originalmente como paquete complementario de titlesec, pero se puede utilizar por sí solo. Implementa su propia interfaz para diseñar estructuras de contenidos, evitando así algunas de las limitaciones del código \(\LaTeX\) original para esta tarea. Esto lo convierte en un buen candidato cuando son necesarios ajustes en dichas listas cuando se está desarrollando una nueva clase.

La generación real de archivos de contenidos externos y su sintaxis no se modifica para que funcione bien con otros paquetes que generan dichos archivos. Sin embargo, hay una excepción: los archivos de contenido deben terminar con el comando \contentsfinish. Para las extensiones de archivo estándar .toc, .lof y .lot, esto se maneja automáticamente. Pero si proporciona su propio tipo de listas de contenidos (consulte la Sección 2.3.4), debe anunciarlo en titletoc, como en el siguiente ejemplo:

\contentsuse{example}{xmp}

Diseñar el diseño de una única entrada de la lista de contenidos

Una sola entrada de la lista de contenidos normalmente consta de una o más líneas de texto, que normalmente comienzan con una etiqueta (por ejemplo, el número del encabezado) seguida del título del encabezado y terminan con un número de página. Normalmente, el número de página se empuja hacia el borde derecho para que los números de página de diferentes entradas se alineen. Por lo tanto, normalmente hay un espacio entre el título y el número de página, que se llena con espacios en blanco o con algunos encabezados, por ejemplo, algunos puntos o una línea.

El estándar \(\LaTeX\) ya admite ese tipo de diseño con cierta flexibilidad al permitir sangría a la izquierda y a la derecha de todas las líneas. Además, se puede mover el inicio de la primera línea y el punto final de la última línea (normalmente para colocar tanto la etiqueta como el número de página fuera del bloque de texto del título).

Una entrada multilínea típica podría verse así:

3.11 This is a sample section entry which has been deliberately made very long so that it spans three lines to exhibit the handling of the first and the last line in the entry . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Como puede ver, la entrada tiene sangría en ambos lados con la etiqueta de entrada colocada en el espacio en blanco disponible. El título del encabezado se establece irregularmente en sans serif, y el número de página se separa del bloque de texto mediante una fila de puntos guía y se coloca nuevamente fuera del bloque.

Diseños estándar (dotted)

El paquete titletoc admite este tipo de diseño estándar, pero en comparación con el estándar \(\LaTeX\) ofrece formas más convenientes de personalizarlo. Además, admite otros diseños, como ejecutar entradas de encabezado de nivel inferior juntas en un solo párrafo y, como complemento interesante, admite listas de índices parciales para que pueda proporcionar tablas de capítulos, etc. Para el caso más común , es decir, el diseño que se muestra arriba, ofrece la declaración \dottedcontents.

\dottedcontents{type}[left-indent]{before-code}{label-width}{leader-width}

El primer argumento de \dottedcontents contiene el tipo de entrada de contenido para el cual configuramos el diseño; normalmente el nombre del comando de encabezado sin barra invertida o el nombre del entorno flotante, por ejemplo, figure. En otras palabras, para cada tipo de comando de sección que puede aparecer en el documento, necesitamos una declaración \dottedcontents (o alternativamente \titlecontents que se analiza a continuación). Los argumentos restantes tienen el siguiente significado:

left-indent La sangría desde el margen izquierdo para todas las líneas de la entrada. Normalmente debería ser más ancho que el argumento ancho de etiqueta porque la etiqueta se coloca en ese espacio. Aunque este argumento debe figurar entre corchetes, no es opcional en la versión actual del paquete (¡y probablemente nunca lo será)!

before-code Código que se ejecutará antes de escribir la entrada. Se puede utilizar para proporcionar espacio vertical, como mediante \addvspace, y para configurar directivas de formato, como cambios de fuente, para toda la entrada. También puedes usar \filleft, \filright, \filcenter o \fillast, ya conocidos del paquete titlesec, en este punto.

label-width Ancho nominal de la etiqueta, es decir, la etiqueta comienza a la izquierda de la primera línea desplazada en esta cantidad. Por lo tanto, el valor debe ser lo suficientemente ancho como para sujetar cómodamente el material de etiqueta de este tipo. Los casos problemáticos con diferentes anchos de etiquetas y sus posibles soluciones se analizan en las páginas 63 (\contentspush) y 73.

leaders-width Distancia entre dos puntos en los líderes en la última línea de la entrada.

Por ejemplo, la entrada anterior se compuso utilizando la siguiente declaración:

\dottedcontents{section}[40pt]{\normalfont\sffamily\filright}{24pt}{6pt}

es decir, tenemos una sangría de “40 puntos” desde el margen izquierdo con la etiqueta comenzando “16 puntos” desde el margen y ocupando “24 puntos”. Toda la entrada está escrita en sans serif y irregular a la derecha (a través de \filright), y cada punto líder ocupa 6pt de espacio.

Quizás se pregunte de dónde viene la sangría de la derecha (para todas las líneas menos la última) y por qué no está disponible como argumento para \dottedcontents. La razón principal es que en casi todos los diseños su valor es el mismo para todos los tipos de entrada y, por lo tanto, proporcionarlo como argumento en el nivel de entrada sería engorroso y propenso a errores. En la mayoría de las clases de documentos, el valor predeterminado es lo suficientemente amplio como para contener hasta tres dígitos en la fuente del cuerpo del documento. Si eso no es suficiente (o demasiado), se puede cambiar global (o localmente) con una declaración \contentsmargin.

\contentsmargin[correction]{right-sep}

Esta declaración acorta todas las líneas de entrada en “right-sep”. En la última línea, el número de página se escribe en ese espacio, por lo que si es demasiado pequeño, la entrada y el número de página pueden superponerse. Además, el argumento opcional corrección se agrega a todas las líneas de una entrada excepto a la última. Este argumento se puede utilizar, por ejemplo, para ajustar el diseño del contenido de modo que los puntos de una fila de líneas guía se alineen con el texto de las líneas anteriores en una entrada de varias líneas si la entrada está justificada.

En el improbable caso de que sea necesario tener diferentes valores right-sep para diferentes tipos de entrada, entonces la solución es colocar este comando dentro del before-code de \dottedcontents o \titlecontents. Entonces es local para ese tipo de entrada.

Diseños más complicados

Si bien \dottedcontents funciona bien en muchos casos, claramente tiene sus limitaciones y no se puede utilizar si no se desean líneas guía u otros ajustes tipográficos que vayan más allá de establecer la fuente o la sangría. Para tales casos, titletoc ofrece la declaración \titlecontents y algunos comandos auxiliares para usar dentro de sus argumentos.

\titlecontents{type}[left-indent]{before-code}{numbered-entry-format} {numberless-entry-format}{page-format}[below-code]

Los primeros tres argumentos tipo, sangría izquierda y antes del código son los mismos que los correspondientes a \dottedcontents y se describen allí. Sin embargo, los restantes difieren. En lugar de simplemente especificar el ancho de la etiqueta, ahora tenemos dos argumentos que nos permiten definir explícitamente cómo se debe formatear la etiqueta y el texto del título y qué debería suceder si la etiqueta está vacía. Esto significa que tiene muchas más posibilidades de diseño a costa de especificar más código.

formato-entrada-numerada Código para formatear la entrada incluyendo su número. Se ejecuta en modo horizontal (después de configurar la sangría). El último token puede ser un comando con un argumento, en cuyo caso recibe la entrada texto como argumento. El número de encabezado sin formato está disponible en el comando \thecontentslabel, pero consulte a continuación otras posibilidades para acceder a él y colocarlo.

formato-entrada-sin-número Código para formatear la entrada si la entrada actual no contiene un número. Nuevamente, el último token puede ser un comando con un argumento.

En lugar de especificar el ancho del título, ahora tenemos un argumento en el que tenemos que definir exactamente qué debe suceder después del texto del título y cómo se debe formatear el número de página. Finalmente, hay otro argumento opcional que se ejecutará después de escribir la entrada.

page-format Código que se ejecuta después de formatear la entrada pero aún estando en modo horizontal. Normalmente se utiliza para agregar algún material de relleno, como una línea de puntos, y para adjuntar el número de página almacenado en \thecontentspage. Puede utilizar el comando \titlerule, que se analiza en la página 47, para producir líderes.

abajo-código Código opcional que se ejecutará en modo vertical después de componer la entrada, por ejemplo, para agregar algo de espacio vertical adicional después de la entrada.

Para ayudar a colocar y formatear el encabezado y los números de página, el paquete titletoc ofrece dos herramientas útiles: \contentslabel y \contentspage.

\contentslabel[text]{size}    \contentspage[text]

El propósito del comando \contentslabel es componer el texto (que por defecto contiene \thecontentslabel) alineado a la izquierda en un cuadro de ancho tamaño y colocar ese cuadro a la izquierda de la posición actual. Por lo tanto, si usa este comando en el argumento numbered-entry-format de \titlecontents, entonces el número se coloca delante del texto de entrada en el margen o sangría configurado por left-indent. Para un diseño más refinado, puede utilizar el argumento opcional para especificar su propio formato, que normalmente implica \thecontentslabel.

De manera similar, \contentspage escribe text (que por defecto contiene \thecontentspage) alineado a la derecha en un cuadro y organiza el cuadro para que se coloque a la derecha de la posición actual pero sin ocupar espacio. Por lo tanto, si se coloca en el extremo derecho de una línea, el cuadro se extiende hasta el margen. En este caso, sin embargo, ningún argumento obligatorio especifica el tamaño del cuadro: es el mismo para todas las entradas. Su valor es el mismo que el espacio que se encuentra a la derecha de todas las entradas y se puede configurar con el comando \contentsmargin que se describe a continuación.

El paquete ofrece tres opciones para influir en el resultado predeterminado del comando \contentslabel cuando se usa sin el argumento text. Con la opción rightlabels, el número del encabezado se alinea a la derecha en el espacio, mientras que leftlabels (el valor predeterminado) lo alinea a la izquierda. También puede especificar dotinlabels para agregar siempre un punto después del número.

En lugar de sangrar toda la entrada y luego mover algo de material al margen izquierdo usando \contentslabel, puedes usar \contentspush para lograr un efecto similar.

\contentspush{text}

Este comando escribe texto y luego aumenta la sangría izquierda por el ancho de texto para todas las líneas adicionales de la entrada (si corresponde). Como consecuencia, la sangría variará si cambia el ancho del texto. En muchos casos, esta variación no es deseable, pero en otros casos otras soluciones dan resultados aún peores. Consideremos el caso de un documento con muchos capítulos, cada uno de los cuales contiene docenas de secciones. Una sangría izquierda rígida debe poder contener el número más amplio, que puede tener cinco o seis dígitos. En ese caso una etiqueta como “1.1” sale indebidamente separada de su texto de entrada. A continuación se muestra una solución que crece con el tamaño del número de entrada:

\usepackage{titletoc} \titlecontents{section}[0pt]{\addvspace{2pt}\filright} {\contentspush{\thecontentslabel\enspace }} {}{~\hrulefill\contentspage} \contentsline{section}{\numberline{12.8}Some section that is wrapped in the TOC}{87}{}% \contentsline{section}{\numberline{12.9}Another section}{88}{}% \contentsline{section}{\numberline{12.10}And yet another wrapping section}{90}{}% \contentsline{section}{\numberline{12.11}Final section}{92}{}% \contentsfinish

Algunos ejemplos de diseño

Para los ejemplos de esta sección, copiamos algunas partes del archivo .toc original generado por \(\LaTeX\) para este libro (Capítulo 2 y partes del Capítulo 3) en un archivo que llamamos partial.toc y agregamos manualmente un Comando \contentsfinish al final. Dentro de los ejemplos podemos cargar este archivo con \input. Por supuesto, en un documento real usarías el comando \tableofcontents para que el archivo .toc de tu documento se cargue y procese.

En nuestro primer ejemplo proporcionamos un nuevo formato para las entradas de los capítulos, mientras mantenemos el formato para las entradas de las secciones tal como lo define la clase de documento estándar \(\LaTeX\). Las entradas de los capítulos ahora están configuradas irregularmente a la derecha (\filright) en negrita, con un espacio de pica arriba, seguido de una regla gruesa. La entrada real tiene una sangría de seis picas. En ese espacio escribimos la palabra “Capítulo” en versales seguida de un espacio y el número del capítulo (\thecontentslabel) usando la directiva \contentslabel con su argumento opcional. No existe un manejo especial para las entradas sin números, por lo que se formatearían con una sangría de seis picas. Rellenamos el espacio restante usando \hfill y escribimos el número de página en el margen mediante \contentspage.

Finalmente, después de la entrada añadimos otros dos puntos de espacio para que la entrada quede ligeramente separada de cualquier entrada de sección siguiente.

\usepackage[dotinlabels]{titletoc} \titlecontents{chapter} [5pc] {\addvspace{1pc}\bfseries \titlerule[2pt]\filright} {\contentslabel [\textsc{\chaptername}\ \thecontentslabel]{5pc}} {}{\hfill\contentspage} [\addvspace{2pt}] % Show only chapter/section entries: \setcounter{tocdepth}{1} \input{partial.toc}

En nuestro segundo ejemplo, escribimos el título del capítulo en sans serif con los números de capítulo y página a la izquierda y a la derecha. Cualquier espacio libre se llena con una regla en la línea base y proporcionamos un poco de espacio adicional encima y debajo de la línea del capítulo. Los títulos de las secciones se muestran ligeramente sangrados; para ellos se suprimen los números de página. Todos los números tienen el formato de números antiguos.

\usepackage{titletoc} \titlecontents{chapter}[0pc] {\addvspace{6pt}} {\large\sffamily \oldstylenums{\thecontentslabel} \ \hrulefill\ }{} {\large\sffamily\ \hrulefill\ \oldstylenums{\thecontentspage}} [\addvspace{2pt}] \titlecontents{section} [1pc]{} {\oldstylenums{\thecontentslabel} -- }{}{} \setcounter{tocdepth}{1} \input{partial.toc}

El tercer ejemplo y último ejemplo por ahora pone de relieve los números de página; están impresos a la izquierda, mientras que los números de encabezado normales se suprimen. El título del capítulo se coloca a la derecha llenando el espacio disponible con \dotfill. Los títulos de las secciones están alineados a la izquierda y separados con un guión del número de página. Tenga en cuenta que usamos \enspace en lugar de un espacio normal alrededor para que este espacio no se estire ni se reduzca si el título de la sección tiene más de una sola línea.

\usepackage{titletoc} \titlecontents{chapter}[2pc] {\addvspace{5pt}} {\large\bfseries \contentslabel[\hfill \thecontentspage]{2pc}\dotfill }{}{} [\addvspace{2pt}] \titlecontents{section}[2pc]{} {\contentslabel[\hfill \thecontentspage]{2pc}% \enspace --\enspace }{}{} \setcounter{tocdepth}{1} \input{partial.toc}

Tenga en cuenta que ninguno de los ejemplos anteriores tiene disposiciones para dar formato a los títulos que no están numerados; es decir, el tercer argumento obligatorio del comando \titlecontents siempre se dejaba vacío. Esto se hizo porque los datos de muestra contienen solo encabezados numerados y ahorró espacio al no proporcionar instrucciones de formato para encabezados no numerados que nunca se usan. Sin embargo, en la vida real será mejor que pienses también en cómo se deben mostrar dichas entradas.

Entradas de contenido combinadas en un párrafo

El estándar \(\LaTeX\) solo admite entradas de contenido formateadas en líneas individuales. En algunos casos, sin embargo, resulta más económico formatear las entradas de nivel inferior juntas en un solo párrafo. Con el paquete titletoc esto es posible.

\titlecontents*{type}[left-indent]{before-code}{numbered-entry-format} {numberless-entry-format}{page-format}[mid-code] \titlecontents*{type}. . . {page-format}[mid-code][final-code] \titlecontents*{type}. . . {page-format}[start-code][mid-code][final-code]

La declaración \titlecontents* se utiliza para entradas que deben formatearse junto con otras entradas del mismo nivel o inferior en un solo párrafo. Los primeros seis argumentos son idénticos a los de \titlecontents descrito en la página 61.

En lugar de un argumento debajo del código orientado verticalmente, \titlecontents* proporciona de uno a tres argumentos opcionales que manejan diferentes situaciones que pueden suceder cuando las entradas están a punto de unirse horizontalmente. Los tres argumentos opcionales están vacíos por defecto. La unión funciona de forma recursiva de la siguiente manera:

  • Si la entrada actual es la primera entrada que participa en la unión, entonces su código de inicio se ejecuta antes de componer la entrada.
    • En caso contrario, ha habido una entrada anterior ya participando.
    • Si ambas entradas están en el mismo nivel, entonces se inserta el mid-code.
    • De lo contrario, si la entrada actual es de un nivel inferior, entonces se inserta el código de inicio correspondiente y volvemos a procesar el nuevo nivel.
    • En caso contrario, la entrada actual es de un nivel superior. Primero, ejecutamos para cada nivel que haya finalizado el código-final (en orden inverso). Luego, si la entrada actual no participa en la unión, hemos terminado. De lo contrario, se ejecuta el código medio de la entrada, ya que ya debería estar presente una entrada anterior del mismo nivel (asumiendo un documento estructurado jerárquicamente).

Si se van a unir varios niveles, entonces debe especificar cualquier información de diseño de párrafo en el código anterior del nivel más alto que participa. De lo contrario, el alcance de su configuración no incluye el final del párrafo y, por lo tanto, no se aplica. En el siguiente ejemplo, \footnotesize se aplica solo a las entradas de la sección; el \baselineskip para todo el párrafo todavía está configurado en \normalsize. Este ejemplo artificial muestra cómo se pueden unir dos niveles diferentes utilizando los tres argumentos opcionales. Tenga en cuenta en particular los espacios añadidos al principio de algunos argumentos para obtener el resultado correcto al unirse.

\usepackage{titletoc,xcolor} \contentsmargin{0pt} \titlecontents*{chapter}[0pt] {\sffamily}{}{}{, \thecontentspage} [\ \textbullet \ ] [~\P]    % mid, finish \titlecontents*{section}[0pt] {\color{blue}\footnotesize\slshape}{}{}{} [ \{] [; ] [\}]    % start, mid, finish \setcounter{tocdepth}{1} \sloppy \input{partial.toc}

Veamos ahora cómo funciona esto en la práctica. En el siguiente ejemplo unimos el nivel de sección, separando las entradas con una viñeta rodeada por un espacio extensible (\xquad) y terminando la lista con un punto. Las entradas de los capítulos también son interesantes porque movemos el número de página hacia la izquierda. Ambos tipos omiten completamente los números de encabezado en este diseño. Como no hay números de página a la derecha, también establecemos el margen derecho en cero.

\usepackage{titletoc} \contentsmargin{0pt} \titlecontents{chapter}[0pt] {\addvspace{1.4pc}\bfseries} {{\Huge\thecontentspage\quad}}{}{} \newcommand\xquad {\hspace{1em plus.4em minus.4em}} \titlecontents*{section}[0pt] {\filright\small}{}{} {,~\thecontentspage} [\xquad\textbullet\xquad][.] \setcounter{tocdepth}{1} \input{partial.toc}

Como segundo ejemplo, observamos una configuración que implementa un diseño similar al utilizado en Métodos de diseño de libros [198]. Este diseño utiliza fuentes Garamond con dígitos de estilo antiguo, algo que logramos usando el paquete garamondx. Los títulos de los \capítulos están escritos en minúsculas. Para organizar eso usamos \scshape y convertimos todas las letras en el título a minúsculas usando \MakeLowercase (recuerde que el último token de los argumentos numbered-entry-format y numberless-entry-format se puede un comando con un argumento para recibir el texto del encabezado). Todas las secciones se agrupan en un párrafo y el número de sección tiene un signo § antepuesto. La separación entre entradas es un punto seguido de un espacio, y la sección final también se completa con un punto.

Justificar el párrafo realmente requiere una medida más amplia que la disponible en el ejemplo, aunque queda bastante bien con el texto dado. Si no, considere usar \filright, pero eso alteraría drásticamente el diseño.

\usepackage[osf]{garamondx} \usepackage{titletoc} \contentsmargin{0pt} \titlecontents{chapter}[1.5pc] {\addvspace{2pc}\large} {\contentslabel{2pc}% \scshape\MakeLowercase} {\scshape\MakeLowercase} {\hfill\thecontentspage} [\vspace{2pt}] \titlecontents*{section}[1.5pc] {\small}{\S\thecontentslabel\ } {}{,~\thecontentspage}[.\ ][.] \setcounter{tocdepth}{1} \input{partial.toc}

Generando listas de índices parciales

Es posible generar listas de contenidos parciales usando el paquete titletoc como lo hacemos para cada capítulo de este libro; proporciona cuatro comandos para este propósito.

\startcontents[name]

Una tabla de contenido parcial comienza con \startcontents. Es posible recopilar datos para varios TOC parciales en paralelo, como uno para la \parte actual y otro para el \chapter actual. En ese caso, el argumento opcional nombre nos permite distinguir entre los dos (su valor predeterminado es la cadena default). Los TOC parciales que se ejecutan simultáneamente pueden superponerse entre sí, aunque normalmente estarán anidados. Toda la información sobre estos TOC parciales se almacena en un único archivo con la extensión .ptc; este archivo se genera una vez que se ejecuta un único comando \startcontents.

\printcontents[name]{prefix}{start-level}{toc-code}

Este comando imprime el TOC parcial actual iniciado anteriormente por \startcontents e incluye todas las entradas hasta la siguiente invocación de \startcontents. Si se utiliza el argumento opcional nombre, entonces se debe haber iniciado antes una lista de contenidos parcial con ese nombre.

Es muy probable que desee formatear el TOC parcial de manera diferente a la tabla de contenido principal. Para permitir esto, el argumento prefijo se antepone a cualquier entrada tipo cuando se busca una definición de diseño proporcionada a través de \titlecontents o su forma destacada. En el siguiente ejemplo usamos p- como prefijo y luego definimos un formato para p-subsection para formatear las entradas \subsection en el TOC parcial.

El argumento nivel inicial define el primer nivel que se muestra en el TOC parcial; en el ejemplo usamos el valor 2 para indicar que queremos ver todas las subsecciones y niveles inferiores.

La profundidad a la que queremos incluir entradas en el TOC parcial se puede establecer en toc-code estableciendo el contador toc Depth en un valor adecuado. Allí también se pueden realizar otras inicializaciones para componer el TOC parcial. En el ejemplo cancelamos cualquier margen derecho, porque el TOC parcial tiene el formato de un solo párrafo.

Integrar TOC parciales en las definiciones de encabezados para que no haya necesidad de cambiar el documento real es muy fácil cuando se usa “titletoc” junto con el paquete “titlesec”. A continuación ampliamos el Ejemplo 2-2-14 de la página 45 para que el comando \section ahora imprima automáticamente un TOC parcial de todas sus subsecciones. Esto se hace usando el argumento opcional post-code de la declaración \titleformat. Primero agregamos algo de espacio vertical, asegurando así que no pueda ocurrir ningún salto de página en este punto. A continuación (re)iniciamos el TOC parcial “predeterminado” con ”

[name] ```

El comando \stopcontents detiene la recopilación de entradas para el TOC parcial predeterminado o, si se usa con el argumento nombre, para el TOC con ese nombre. Más adelante, la colección se puede reiniciar usando \resumecontents. Tenga en cuenta que esto es bastante diferente a llamar a \startcontents, que inicia un nuevo TOC parcial, haciendo así inaccesibles las entradas antiguas.

No es necesario limitar las TOC parciales a un subconjunto de su documento. Es igualmente posible utilizarlos para proporcionar “resúmenes”, por ejemplo, enumerando sólo los títulos de los capítulos, además de un índice completo. Una posible implementación podría verse así:

\AtBeginDocument{\startcontents[short]} \newcommand\shorttoc[1]{\chapter*{#1}% \printcontents[short]{short-}{0}{\setcounter{tocdepth}{0}}} \titlecontents{short-chapter}[..]{..}{..}{..}{..}

Comenzamos una lista de contenidos parcial denominada “corta” al principio del documento. Como nunca reiniciamos, esta lista parcial recibe todos los encabezados. Luego definimos el comando \shorttoc para producir un encabezado de capítulo sin un número y luego imprimimos esta lista parcial de TOC comenzando desde el nivel 0 (es decir, capítulos) pero mostrando solo los capítulos (ya que configuramos el contador toc Depth en cero ). Finalmente, definimos un formato adecuado para las entradas de capítulos en esa lista. Como usamos el prefijo short-, necesitamos definir short-chapter (no se proporcionan detalles en el código anterior).

Existen comandos similares para producir listas parciales de figuras o tablas denominadas \startlist, \printlist, \stoplist y \resumelist, pero con una sintaxis ligeramente diferente. Para más detalles consulte la documentación del paquete.

En este libro utilizamos estas listas de contenidos parciales en varios lugares. Cada capítulo comienza con una declaración \startcontents, que nos permite mostrar las TOC del capítulo con un formato especial. Cada comando \chapter ejecutó algo similar a lo siguiente:

\startcontents \printcontents{p-}{1}{\contentsmargin{0pt}\setcounter{tocdepth}{1}% \color{blue}\headingfont\mdseries}

Todo lo que teníamos que hacer además era proporcionar una definición adecuada de “p-section” para formatear las entradas de la sección. Para este libro utilizamos la siguiente configuración, que era todo lo necesario:

\titlecontents{p-section}[18pt]{\addvspace{1pt}} {\contentspush{\thecontentslabel\enspace}} {} {\titlerule*[6pt]{.}\ \thecontentspage}

Además, para las listas de contenido generales también implementamos listas parciales, porque ambos libros físicos se produjeron en una sola tirada (para simplificar las referencias cruzadas y la indexación). Por lo tanto, comenzamos cada parte del libro con

\startcontents[part] \startlist[part]{lof} \startlist[part]{lot}

dividiendo así las listas de contenidos en las dos partes que representan los dos libros físicos. Esto nos permitió incluir automáticamente los títulos de ambos libros en el índice de cada libro, con el formato adecuado; es decir, en el libro I, mostramos solo los títulos de los capítulos del libro II, mientras que en el libro II solo se enumeran los capítulos del libro I, pero se dan capítulos y secciones para el libro II. La situación para la lista de figuras y tablas es más sencilla: aquí mostramos sólo aquellas entradas que pertenecen al libro actual. Pero nuevamente, esto sólo es posible porque hemos dividido las listas de contenido como se muestra arriba.

2.3.3 multitoc - Configurar listas de contenidos en varias columnas

Establecer listas de contenidos en varias columnas es un diseño que a veces se solicita. Una solución para esto la proporciona el paquete “multitoc” de Martin Schröder, que utiliza internamente el paquete “multicol” para lograr el resultado deseado.

El paquete tiene tres opciones (toc, lof y lot) para componer la tabla de contenido, la lista de figuras o la lista de tablas en varias columnas (predeterminado 2).

Rara vez se necesitan más columnas, pero si es necesario, puede especificar el número deseado de columnas cambiando \multicolumntoc, \multicolumnlof o \multicolumnlot por \renewcommand.

2.3.4 Interfaces de bajo nivel de LaTeX

En esta sección final sobre TOC revisamos brevemente las interfaces básicas para archivos de contenido proporcionadas por \(\LaTeX\), porque es posible que las encuentre utilizadas directamente en archivos de clases más antiguos. Paquetes como titletoc también los invocan pero ofrecen un nivel adicional de abstracción.

Ingresar información en los archivos de contenido

La interfaz para escribir en los archivos de contenido consta de dos comandos: \addcontentsline y \addtocontents. Se invocan automáticamente mediante comandos de encabezado o título, pero si es necesario, también es posible utilizarlos para ingresar información directamente en los archivos.

\addcontentsline{ext}{type}{text}

El comando\addcontentsline escribe el texto junto con información adicional, como el número de página de la página actual, en un archivo con la extensión ext (normalmente .toc, .lof o .lote). Los comandos frágiles dentro de text deben protegerse con \protect. El argumento tipo es una cadena que especifica el tipo de entrada de contenido que se está realizando. Para la tabla de contenido (.toc), suele ser el nombre del comando de encabezado sin barra invertida; para archivos .lof o .lot, normalmente se especifica figure o table.

La instrucción \addcontentsline es invocada automáticamente por los comandos de sección de documentos o por los comandos \caption dentro de los entornos flotantes. Desafortunadamente, la interfaz tiene sólo un argumento para el texto variable, lo que hace que sea complicado identificar correctamente el número de un objeto, si está presente. Debido a que dichos números (por ejemplo, el número de encabezado) normalmente necesitan un formato especial en las listas de contenidos, esta identificación es absolutamente necesaria. El truco utilizado por el kernel actual de \(\LaTeX\) para lograr este objetivo es rodear dicho número con el comando \numberline dentro del argumento text de la siguiente manera:

\protect\numberline{number}heading

Por ejemplo, un comando \caption dentro de un entorno figure guarda el texto del título de la figura usando la siguiente línea:

\addcontentsline{lof}{figure}{\protect\numberline{\thefigure}caption text}

Debido al comando \protect, \numberline se escribe sin cambios en el archivo externo, mientras que \thefigure se reemplaza en el camino para que el número de figura real y no el comando termine en el archivo.

Más adelante, durante el formateo de las listas de contenidos, se puede utilizar una definición adecuada de \numberline para formatear el número de una manera especial, como proporcionando espacio adicional o una fuente diferente. La desventaja de este enfoque es que es menos general que una versión que toma un argumento separado para este número (por ejemplo, no se puede hacer fácilmente una transformación arbitraria en este número), y requiere una definición apropiada para \numberline, algo que Desafortunadamente, no siempre es fácil de proporcionar (consulte la discusión a continuación).

\addtocontents{ext}{text}

El comando \addtocontents no contiene un parámetro type y está destinado a ingresar información de formato especial que no está directamente relacionada con ninguna línea de contenido. Por ejemplo, el comando \chapter de las clases estándar coloca espacios en blanco adicionales en los archivos .lof y .lot para separar entradas de diferentes capítulos de la siguiente manera:

\addtocontents{lof}{\protect\addvspace{10pt}} \addtocontents{lot}{\protect\addvspace{10pt}}

Al usar \addvspace como máximo 10 puntos separan las entradas de diferentes capítulos sin producir espacios extraños si algunos capítulos no contienen figuras o tablas.

Este ejemplo, sin embargo, muestra un cierto peligro de la interfaz: mientras que \addcontentsline, \addtocontents y \addvspace parecen ser comandos a nivel de usuario (dado que no contienen ningún signo @ en sus nombres) , pueden producir fácilmente errores extraños. En particular, \addvspace solo se puede usar en modo vertical, lo que significa que una línea como la anterior funciona correctamente solo si una \addcontentsline anterior termina en modo vertical. Por lo tanto, es necesario comprender cómo se procesan realmente dichas líneas para poder ingresar instrucciones de formato arbitrarias entre ellas. Este es el tema de la siguiente sección.

Si se usa \addcontentsline o \addtocontents dentro del código fuente de un documento, se aplica una restricción importante: ninguno de los comandos se puede usar en el mismo nivel que una declaración \include. Esto significa, por ejemplo, que la secuencia

\addtocontents{toc}{\protect\setcounter{tocdepth}{1}} \include{sect1}

con sect1.tex que contiene un comando \section sorprendentemente daría como resultado un archivo .toc que contiene

\contentsline {section}{\numberline {1}Section from sect1}{2}{}% \setcounter {tocdepth}{1}

mostrando que las líneas parecen desordenadas. La solución es mover la instrucción \addtocontents o \addcontentsline al archivo cargado mediante \include o evitar \include por completo.

Composición tipográfica de una lista de contenidos

Como se analizó anteriormente, las listas de contenidos se generan implícita o explícitamente usando los comandos \addcontentsline y \addtocontents. El efecto exacto de \addcontentsline{ext}{type}{text} es colocar la línea

\contentsline{type}{text}{page}{anchor-name}%

incluido el signo de porcentaje final en el archivo auxiliar con extensión ext, donde página es el número de página actual del documento. El argumento anchor-name está vacío de forma predeterminada, pero se completa si se carga el paquete hyperref. En ese caso, especifica un nombre de anclaje de hipervínculo.

El comando \addtocontents{ext}{text} es más simple: simplemente coloca text en el archivo auxiliar sin ningún material adicional. Por lo tanto, un archivo de lista de contenidos típico consta de varios comandos \contentsline, posiblemente intercalados con instrucciones de formato adicionales agregadas como resultado de llamadas \addtocontents. También es posible que el usuario cree una tabla de contenido a mano con la ayuda del comando \contentsline.

A continuación se muestra un ejemplo típico. Tenga en cuenta que la mayoría (aunque no todos) los números de encabezado se ingresan como parámetro del comando \numberline para permitir el formato con la sangría adecuada. Por razones históricas \(\LaTeX\) lamentablemente no es consistente aquí; las clases estándar no usan \numberline para los encabezados \part sino que especifican el formato explícitamente.

\setcounter{tocdepth}{3} \contentsline {part}{I\hspace{1em}Part}{2}{}% \contentsline{chapter}{\numberline{1}A-Head}{2}{}% \contentsline{section}{\numberline{1.1}B-Head}{3}{}% \contentsline{subsection}% {\numberline{1.1.1}C-Head}{4}{}% \contentsline{subsection}% {\numberline{}With Empty Number}{5}{}% \contentsline{subsection}{Unnumbered C-Head}{6}{}% \contentsline{subsection}% {\numberline{1.1.2}Another C-Head}{8}{}% \contentsline{section}% {\numberline{1.2}Another B-Head}{10}{}% 2-3-13

El comando \contentsline se implementa para tomar su primer argumento tipo y luego usarlo para llamar al comando \l@type correspondiente, que realiza la composición tipográfica real. Se debe definir un comando separado para cada uno de los tipos en el archivo de clase. Por ejemplo, en la clase de informe encontrará las siguientes definiciones:

\newcommand\l@section    {\@dottedtocline{1}{1.5em}{2.3em}} \newcommand\l@subsection    {\@dottedtocline{2}{3.8em}{3.2em}} \newcommand\l@subsubsection    {\@dottedtocline{3}{7.0em}{4.1em}} \newcommand\l@paragraph    {\@dottedtocline{4}{10em}{5em}} \newcommand\l@subparagraph    {\@dottedtocline{5}{12em}{6em}} \newcommand\l@figure \newcommand\l@table    {\@dottedtocline{1}{1.5em}{2.3em}} {\l@figure}

Al definir \l@type para llamar a \@dottedtocline (un comando con cinco argumentos) y especificar tres argumentos (nivel, indent y numwidth), los argumentos restantes, text y * page*, de \contentsline son recogidos por \@dottedtocline como argumentos 4 y 5. El último argumento (que por defecto está vacío) simplemente se deja allí sin hacer nada. Si se carga hyperref, las definiciones se cambian y también se procesa el último argumento.

Tenga en cuenta que algunos niveles de sección crean sus entradas de tabla de contenido de una manera algo más complicada, de modo que las clases de documentos estándar tienen definiciones para \l@part y \l@chapter (o \l@section con article) que no utilizan \@dottedtocline. Generalmente utilizan un conjunto de comandos de formato específicos, quizás omitiendo los puntos suspensivos y escribiendo el título en una fuente más grande.

Entonces, para definir el diseño de las listas de contenidos, tenemos que declarar los comandos\l@type apropiados (que es precisamente lo que hacen los comandos \dottedcontents y \titlecontents de titletoc). Una forma sencilla sin este paquete, como se muestra arriba, es usar \@dottedtocline, un comando interno que ahora veremos con cierto detalle.

\@dottedtocline{level}{indent}{numwidth}{text}{page}

Los dos últimos argumentos de \@dottedtocline coinciden con el segundo y tercer argumento de \contentsline, que a su vez generalmente invoca un comando \@dottedtocline. Los demás argumentos son los siguientes:

nivel El nivel de anidamiento de la entrada. Con la ayuda del contador “toc Depth”, el usuario puede controlar cuántos niveles de anidamiento se muestran. Los niveles superiores al valor de este contador no aparecerán en la tabla de contenidos.

sangría La sangría total desde el margen izquierdo.

numwidth El ancho del cuadro que contiene el número si text tiene un comando \numberline. También es la cantidad de sangría adicional agregada a la segunda línea y a las posteriores de una entrada de varias líneas.

Además, el comando \@dottedtocline utiliza los siguientes parámetros de formato global, que especifican la apariencia visual de todas las entradas. Aunque todos los parámetros almacenan valores de longitud, deben cambiarse con \renewcommand.

\@pnumwidth El ancho del cuadro en el que se establece el número de página.

\@tocrmarg La sangría del margen derecho para todas las entradas de varias líneas, excepto la última. Se puede ajustar a una longitud de goma, lo que da como resultado que el TOC no esté justificado.

\@dotsep La separación entre puntos, en mu (unidades matemáticas). El valor almacenado es un número puro (como 1,7 o 2). Al hacer que este número sea lo suficientemente grande, puedes deshacerte de los puntos por completo.

En la Figura 2.2 se muestra una representación gráfica de los efectos descritos. El campo identificado por numwidth contiene un número de sección justificado a la izquierda, si está presente. Puede lograr la sangría adecuada para las entradas anidadas variando la configuración de sangría y numwidth.

Un caso en el que esto es necesario, al utilizar una clase estándar (“artículo”, “informe” o “libro”), surge cuando tienes diez o más secciones y dentro de las últimas más de nueve subsecciones. En ese caso, los números y el texto se acercarán demasiado o incluso se superpondrán si el argumento numwidth en las llamadas correspondientes a \@dottedtocline no se extiende, como se ve en el siguiente ejemplo.

\contentsline{section}{\numberline{10}A-Head}{3}{}% \contentsline{subsection}{\numberline{10.1}B-Head}{3}{}% \ldots % several more heading lines here (not shown) \contentsline{subsection}{\numberline{10.9}B-Head}{7}{}% \contentsline{subsection}{\numberline{10.10}B-Head}{8}{}%

Redefinir \l@subsection para dejar un poco más de espacio para el número (es decir, el tercer argumento de \@dottedtocline) da un mejor resultado en este caso. Probablemente también tendrá que ajustar los otros comandos, como @subsubsection, para producir una apariencia equilibrada para toda la tabla.

\makeatletter \renewcommand\l@subsection{\@dottedtocline{2}{1.5em}{3em}} \makeatother \contentsline{section}{\numberline{10}A-Head}{3}{}% \ldots % several more heading lines here \contentsline{subsection}{\numberline{10.9}B-Head}{7}{}% \contentsline{subsection}{\numberline{10.10}B-Head}{8}{}%

Otro ejemplo que requiere cambios es el uso de una numeración de páginas inusual. Por ejemplo, si las páginas están numeradas por partes y formateadas como “A–78”, “B–328”, etc., entonces el espacio proporcionado para el número de página probablemente sea demasiado pequeño, lo que resultará al menos en un gran número de páginas. Advertencias molestas de “Hbox demasiado lleno”, pero más probablemente con un mal espaciado a su alrededor. En ese caso, la solución es establecer \@pnumwidth en un valor que se ajuste a la entrada más amplia, por ejemplo, mediante

\makeatletter \renewcommand\@pnumwidth{2cm} \makeatother

Al ajustar \@pnumwidth de esta manera, es probable que también sea necesario cambiar el valor de \@tocrmarg para mantener coherente el diseño de la tabla de contenido.

Estos ejemplos y sus soluciones muestran claramente las ventajas de las interfaces de nivel superior proporcionadas por titletoc donde comandos como \contentspush permiten soluciones mucho más simples.

Proporcionar archivos de contenido adicionales

Es posible que desee marcar otros datos en su documento y mostrarlos como una lista. Si es así, deberá crear un nuevo archivo de contenido y luego utilizar las funciones descritas anteriormente.

Por ejemplo, supongamos que desea recopilar notas sobre artistas. Para esto necesitamos definir dos comandos. El primer comando, \artist, escribe el nombre del artista y asocia ambos argumentos con la posición actual en el documento escribiéndolos y el número de página actual en el archivo de contenido. El segundo comando, \listofartistnotes, lee la información escrita en el archivo de contenido en la ejecución anterior y la escribe en el punto del documento donde se llama el comando.

Para esto, el comando \listofartistnotes invoca \@starttoc{ext}, que lee el archivo externo (con la extensión ext) y luego lo vuelve a abrir para escribir. Este comando también lo utilizan los comandos \tableofcontents, \listoffigures y \listoftables. Al archivo complementario se le podría dar cualquier extensión no utilizada, como .rec. Se puede poner un comando como \chapter*{Notas sobre artistas} delante o dentro de \listofartistnotes para producir un título y, si se desea, se puede señalar la presencia de esta lista al lector ingresándola en el Archivo .toc con un comando \addcontentsline.

La composición tipográfica real de las entradas individuales en el archivo .rec está controlada por \l@note, que debe definirse. En el siguiente ejemplo, las notas están escritas como párrafos seguidos de un número de página en cursiva. En lugar de definir este comando directamente, podríamos haber usado las interfaces de titletoc, por ejemplo, \titlecontents{note}

\newcommand\artist[2] {#1\addcontentsline{rec}{note}{#1: #2}} \makeatletter \newcommand\listofartistnotes {\section*{Notes on artists}\@starttoc{rec}} \newcommand\l@note[2] {\par\noindent#1,~\textit{#2}\par} \makeatother The version of Ravel’s Boléro by \artist{Jacques Loussier Trio}{A strange experience} is rather unusual. Quite interesting is Davis’ Blue in Green by \artist{Cassandra Wilson}{A wonderful version}. \listofartistnotes

El paquete float descrito en la Sección 7.3.1 en la página 529 implementa el mecanismo anterior con el comando \listof, que genera una lista de flotantes del tipo especificado como argumento.