如何使回忆录的 \tableofcontents 默认表现得像带星号的 \tableofcontents* 一样?

如何使回忆录的 \tableofcontents 默认表现得像带星号的 \tableofcontents* 一样?

我正在编写一个基于的类memoir,它提供\tableofcontents(在目录中列出目录)和\tableofcontents*(不在目录中列出目录)。

我见过这个问题及其许多重复项,但我想阻止目录本身在目录中列出,无论用户选择如何\tableofcontents* 对阵 \tableofcontents

根据memoir手册(第 9.2 节),我目前正在etoolbox使用

\pretocmd{\tableofcontents}{\begin{KeepFromToc}}{}{<class warning omitted>}
\apptocmd{\tableofcontents}{\end{KeepFromToc}}{}{<class warning omitted>}

其工作符合预期(带星号和不带星号的版本均不会写入目录条目)。

这是推荐的方法吗?这种方法是否有我没想到的不良副作用?

以下是您可能希望进行的任何测试的 MWE:

\documentclass{memoir}
\usepackage{etoolbox}

\pretocmd{\tableofcontents}{\begin{KeepFromToc}}{}{}
\apptocmd{\tableofcontents}{\end{KeepFromToc}}{}{}

\begin{document}

\tableofcontents   
\chapter{Test Chapter}
\section{Test Section}

\end{document}

答案1

\tableofcontents命令定义为

> \tableofcontents=macro:
->\@ifstar {\@nameuse {mem@tableofcontents}{01}}{\@nameuse {mem@tableofcontents}{00}}.

我不得不使用\show\tableofcontents,因为定义是间接的,通过

\newlistof{tableofcontents}{toc}{\contentsname}

因此

\makeatletter
\renewcommand{\tableofcontents}{%
  \@ifstar{\mem@tableofcontents{01}}
          {\mem@tableofcontents{01}}%
}
\makeatother

会做。

完整示例:

\documentclass{memoir}
\makeatletter
\renewcommand{\tableofcontents}{%
  \@ifstar{\mem@tableofcontents{01}}
          {\mem@tableofcontents{01}}%
}
\makeatother

\begin{document}

\tableofcontents
\chapter{Test Chapter}
\section{Test Section}

\end{document}

有了\tableofcontents*它就是一样的。

答案2

如果没有该etoolbox包,你可以执行以下操作:

\documentclass{memoir}

\makeatletter
\let\oldtableofcontents\tableofcontents
\def\tableofcontents{\@ifstar{\oldtableofcontents*}{\oldtableofcontents*}}
\makeatother

\begin{document}

\tableofcontents  
\chapter{Test Chapter}
\section{Test Section}

\end{document}

(当然,在您的.cls文件中您不需要\makeatletter, \makeatother)。

相关内容