Como fazer com que o \tableofcontents do livro de memórias se comporte como \tableofcontents* estrelado por padrão?

Como fazer com que o \tableofcontents do livro de memórias se comporte como \tableofcontents* estrelado por padrão?

Estou escrevendo uma classe baseada em memoir, que fornece \tableofcontents(que lista o ToC dentro do ToC) e \tableofcontents*(que não lista o ToC dentro do ToC).

Eu tenho vistoessa questãoe suas muitas duplicatas, mas quero evitar que o Índice seja listado no Índice, independentemente da escolha do usuário.\tableofcontents* vs. \tableofcontents.

Com base no memoirmanual (Seção 9.2), estou usando atualmente etoolboxpara fazer

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

que funciona conforme o esperado (tanto as variantes com estrela quanto as sem estrela não escrevem uma entrada de ToC).

Esta é uma maneira recomendada de fazer isso? Este método tem algum efeito colateral ruim que eu não tenha pensado?

Aqui está um MWE para qualquer teste que você queira fazer:

\documentclass{memoir}
\usepackage{etoolbox}

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

\begin{document}

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

\end{document}

Responder1

O \tableofcontentscomando é definido como

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

Tive que usar \show\tableofcontents, porque a definição é indireta, via

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

Por isso

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

vai fazer.

Exemplo completo:

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

\begin{document}

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

\end{document}

Com \tableofcontents*isso seria a mesma coisa.

Responder2

Sem o etoolboxpacote, você pode fazer algo assim:

\documentclass{memoir}

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

\begin{document}

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

\end{document}

(claro, no seu .clsarquivo você não precisa de \makeatletter, \makeatother).

informação relacionada