我希望开始一个章节而不显示标题。但是,副作用应该保留,即计数器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 中,有一个\cleardoublepage
before \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}
}