我想用 amsbook 类显示两个目录:考虑以下 MWE,
\documentclass{amsbook}
\usepackage{shorttoc}
\title{Title}
\begin{document}
\maketitle
\shorttoc{Contents}{1}
\setcounter{tocdepth}{3}
\renewcommand*\contentsname{Contents (detailed)}
\tableofcontents
\chapter{Chapter}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
Some subsubsection text
\end{document}
这不能编译,但有趣的是,只有在编译两次之后才能编译:如果我不使用命令进行编译,\shorttoc
我会像往常一样生成目录;然后我取消注释\shorttoc
,它仍然可以编译,现在正确地生成两个目录;然后我再次编译并出现以下错误。
! Missing control sequence inserted.
<inserted text>
\inaccessible
l.1 ...tents}}}\xdef {}{}{}\mark {}\endgroup }}{3}
%
Please don't say `\def cs{...}', say `\def\cs{...}'.
I've inserted an inaccessible control sequence so that your
definition will be completed without mixing me up too badly.
You can recover graciously from this error, if you're
careful; see exercise 27.2 in The TeXbook.
) [3
] [4
]
Contents (detailed)
(./MWE.toc
这是 shorttoc 和 amsbook 不兼容吗?有没有变通办法来拥有两个目录?我都不打算使用shorttoc
。但是etoc
,tocloft
等似乎会给 AMS 类带来其他问题。
答案1
下面我定义\firstToC
打印第一个目录和\secondToC
打印第二个目录。第一个关闭覆盖.toc
(设置\@fileswfalse
,本地)。第二个删除在目录中打印目录(同样,本地)。
\documentclass{amsbook}
\makeatletter
\newcommand{\firstToC}{{%
\@fileswfalse% Don't overwrite the current ToC
\@starttoc{toc}\contentsname
}}
\newcommand{\secondToC}{{%
\renewcommand{\@tocwrite}[2]{}% Don't write ToC to ToC
\renewcommand{\contentsname}{Contents (detailed)}%
\@starttoc{toc}{\contentsname}%
}}
\makeatother
\begin{document}
\setcounter{tocdepth}{1}%
\firstToC
\setcounter{tocdepth}{3}%
\secondToC
\chapter{Chapter}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
Lorem ipsum\ldots
\end{document}
答案2
\starttoc
为了使其兼容,需要进行一些更改amsbook
:
- 我们希望避免它在目录中写入条目,这
\chapter*
通常是在amsbook
; - 我们不希望它主动设置标题,因为
amsbook
无论如何它都会处理好业务。
\documentclass{amsbook}
\usepackage{shorttoc}
\makeatletter
\renewcommand\shorttoc[2]{%
\begingroup
\c@tocdepth=#2\relax
\@restonecolfalse
\if@tightshtoc
\parsep\z@
\fi
\if@twocolumn\@restonecoltrue\onecolumn\fi
\renewcommand\@tocwriteb[3]{}%
\chapter*{#1}%
\@startshorttoc{toc}\if@restonecol\twocolumn\fi
\endgroup
}
\makeatother
\title{Title}
\begin{document}
\maketitle
\shorttoc{Contents}{1}
\setcounter{tocdepth}{3}
\renewcommand*\contentsname{Contents (detailed)}
\tableofcontents
\chapter{Chapter}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
Some subsubsection text
\end{document}
的重新定义\shorttoc
本质上与包中的相同,但是
\@tocwriteb
已(本地)禁用,以便不生成目录条目\chapter*{#1}
没有发出\@mkboth
。