重新定义 \@starttoc 安全吗?

重新定义 \@starttoc 安全吗?

我正在使用tocloft并希望制作一个两列的目录。虽然将整个目录包裹在multicol- 环境中很容易,但我不喜欢这种外观,因为标题也会被包裹在其中,这会导致第二列从标题上方开始。

当使用tocloft重新定义时,我想我可以重新定义以产生我想要的内容,而不是在以后覆盖该定义,如下所示:\tableofcontents\AtBeginDocument\@starttoc

\documentclass{scrbook}
\usepackage{multicol}
\usepackage{tocloft}
\makeatletter
% tocloft redefines \tableofcontents \AtBeginDocument
% As I don't want the title to be part of the two column layout,
% it seems easiest to just add the multicols to \@starttoc.
\let\@starttocorg\@starttoc
\def\@starttoc#1{%
    \begin{multicols*}{2}%
        \@starttocorg{#1}%
    \end{multicols*}}%
\makeatother
\begin{document}
\tableofcontents
\part{part}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\part{part}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\part{part}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\end{document}

其结果为:

在此处输入图片描述

但由于我不知道\@starttoc内部发生了什么,我不确定这样做是否安全。有什么我没看到的影响吗?(我想我也可以重新表述这个问题真的有那么容易吗?

答案1

KOMA-Script 类scrartclscrreprt以及ToC 和 Lists 的加载和使用scrbook包均基于。和均为内部命令,用户不应重新定义。 但提供了两个钩子来在 ( ) 之前和 ( )之后执行代码。tocbasictocbasic\tocbasic@starttoc\@starttoc\tocbasic@starttoc\@starttoctocbasic\BeforeStartingTOC\AfterStartingTOC@starttoc

请注意\BeforeStartingTOC\AfterStartingTOC处于同一组级别(同一组内),因此您可以使用:

\BeforeStartingTOC[toc]{\begin{multicols}{2}}
\AfterStartingTOC[toc]{\end{multicols}}

在此处输入图片描述

代码:

\documentclass{scrbook}
\usepackage{multicol}

\BeforeStartingTOC[toc]{\begin{multicols}{2}}
\AfterStartingTOC[toc]{\end{multicols}}

\begin{document}
\tableofcontents

\part{part}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\part{part}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\chapter{chapter}
\section{section}
\section{section}
\end{document}

或者使用带星号的版本multicols

\BeforeStartingTOC[toc]{\begin{multicols*}{2}}
\AfterStartingTOC[toc]{\end{multicols*}}

在此处输入图片描述

答案2

至少需要运行两次 LaTeX。

\documentclass{scrbook}
\usepackage{multicol}
\AfterTOCHead[toc]{\begin{multicols}{2}}
\AtEndDocument{\addtocontents{toc}{\protect\end{multicols}}}
\begin{document}
\tableofcontents

\part{part}
[...]

在此处输入图片描述

或者星号版本multicols(无平衡列)

\AfterTOCHead[toc]{\raggedcolumns\begin{multicols}{2}}

相关内容