
Estoy creando una ToC elegante basada en la pregunta de @pluton.¿Cómo personalizar la tabla de contenidos usando TikZ?
Aunque este código funciona bien, parece que se comporta mal cuando se utiliza un apéndice. En lugar de agregar una entrada, Appendix A
agrega Chapter A
.
Además, al agregar un capítulo sin numerar, prefiero no tener una Chapter
entrada, sino un cuadro de color o nada en absoluto.
mi codigo es
\documentclass[11pt,a4paper]{book}
\usepackage{tikz,pgf}
\usepackage{tocloft,titletoc,titlesec}
\definecolor{doc}{RGB}{0,60,110}
\definecolor{myblueii}{RGB}{63,200,244}
\usepackage{lipsum}
\contentsmargin{0cm}
\titlecontents{chapter}[0pc]
{\addvspace{30pt}%
\begin{tikzpicture}[remember picture, overlay]%
\draw[fill=myblueii,draw=myblueii, rounded corners] (-4,-.1) rectangle (-0.15,.5);%
\pgftext[left,x=-2.7cm,y=0.2cm]{\color{white}\Large \chaptertitlename\ \thecontentslabel};%
\end{tikzpicture}\color{myblueii}\large\bfseries}%
{}
{}
{\hspace*{6pt}\titlerule\hspace*{6pt}\large\bfseries \thecontentspage
\begin{tikzpicture}[remember picture, overlay]
\draw[fill=doc!25,draw=myblueii, rounded corners=0pt] (2pt,0) rectangle (6,0.1pt);
\end{tikzpicture}}%
\titlecontents{section}[2.4pc]
{\addvspace{1pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small \thecontentspage}
[]
\titlecontents{subsection}[4.8pc]
{\addvspace{1.0pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small\thecontentspage}
[]
\makeatletter
\renewcommand{\tableofcontents}{%
\chapter*{%
\vspace*{-20\p@}%
\begin{tikzpicture}[remember picture, overlay]%
\pgftext[right,x=15cm,y=0.2cm]{\color{myblueii}\Huge \contentsname};%
\draw[fill=myblueii,draw=myblueii, rounded corners=15pt] (13,-.75) rectangle (20,1);%
\clip (13,-.75) rectangle (20,1);
\pgftext[right,x=15cm,y=0.2cm]{\color{white}\Huge \contentsname};%
\end{tikzpicture}}%
\@starttoc{toc}}
\makeatother
\begin{document}
\tableofcontents
\chapter{First Chapter}
\lipsum[1]
\chapter{Second Chapter}
\lipsum[1]
\chapter{Third Chapter}
\lipsum[1]
\appendix
\chapter{First Appendix Chapter}
\lipsum[1]
\chapter{Second Appendix Chapter}
\lipsum[1]
\chapter*{Chapter}
\addcontentsline{toc}{chapter}{Chapter}
\lipsum[1]
\end{document}
y mi salida es
¿Hay alguna manera de lograr esos dos requisitos?
Respuesta1
Creo que esto es un descuido, o incluso un error, en la forma en que se genera la tabla de contenido.
Dentro de un archivo de látex, el \appendix
comando cambia \@chapapp
de \chaptername
a \appendixname
y esto se usa para obtener el título correcto en los títulos de los capítulos y apéndices. Desafortunadamente, esta información NO se pasa al archivo de tabla de contenido (toc). Actualmente, por ejemplo en book.cls, la entrada de un capítulo o apéndice se escribe en el archivo toc mediante:
\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}
Esto significa que las entradas de capítulos y apéndices en el archivo toc se ven exactamente iguales cuando se \tableofcontents
ejecuta, por lo que el archivo toc no puede diferenciar entre capítulos y apéndices (sin alguna modificación). Sería mejor si también hubiera
\addcontentsline{toc}{appendix}{\protect\numberline{\thechapter}#1}
líneas, aunque no puedes usarlas \@chapapp
para generar estas líneas porque el valor de \@hapapp
depende del idioma... por lo que el código no sería tan elegante:(
Para solucionar este problema, una solución es reemplazar el uso de \chaptertitlename
en el código de Pluton con, por ejemplo, \tocchaptername
y luego agregar el siguiente código al principio de su archivo:
\let\tocchaptername\chaptertitlename
\let\originalAppendix\appendix
\renewcommand\appendix{\originalAppendix%
\addtocontents{toc}{\let\string\tocchaptername\string\appendixname}%
}
Una vez implementado esto, los apéndices están etiquetados como quiere el OP. (El uso de \addtocontents
es un truco para escribir algunas líneas en el archivo toc sin usar \makeatletter\@writefile{toc}...\makeatother
).
En realidad, la imagen de arriba requiere un poco más de lo que he dicho hasta ahora. Primero, debido a que "apéndice" tiene un carácter más que "capítulo", el espaciado requiere una pequeña cantidad de ajustes adicionales. (Para centrar el capítulo y el apéndice, estos números deben ajustarse con más cuidado :)
Más en serio, el uso de \chapter*
para el último "apéndice" da como resultado una etiqueta azul de "apéndice", que probablemente no sea lo que desea. Sería complicado solucionar este problema correctamente (por ejemplo, para hacer frente al caso en el que se alternan comandos \chapter{..}
y \chapter*{...}
en el documento). Suponiendo que el OP quiere etiquetas vacías a partir de este punto (como en la imagen de arriba), puede simplemente agregar la línea
\addtocontents{toc}{\let\string\tocchaptername\string\relax}
antes del \chapter*{}
comando. Si alguien quisiera alternar el uso de capítulos/apéndices destacados y no destacados, entonces tendría que escribir
\addtocontents{toc}{\let\string\tocchaptername\string\chaptertitlename}
para que el archivo toc sepa lo que está sucediendo (usando la variación obvia del apéndice en los apéndices).
Aquí está el código real que utilicé:
\documentclass[11pt,a4paper]{book}
\usepackage{tikz,pgf}
\usepackage{tocloft,titletoc,titlesec}
\definecolor{doc}{RGB}{0,60,110}
\definecolor{myblueii}{RGB}{63,200,244}
\usepackage{lipsum}
\let\tocchaptername\chaptertitlename
\let\originalAppendix\appendix
\renewcommand\appendix{\originalAppendix\addtocontents{toc}{\let\string\tocchaptername\string\appendixname}}
\contentsmargin{0cm}
\titlecontents{chapter}[0pc]
{\addvspace{30pt}%
\begin{tikzpicture}[remember picture, overlay]%
\draw[fill=myblueii,draw=myblueii, rounded corners] (-4,-.1) rectangle (0.10,.5);%
\pgftext[left,x=-2.7cm,y=0.2cm]{\color{white}\Large \tocchaptername\ \thecontentslabel};%
\end{tikzpicture}\color{myblueii}\large\bfseries\quad}%
{}
{}
{\hspace*{6pt}\titlerule\hspace*{6pt}\large\bfseries \thecontentspage
\begin{tikzpicture}[remember picture, overlay]
\draw[fill=doc!25,draw=myblueii, rounded corners=0pt] (2pt,0) rectangle (6,0.1pt);
\end{tikzpicture}}%
\titlecontents{section}[2.4pc]
{\addvspace{1pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small \thecontentspage}
[]
\titlecontents{subsection}[4.8pc]
{\addvspace{1.0pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small\thecontentspage}
[]
\makeatletter
\renewcommand{\tableofcontents}{%
\chapter*{%
\vspace*{-20\p@}%
\begin{tikzpicture}[remember picture, overlay]%
\pgftext[right,x=15cm,y=0.2cm]{\color{myblueii}\Huge \contentsname};%
\draw[fill=myblueii,draw=myblueii, rounded corners=15pt] (13,-.75) rectangle (20,1);%
\clip (13,-.75) rectangle (20,1);
\pgftext[right,x=15cm,y=0.2cm]{\color{white}\Huge \contentsname};%
\end{tikzpicture}}%
\@starttoc{toc}}
\makeatother
\begin{document}
\tableofcontents
\chapter{First Chapter}
\lipsum[1]
\chapter{Second Chapter}
\lipsum[1]
\chapter{Third Chapter}
\lipsum[1]
\appendix
\chapter{First Appendix Chapter}
\lipsum[1]
\chapter{Second Appendix Chapter}
\lipsum[1]
\addtocontents{toc}{\let\string\tocchaptername\string\relax}
\chapter*{Chapter}
\addcontentsline{toc}{chapter}{Chapter}
\lipsum[1]
\end{document}
Editar - capítulos sin numerar
Finalmente, para responder a su pregunta en los comentarios, para deshacerse del marcador azul vacío para capítulos sin numerar, reemplace el tikzpicture
entorno dentro del \titlecontents{chapter}
comando anterior con la siguiente variación (de hecho, he mejorado un poco el código al mismo tiempo) :
\begin{tikzpicture}[remember picture, overlay]%
\ifx\tocchaptername\relax\relax%
\else%
\draw(-0.15,0.15)node[anchor=east,align=center,fill=myblueii,text=white,rounded corners,
rectangle, minimum width=8.5em]{\Large \tocchaptername\ \thecontentslabel};
\fi%
\end{tikzpicture}\color{myblueii}\large\bfseries}%
Usando esto, la salida ahora se ve así:
Si va a haber muchos capítulos/apéndices sin numerar entre los numerados, entonces probablemente desee definir un comando como el siguiente:
\newcommand\unnumberedchapter[1]{%
\addtocontents{toc}{\let\string\tocchaptername\string\relax}%
\chapter*{#1}%
\addtocontents{toc}{\let\string\tocchaptername\string\chaptertitlename}%
}
Luego podrás escribir \unnumberedchapter{Chapter title}
cuando lo necesites.