删除回忆录中多余的目录页码

删除回忆录中多余的目录页码

此处讨论了删除冗余页码的问题(即,在一部作品的目录中,某一页重复出现在另一页之后,而同一页上有较短的章节)。(抑制目录中的冗余页码) 和这里 (从目录中删除重复的页码),但回复都处理不了tocloft,我无法让它们工作memoir。可以在 中执行此操作吗memoir

因此,我想要这个代码:

\documentclass{memoir}
\begin{document}
\tableofcontents\clearpage
\section{Test}
\section{test}
\subsection{test}
\subsection{test}\clearpage\subsubsection{test}\section{test}
\subsection{test}\section{test}
\end{document}

目前生产

在此处输入图片描述

而是生成:在此处输入图片描述

答案1

由于tocloftmemoir是同一作者,大多数tocloft解决方案都适用于memoir,但名称略有变化。大致来说,tocloft使用缩写的节名称(如、chap等)通常使用名称的完整版本。因此,下面是显示的方法secsubsecmemoir这里适用于memoir。您需要将补丁应用到您希望它工作的每个部分级别。在您的例子中,由于您根本不想显示页码,因此根本不需要使用代码\textcolor{},但我已在注释代码中保留了该选项。

由于原始代码(不是我写的)实际上使用了显示的页码,因此如果页码不是阿拉伯数字,则它会失败,这意味着如果您放入\frontmatter文档中,它会失败,因为页码设置为罗马数字。我现在已经修复了这个问题,并大幅清理了代码以处理重复的罗马或阿拉伯页码。

\documentclass{memoir}
\settocdepth{subsection}
\setsecnumdepth{subsection}
\ExplSyntaxOn
% this function from https://tex.stackexchange.com/a/427559/
\prg_new_protected_conditional:Npnn \if_is_int:n #1 { T, F, TF }
  {
    \regex_match:nnTF { ^[\+\-]?[\d]+$ } {#1}% $
      { \prg_return_true: }
      { \prg_return_false: }
  }
\int_new:N\l_clrize_svpage_int
\int_set:Nn\l_clrize_svpage_int{0}
\NewDocumentCommand{\resetsvpage}{}{\int_set:Nn\l_clrize_svpage_int{0}}
\cs_new:Npn\clrize#1{
\if_is_int:nTF{#1}
    {\int_set:Nn\l_tmpa_int{#1}}
    {\int_set:Nn\l_tmpa_int{\int_from_roman:n{#1}}}
\int_compare:nNnTF{\l_tmpa_int}={\l_clrize_svpage_int}
    {}
%   Instead of the previous line, use the next line
%   to change the colour of the page number instead
%   {\textcolor{white}{#1}}
    {#1\int_gset:Nn \l_clrize_svpage_int {\l_tmpa_int}}
}
\ExplSyntaxOff
\usepackage{xpatch}
\usepackage{xcolor}
\xpatchcmd\cftchapterfillnum{#1}{\clrize{#1}}{}{}
\xpatchcmd\cftsectionfillnum{#1}{\clrize{#1}}{}{}
\xpatchcmd\cftsubsectionfillnum{#1}{\clrize{#1}}{}{}
\pretocmd{\mainmatter}{\addtocontents{toc}{\resetsvpage}}


\makeatother
\begin{document}
\frontmatter
\tableofcontents
\listoffigures
\mainmatter
\chapter{A chapter}
\section{Test}
\clearpage
\section{test}
\subsection{test}
\subsection{test}
\section{test}
\clearpage
\subsubsection{test}
\section{test}
\subsection{test}
\section{test}
\end{document}

代码输出

相关内容