编辑

编辑

请问,如果不使用目录,我怎样才能获取所有章节的名称?

\documentclass{memoir}

\begin{document}


\part{part ONE}

%Display all the chapter name of Part ONE

\chapter{One}
\chapter {Two}

\end{document}

答案1

有什么原因你不能使用etoc?你至少没有提到它,而且它的设计尊重的配置。(例如,它确保在加载memoir时将 ToC 添加到 ToC 。)memoir

\documentclass{memoir}
\usepackage{etoc}
\begin{document}
  \tableofcontents

  \part{part ONE}
  \localtableofcontents

  \chapter{One}
  \chapter {Two}

  \part{part two}
  \localtableofcontents

  \chapter{three}
  \chapter{four}

\end{document}

这将产生一个主要的目录:

主要目录

第 1 部分的目录:

第 1 部分目录

以及第 2 部分的目录:

第 2 部分目录

编辑

只是为了回答您关于主目录和本地目录的不同配置的问题,它甚至允许您做完全荒谬的事情。如果您愿意,您可以为文档中的每个目录使用不同的布局,以不同的方式排版相同的目录,并以亮橙色斜体打印目录中的特定元素,背景为绿色,带有蓝色边框。此示例仅显示了使用 的两种默认格式的etoc几个不同的本地目录:和。etocruledframed

\documentclass{memoir}
\usepackage{etoc}
\begin{document}
  \tableofcontents

  \part{part ONE}
  \etoclocalruled[1]{Local Contents Rules!}

  \chapter{One}
  \chapter {Two}

  \part{part two}
  \etoclocalframed[2]{Local Contents Framed}

  \chapter{three}
  \chapter{four}
  \chapter{five}
  \chapter{six}

  \part{part three}
  \localtableofcontents
  \chapter{seven}
  \chapter{eight}

\end{document}

这将产生标准的主要目录:

主目录采用默认样式

包含第 1 部分规则的目录:

规则目录

第 2 部分的框架目录:

框架目录

以及第 3 部分的默认样式的本地目录:

本地默认目录

显然,为每个目录更改样式是疯狂的。但是,您可以在发布主目录后轻松更改全局样式\tableofcontents。(如果您出于某种原因希望稍后发布主目录,也可以稍后恢复默认设置。)软件包手册应该可以让您了解各种可能性。

答案2

可以重复使用目录并仅提取每个目录的内容\part。这将通过以下示例进行讨论memoir 基本用户手册(片段C.7(使用课堂工具制作章节目录),第 405 页)。以下讨论取自手册,并进行了一些修改(章节 > 部分)以满足您的要求...


通过使用一些钩子,我们将能够创建一个简单的零件目录。首先需要注意几点:

  1. 在这个类中,ToC 数据可以被重复使用,因此我们可以根据需要多次加载 ToC 数据。

  2. ToC 中的数据作为\contentsline宏的参数存储,例如(参见第 143 页的图 9.1):

    \contentsline{part}{\partnumberline {I}Test}{3}
    

    其中第一个参数决定使用哪个宏来处理数据。每个宏都会查看计数器的值tocdepth以了解是否要排版。

  3. 使用一些钩子,我们可以插入局部更改,tocdepth以便只排版当前部分的部分。

这个想法是能够在 ToC 数据的关键点添加钩子,然后使用这些钩子来启用和禁用排版。

我们需要在部分行之后添加钩子(如上面的钩子),并且我们需要能够在标记部分结束的项目之前插入钩子,即下一个\part,,\book加上一个宏,\appendixpage它也写入目录。

首先,我们定义将钩子添加到 ToC 中的钩子。我们使用计数器使每个开始和结束钩子都独一无二。我们在\part和的 ToC 条目上方添加结束标记\book

\newcounter{tocmarker}
\renewcommand\mempreaddparttotochook {\cftinserthook{toc}{end-\thetocmarker}}
\renewcommand\mempreaddbooktotochook {\cftinserthook{toc}{end-\thetocmarker}}
\renewcommand\mempreaddapppagetotochook{\cftinserthook{toc}{end-\thetocmarker}}
% start marker
\renewcommand\mempostaddparttotochook{%
  \stepcounter{tocmarker}\cftinserthook{toc}{start-\thetocmarker}}
\let\normalchangetocdepth\changetocdepth % for later

插入 ToC 文件中的钩子默认不执行任何操作。您会注意到上面的行现在看起来像:

\cftinsert {end-0}
\contentsline{part}{\partnumberline {I}Test}{3}
\cftinsert {start-1}
...
\cftinsert {end-1}
\contentsline{part}{\partnumberline {II}Test}{5}

因此,要获得部分 ToC 命令,我们需要确保 (1) 所有条目均已禁用,(2)start-1重新启用 ToC 条目,以及 (3)end-1再次禁用 ToC 条目。以下是代码的其余部分,通过注释进行了解释。

\makeatletter
\newcommand\parttoc{
  % make changes local, remember counters a global
  \begingroup
    % store current value, to be restored later
    \setcounter{@memmarkcntra}{\value{tocdepth}}
    % when ever \settocdepth is used, it adds the new value to the
    % ToC data. This cause problems when we want to disable all
    % entries. Luckily the data is added via a special macro, we
    % redefine it, remember we stored the original value earlier.
    \let\changetocdepth\@gobble
    % disable all entries (using our copy from above)
    \normalchangetocdepth{-10}
    % enable ToC data within our block, we go as far as subsubsection
    \cftinsertcode{start-\thetocmarker}{\normalchangetocdepth{3}}
    % when the block is done, disable the remaining
    \cftinsertcode{end-\thetocmarker}{\normalchangetocdepth{-10}}
    % remove the spacing above the ToC title
    \let\tocheadstart\relax
    % remove the ToC title itself
    \let\printtoctitle\@gobble
    % remove space below title
    \let\aftertoctitle\relax
    % reformat ToC entries:
    \setlength{\cftchapterindent}{0pt}
    \setlength{\cftsectionindent}{\cftchapternumwidth}
    \setlength{\cftsubsectionindent}{\cftsectionnumwidth}
    \setlength{\cftsubsubsectionindent}{\cftsubsectionindent}
    \addtolength{\cftsubsubsectionindent}{\cftsubsectionnumwidth}
    \renewcommand\cftchapterfont{\small}
    \renewcommand\cftsectionfont{\small}
    \renewcommand\cftsectionpagefont{\small}
    \renewcommand\cftsubsectionfont{\small}
    \renewcommand\cftsubsectionpagefont{\small}
    \renewcommand\cftsubsubsectionfont{\small}
    \renewcommand\cftsubsubsectionpagefont{\small}
    % include the actual ToC data
    \tableofcontents*
  \endgroup
  % restore tocdepth
  \setcounter{tocdepth}{\value{@memmarkcntra}}
  % to indent or not after the chapter ToC
  \m@mindentafterchapter
  % space between part ToC and text
  \par\bigskip
  % handles indentation after the macro
  \@afterheading}
\makeatother

请注意,如果使用了\partprecistoc\partprecis,则该数据也会添加到 ToC 数据中,我们需要在 ToC 部分中本地禁用它。这可以通过添加

\let\precistoctext\@gobble

\parttoc上面的定义,只需确保在调用 before 之前添加它 \tableofcontents*

在此处输入图片描述

\documentclass{memoir}

\newcounter{tocmarker}
\renewcommand\mempreaddparttotochook {\cftinserthook{toc}{end-\thetocmarker}}
\renewcommand\mempreaddbooktotochook {\cftinserthook{toc}{end-\thetocmarker}}
\renewcommand\mempreaddapppagetotochook{\cftinserthook{toc}{end-\thetocmarker}}
% start marker
\renewcommand\mempostaddparttotochook{%
  \stepcounter{tocmarker}\cftinserthook{toc}{start-\thetocmarker}}
\let\normalchangetocdepth\changetocdepth % for later

\makeatletter
\newcommand\parttoc{
  % make changes local, remember counters a global
  \begingroup
    % store current value, to be restored later
    \setcounter{@memmarkcntra}{\value{tocdepth}}
    % when ever \settocdepth is used, it adds the new value to the
    % ToC data. This cause problems when we want to disable all
    % entries. Luckily the data is added via a special macro, we
    % redefine it, remember we stored the original value earlier.
    \let\changetocdepth\@gobble
    % disable all entries (using our copy from above)
    \normalchangetocdepth{-10}
    % enable ToC data within our block, we go as far as section
    \cftinsertcode{start-\thetocmarker}{\normalchangetocdepth{1}}
    % when the block is done, disable the remaining
    \cftinsertcode{end-\thetocmarker}{\normalchangetocdepth{-10}}
    % remove the spacing above the ToC title
    \let\tocheadstart\relax
    % remove the ToC title itself
    \let\printtoctitle\@gobble
    % remove space below title
    \let\aftertoctitle\relax
    % reformat ToC entries:
    \setlength{\cftchapterindent}{0pt}
    \setlength{\cftsectionindent}{\cftchapternumwidth}
    \renewcommand\cftchapterfont{\small}
    \renewcommand\cftsectionfont{\small}
    % include the actual ToC data
    \tableofcontents*
  \endgroup
  % restore tocdepth
  \setcounter{tocdepth}{\value{@memmarkcntra}}
  % to indent or not after the chapter ToC
  \m@mindentafterchapter
  % space between part ToC and text
  \par\bigskip
  % handles indentation after the macro
  \@afterheading}
\makeatother

\begin{document}

\tableofcontents

\part{First part}

\parttoc

\chapter{First chapter}
\section{First section}
\section{Second section}
\section{Last section}

\chapter{Second chapter}
\section{First section}
\section{Second section}
\section{Last section}

\chapter{Last chapter}
\section{First section}
\section{Second section}
\section{Last section}

\end{document}

请注意,您将 放在\parttoc与标题不同的页面上\part。您必须修改一些\part内部内容,也许还要修改 的一些内容,\parttoc才能在同一页面上正确显示内容。但是,目前,如果没有更多指导方针,这应该就足够了。

相关内容