メモワールの \tableofcontents をデフォルトで星印付きの \tableofcontents* のように動作させるにはどうすればよいですか?

メモワールの \tableofcontents をデフォルトで星印付きの \tableofcontents* のように動作させるにはどうすればよいですか?

私は に基づいてクラスを作成しています。memoirこのクラスは、\tableofcontents(ToC 内に ToC をリストします) と\tableofcontents*(ToC 内に ToC をリストしません) を提供します。

私は見たこの質問重複している部分が多いのですが、ユーザーの選択に関係なく目次自体が目次にリストされるのを防ぎたいのです。\tableofcontents* \tableofcontents

マニュアル(セクション9.2)に基づいてmemoir、私は現在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

関連情報