Markieren Sie Abschnittseinträge im Inhaltsverzeichnis entsprechend den Abschnittsnummern mit einem Farbcode.

Markieren Sie Abschnittseinträge im Inhaltsverzeichnis entsprechend den Abschnittsnummern mit einem Farbcode.

Ich setze ein Dokument, bei dem sich die Farbe der Abschnittsüberschriften regelmäßig ändert. Ich möchte die Farbe der Abschnittseinträge im Inhaltsverzeichnis an die Farben der entsprechenden Abschnitte anpassen.

Um dies zu erreichen, verwende ich \setkomafont{sectioning}Farbbefehle und "füge sie in das Inhaltsverzeichnis ein". Das funktioniert wie erwartet, obwohl ich das Gefühl habe, dass es sich dabei um eine Art Missbrauch der Inhaltsverzeichniseinträge handelt. \setkomafont{sectionentry}Und \setkomafont{sectionentrypagenumber}es funktioniert nicht, da sie alle gleich eingefärbt werden (da sie sich natürlich im selben Abschnitt des Dokuments befinden).

Das Problem ist: Wenn ich Hyperref verwende, erhalte ich diese Token not allowed in a PDF stringWarnungen, da diese „eingefügten“ Befehle ihren Weg in das Inhaltsverzeichnis der PDF-Datei finden. Noch problematischer ist, dass \contentslinedie Seitenzahl weg ist, wenn Hyperref die Farbe neu definiert. \DeclareTOCStyleEntryhilft sowieso nicht, da es die Nummer des Abschnitts nicht kennt, die zur Bestimmung der richtigen Farbe erforderlich ist. Sie wird trotzdem benötigt, um es ohne Hyperref richtig zu machen.

Hier ist ein 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}

Ich sollte erwähnen, dass die Verwendung des tocloftPakets nur der letzte Ausweg ist, da Koma-Script die Verwendung von Tocloft ablehnt.

Entfernen Sie das Kommentarzeichen \usepackage{hyperref}, um die gewünschte Ausgabe anzuzeigen. Vielen Dank für Ihre Hilfe oder Vorschläge.

Antwort1

nun, das „Token nicht erlaubt“ kann wie immer mit vermieden werden \texorpdfstring, z. B. so etwas wie \texorpdfstring{\protect\structurecolor[#1]#2}{#2}. Bezüglich der Farbe: Sie verlassen sich darauf, dass der Text und die Seitenzahl in derselben Gruppe sind. Aber hyperref muss natürlich Klammern und Gruppierungen für die Links hinzufügen. Speichern Sie die Farbe in einer globalen Variable und wiederholen Sie sie dann in der Seitenzahl:

\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}

Bildbeschreibung hier eingeben

Antwort2

Wenn Sie \addtocontents{toc}{}innerhalb von verwenden \renewcommand{\addsectiontocentry}{...}, hat dies keinerlei Auswirkungen auf das PDF-Inhaltsverzeichnis. Dann müssen Sie \structurecolor[#1]innerhalb von nicht aufrufen \addtocentrydefault. Verwenden Sie \begingroup ... \endgroup, um die Änderungen lokal vorzunehmen. Dieser Weg \DeclareTOCStyleEntryist nicht einmal mehr erforderlich.

\renewcommand{\addsectiontocentry}[2]{%
  \IfArgIsEmpty{#1}{%
    \addtocentrydefault{section}{}{#2}
  }{%
    \addtocontents{toc}{\begingroup\structurecolor[#1]}
    \addtocentrydefault{section}{#1}{#2}
    \addtocontents{toc}{\endgroup}
  }
}

Vollständiges 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}
\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}

verwandte Informationen