
Estou criando um ToC sofisticado baseado na pergunta de @plutonComo personalizar o índice usando TikZ?
Embora esse código funcione bem, parece que ele se comporta mal ao usar um apêndice. Em vez de adicionar uma entrada, Appendix A
ele adiciona Chapter A
.
Além disso, ao adicionar um capítulo não numerado, prefiro não ter uma Chapter
entrada, mas uma caixa colorida ou nada.
Meu código é
\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}
e minha saída é
Existe uma maneira de atingir esses dois requisitos?
Responder1
Acho que isso é um descuido, ou mesmo um bug, na forma como o índice é gerado.
Dentro de um arquivo latex, o \appendix
comando muda \@chapapp
de \chaptername
para \appendixname
e é usado para obter o título correto nos títulos dos capítulos e apêndices. Infelizmente, essas informações NÃO são passadas para o arquivo de índice (toc). Atualmente, por exemplo em book.cls, a entrada de um capítulo ou apêndice é gravada no arquivo toc por meio de:
\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}
Isso significa que as entradas de capítulo e apêndice no arquivo toc parecem exatamente iguais quando \tableofcontents
é executado, de modo que o arquivo toc não pode diferenciar entre capítulos e apêndices (sem alguma invasão). Seria melhor se também houvesse
\addcontentsline{toc}{appendix}{\protect\numberline{\thechapter}#1}
linhas - embora você não possa usar \@chapapp
para gerar essas linhas porque o valor de \@hapapp
depende do idioma...então o código não seria tão elegante :(
Para contornar esse problema, uma solução é substituir o uso de \chaptertitlename
no código do Pluton por, digamos, \tocchaptername
e adicionar o seguinte código ao topo do seu arquivo:
\let\tocchaptername\chaptertitlename
\let\originalAppendix\appendix
\renewcommand\appendix{\originalAppendix%
\addtocontents{toc}{\let\string\tocchaptername\string\appendixname}%
}
Com isso implementado, os apêndices são rotulados como o OP deseja. (O uso de \addtocontents
é um hack para escrever algumas linhas no arquivo toc sem usar \makeatletter\@writefile{toc}...\makeatother
.)
Na verdade, a imagem acima exige um pouco mais do que falei até agora. Primeiro, como "apêndice" tem um caractere a mais que "capítulo", o espaçamento requer alguns ajustes adicionais. (Para centralizar o capítulo e o apêndice, esses números precisam ser ajustados com mais cuidado:)
Mais seriamente, o uso do \chapter*
último "apêndice" resulta em um rótulo azul de "apêndice", o que provavelmente não é o que você deseja. Seria difícil corrigir isso corretamente (por exemplo, lidar com o caso em que há alternâncias \chapter{..}
e \chapter*{...}
comandos no documento). Supondo que o OP queira rótulos vazios deste ponto em diante (como na imagem acima), basta adicionar a linha
\addtocontents{toc}{\let\string\tocchaptername\string\relax}
antes do \chapter*{}
comando. Se alguém quiser alternar o uso de capítulos/apêndices com e sem estrela, precisará digitar
\addtocontents{toc}{\let\string\tocchaptername\string\chaptertitlename}
para que o arquivo toc saiba o que está acontecendo (usando a variação óbvia do apêndice nos apêndices).
Aqui está o código real que usei:
\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 não numerados
Por fim, para responder sua pergunta nos comentários, para se livrar do marcador azul vazio para capítulos não numerados substitua o tikzpicture
ambiente dentro do \titlecontents{chapter}
comando acima pela seguinte variação (na verdade, melhorei um pouco o código ao mesmo tempo) :
\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 isso, a saída agora se parece com:
Se houver muitos capítulos/apêndices não numerados entre os numerados, você provavelmente desejará definir um comando como o seguinte:
\newcommand\unnumberedchapter[1]{%
\addtocontents{toc}{\let\string\tocchaptername\string\relax}%
\chapter*{#1}%
\addtocontents{toc}{\let\string\tocchaptername\string\chaptertitlename}%
}
Depois, você pode digitar \unnumberedchapter{Chapter title}
quando precisar.