如何仅将 \part 添加到目录?

如何仅将 \part 添加到目录?

我想知道如何在\part不输出文档本身的情况下将条目添加到目录中。我实际上得到了一个几乎可以正常工作的版本:

\begin{filecontents}{chap1.tex}
\chapter{Chapter} This is a chapter.
\end{filecontents}
\begin{filecontents}{chap2.tex}
\chapter{Chapter} This is a chapter.
\end{filecontents}

\documentclass{scrbook}

\usepackage{xparse,hyperref}

\NewDocumentCommand{\TOCpart}{s m}{%
   \clearpage
   \refstepcounter{part}%
   \phantomsection
   \addcontentsline{toc}{part}{%
      \IfBooleanF{#1}{\protect\numberline{\thepart}}%
      #2%
   }%
   \cleardoublepage
   \ignorespaces
}

\begin{document}
\tableofcontents
\part{Normal Part}
\include{chap1}

\TOCpart{TOC Part}
\include{chap2}

\part{Normal Part}
\chapter{Chapter} This is a chapter.

\TOCpart{TOC Part}
\chapter{Chapter} This is a chapter.
\end{document}

这样做是可行的,只是“II. TOC Part”应该列在第 7 页而不是第 6 页。即与下一章相同。如果我将定义更改为

\NewDocumentCommand{\TOCpart}{s m}{%
   \cleardoublepage
   \refstepcounter{part}%
   \phantomsection
   \addcontentsline{toc}{part}{%
      \IfBooleanF{#1}{\protect\numberline{\thepart}}%
      #2%
   }%
%   \cleardoublepage
   \ignorespaces
}

该条目有正确的页码,但如果后面跟着一个,\include它就会出现在章节条目的后面,这是非常错误的……那么我怎样才能将这两个定义结合起来,得到章节之前的部分,但带有章节的页码,同时仍然使用\include\TOCpart在包含的文件内部移动?

答案1

如果\addcontentsline位于“主”文件中,就在之前\include,则它会被推迟。

(\addcontents因此\TOCpart这里的) 需要进入那个\included 文件,即使这看起来违反直觉,并且掩盖了您需要以这种方式完成更改的事实。

我建议在主文件中留下一条注释来说明您所做的事情,这样如果您想更改“部分”条目的位置(或者,以后想知道它来自哪里),您将有一个明显的线索。

答案2

如果您查看 aux 文件,您会发现\@input{chap2.aux}之前发生过这种情况\@writefile{toc}{\contentsline {part}{\numberline {II}TOC Part}{7}{part.2}},并且对此无能为力。我甚至尝试修改\@docinclude为不使用\immediate\write\@mainaux{\string\@input{#1.aux}}

无论如何,主要关键是使用\input而不是\include。实际区别在于\include强制使用\clearpage之前和之后,这在这里是多余的。另请参阅\include、\input 和 \import 命令的使用

我还进行了替换,\phantomsection以使辅助文件条目\part和“\TOCpart”在形式上更加接近。

\begin{filecontents}{chap1.tex}
\chapter{Chapter} This is a chapter.
\end{filecontents}
\begin{filecontents}{chap2.tex}
\chapter{Chapter} This is a chapter.
\end{filecontents}

\documentclass{scrbook}
\usepackage{xparse,hyperref}

\NewDocumentCommand{\TOCpart}{s m}{%
   \cleardoublepage
   \refstepcounter{part}%
   \hypertarget{part.\arabic{part}}{\relax}%
   \addcontentsline{toc}{part}{%
      \IfBooleanF{#1}{\protect\numberline{\thepart}}%
      #2%
   }%
}

\begin{document}
\tableofcontents
\part{Normal Part}
\input{chap1}

\TOCpart{TOC Part}
\input{chap2}
\end{document}

答案3

如果您总是\TOCpart在 之前立即添加\chapter(没有内容讨论),则可以使用“页面 + 1”作为 的页面\TOCpart。此外,作为超链接跳转,您可以使用后续 设置的任意内容\chapter。其形式为chapter.#

上述内容实现如下:

在此处输入图片描述

\begin{filecontents}{chap1.tex}
\chapter{Chapter} This is a chapter.
\end{filecontents}
\begin{filecontents}{chap2.tex}
\chapter{Chapter} This is a chapter.
\end{filecontents}

\documentclass{scrbook}

\usepackage{xparse,hyperref}

\NewDocumentCommand{\TOCpart}{s m}{%
  \clearpage
  \stepcounter{part}%
  \addtocontents{toc}{%
    \protect\contentsline{part}% type
      {\protect\numberline{\thepart} #2}% number + title
      {\number\numexpr\value{page}+1}% page number
      {chapter.\number\numexpr\value{chapter}+1}}% hyperref link
  \cleardoublepage
  \ignorespaces
}

\begin{document}
\tableofcontents
\part{Normal Part}
\include{chap1}

\TOCpart{TOC Part}
\include{chap2}

\part{Normal Part}
\chapter{Chapter} This is a chapter.
\chapter{Another chapter} This is a chapter.

\TOCpart{TOC Part}
\chapter{Chapter} This is a chapter.
\end{document}

答案4

“这有点作弊,在这种情况下是可行的,但如果章节可以从任何页面开始,就会失败(我目前的项目不是这种情况)。你可以把你的评论写成答案,这样会更清晰易读”(托比 9月1日 21:24

我评论的代码中应该有换行符,但在评论中这些换行符被删除了。-因此,只是为了记录和可读性,另一个(不建议 ) 实现方法:

您可以尝试\addcontentsline对其使用的页面撒谎(!):

\makeatletter%
\NewDocumentCommand{\TOCpart}{s m}{%
  \clearpage%
  \refstepcounter{part}%
  \phantomsection%
  \ifodd\c@page%
    \addcontentsline{toc}{part}{%
      \IfBooleanF{#1}{\protect\numberline{\thepart}}%
      #2%
     }%
  \else%
    \addtocounter{page}{+1}%
    \addcontentsline{toc}{part}{%
      \IfBooleanF{#1}{\protect\numberline{\thepart}}%
      #2%
     }%
    \addtocounter{page}{-1}%
  \fi%
  \cleardoublepage%
  \ignorespaces%
 }%
\makeatother%

相关内容