Entradas de seção de cores no índice correspondente aos números de seção

Entradas de seção de cores no índice correspondente aos números de seção

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 stringavisos à medida que esses comandos "incetados" chegam ao índice do arquivo PDF. O que é ainda mais problemático é que, à medida que o hiperref redefine, \contentslinea cor do número da página desaparece. \DeclareTOCStyleEntrynã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 tocloftpacote é 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}

insira a descrição da imagem aqui

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 ... \endgrouppara fazer as alterações locais. Desta forma ainda \DeclareTOCStyleEntrynã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}

informação relacionada