我一直在尝试排版我的目录,就像问题中的那样如何将目录部分条目放在一列中,而将其他条目放在两列中但是,我没有部分,因此我希望章节为单列,而它们{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
和\chapter
work 的原因。它们不自己捕获参数,而是调用其他辅助宏来执行此操作。因此,在“命令末尾\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*
(实际上是\@@makechapterhead
and )执行的最后一个宏。这是在目录中插入环境的合适位置。\@@makeschapterhead
multicols
如果你使用分段式包装,例如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}