我有一个包含许多章节、许多节和小节的大型文档。(每个问题一个小节),每个节中可能有数百个问题。
我习惯\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}
{}
% **********************************************************
评论
您只能修改本地目录的子部分的格式(例如,设置较小的缩进)
...
\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}}{}
....