我想知道如何在\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
这里的) 需要进入那个\include
d 文件,即使这看起来违反直觉,并且掩盖了您需要以这种方式完成更改的事实。
我建议在主文件中留下一条注释来说明您所做的事情,这样如果您想更改“部分”条目的位置(或者,以后想知道它来自哪里),您将有一个明显的线索。
答案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%