创建具有任意范围的本地目录

创建具有任意范围的本地目录

我正在使用考博类,它又使用etoc包来在我的文档中创建本地目录。由于本地目录应位于调用它们的页面边缘(通常在章节开头),因此它们基本上是像这样包含的:

\documentclass{scrbook}
\usepackage{etoc}
\usepackage{marginnote}
\usepackage[hidelinks]{hyperref}

\newcounter{margintocdepth} % Set the depth of the margintoc
\setcounter{margintocdepth}{\sectiontocdepth}

\newlength{\mtocshift} % Length of the vertical offset used for margin tocs
\setlength{\mtocshift}{-52mm}

% Command to print a table of contents in the margin
\newcommand{\margintoc}[1][\mtocshift]{ % The first parameter is the vertical offset; by default it is \mtocshift
    \begingroup
        % Set the style for chapter entries
        \etocsetstyle{chapter}
        {\parindent -10pt \parskip 0pt}
        {\leftskip 0pt}
        {\makebox[.5cm]{}
        \hangindent=0.5cm\etoclink{\etocthename}\nobreak\hbox{\hbox to 1.5ex {\hss\hss}}\hfill\makebox[5mm][l]{\etocpage}\nobreak
        \par}
        {}
        % Set the style for section entries
        \etocsetstyle{section}
        {\parindent 0pt \parskip 0pt}
        {\leftskip 0pt}
        {\makebox[.5cm]{}
        \hangindent=0.5cm\etoclink{\etocthename}\nobreak\hbox{\hbox to 1.5ex {\hss\hss}}\hfill\makebox[5mm][l]{\etocpage}\nobreak
        \par}
        {}
        % Set the global style of the toc
        \etocsettocstyle{\usekomafont{section}\small\raggedright}{}
        \etocsetnexttocdepth{\themargintocdepth}
        % Print the table of contents in the margin
        \marginnote[#1]{
            \parbox[b]{\marginparwidth}{Contents\vspace{-0.65\baselineskip}\\\vspace{0.1\baselineskip}\rule{\marginparwidth}{0.5pt}}
            \localtableofcontents
        }
    \endgroup
}

\begin{document}

\tableofcontents

\part{First Part}
\setchapterpreamble[u]{\margintoc}
\chapter{Introduction}

    \section{Section 1}

    \section{Section 2}

\chapter{Body}

    \section{Section 1}

    \section{Section 2}

\chapter{Conclusion}

    \section{Section 1}

    \section{Section 2}

\part{Second Part}

\chapter{Introduction}

\chapter{Body}

\chapter{Conclusion}



\end{document}

这很有效,但本地目录仅包含章节内的元素(我猜这通常正是您想要的)。但我希望本地目录包含零件级别的所有内容。有什么办法吗?

不幸的是,使用\etocsetnexttocdepth不起作用,\localtableofcontents如果不使用,调用\setchapterpreamble将创建一个具有正确范围的本地目录,但它将被打印在自己的页面上。

答案1

根据包装文档部分15. Labeling and reusing elsewhere

etoc 允许在某个位置排版在其他地方定义的本地目录。为此,只需两个简单的步骤:

  1. \localtableofcontents在远处插入,然后跟随一些\label{foo}

  2. 插入\tableofcontents\ref{foo}到您希望此远程目录出现的位置。

  3. 在步骤1中,如果使用\invisiblelocaltableofcontents代替\localtableofcontents,则在其定义的地方将不会进行排版。

您需要某种方式来自动生成带有适当标签的标记,例如\label{part:1},但您需要知道您的章节属于哪个部分。好的,我测试了这\the\value{part}两种方法,以生成标签并用作该部分章节的参考,它似乎确实有效。

第一部分的第一章

第一部分第一章的页边距目录

第二部分第一章

第二部分第一章的页边距目录

\documentclass{scrbook}
\usepackage{etoc}
\usepackage{marginnote}
\usepackage[hidelinks]{hyperref}

\newcounter{margintocdepth} % Set the depth of the margintoc
\setcounter{margintocdepth}{\sectiontocdepth}

\newlength{\mtocshift} % Length of the vertical offset used for margin tocs
\setlength{\mtocshift}{-52mm}

% Command to print a table of contents in the margin
\newcommand{\margintoc}[1][\mtocshift]{ % The first parameter is the vertical offset; by default it is \mtocshift
    \begingroup
        % Set the style for chapter entries
        \etocsetstyle{chapter}
        {\parindent -10pt \parskip 0pt}
        {\leftskip 0pt}
        {\makebox[.5cm]{}
        \hangindent=0.5cm\etoclink{\etocthename}\nobreak\hbox{\hbox to 1.5ex {\hss\hss}}\hfill\makebox[5mm][l]{\etocpage}\nobreak
        \par}
        {}
        % Set the style for section entries
        \etocsetstyle{section}
        {\parindent 0pt \parskip 0pt}
        {\leftskip 0pt}
        {\makebox[.5cm]{}
        \hangindent=0.5cm\etoclink{\etocthename}\nobreak\hbox{\hbox to 1.5ex {\hss\hss}}\hfill\makebox[5mm][l]{\etocpage}\nobreak
        \par}
        {}
        % Set the global style of the toc
        \etocsettocstyle{\usekomafont{section}\small\raggedright}{}
        \etocsetnexttocdepth{\themargintocdepth}
        % Print the table of contents in the margin
        \marginnote[#1]{
            \parbox[b]{\marginparwidth}{Contents\vspace{-0.65\baselineskip}\\\vspace{0.1\baselineskip}\rule{\marginparwidth}{0.5pt}}
            \localtableofcontents\ref{part:\the\value{part}}
        }
    \endgroup
}

\begin{document}

\tableofcontents

\part{First Part}
\invisiblelocaltableofcontents\label{part:\the\value{part}}
\setchapterpreamble[u]{\margintoc}
\chapter{Introduction}

    \section{Section 1}

    \section{Section 2}

\chapter{Body}

    \section{Section 1}

    \section{Section 2}

\chapter{Conclusion}

    \section{Section 1}

    \section{Section 2}

\part{Second Part}
\invisiblelocaltableofcontents\label{part:\the\value{part}}

\setchapterpreamble[u]{\margintoc}
\chapter{Introduction}

\chapter{Body}

\chapter{Conclusion}



\end{document}

更新:以上是使用\part。使用 时会失败\part*。然后使用 而不是\the\value{part}诸如\the\value{mycounter}having done\newcounter{mycounter}和 issuing\stepcounter{mycounter}\refstepcounter{mycounter}at each 之类的东西\part*。您也可以\refstepcounter{part}按照评论中提到的那样做,但这似乎只有在文档中仅包含未编号部分时才合理,否则编号部分的编号将发生偏移。请注意,\part*可能存在另一个问题,即无法根据埃托克文档,部分21. The \etocsetlocaltop.toc and \etocimmediatesetlocaltop.toc commands。我没有测试过,你的评论(我不知道如何链接到它)似乎表明你没有问题,但你可能必须对未编号的部分做类似的事情,我part*在寻找中找到了埃托克文档。

\part*{Extra unnumbered part}
\etocsetlocaltop.toc{part}
\invisiblelocaltableofcontents

回想起来,您的评论似乎表明一切都没问题,但也许这不是必要的,甚至可能是有害的。

相关内容