在以下 MWE 中,我如何仅为目录中的章节编号着色?
\documentclass[a4paper]{book}
\usepackage{color}
\makeatletter
\renewcommand*\l@section{\@dottedtocline{1}{0em}{2.3em}}
\makeatother
\begin{document}
\tableofcontents
\chapter{Test one}
\section{Introduction}
\section{Foo bar}
\end{document}
我喜欢这样做而不使用诸如 之类的附加包tocloft
。
答案1
\csname the#1\endcsname
没有包,只是重新定义或改变写入 ToC 的方式,通过重新定义\@sect
\documentclass[a4paper]{book}
\usepackage{color}
\makeatletter
\renewcommand*\l@section{\@dottedtocline{1}{0em}{2.3em}}
\newcommand{\sectionnumbercolor}{blue}
\def\@sect#1#2#3#4#5#6[#7]#8{%
\ifnum #2>\c@secnumdepth
\let\@svsec\@empty
\else
\refstepcounter{#1}%
\protected@edef\@svsec{\@seccntformat{#1}\relax}%
\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup
#6{%
\@hangfrom{\hskip #3\relax\@svsec}%
\interlinepenalty \@M #8\@@par}%
\endgroup
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\textcolor{\sectionnumbercolor}{\csname the#1\endcsname}}%
\fi
#7}%
\else
\def\@svsechd{%
#6{\hskip #3\relax
\@svsec #8}%
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\textcolor{\sectionnumbercolor}{\csname the#1\endcsname}}%
\fi
#7}}%
\fi
\@xsect{#5}}
\makeatother
\begin{document}
\tableofcontents
\chapter{Test one}
\section{Introduction}
\section{Foo bar}
\end{document}
答案2
下面介绍了一个补丁,它改变了\numberline
通常写入 ToC 的宏。相反,它编写了一个特定于部分单元的宏,而该宏又可以根据您的需要进行定义:
\documentclass{book}
\usepackage{xcolor,etoolbox}
\makeatletter
\patchcmd{\@sect}{\numberline}{\csname #1numberline\endcsname}{}{}
\patchcmd{\@sect}{\numberline}{\csname #1numberline\endcsname}{}{}
\renewcommand*\l@section{\@dottedtocline{1}{0em}{2.3em}}
\makeatother
\colorlet{secnumcolor}{red}% For convenience
% Default definition of \numberline (left-aligned box of fixed-width \@tempdima)
% \def\numberline#1{\hb@xt@\@tempdima{#1\hfil}}
\newcommand{\sectionnumberline}[1]{\makebox[2.3em][l]{\color{secnumcolor}#1}}
%\newcommand{\subsectionnumberline}{\numberline}% Not needed here
%\newcommand{\subsubsectionnumberline}{\numberline}% Not needed here
\begin{document}
\tableofcontents
\chapter{Test one}
\section{Introduction}
\section{Foo bar}
\end{document}
我们执行两次修补程序\numberline
>\csname #1numberline\endcsname
以覆盖内部的两个实例\@sect
。regexpatch
只需一条命令即可完成此操作全部替换。