在目录中将章节设置为节级

在目录中将章节设置为节级

我有:

\chapter{My first chapter}
\chapter{My second chapter}
\phantomsection
\addcontentsline{toc}{chapter}{Appendixes}
\appendix
\makeatletter
\def\toclevel@chapter{1}\def\toclevel@section{2}
\makeatother
\chapter{My first appendix}
\chapter{My second appendix}

所以我的hyperref目录如下所示:

- My first chapter
- My second chapter
+ Appendixes
  - My first appendix
  - My second appendix

但我的\tableofcontents看起来仍然是这样的:

1 My first chapter
2 My second chapter
Appendixes
A My first appendix
B My second appendix

我想要的是附录看起来像章节:

1 My first chapter
2 My second chapter
Appendixes
  A My first appendix
  B My second appendix

我可以弄清楚,有一个非常小的技巧可以完成这项工作,但我找不到它......

答案1

设置\l@chapterl@section

\documentclass{book}
\usepackage{hyperref}

\begin{document}

\tableofcontents
\chapter{My first chapter}
\chapter{My second chapter}

\phantomsection
\addcontentsline{toc}{chapter}{Appendixes}
\appendix
\def\toclevel@chapter{1}\def\toclevel@section{2}
\addtocontents{toc}{\string\let\string\l@chapter\string
\l@section}
\chapter{My first appendix}
\chapter{My second appendix}

\end{document}

答案2

您可以重新定义\@chapter(如所使用的文档类中实现的那样)使用\addcontentsline{toc}{section}{...}而不是\addcontentsline{toc}{chapter}{...}。以下是 重新定义的一个示例book.cls

\documentclass{book}
\usepackage{hyperref}

\begin{document}

\tableofcontents
\chapter{My first chapter}
\chapter{My second chapter}

\phantomsection
\addcontentsline{toc}{chapter}{Appendixes}
\appendix
\makeatletter
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
                       \if@mainmatter
                         \refstepcounter{chapter}%
                         \typeout{\@chapapp\space\thechapter.}%
                         \addcontentsline{toc}{section}%
                                   {\protect\numberline{\thechapter}#1}%
                       \else
                         \addcontentsline{toc}{section}{#1}%
                       \fi
                    \else
                      \addcontentsline{toc}{section}{#1}%
                    \fi
                    \chaptermark{#1}%
                    \addtocontents{lof}{\protect\addvspace{10\p@}}%
                    \addtocontents{lot}{\protect\addvspace{10\p@}}%
                    \if@twocolumn
                      \@topnewpage[\@makechapterhead{#2}]%
                    \else
                      \@makechapterhead{#2}%
                      \@afterheading
                    \fi}
\makeatother

\chapter{My first appendix}
\chapter{My second appendix}

\end{document}

以下是最终的目录:

在此处输入图片描述

和书签 pabel:

在此处输入图片描述

答案3

以下是 Gonzalo 答案的精简版本,使用regexpatch。它用 修补了{toc}{chapter}中的第一次出现,产生相同的结果:\Hy@org@chapter{toc}{section}

\documentclass{book}
\usepackage{hyperref}% http://ctan.org/pkg/hyperref
\usepackage{regexpatch}% http://ctan.org/pkg/regexpatch

\begin{document}

\tableofcontents
\chapter{My first chapter}
\chapter{My second chapter}

\phantomsection
\addcontentsline{toc}{chapter}{Appendixes}
\appendix
\makeatletter
\xpatchcmd{\Hy@org@chapter}{{toc}{chapter}}{{toc}{section}}{}{}%
\makeatother

\chapter{My first appendix}
\chapter{My second appendix}

\end{document}

如果您不仅希望\chapter在节级打印 s,而且还希望将整个层次结构向下推一级,那么事情就会变得有点混乱。具体来说,因为节单元都由一个名为 的宏控制(可能是因为它们对所有基本文档类都通用)\@startsection。因此,可以重新定义或修补每个节单元的宏的“类型”或“级别”。这对hyperref。 例如:

\xpatchcmd{\section}{section}{subsection}{}{}
\xpatchcmd{\subsection}{subsection}{subsubsection}{}{}
\xpatchcmd{\subsubsection}{subsubsection}{paragraph}{}{}
\xpatchcmd{\paragraph}{paragraph}{subparagraph}{}{}

当然,没有可以降级的级别\subparagraph,但希望该级别的细节不包含在您的目录中。


如果以上所有内容都应该本地化,以便您可以在需要时轻松恢复到默认布局,那么我建议复制任何宏修补它们:

\let\storedchapter\Hy@org@chapter
\let\storedsection\section
\let\storedsubsection\subsection
\let\storedsubsubsection\subsubsection
\let\storedparagraph\paragraph

这样,如果需要的话,您可以稍后恢复该过程。

答案4

这是另一种解决方案。它使用在您选择的级别上addcontentsline插入,并使用带星号的变体排版带有格式的标题,而不在目录中添加任何内容。使用 letltxmacro 是因为否则我会得到循环引用。chapterchapter

\documentclass{book}
\usepackage{hyperref}
\usepackage{letltxmacro}

\begin{document}

\tableofcontents
\chapter{My first chapter}
\chapter{My second chapter}

\LetLtxMacro{\chapNoToc}{\chapter*}
\renewcommand{\chapter}[1]{%
\chapNoToc*{#1}
\phantomsection
\markboth{#1}{#1}
\addcontentsline{toc}{section}{#1}%
}

\chapter{My first appendix}
\chapter{My second appendix}

\end{document}

这个解决方案可以扩展以支持chapters可选参数,但是我不知道如何根据我脑海中后者的存在来插入第一个参数或可选参数。

保存后再恢复可能是一个好主意。\chapter在重新定义之前添加并使用它恢复默认章节行为。\LetLtxMacro\LetLtxMacro{\oldChapter}{\chapter}\chapter\LetLtxMacro{\chapter}{\oldChapter}

相关内容