此处讨论了删除冗余页码的问题(即,在一部作品的目录中,某一页重复出现在另一页之后,而同一页上有较短的章节)。(抑制目录中的冗余页码) 和这里 (从目录中删除重复的页码),但回复都处理不了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
由于tocloft
和memoir
是同一作者,大多数tocloft
解决方案都适用于memoir
,但名称略有变化。大致来说,tocloft
使用缩写的节名称(如、chap
等)通常使用名称的完整版本。因此,下面是显示的方法sec
subsec
memoir
这里适用于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}