Я пишу класс на основе memoir
, который предоставляет \tableofcontents
(который перечисляет ToC внутри ToC) и \tableofcontents*
(который не перечисляет ToC внутри ToC).
Я виделэтот вопроси его многочисленные дубликаты, но я хочу предотвратить само перечисление Оглавления в Оглавлении независимо от выбора пользователя\tableofcontents*
против. \tableofcontents
.
На основании memoir
руководства (Раздел 9.2) я в настоящее время использую etoolbox
для выполнения
\pretocmd{\tableofcontents}{\begin{KeepFromToc}}{}{<class warning omitted>}
\apptocmd{\tableofcontents}{\end{KeepFromToc}}{}{<class warning omitted>}
что работает так, как и ожидалось (варианты как со звездочкой, так и без нее не создают запись в ToC).
Это рекомендуемый способ? Имеет ли этот метод какие-либо плохие побочные эффекты, о которых я не подумал?
Ниже приведен 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
).