隐藏章节标题会弄乱所含文件的目录

隐藏章节标题会弄乱所含文件的目录

我希望开始一个章节而不显示标题。但是,副作用应该保留,即计数器chapter应该步进,并创建目录条目。

请注意@Dirk 的回答隐藏部分和章节标题仍然会在标题位置产生一些空白。另外,我宁愿不使用该titlesec包。

为此,这很有效:

\documentclass{scrbook}

\begin{document}
\tableofcontents

\addtocentrydefault{chapter}{}{Ch1}\stepcounter{chapter}
\section{Sec11}
\section{Sec12}

\cleardoublepage
\addtocentrydefault{chapter}{}{Ch2}\stepcounter{chapter}
\section{Sec21}
\section{Sec22}

\end{document}

\include然而,当我查看以下部分时,情况发生了变化:

\documentclass{scrbook}

\begin{filecontents}{Sec11.tex}
\section{Sec11}
\end{filecontents}
\begin{filecontents}{Sec12.tex}
\section{Sec12}
\end{filecontents}
\begin{filecontents}{Sec21.tex}
\section{Sec21}
\end{filecontents}
\begin{filecontents}{Sec22.tex}
\section{Sec22}
\end{filecontents}

\begin{document}
\tableofcontents

\addtocentrydefault{chapter}{}{Ch1}\stepcounter{chapter}
\include{Sec11}
\include{Sec12}

\cleardoublepage
\addtocentrydefault{chapter}{}{Ch2}\stepcounter{chapter}
\include{Sec21}
\include{Sec22}

\end{document}

现在,目录乱了: 在此处输入图片描述

这是怎么发生的?有没有什么好的(简单的)方法可以解决这个问题?

答案1

原始答案(以下是更新内容,也许有更好的建议)

以下是建议修补\@include

\documentclass{scrbook}
\pagestyle{plain}
\usepackage{xpatch}
\makeatletter
\newcommand*\@chaptertocentry{}% initialize \@chaptertocentry
\newcommand*\chaptertocentry[1]{\def\@chaptertocentry{#1}}% command to set \@chaptertocentry

\xpatchcmd\@include{\@input@}
  {\ifstr{\@chaptertocentry}{}{}
    {\cleardoublepage\stepcounter{chapter}\addchaptertocentry{}{\@chaptertocentry}}% add the toc entry
    \@input@
  }{}{\PatchFailed}

\xapptocmd\@include{\def\@chaptertocentry{}}{}{\PatchFailed}% reset \@chaptertocentry
\makeatother

\begin{document}
\tableofcontents

\chaptertocentry{Ch1}
\include{Sec11}
\include{Sec12}

\chaptertocentry{Ch2}
\include{Sec21}
\include{Sec22}
\end{document}

在此处输入图片描述


更新

\addtocentrydefault{chapter}{}{<chapter title>}写入\@writefile{toc}{\contentsline {chapter}{\nonumberline <chapterline>}{<pagenumber>}}主辅助文件,当当前页面被发送出去时(在目录中获取正确的页码)。

\include写道立即\@input将包含 tex 文件的自身辅助文件的命令添加到主辅助文件中。因此,如果命令与特殊辅助文件\addtocentrydefault出现在同一页面上,则主辅助文件位于 之前。\include\@input\@writefile{toc}...

示例生成的主要辅助文件是:

\relax 
\providecommand*\new@tpo@label[2]{}
\@writefile{toc}{\contentsline {chapter}{\nonumberline Ch1}{1}}
\@input{Sec11.aux}
\@input{Sec12.aux}
\@input{Sec21.aux}
\@writefile{toc}{\contentsline {chapter}{\nonumberline Ch2}{5}}
\@input{Sec22.aux}
\global\@namedef{scr@dte@section@lastmaxnumwidth}{18.37163pt}

正如您所看到的,“Ch1”获得了错误的页码“1”,因为\addcontentsline它是在目录的(最后一页)上执行的。

在您的 MWE 中,有一个\cleardoublepagebefore \addtocentrydefault{chapter}{}{Ch2}\stepcounter{chapter},它不会在文档中插入任何内容。因此,此命令与以下内容之间没有分页符\include{Sec21}\@input{Sec21.aux}立即写入,而\@writefile{toc}{\contentsline {chapter}{\nonumberline Ch2}{5}}在第 5 页发出时写入。因此“Sec21”中的所有标题都会出现在“Ch2”之前的目录中。

据我所知,这种行为无法改变。因此,您必须确保\@writefile{toc}...命令转到包含的 tex 文件的辅助文件。这可以通过我上面原始答案中的补丁来完成。或者scrlfile可以使用包:

\documentclass{scrbook}
\pagestyle{plain}

\usepackage{scrlfile}
\newcommand\hiddenchapter[1]{%
  \cleardoublepage
  \stepcounter{chapter}%
  \addchaptertocentry{}{#1}%
}

\begin{document}
\tableofcontents

\BeforeFile{Sec11.tex}{\hiddenchapter{Ch1}}
\include{Sec11}
\include{Sec12}

\BeforeFile{Sec21.tex}{\hiddenchapter{Ch2}}
\include{Sec21}
\include{Sec22}
\end{document}

生成的主要辅助文件是

\relax 
\providecommand*\new@tpo@label[2]{}
\@input{Sec11.aux}
\@input{Sec12.aux}
\@input{Sec21.aux}
\@input{Sec22.aux}
\global\@namedef{scr@dte@section@lastmaxnumwidth}{18.37163pt}

和 Sec21.aux:

\relax 
\@writefile{toc}{\contentsline {chapter}{\nonumberline Ch2}{5}}
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Sec21}{5}}
\@setckpt{Sec21}{
\setcounter{page}{6}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{2}
\setcounter{section}{1}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
}

相关内容