如何在回忆录中实现以下简单的目录?
Introduction
0.1. First section
1. First chapter
1.1. First section
1.1.1. First subsection
12. 12th chapter
12.1. First section
12.1.1. First subsection
最好避免使用额外的包。
\documentclass{memoir}
%% delete boxes
\renewcommand\numberlinebox[2]{#2} % for sections
\renewcommand\chapternumberlinebox[2]{#2} % for chapters
%% set dot and space
\renewcommand\cftchapteraftersnum{.\space}
\renewcommand\cftsectionaftersnum{.\space} \renewcommand\cftsubsectionaftersnum{.\space} \renewcommand\cftsubsubsectionaftersnum{.\space}
%%enumeration levels in the ToC and text
\settocdepth{subsection}
\setsecnumdepth{subsubsection}
\setrmarg{2.55em plus1fil} %hyphenation is forbidden
\begin{document}
\tableofcontents
\chapter*{Introduction}
\addcontentsline{toc}{chapter}{Introduction}
\chapter{First chapter}
\section{First section long long long long long long long long long long long long title}
\subsection{First subsection long long long long long long long long long long long long title}
\setcounter{chapter}{11}
\chapter{Another chapter long long long long long long long long long long long long title}
\section{First section long long long long long long long long long long long long title}
\subsection{First subsection long long long long long long long long long long long long title}
\subsection*{Short conclusion with long long long long long long long long long long long long title}
\addcontentsline{toc}{susubsection}{Short conclusion}
\end{document}
1 型该方法可以实现与我需要的最简单的 ToC 非常接近的效果boxed
。
我如何\quad
用标准替换数字和标题之间的所有间距\space
?
也许,从盒子的右侧替换\hfil
到左侧会产生理想的效果。
相关问题: 如何右对齐回忆录目录中的章节编号?
UD2型
简介中的 0.1 小节应缩进为 1.1 小节。
如果您想要考虑 UPD3,请按照@Werner 的建议使用以下代码,而不是使用etoolbox
:
\renewcommand{\mempreaddchaptertotochook}{%
\addtocontents{toc}{%
\protect\settowidth{\protect\cftchapternumwidth}{\cftchapterfont \thechapter.\space}%
\protect\setlength{\protect\cftsectionindent}{\protect\cftchapternumwidth}%
}%
}
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\@m@mschapter}% <cmd>
{\@schapter}% <search>
{\addtocontents{toc}{\protect\settowidth{\protect\cftsectionindent}{\protect\cftchapterfont \thechapter.\space}}%
\@schapter}% <replace>
{}{}% <success><failure>
\patchcmd{\M@sect}% <cmd>
{\addcontentsline}% <search>
{\addtocontents{toc}{%
\protect\settowidth{\csname cft#1numwidth\endcsname}{\csname cft#1font\endcsname\csname the#1\endcsname.\space}%
\protect\setlength{\csname cftsub#1indent\endcsname}{\protect\dimexpr\csname cft#1numwidth\endcsname+\csname cft#1indent\endcsname}%
}%
\addcontentsline}% <replace>
{}{}% <success><failure>
\makeatother
UPD3
如果您尝试替换某些命令,输出可能是不可预测的!
非常感谢@Werner 和@jfbu!
答案1
以下代码添加了\chapter
和(子)的钩子\section
,以便在每次调用写入 ToC 的分段单元时将间距更新直接插入到 ToC 中:
\documentclass{memoir}
\renewcommand{\mempreaddchaptertotochook}{%
\addtocontents{toc}{%
\protect\settowidth{\protect\cftchapternumwidth}{\cftchapterfont \thechapter.\space}%
\protect\setlength{\protect\cftsectionindent}{\protect\cftchapternumwidth}%
}%
}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\M@sect}% <cmd>
{\addcontentsline}% <search>
{\addtocontents{toc}{%
\protect\settowidth{\csname cft#1numwidth\endcsname}{\csname cft#1font\endcsname \csname the#1\endcsname.\space}%
\protect\setlength{\csname cftsub#1indent\endcsname}{\protect\dimexpr\csname cft#1numwidth\endcsname+\csname cft#1indent\endcsname}%
}%
\addcontentsline}% <replace>
{}{}% <success><failure>
\makeatother
%% delete boxes
\renewcommand\numberlinebox[2]{#2} % for sections
\renewcommand\chapternumberlinebox[2]{#2} % for chapters
%% set dot and space
\renewcommand\cftchapteraftersnum{.\space}
\renewcommand\cftsectionaftersnum{.\space}
\renewcommand\cftsubsectionaftersnum{.\space}
\renewcommand\cftsubsubsectionaftersnum{.\space}
%%enumeration levels in the ToC and text
\settocdepth{subsection}
\setsecnumdepth{subsubsection}
\setrmarg{2.55em plus1fil} %hyphenation is forbidden
\begin{document}
\tableofcontents
\chapter*{Introduction}
\addcontentsline{toc}{chapter}{Introduction}
\chapter{First chapter}
\section{First section long long long long long long long long long long long long title}
\subsection{First subsection long long long long long long long long long long long long title}
\setcounter{chapter}{11}
\chapter{Another chapter long long long long long long long long long long long long title}
\section{First section long long long long long long long long long long long long title}
\subsection{First subsection long long long long long long long long long long long long title}
\subsection*{Short conclusion with long long long long long long long long long long long long title}
\addcontentsline{toc}{subsection}{Short conclusion}
\end{document}
由于间距是在目录中更新的,因此需要至少两次编译才能随着目录内容的任何变化而正确更新。
以下是.toc
上述代码,重点介绍了如何插入/更新内容:
\changetocdepth {2}
\contentsline {chapter}{Contents}{1}
\contentsline {chapter}{Introduction}{3}
\settowidth {\cftchapternumwidth }{\bfseries 1. }\setlength {\cftsectionindent }{\cftchapternumwidth }
\contentsline {chapter}{\chapternumberline {1}First chapter}{5}
\settowidth {\cftsectionnumwidth }{\normalfont 1.1. }\setlength {\cftsubsectionindent }{\dimexpr \cftsectionnumwidth +\cftsectionindent }
\contentsline {section}{\numberline {1.1}First section long long long long long long long long long long long long title}{5}
\settowidth {\cftsubsectionnumwidth }{\normalfont 1.1.1. }\setlength {\cftsubsubsectionindent }{\dimexpr \cftsubsectionnumwidth +\cftsubsectionindent }
\contentsline {subsection}{\numberline {1.1.1}First subsection long long long long long long long long long long long long title}{5}
\settowidth {\cftchapternumwidth }{\bfseries 12. }\setlength {\cftsectionindent }{\cftchapternumwidth }
\contentsline {chapter}{\chapternumberline {12}Another chapter long long long long long long long long long long long long title}{7}
\settowidth {\cftsectionnumwidth }{\normalfont 12.1. }\setlength {\cftsubsectionindent }{\dimexpr \cftsectionnumwidth +\cftsectionindent }
\contentsline {section}{\numberline {12.1}First section long long long long long long long long long long long long title}{7}
\settowidth {\cftsubsectionnumwidth }{\normalfont 12.1.1. }\setlength {\cftsubsubsectionindent }{\dimexpr \cftsubsectionnumwidth +\cftsubsectionindent }
\contentsline {subsection}{\numberline {12.1.1}First subsection long long long long long long long long long long long long title}{7}
\contentsline {subsection}{Short conclusion}{7}
答案2
或许这就是你想要的。
已编辑添加\bfseries
用于计算章节数所需宽度的框。(我简要查看了一下是否有一些回忆录宏可用于设置此样式,但没有立即找到,因此只需添加\bfseries
。)
此外,本次编辑还纠正了 OP 关于最后一个未编号小节的拼写错误。
\documentclass{memoir}
%% enumeration levels in the ToC and text
%\settocdepth{subsection}
\setsecnumdepth{subsubsection}
\setrmarg{2.55em plus1fil} %hyphenation is forbidden
\usepackage{etoc}
\etocsetstyle{chapter}
{\edef\defaultchapternumwidth{\the\cftchapternumwidth}}
{\etocifnumbered
{\settowidth{\cftchapternumwidth}{\bfseries\etocnumber.\space}}%
{\cftchapternumwidth\defaultchapternumwidth\relax}}
{\etocsavedchaptertocline
{\etocifnumbered
{\chapternumberline{\etocnumber.}}
{}%
\etocname}{\etocpage}}
{}%
\etocsetstyle{section}
{\cftsectionindent\cftchapternumwidth
\edef\defaultsectionnumwidth{\the\cftsectionnumwidth}}
{\etocifnumbered
{\settowidth{\cftsectionnumwidth}{\etocnumber.\space}}%
{\cftsectionnumwidth\defaultsectionnumwidth\relax}}
{\etocsavedsectiontocline
{\etocifnumbered
{\numberline{\etocnumber.}}
{}%
\etocname}{\etocpage}}
{}%
\etocsetstyle{subsection}
{\cftsubsectionindent\cftsectionindent
\advance\cftsubsectionindent\cftsectionnumwidth
\edef\defaultsubsectionnumwidth{\the\cftsubsectionnumwidth}}
{\etocifnumbered
{\settowidth{\cftsubsectionnumwidth}{\etocnumber.\space}}%
{\cftsubsectionnumwidth\defaultsubsectionnumwidth\relax}}
{\etocsavedsubsectiontocline
{\etocifnumbered
{\numberline{\etocnumber.}}
{}%
\etocname}{\etocpage}}
{}%
\begin{document}
\etocsetnexttocdepth{subsection}
\tableofcontents
\chapter*{Introduction}
\addcontentsline{toc}{chapter}{Introduction}
\chapter{First chapter}
\section{First section long long long long long long long long long long long long title}
\subsection{First subsection long long long long long long long long long long long long title}
\setcounter{chapter}{11}
\chapter{Another chapter long long long long long long long long long long long long title}
\section{First section long long long long long long long long long long long long title}
\subsection{First subsection long long long long long long long long long long long long title}
\subsection*{Short conclusion with long long long long long long long long long long long long title}
\addcontentsline{toc}{subsection}{Short conclusion}
\end{document}
您需要etoc 1.08k
或更高版本(由于\etocsavedchaptertocline
等等宏)。
请注意,以上内容使用 OP 是\setrmarg{2.55em plus1fil} %hyphenation is forbidden
出于好意还是坏意。
更新后的图像(\bseries
添加后,最后未编号subsection
)。
对于 subsubsection,可以添加以下代码,这与其他 toc 样式类似:
\etocsetstyle{subsubsection}
{\cftsubsubsectionindent\cftsubsectionindent
\advance\cftsubsubsectionindent\cftsubsectionnumwidth
\edef\defaultsubsubsectionnumwidth{\the\cftsubsubsectionnumwidth}}
{\etocifnumbered
{\settowidth{\cftsubsubsectionnumwidth}{\etocnumber.\space}}%
{\cftsubsubsectionnumwidth\defaultsubsubsectionnumwidth\relax}}
{\etocsavedsubsubsectiontocline
{\etocifnumbered
{\numberline{\etocnumber.}}
{}%
\etocname}{\etocpage}}
{}%
这需要 tocdepth 允许子小节实际显示。etoc
允许一个全局设置,允许.toc
文件中的子小节条目,但\etocsetnexttocdepth{subsection}
例如它们实际上会在当前目录中被忽略。
我讲两点:
一个优点是您可以
\tableofcontents
在文档的其他地方使用另一种样式执行另一个操作;或者您可以使用etoc
。\localtableofcontents
由于文件中没有插入额外信息.toc
,您可以自由地遵循类似的方法或对其他目录使用其他样式。另一个\tableofcontents
可以使用 memoir 默认设置(\etocstandardlines
告诉 etoc 透明)。注意这种混合非编号条目和编号条目的样式。目前,非编号条目(使用 添加
\addcontentsline
)将使用 设置的默认宽度memoir
。假设一个非编号部分:那么子部分的缩进将与另一个编号部分的子部分的缩进略有不同(并且编号部分本身可能有所不同,例如9
与 相比10
)。人们总是可以让代码更复杂,例如非编号部分将使用适合部分编号的宽度1
。
嗯,为了回应
UDT2
The 0.1 subsection in Introduction should be indented as the 1.1 subsection.
这与我上面的评论完全相关,鉴于慷慨的赏金,我在睡觉前指出
\etocsetstyle{chapter}
{}
{\etocifnumbered
{\settowidth{\cftchapternumwidth}{\bfseries\etocnumber.\space}}%
{\settowidth{\cftchapternumwidth}{\bfseries1.\space}}}
{\etocsavedchaptertocline
{\etocifnumbered
{\chapternumberline{\etocnumber.}}
{}%
\etocname}{\etocpage}}
{}%
诀窍是:
(上图使用\setlength{\cftbeforechapterskip}{\medskipamount}
)