目录中与章节编号对应的彩色章节条目

目录中与章节编号对应的彩色章节条目

我排版了一个文档,其中章节标题的颜色会定期变化。我想将目录中的章节条目也设置为与相应章节的颜色相匹配的颜色。

为了完成此操作,我\setkomafont{sectioning}在目录中使用了和“注入”颜色命令。这确实按预期工作,尽管我感觉后者是对目录条目的一种滥用。\setkomafont{sectionentry}并且\setkomafont{sectionentrypagenumber}不起作用,因为它们将它们全部着色为相同颜色(因为它们当然位于文档的同一部分)。

问题是:当我使用 hyperref 时,我会收到这些Token not allowed in a PDF string警告,因为这些“感染”命令进入了 PDF 文件的目录。更成问题的是,由于 hyperref 重新定义了\contentsline页码的颜色,因此页码\DeclareTOCStyleEntry的颜色消失了。这无论如何都无济于事,因为它不知道确定正确颜色所需的节号。然而,在没有 hyperref 的情况下,它仍然是正确的选择。

以下是 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}

我应该提到,使用该tocloft包只是最后的手段,因为 koma-script 不赞成使用 tocloft。

取消注释\usepackage{hyperref}以查看所需输出。感谢您的帮助或建议。

答案1

好吧,可以像往常一样避免“不允许使用令牌” \texorpdfstring,例如类似\texorpdfstring{\protect\structurecolor[#1]#2}{#2}。关于颜色:您依赖文本和页码在同一组中。但 hyperref 自然必须为链接添加括号和分组。将颜色存储在某个全局变量中,然后在页码中重复它:

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

在此处输入图片描述

答案2

如果您\addtocontents{toc}{}在 内部使用\renewcommand{\addsectiontocentry}{...},则不会以任何方式影响 pdf 目录。那么您不需要\structurecolor[#1]在 内部调用\addtocentrydefault。使用\begingroup ... \endgroup使更改本地化。这种方式甚至\DeclareTOCStyleEntry不再需要。

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

完整 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}

相关内容