答案1
以下提供了在 ToC 中为特定单元添加“标签”的界面。
\addsectiontag{<unit>}{<tag>}
为该特定部分创建一个宏<unit>
。然后,在每个单元的目录条目中,检查此宏是否存在。如果存在,则将标签设置在页码框左侧的白色背景框中(以便与目录中可能的引文重叠)。
\documentclass{article}
\usepackage{tocloft,etoolbox,xcolor,hyperref}
\makeatletter
\AtBeginDocument{%
\patchcmd{\tableofcontents}% <cmd>
{\@starttoc}% <search>
{\noindent\hfill{\bfseries Page}\par%
\@starttoc}% <replace>
{}{}% <success><failure>
}
% \addsectiontag{<unit>}{<tag>}
\newcommand{\addsectiontag}[2]{%
\addtocontents{toc}{\protect\@namedef{#1tag}{#2}}%
}
\renewcommand{\cftsecafterpnum}{%
\ifcsname sectiontag\endcsname
\makebox[0pt][r]{\smash{\colorbox{white}{\strut\sectiontag}\hspace{\@pnumwidth}}}%
\global\let\sectiontag\relax
\fi
}
\renewcommand{\cftsubsecafterpnum}{%
\ifcsname subsectiontag\endcsname
\makebox[0pt][r]{\smash{\colorbox{white}{\strut\subsectiontag}\hspace{\@pnumwidth}}}%
\global\let\subsectiontag\relax
\fi
}
\makeatother
\begin{document}
\tableofcontents
\addsectiontag{section}{Test1}
\section{A section}
\addsectiontag{subsection}{Test2}
\subsection{A subsection}
\section{Another section}
\addsectiontag{subsection}{Test3}
\subsection{Another subsection}
\end{document}
由于 ToC 的处理,标签添加被称为前实际的节单元。
为了将分段标签添加到文档主体分段标题,以下内容就足够了:
\documentclass{article}
\usepackage{tocloft,etoolbox,xcolor,hyperref}
\makeatletter
\AtBeginDocument{%
\patchcmd{\tableofcontents}% <cmd>
{\@starttoc}% <search>
{\noindent\hfill{\bfseries Page}\par%
\@starttoc}% <replace>
{}{}% <success><failure>
}
\newcommand{\glet}{\global\let}
\let\sectiontag\relax
\let\subsectiontag\relax
\patchcmd{\H@old@sect}% <cmd>
{#8}% <search>
{#8\hfill\@nameuse{#1tag}\expandafter\glet\csname #1tag\endcsname\relax}% <replace>
{}{}% <success><failure>
% \addsectiontag{<unit>}{<tag>}
\newcommand{\addsectiontag}[2]{%
\addtocontents{toc}{\protect\@namedef{#1tag}{#2}}% Define tag for ToC
\@namedef{#1tag}{#2}% Define tag for section title in document body
}
\renewcommand{\cftsecafterpnum}{%
\ifcsname sectiontag\endcsname
\makebox[0pt][r]{\smash{\colorbox{white}{\strut\sectiontag}\hspace{\@pnumwidth}}}%
\global\let\sectiontag\relax
\fi
}
\renewcommand{\cftsubsecafterpnum}{%
\ifcsname subsectiontag\endcsname
\makebox[0pt][r]{\smash{\colorbox{white}{\strut\subsectiontag}\hspace{\@pnumwidth}}}%
\global\let\subsectiontag\relax
\fi
}
\makeatother
\begin{document}
\tableofcontents
\addsectiontag{section}{Test1}
\section{A section}
\addsectiontag{subsection}{Test2}
\subsection{A subsection}
\section{Another section}
\addsectiontag{subsection}{Test3}
\subsection{Another subsection}
\end{document}
不会测试标签是否适合行内。因此,太宽的标题可能会显示左对齐的标签。
答案2
我重新定义\@dottedtocline
为更像\l@section
。我不明白为什么最后的Text
s 不太对齐。两者都应该正好\@pnumwidth
位于右边距。
\documentclass{article}
\makeatletter
\def\@dottedtocline#1#2#3#4#5{%
\ifnum #1>\c@tocdepth \else
\vskip \z@ \@plus.2\p@
{\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
\parindent #2\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima #3\relax
\advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
{#4}\nobreak\hfil\nobreak% removed \leaders and replaced \hfill
\hb@xt@\@pnumwidth{\hfill\normalfont \normalcolor #5}%
\par}%
\fi}
\makeatother
\begin{document}
\tableofcontents
\section{Test section \hfill{\normalsize\normalfont Text}}
\subsection{Test subsection \hfill{\normalsize\normalfont Text}}
\end{document}