我的文档无法生成目录。
这是 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
它来在目录中引入“章节”一词。