我使用的是 \documentclass{book}。一共有 6 个章节。前 4 个章节有编号,使用 \section{} 创建。后两个章节没有编号,但我使用命令 \addcontentsline{toc}{section}{section name} 人为地向目录中添加了几个章节。我面临的问题是目录。我想要的是以下内容:
在书的开头出现的目录中,前 4 章应以章和节的形式出现。第 5 章和第 6 章应仅以章的形式出现。
在第 5 章中,开头应该有一个目录,该目录以两个多列的形式打印第 5 章中的所有章节。
在第 6 章中,开头应该有一个目录,该目录以两个多列的形式打印第 6 章中的所有章节。
这可能吗?谢谢。
编辑(2023 年 6 月 29 日):我正在对这个问题进行一些编辑,以更新我迄今为止所取得的成就,并借助此处的帖子:etoc 和 toc 的深度不同。我无法完全解决这个问题。通过尝试不同的方法,我能够接近解决方案。但是,该解决方案在某些编译中有效,在其他编译中无效。如果能知道完整的解决方案就太好了。
\documentclass[12pt,a4paper,fleqn]{book}
\usepackage{array}
\usepackage{tocloft}% always load before etoc
\usepackage{etoc}
\usepackage{amsmath,amsfonts,amsthm,mathrsfs,amssymb,amscd,comment,enumerate}
\usepackage[table]{xcolor}
\usepackage{hyperref}
\usepackage{geometry}
\geometry{bindingoffset=1cm}
\hypersetup{
colorlinks = true, %Colours links instead of ugly boxes
urlcolor = red, %Colour for external hyperlinks
linkcolor = blue, %Colour of internal links
citecolor = blue %Colour of citations, could be ``red''
}
\setlength{\textwidth}{20cm}
\setlength{\textheight}{23cm}
\hoffset=-3.0cm
\usepackage{multicol}
\begin{document}
\begin{center}
{\Large {\bf Title \footnote{Footnote}}}
{\bf \today}
{\Large {\bf Title\\}}
\end{center}
\etocsetnexttocdepth{1}
\renewcommand{\contentsname}{Contents}
\tableofcontents
\chapter{Name of chapter 1}
\section{Name of section 1, chapter 1}
\section{Name of section 2, chapter 1} (click on the link)
\chapter{Name of Chapter 2}
\section{Name of section 1, chapter 2}
\section{Name of section 2, chapter 2}
\section{Name of section 3, chapter 2}
\subsection{Subsection}
\section{Name of section 4, chapter 2}
\chapter{Chapter 3}
\section{Name of section 1, chapter 3}
\section{Name of section 2, chapter 3}
\chapter{Name of chapter 4}
\section{Name of section 1, chapter 4}
\section{Name of section 2, chapter 4}
\chapter{Name of chapter 5}
\etocsettocstyle{}{}
\etocsetnexttocdepth{2}
\begin{multicols}{2}
\localtableofcontents
\end{multicols}
\pagebreak
\addcontentsline{toc}{subsection}{L1}
\addcontentsline{toc}{subsection}{L2}
\addcontentsline{toc}{subsection}{L3}
\addcontentsline{toc}{subsection}{L4}
\addcontentsline{toc}{subsection}{L5}
\addcontentsline{toc}{subsection}{L6}
\chapter{Name of chapter 6}
\etocsettocstyle{}{}
\etocsetnexttocdepth{2}
\begin{multicols}{2}
\localtableofcontents
\end{multicols}
\pagebreak
\addcontentsline{toc}{subsection}{M1}
\addcontentsline{toc}{subsection}{M2}
\addcontentsline{toc}{subsection}{M3}
\addcontentsline{toc}{subsection}{M4}
\addcontentsline{toc}{subsection}{M5}
\addcontentsline{toc}{subsection}{M6}
\end{document}
这部分有效,但我不知道如何实现。如果我注释掉第 5 章后面的行“\etocsettocstyle{}{}”,编译两次,然后添加此行,再编译两次,那么我就能得到所需的第 5 章的目录。
在这个文件中,第 6 章的目录从未出现过。虽然它似乎在其他文件中起作用,其中不止一章的本地目录出现了。
答案1
您的 MWE 中存在许多微妙的事情在起作用。
您应该向 etoc 作者发送错误报告,因为我的 TL2023 安装无法检测 tocloft。因此,由于被重新定义,
\etocsetnexttocdepth
因此命令仍然无效。这里最简单的解决方法是使用来处理主目录。\tableofcontents
\tableofcontents
tocloft
\etoctableofcontents
\addcontentsline
由于没有排版材料,您的 MWE 的最后一章的各种内容都被忽略了,因此它们被丢弃了;在现实生活中,这种情况不会发生;修复这个问题\mbox{}
之前的权利\end{document}
就足够了。与环境交互时有一些非常奇怪的事情
multicols
:如下代码
\chapter{Name of chapter 5}
\etocsettocstyle{}{}
\begin{multicols}{2}
\localtableofcontents
\end{multicols}
似乎混淆了 etoc。查看.toc
文件时,命令添加的行的顺序\chapter
和一些看似 etoc 内部的行的顺序被置换了,因此\localtableofcontents
没有打印任何内容。etoc 手册提到了多列并有专门的命令,所以我认为上面的代码应该被替换为
\chapter{Name of chapter 5}
\etocmulticolstyle{}
\etocsetnexttocdepth{2}
\localtableofcontents
或
\chapter{Name of chapter 5}
\etocsetnexttocdepth{2}
\etoclocalmulticol{}
我在试验时对此感到很困惑,因为.toc
文件更新后其效果只会在下一次编译时才生效,因此在更新时一定要编译足够多的次数或隐藏所有辅助文件。关于多列,也许可以查看 etoc 文档,第 II 部分。
这是更新后的 MWE,它结合了上述结论。我注释掉了一些不相关的内容。但请务必阅读下一个更好的提案。
\documentclass[12pt,a4paper,fleqn]{book}
\usepackage{array}
\usepackage{tocloft}% always load before etoc
\usepackage{etoc}
%\usepackage{amsmath,amsfonts,amsthm,mathrsfs,amssymb,amscd,comment,enumerate}
%\usepackage[table]{xcolor}
\usepackage{hyperref}
\usepackage{geometry}
%\geometry{bindingoffset=1cm}
\hypersetup{
colorlinks = true, %Colours links instead of ugly boxes
urlcolor = red, %Colour for external hyperlinks
linkcolor = blue, %Colour of internal links
citecolor = blue %Colour of citations, could be ``red''
}
% \setlength{\textwidth}{20cm}
% \setlength{\textheight}{23cm}
% \hoffset=-3.0cm
\usepackage{multicol}
\begin{document}
\begin{center}
{\Large {\bf Title \footnote{Footnote}}}
{\bf \today}
{\Large {\bf Title\\}}
\end{center}
\etocsetnexttocdepth{1}
\renewcommand{\contentsname}{Contents}
\etoctableofcontents
\chapter{Name of chapter 1}
\section{Name of section 1, chapter 1}
\section{Name of section 2, chapter 1} (click on the link)
\chapter{Name of Chapter 2}
\section{Name of section 1, chapter 2}
\section{Name of section 2, chapter 2}
\section{Name of section 3, chapter 2}
\subsection{Subsection}
\section{Name of section 4, chapter 2}
\chapter{Chapter 3}
\section{Name of section 1, chapter 3}
\section{Name of section 2, chapter 3}
\chapter{Name of chapter 4}
\section{Name of section 1, chapter 4}
\section{Name of section 2, chapter 4}
\chapter{Name of chapter 5}
\etocsetnexttocdepth{2}
\etoclocalmulticol{}
\clearpage
\addcontentsline{toc}{subsection}{L1}
\addcontentsline{toc}{subsection}{L2}
\addcontentsline{toc}{subsection}{L3}
\addcontentsline{toc}{subsection}{L4}
\addcontentsline{toc}{subsection}{L5}
\addcontentsline{toc}{subsection}{L6}
\chapter{Name of chapter 6}
\etocsetnexttocdepth{2}
\etoclocalmulticol{}
\clearpage
\addcontentsline{toc}{subsection}{M1}
\addcontentsline{toc}{subsection}{M2}
\addcontentsline{toc}{subsection}{M3}
\addcontentsline{toc}{subsection}{M4}
\addcontentsline{toc}{subsection}{M5}
\addcontentsline{toc}{subsection}{M6}
\mbox{}
\end{document}
话虽如此,但整个方法似乎存在缺陷。仅出于目录深度的原因使用子节并不是好方法。此外,还有 hyperref 的警告,它不喜欢直接从章节转到子节。
Package hyperref Warning: Difference (2) between bookmark levels is greater
(hyperref) than one, level fixed on input line 105.
因此,这是另一种使用部分的方法。它依赖于深度标签机制,我在 etoc 文档第二部分“内容控制”中找到了该机制。
我们增加
\etocdepthtag.toc{lastchapters}% add a depth tag to toc file
\etocignoredepthtags % ignore etoc depth tags for the local tocs, it will
% obeyed only by main TOC
在文档正文第 4 章之前插入
\etocsettagdepth{lastchapters}{chapter}
在序言中或至少在文档主体的主要目录之前。
\documentclass[12pt,a4paper,fleqn]{book}
\usepackage{array}
\usepackage{tocloft}% always load before etoc
\usepackage{etoc}
%\usepackage{amsmath,amsfonts,amsthm,mathrsfs,amssymb,amscd,comment,enumerate}
%\usepackage[table]{xcolor}
\usepackage{hyperref}
\usepackage{geometry}
%\geometry{bindingoffset=1cm}
\hypersetup{
colorlinks = true, %Colours links instead of ugly boxes
urlcolor = red, %Colour for external hyperlinks
linkcolor = blue, %Colour of internal links
citecolor = blue %Colour of citations, could be ``red''
}
% \setlength{\textwidth}{20cm}
% \setlength{\textheight}{23cm}
% \hoffset=-3.0cm
\usepackage{multicol}
\etocsettagdepth{lastchapters}{chapter}
\begin{document}
\begin{center}
{\Large {\bf Title \footnote{Footnote}}}
{\bf \today}
{\Large {\bf Title\\}}
\end{center}
\renewcommand{\contentsname}{Contents}
\etoctableofcontents
\chapter{Name of chapter 1}
\section{Name of section 1, chapter 1}
\section{Name of section 2, chapter 1} (click on the link)
\chapter{Name of Chapter 2}
\section{Name of section 1, chapter 2}
\section{Name of section 2, chapter 2}
\section{Name of section 3, chapter 2}
\subsection{Subsection}
\section{Name of section 4, chapter 2}
\chapter{Chapter 3}
\section{Name of section 1, chapter 3}
\section{Name of section 2, chapter 3}
\chapter{Name of chapter 4}
\section{Name of section 1, chapter 4}
\section{Name of section 2, chapter 4}
\etocdepthtag.toc{lastchapters}% add a depth tag to toc file
\etocignoredepthtags % ignore etoc depth tags for the local tocs, it will
% obeyed only by main TOC
\chapter{Name of chapter 5}
\etocmulticolstyle{}
\localtableofcontents
% \clearpage
\section{L1}
\section{L2}
\section{L3}
\section{L4}
\section{L5}
\section{L6}
\chapter{Name of chapter 6}
% \etocmulticolstyle{} % already in effect
\localtableofcontents
% \clearpage
\section{M1}
\section{M2}
\section{M3}
\section{M4}
\section{M5}
\section{M6}
\mbox{}
\end{document}
这给出了主目录
并根据需要添加本地目录(也许应该在章节标题和本地目录之间添加一些额外的垂直空间控制)。
关于 tocloft 检测的错误报告应发送给 etoc 作者:最新的 TL2023 导致检测失败。