scrbook 中的附加简短目录

scrbook 中的附加简短目录

显然,KOMA 类缺乏添加第二个目录(例如简短的目录)的可能性,而回忆录则像下面采用的示例一样。另请参阅在简短目录中包含详细内容条目吗?

尽管如此,我想使用它,scrbook但详细的目录却没有打印出来。有人知道可以与之配合使用的实现pdfpages吗?

\documentclass{scrbook}
\begin{document}
{\renewcommand*{\contentsname}{Short Contents}
  \setcounter{tocdepth}{0}
  \tableofcontents
}
\tableofcontents

\chapter{Intro}
\section{Sub A}
\section{Sub B}
\end{document}

评论

pdfpages包(带有)的使用addtotoc=...似乎与不兼容etoc,而其本身可以作为一种解决方案。

答案1

您可以使用 KOMA-Script 包scrwfile

\documentclass{scrbook}
\usepackage[english]{babel}
\usepackage{scrwfile}
\TOCclone[Short Contents]{toc}{stoc}
\addtocontents{stoc}{\protect\value{tocdepth}=0}% or \BeforeStartingTOC[stoc]{\value{tocdepth}=0}
\begin{document}
\listofstoc
\tableofcontents
\chapter{Intro}
\section{Sub A}
\section{Sub B}
\end{document}

另一种可能性是修补\addtocentrydefault将所有 ToC 条目写入扩展名为 的新文件中.stoc

\documentclass{scrbook}
\usepackage[english]{babel}
\addtotoclist[\jobname]{stoc}
\BeforeStartingTOC[stoc]{\value{tocdepth}=0}
\usepackage{xpatch}
\xapptocmd\addtocentrydefault
  {\addxcontentsline{stoc}{#1}[#2]{#3}}
  {}{\PatchFailed}

\begin{document}
\listoftoc[Short Contents]{stoc}
\tableofcontents
\chapter{Intro}
\section{Sub A}
\section{Sub B}
\addchap{Test}
\end{document}

如果目录应该在“简短内容”中获得一个条目,则将以下几行添加到上述示例的序言中:

\BeforeStartingTOC[toc]{%
  \addxcontentsline{stoc}{chapter}{\protect\contentsname}%
}

答案2

使用来自这个帖子。因为您希望它与 babel 一起工作,所以您必须注意 babel 命令。

似乎包含 babel 也会破坏的分组,因此在发出第二个之前tocdepth您可能需要这样做。\setcounter{tocdepth}{2}\tableofcontents

\documentclass{scrbook}
\usepackage[english]{babel}
\begin{document}
{
\makeatletter
\renewcommand*{\contentsname}{Short Contents}
  \setcounter{tocdepth}{0}
  \expandafter\def\csname @starttoc\endcsname#1{\InputIfFileExists{\jobname.#1}{}{}}\tableofcontents
\makeatother
}
\tableofcontents

\chapter{Intro}
\section{Sub A}
\section{Sub B}
\end{document}

答案3

要读取toc文件两次,您必须避免在第二次读取之前打开它进行写入。 LaTeX 的内核宏\@starttoc(由 使用\tableoofcontents)通常也会打开文件进行写入。 加载scrwfile如图所示esdd 的回答\@starttoc已经避免在使用时打开文件进行写入。此外,还\@starttoc进行了局部重新定义,如TeXnician 的回答可以用来避免打开用于书写的文件。另一个建议是停用 LaTeX 打开用于书写的辅助文件,例如:

\documentclass{scrbook}
\usepackage[english]{babel}
\usepackage{scrwfile}
\usepackage{mwe}% provides \Blinddocument
\makeatletter
\newcommand*{\shorttableofcontents}{%
  \begingroup
    \value{tocdepth}=\z@ % set tocdepth locally to zero
    \@fileswfalse % deactivate opening of auxiliary files
    \listoftoc[Short Contents]{\ext@toc}%
  \endgroup
}
\makeatother
\begin{document}
\shorttableofcontents% must be before \tableofcontents
\tableofcontents
\Blinddocument
\end{document}

这里使用 KOMA-Script\listoftoc来显示目录的简短版本。有关更多信息,请参阅手册。

\shorttableofcontents但是如果在之后使用,这个建议会失败\tableofcontents!并且您无法将普通目录中未显示的额外条目添加到简短目录中。如果您需要这样的东西,esdd 的答案将是更好的建议。

但是您可以使用另一个 KOMA-Script 宏来克隆主 ToC:

\documentclass{scrbook}
\usepackage[english]{babel}
\usepackage{scrwfile}
\usepackage{mwe}% provides \Blinddocument
\DeclareNewTOC[%
  listname={Short Contents},
]{stoc}
\makeatletter  
\renewcommand{\addtocentrydefault}[3]{%
  \expandafter\tocbasic@addxcontentsline\expandafter{\ext@toc}{#1}{#2}{#3}%
  \tocbasic@addxcontentsline{stoc}{#1}{#2}{#3}%
}
\makeatother
\BeforeStartingTOC[stoc]{\value{tocdepth}=0\relax}
\let\shorttableofcontents\listofstocs
\begin{document}
\shorttableofcontents
\tableofcontents
\Blinddocument
\end{document}

KOMA-Script 用于生成所有标题的目录条目。但是,如果包不使用(例如直接使用)\addtocentrydefault来生成目录条目,则此方法不起作用。\addtocentryefault\addcontentsline

您可以尝试修补它,而不必重新定义\addtocentrydefault,如 esdd 的第二个建议所示。

答案4

啊,抱歉,在看到您的pdfpages评论之前就发了这篇文章。如果与 不兼容,也许这应该是另一个问题的主题etoc?(展示问题的 mwe 会很有帮助)

\documentclass{scrbook}
\usepackage{etoc}
\begin{document}
{\renewcommand*{\contentsname}{Short Contents}
  \etocsetnexttocdepth{chapter}
  \tableofcontents
}
\tableofcontents

\chapter{Intro}
\section{Sub A}
\section{Sub B}
\end{document}

相关内容