修补 \chapter 命令,使所有下部章节在 ToC 中设置为两列

修补 \chapter 命令,使所有下部章节在 ToC 中设置为两列

我一直在尝试排版我的目录,就像问题中的那样如何将目录部分条目放在一列中,而将其他条目放在两列中但是,我没有部分,因此我希望章节为单列,而它们{sub}*sections为双列模式。

我的方法:

\documentclass{scrbook}

\usepackage{tocloft}
\usepackage{etoolbox}
\usepackage{multicol}

\pretocmd{\chapter}{\protect{\ifnum\value{chapter}>0 \addtocontents{toc}{\protect\end{multicols}}\fi}}{}{}
\apptocmd{\chapter}{\protect{\addtocontents{toc}{\protect\begin{multicols}{2}}}}{}{}

\AtEndDocument{\ifnum\value{chapter}>0 \addtocontents{toc}{\protect\end{multicols}}\fi}

\begin{document}

\tableofcontents

\chapter{FOO}
\section{bar1}
\section{bar2}
\section{bar3}
\section{bar4}

\chapter{BAR}
\section{foo1}
\section{foo2}
\section{foo3}
\section{foo4}
\end{document}

然而,这不能正常工作:章节名称消失了。

  • 这种方法是否存在根本缺陷或者我使用的方法\pretocmd错误\apptocmd
  • 哪种方法用来解决这一问题?

答案1

为什么你的转变如何使目录的部分条目位于一列,而其他条目位于两列?不起作用?这是因为 way\part\chapterwork 的原因。它们不自己捕获参数,而是调用其他辅助宏来执行此操作。因此,在“命令末尾\chapter”插入元素实际上会干扰宏的其他部分。

以下是您需要修补的方法:

在此处输入图片描述

\documentclass{scrbook}

\usepackage{tocloft,etoolbox,multicol}

\pretocmd{\chapter}{\ifnum\value{chapter}>0 \addtocontents{toc}{\protect\end{multicols}}\fi}{}{}
\apptocmd{\chapterheadendvskip}{\addtocontents{toc}{\protect\begin{multicols}{2}}}{}{}
\AtEndDocument{\ifnum\value{chapter}>0 \addtocontents{toc}{\protect\end{multicols}}\fi}

\begin{document}

\tableofcontents

\chapter{FOO}
\section{bar1}
\section{bar2}
\section{bar3}
\section{bar4}

\chapter{BAR}
\section{foo1}
\section{foo2}
\section{foo3}
\section{foo4}
\end{document}

\chapterheadendvskip是设置标题后由 but\chapter\chapter*(实际上是\@@makechapterheadand )执行的最后一个宏。这是在目录中插入环境的合适位置。\@@makeschapterheadmulticols


如果你使用分段式包装,例如titlesec,上述补丁不起作用。原因很明显 - 分段包通常会重新定义分段宏的工作方式,从而导致失败\patchcmd(要么是因为命令发生了变化,要么是因为包建议通过分段单元构造使用不同的路径,因此永远不会看到更改)。这是使用时的一种解决方法titlesec- 使用“代码后”部分将插入\begin{multicol}{2}ToC 中:

\documentclass{scrbook}

\usepackage{multicol,etoolbox}
\usepackage{titletoc,titlesec}
\usepackage{hyperref}

\usepackage{xcolor}
\definecolor{myred}{RGB}{127,0,0}
\definecolor{myyellow}{RGB}{169,121,69}
\definecolor{gray75}{gray}{0.75}

\titleformat{\chapter}% Command
  [block]% Shape
  {\Huge\bfseries\color{myred}}% Format
  {\centering\protect{\color{myyellow}\thechapter\hfil}}% Label
  {1em}% Sep
  {}% Before-Code
  [\ifnum\value{chapter}>0 \addtocontents{toc}{\protect\begin{multicols}{2}}\fi]% After-Code

\pretocmd{\chapter}{\ifnum\value{chapter}>0 \addtocontents{toc}{\protect\end{multicols}}\fi}{}{}
\AtEndDocument{\ifnum\value{chapter}>0 \addtocontents{toc}{\protect\end{multicols}}\fi}

\begin{document}

\tableofcontents

\chapter{FOO}
\section{bar1}
\section{bar2}
\section{bar3}
\section{bar4}

\chapter{BAR}
\section{foo1}
\section{foo2}
\section{foo3}
\section{foo4}

\end{document}

相关内容