我正在编写一个基于的类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
)。