
Eu digito um documento onde a cor dos cabeçalhos das seções muda periodicamente. Quero colorir as entradas da seção no toc e também combinar com as cores das seções correspondentes.
Para fazer isso eu uso \setkomafont{sectioning}
e "injeto" comandos de cores no toc. Isso funciona conforme o esperado, embora eu tenha a sensação de que o último é uma espécie de uso indevido das entradas do toc. \setkomafont{sectionentry}
e \setkomafont{sectionentrypagenumber}
não funcionam porque eles os colorem da mesma forma (pois estão, obviamente, na mesma seção do documento).
O problema é: quando uso o hyperref, recebo esses Token not allowed in a PDF string
avisos à medida que esses comandos "incetados" chegam ao índice do arquivo PDF. O que é ainda mais problemático é que, à medida que o hiperref redefine, \contentsline
a cor do número da página desaparece. \DeclareTOCStyleEntry
não ajuda de qualquer maneira porque não sabe o número da seção necessária para determinar a cor correta. No entanto, é necessário acertar sem hiperref.
Aqui está um MWE:
\documentclass{scrartcl}
\usepackage{xcolor}
\usepackage{blindtext}
\usepackage{arrayjobx}
\usepackage{pgf}
\usepackage{hyperref}
\colorlet{myblue}{blue!60!green!90!black}
\colorlet{myred}{red!80!black}
\colorlet{mygreen}{green!40!black}
\colorlet{default}{black}
\newarray\structurecolors
\readarray{structurecolors}{mygreen&myblue&myred}
\makeatletter
\newcommand{\structurecolor}[1][\value{section}]{%
\pgfmathparse{int(mod(#1,\total@structurecolors) + 1)}%
\checkstructurecolors(\pgfmathresult)%
\color{\cachedata}%
\ifnum#1=0%
\color{black}
\fi
}
\makeatother
\setkomafont{sectioning}{\sffamily\bfseries\structurecolor}
\renewcommand{\addsectiontocentry}[2]{%
\IfArgIsEmpty{#1}{%
\addtocentrydefault{section}{}{#2}
}{%
\addtocentrydefault{section}{\structurecolor[#1]#1}{\protect\structurecolor[#1]#2}
}
}
\DeclareTOCStyleEntry[pagenumberformat={\sffamily\bfseries}]{default}{section}
\begin{document}
\tableofcontents
\Blinddocument
\Blinddocument
\end{document}
Devo mencionar que usar o tocloft
pacote é apenas o último recurso, pois o koma-script descontinua o uso do tocloft.
Remova o comentário \usepackage{hyperref}
para ver a saída desejada. Agradeço por qualquer ajuda ou sugestões.
Responder1
bem, o "token não permitido" pode ser evitado como sempre \texorpdfstring
, por exemplo, algo como \texorpdfstring{\protect\structurecolor[#1]#2}{#2}
. Em relação à cor: você está contando com que o texto e o número da página estejam no mesmo grupo. Mas o hyperref naturalmente precisa adicionar colchetes e agrupamento para os links. Armazene a cor em alguma variável global e repita no número da página:
\documentclass{scrartcl}
\usepackage{xcolor}
\usepackage{blindtext}
\usepackage{arrayjobx}
\usepackage{pgf}
\usepackage{hyperref}
\colorlet{myblue}{blue!60!green!90!black}
\colorlet{myred}{red!80!black}
\colorlet{mygreen}{green!40!black}
\colorlet{default}{black}
\newarray\structurecolors
\readarray{structurecolors}{mygreen&myblue&myred}
\makeatletter
\newcommand{\structurecolor}[1][\value{section}]{%
\pgfmathparse{int(mod(#1,\total@structurecolors) + 1)}%
\checkstructurecolors(\pgfmathresult)%
\color{\cachedata}%
\global\let\currentstructurecolor\cachedata
\ifnum#1=0%
\color{black}
\fi
}
\makeatother
\setkomafont{sectioning}{\sffamily\bfseries\structurecolor}
\renewcommand{\addsectiontocentry}[2]{%
\IfArgIsEmpty{#1}{%
\addtocentrydefault{section}{}{#2}
}{%
\addtocentrydefault{section}{\structurecolor[#1]#1}{\texorpdfstring{\protect\structurecolor[#1]#2}{#2}}
}
}
\DeclareTOCStyleEntry[pagenumberformat={\sffamily\bfseries\color{\currentstructurecolor}}]{default}{section}
\begin{document}
\showoutput
\tableofcontents
\section{a}
\section{b}
% \Blinddocument
% \Blinddocument
\end{document}
Responder2
Se você usar \addtocontents{toc}{}
dentro \renewcommand{\addsectiontocentry}{...}
dele, não afetará o toc do PDF de forma alguma. Então você não precisa ligar para \structurecolor[#1]
dentro de \addtocentrydefault
. Use \begingroup ... \endgroup
para fazer as alterações locais. Desta forma ainda \DeclareTOCStyleEntry
não é mais necessário.
\renewcommand{\addsectiontocentry}[2]{%
\IfArgIsEmpty{#1}{%
\addtocentrydefault{section}{}{#2}
}{%
\addtocontents{toc}{\begingroup\structurecolor[#1]}
\addtocentrydefault{section}{#1}{#2}
\addtocontents{toc}{\endgroup}
}
}
MWE completo:
\documentclass{scrartcl}
\usepackage{xcolor}
\usepackage{blindtext}
\usepackage{arrayjobx}
\usepackage{pgf}
\usepackage{hyperref}
\colorlet{myblue}{blue!60!green!90!black}
\colorlet{myred}{red!80!black}
\colorlet{mygreen}{green!40!black}
\colorlet{default}{black}
\newarray\structurecolors
\readarray{structurecolors}{mygreen&myblue&myred}
\makeatletter
\newcommand{\structurecolor}[1][\value{section}]{%
\pgfmathparse{int(mod(#1,\total@structurecolors) + 1)}%
\checkstructurecolors(\pgfmathresult)%
\color{\cachedata}%
\ifnum#1=0%
\color{black}
\fi
}
\makeatother
\setkomafont{sectioning}{\sffamily\bfseries\structurecolor}
\setkomafont{sectionentry}{\sffamily\bfseries}
\renewcommand{\addsectiontocentry}[2]{%
\IfArgIsEmpty{#1}{%
\addtocentrydefault{section}{}{#2}
}{%
\addtocontents{toc}{\begingroup\structurecolor[#1]}
\addtocentrydefault{section}{#1}{#2}
\addtocontents{toc}{\endgroup}
}
}
\begin{document}
\tableofcontents
\section{a}
\section{b}
\end{document}