回忆录目录:第二行缩进数字+上一行的空格宽度或设置标准间距或在带有数字的框中右对齐

回忆录目录:第二行缩进数字+上一行的空格宽度或设置标准间距或在带有数字的框中右对齐

如何在回忆录中实现以下简单的目录?

    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}

PDF

在此处输入图片描述

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}

相关内容