Modificar índice sofisticado

Modificar índice sofisticado

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 Aele adiciona Chapter A.

Além disso, ao adicionar um capítulo não numerado, prefiro não ter uma Chapterentrada, 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 é

insira a descrição da imagem aqui

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 \appendixcomando muda \@chapappde \chapternamepara \appendixnamee é 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 \@chapapppara gerar essas linhas porque o valor de \@hapappdepende do idioma...então o código não seria tão elegante :(

Para contornar esse problema, uma solução é substituir o uso de \chaptertitlenameno código do Pluton por, digamos, \tocchapternamee 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.)

insira a descrição da imagem aqui

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 tikzpictureambiente 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:

insira a descrição da imagem aqui

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.

informação relacionada