目录不起作用

目录不起作用

我的文档无法生成目录。

这是 Nickie 建议的最新 MWE(可能翻译有误,我不知道)。当我使用 pdflatex 在 TeXworks 中编译它时,它不会生成目录。我输入了一些示例文本来测试我使用的功能是否仍然有效(例如链接),结果确实如此。但目录仍然没有显示。

\documentclass[12pt]{book}
\usepackage[usenames,dvipsnames]{color}
\usepackage{titlesec}
\definecolor{DeepPink}{rgb}{0.8,0,0.4}
\definecolor{DarkRed}{rgb}{0.5,0,0}
\definecolor{DarkBlue}{rgb}{0,0,0.5}
\titleformat{\chapter}
  {\normalfont\LARGE\bfseries\color{DarkBlue}}{\thechapter.}{1em}{}

\makeatletter
% copied from mwe
\renewcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
   \thispagestyle{plain}%
   \global\@topnum\z@
   \@afterindentfalse
   \secdef\@chapter\@schapter}

% copied from book.cls and modified
\def\@chapter[#1]#2{%
  \ifnum \c@secnumdepth >\m@ne
    \if@mainmatter
      \refstepcounter{chapter}%
      \typeout{\@chapapp\space\thechapter.}%
      \addtocontents{toc}{\string\contentsline {chapter}%
        {\hbox to .65in{Chapter}\protect\numberline{\thechapter}#1}{\thepage}}%
    \else
      \addtocontents{toc}{\string\contentsline {chapter}%
        {\hbox to .65in{Chapter}\protect\numberline{\thechapter}#1}{\thepage}}%
    \fi
  \else
    \addtocontents{toc}{\string\contentsline {chapter}%
      {\hbox to .65in{Chapter}\protect\numberline{\thechapter}#1}{\thepage}}%
  \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

\usepackage[colorlinks,citecolor=DeepPink,linkcolor=DarkRed,urlcolor=DarkBlue]{hyperref}

\begin{document}
\frontmatter
\tableofcontents
\mainmatter

\chapter{C++ First Blood}

This is a test.

Review Questions
\begin{enumerate}
\item What color is George Washington's white horse?
\item What function is the entry point to every C++ program?
\end{enumerate}

\href{http://en.wikipedia.org/wiki/Graph_theory}{Graph Theory}

\chapter{Java: More Delicious than C++}

\chapter{Python Swallows Those other Languages, Whole}
\chapter{D for Those who Cannot Spell C++}

\end{document}

答案1

问题在于您重新定义的方式\@chapter与 不兼容hyperref。如果您注释掉hyperref之前的 loading 行,您可以立即看到这一点\begin{document}

hyperref包与包含参考的所有内容打交道;目录中的行只是其中之一。它通过重新定义诸如 之类的命令来实现这一点\addcontentsline,有效地为所有参考添加超链接。hyperref加载后,命令\contentsline(通常需要 3 个参数)还需要第四个参数:行链接到的锚点。在您的例子中,您的 定义直接\@chapter使用\contentsline并且仅提供三个参数。第四个参数永远不会被 引入hyperref,因此 latex 会在读取文件时抱怨它丢失了toc

一个立即有效的解决方案是替换定义中的以下行(出现三次)\@chapter

      \addtocontents{toc}{\string\contentsline {chapter}%
        {\hbox to .65in{Chapter}\protect\numberline{\thechapter}#1}{\thepage}}%

与未明确使用的等效方法\contentsline

      \addcontentsline{toc}{chapter}% 
        {\hbox to .68in{Chapter}\protect\numberline{\thechapter}#1}

(我在这里更改了宽度以避免 过满\hbox。)这将有hyperref机会正确地将第四个参数引入\contentsline。现在,hyperref(实际上是 PDF 驱动程序)将警告您不应\hbox在内容行中使用 ,但您可以忍受它。

当然,要查看目录,您需要pdflatex多次调用。我推荐该latexmk实用程序:通过运行latexmk -pdf yourfile.tex您的 PDF 将自动生成。

我理解您唯一想要的改变(与book.cls通常所做的不同)是在目录中的章节标题前引入“章节”一词。如果是这样,可能更好的解决方案是保留和的定义\chapter不变\@chapter,并重新定义\l@chapter(由使用\contentsline)以满足您的需求。

一个更好的解决方案titlesec是,当您已经使用该包时,也使用titletoc它来在目录中引入“章节”一词。

相关内容