etoc 软件包中的 localtableofcontents 存在问题

etoc 软件包中的 localtableofcontents 存在问题

我有一个包含许多章节、许多节和小节的大型文档。(每个问题一个小节),每个节中可能有数百个问题。

我习惯\localtableofcontents在每个部分都制作目录。但是目录过一段时间就会变得拥挤不堪,小节编号开始向右移动到小节名称上方。

下面我展示了一个 MWE。但这是一个示例的屏幕截图。

在此处输入图片描述

为了重现这种情况,我制作了这个 MWE,它生成了很多章节和节,对于最后一节,我添加了\localtableofcontents。这需要至少编译两次才能看到问题,以便构建目录。

\documentclass[12pt]{book}
\usepackage{tocloft}
\usepackage{etoc} 
\usepackage{ifthen}
\newcounter{int}

\begin{document}          
\setcounter{int}{1}
\loop
\chapter{This is my chapter number \theint}
stuff
\addtocounter{int}{1}
\ifnum \value{int}<45
\repeat

\setcounter{int}{1}
\loop
\section{This is my section number \theint}
stuff
\addtocounter{int}{1}
\ifnum \value{int}<100
\repeat

\etocsetnexttocdepth{2}
\etocsettocstyle{\subsection*{Local contents}}{}
\cftsubsecindent 0pt
\localtableofcontents

\setcounter{int}{1}
\loop
\subsection{This is my subsection number \theint}
stuff
\addtocounter{int}{1}
\ifnum \value{int}<1000
\repeat

\end{document}

编译上述内容并查看最后一节的 pdf,目录如下所示

在此处输入图片描述

要如何改变才能使左边的数字不超过小节名称?

TL 2021,并且仅使用 lualatex。


更新

我发现使用下面给出的解决方案会产生一些副作用。它会影响主文档内容的主表。这是一个例子。如果不使用下面显示的宏,这就是结果,这是预期的结果

\documentclass[12pt]{book}
\usepackage{tocloft}
\usepackage{etoc}  
\begin{document}           
\title{my title}
\maketitle
\tableofcontents
 
\chapter{ chapter one}       
\section{ Test file number 34}
Test folder name

\section{ Test file number 35}
Test folder name    
\end{document}

在此处输入图片描述

现在,在添加下面答案中给出的宏之后,这是主目录的输出。注意区别

\documentclass[12pt]{book}
\usepackage{tocloft}
\usepackage{etoc}  

\newlength{\npageW}
\settowidth{\npageW}{99999} % width of the page number box
\newlength{\subnumberW}
\settowidth{\subnumberW}{999.999.999} % width of the subsection number box<<<<

\newcommand*{\DotsAndPage}
{\nobreak\leaders\hbox{\normalsize\hbox to 1.75ex {\hss.\hss}}% make dots
\hfill\nobreak\rlap{\makebox[\npageW]{\etocpage}}\par}

\etocsetstyle{subsection}
{}
{\normalfont\addvspace{.5ex}\noindent\setlength{\leftskip}{7em}\setlength{\rightskip}{2em}}
{\llap{\makebox[\subnumberW][l]{\etocnumber}}\etocname\DotsAndPage}
{}    

\begin{document}           
\title{my title}
\maketitle
\tableofcontents
 
\chapter{ chapter one}       
\section{ Test file number 34}
Test folder name

\section{ Test file number 35}
Test folder name    
\end{document}

在此处输入图片描述

为什么主文档目录会发生变化?我只想更改该部分的本地目录以解决间距问题。

答案1

您可以为子部分定义样式(在本例中),例如

%% ***************************************** added <<<<
\usepackage{showframe} % only to show margins <<<<<<<<<

\newlength{\npageW}
\settowidth{\npageW}{99999} % width of the page number box
\newlength{\subnumberW}
\settowidth{\subnumberW}{999.999.999} % width of the subsection number box<<<<

\newcommand*{\DotsAndPage}
{\nobreak\leaders\hbox{\normalsize\hbox to 1.75ex {\hss.\hss}}% make dots
\hfill\nobreak\rlap{\makebox[\npageW]{\etocpage}}\par}

\etocsetstyle{subsection}
{}
{\normalfont\addvspace{.5ex}\noindent\setlength{\leftskip}{7em}\setlength{\rightskip}{2em}}
{\llap{\makebox[\subnumberW][l]{\textit{\etocnumber}}}\etocname\DotsAndPage}
{}
%**********************************************************

每个\etocsetstyle命令有五个强制参数:

\etocsetstyle{⟨levelname⟩}{⟨start⟩}{⟨prefix⟩}{⟨contents⟩}{<finish>}

经过两次编译后:

埃

这是完整的代码。

\documentclass[12pt]{book}
\usepackage{tocloft}
\usepackage{etoc} 
\usepackage{ifthen}
\newcounter{int}

%% ***************************************** added <<<<
\usepackage{showframe} % only to show margins <<<<<<<<<

\newlength{\npageW}
\settowidth{\npageW}{99999} % width of the page number box
\newlength{\subnumberW}
\settowidth{\subnumberW}{999.999.999} % width of the subsection number box<<<<

\newcommand*{\DotsAndPage}
{\nobreak\leaders\hbox{\normalsize\hbox to 1.75ex {\hss.\hss}}% make dots
\hfill\nobreak\rlap{\makebox[\npageW]{\etocpage}}\par}

\etocsetstyle{subsection}
{}
{\normalfont\addvspace{.5ex}\noindent\setlength{\leftskip}{7em}\setlength{\rightskip}{2em}}
{\llap{\makebox[\subnumberW][l]{\textit{\etocnumber}}}\etocname\DotsAndPage}
{}
%**********************************************************

\begin{document}    
    
              
    \setcounter{int}{1}
    \loop
    \chapter{This is my chapter number \theint}
    stuff
    \addtocounter{int}{1}
    \ifnum \value{int}<45
    \repeat
    
    \setcounter{int}{1}
    \loop
    \section{This is my section number \theint}
    stuff
    \addtocounter{int}{1}
    \ifnum \value{int}<100
    \repeat
    
    \etocsetnexttocdepth{2}
    \etocsettocstyle{\subsection*{Local contents}}{}
    \cftsubsecindent 0pt
    \localtableofcontents
    \setcounter{int}{1}
    \loop
    \subsection{This is my subsection number \theint}
    stuff
    \addtocounter{int}{1}
    \ifnum \value{int}<1000
    \repeat
    
\end{document}

更新在后续问题之后。

在实践中,有必要定义上层级别:节和章,以获得连贯的目录,同时考虑到节和小节的最大位数。

例如

%% ***************************************** added <<<<
\usepackage{showframe} % only to show margins <<<<<<<<< 
    
\newlength{\chapterW}
\settowidth{\chapterW}{999} % width of the chapter number box   
\newlength{\pageW}
\settowidth{\pageW}{99999} % width of the page number box
\newlength{\snumberW}
\settowidth{\snumberW}{999.999} % width of the section number box<<<<
\newlength{\subnumberW}
\settowidth{\subnumberW}{999.999.999} % width of the subsection number box<<<<

\newcommand*{\DotsAndPage}
{\nobreak\leaders\hbox{\normalsize\hbox to 1.75ex {\hss.\hss}}% make dots
    \hfill\nobreak\rlap{\makebox[\pageW]{\etocpage}}\par}

\etocsetstyle{subsection}
{}
{\normalfont\addvspace{.5ex}\noindent\setlength{\leftskip}{\dimexpr \chapterW + \snumberW + 5.5em}\setlength{\rightskip}{2em}}
{\llap{\makebox[\subnumberW][l]{\textit{\etocnumber}}}\etocname\DotsAndPage}
{}

\etocsetstyle{section}
{}
{\normalfont\addvspace{.5ex}\noindent\setlength{\leftskip}{\dimexpr \chapterW + 3.5em}\setlength{\rightskip}{2em}}
{\llap{\makebox[\snumberW][l]{\textit{\etocnumber}}}\etocname\DotsAndPage}
{}

\etocsetstyle{chapter} 
{}
{\bfseries\addvspace{.8ex}\setlength{\leftskip}{1.5em}\setlength{\rightskip}{2em}\noindent}
{\llap{\makebox[\chapterW][l]{\etocnumber}}\etocname \hfill\nobreak\rlap{\makebox[\pageW]{\etocpage}}\par}
{}  
%   **********************************************************

X

是

评论

您只能修改本地目录的子部分的格式(例如,设置较小的缩进)

      ...
    \etocsetnexttocdepth{2}     
    \etocsetstyle{subsection}
    {}
    {\normalfont\addvspace{.5ex}\noindent\setlength{\leftskip}{7em}\setlength{\rightskip}{2em}}
    {\llap{\makebox[\subnumberW][l]{\textit{\etocnumber}}}\etocname\DotsAndPage}
    {}      
    \etocsettocstyle{\subsection*{Local contents}}{}
    ....

相关内容