目录中页码旁边的文本

目录中页码旁边的文本

在我的(子)部分标题中,我习惯\hfill在页面右侧的标题中添加一些文本。我希望此文本也显示在页码旁边的目录中。这对部分很有效,但对子部分无效。我还希望将子部分的点保留在目录中。

\section{Test section \hfill{{\normalsize\normalfont Text}}}

\subsection{Test subsection \hfill{{\normalsize\normalfont Text}}}

我没有对目录做任何修改。

目录

答案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。我不明白为什么最后的Texts 不太对齐。两者都应该正好\@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}

目录

相关内容