TOCLOFT 和引导点...禁用单个点或无点

TOCLOFT 和引导点...禁用单个点或无点

在设计我的论文时,出版商要求目录中至少有两个点 - 否则需要断开行(手动操作会导致其他问题)。有没有比 -thing tocloft \renewcommand\cftdotsep{..}(这会在其他行产生新问题)更优雅的解决方案?

梅威瑟:

\documentclass[
paper=233mm:155mm,
fontsize=10.5,
cleardoubleempty,
headings=optiontohead,
bibliography=totoc,
idxtotoc,
pointlessnumbers]
{scrbook}


\usepackage{fontspec}
\setmainfont{Times New Roman}

\usepackage{polyglossia}  % Sprachumschaltung
\setdefaultlanguage{german}% Voreingestellte Dokumentsprache: Deutsch


%%% Seitenränder etc.
\usepackage[footnotesep=1.5\baselineskip]{geometry}
\geometry{includehead=true, textwidth=117mm, textheight=186mm, headsep=6mm, left=18mm, bottom=24mm}


%% Design der Überschriften %%%%%%%%%%
\setkomafont{sectioning}{\normalfont\large\scshape\centering}
\setkomafont{part}{\normalfont\Huge\scshape\centering}
\setkomafont{chapter}{\normalfont\LARGE\scshape\centering}
\setkomafont{section}{\normalfont\Large\centering}
\setkomafont{subsection}{\normalfont\large\centering}
\setkomafont{subsubsection}{\normalfont\normalsize\centering}
\setkomafont{minisec}{\normalfont\normalsize\itshape\centering}
\setkomafont{paragraph}{\normalfont\normalsize\itshape}
\setkomafont{subparagraph}{\normalfont\normalsize\itshape}


%% Inhaltsverzeichnis formatieren %%%%%%%%%%%%%%%%%%%
\usepackage{tocloft}

\tocloftpagestyle{empty} %keine Seitenzahl auf erster Seite des Inhaltsverzeichnisses

\renewcommand{\cftchappagefont}{} % Seitenzahlen auch bei Chapter nicht fett
\renewcommand{\cftpartpagefont}{} % Seitenzahlen auch bei Chapter nicht fett

\renewcommand{\cftchapleader}{\cftdotfill{\cftchapdotsep}} % Punkte nicht fett
\renewcommand{\cftchapdotsep}{\cftdotsep}

\renewcommand{\cfttoctitlefont}{\hfill\normalfont\LARGE\scshape} % Größe der Überschrift wie \chapter
\renewcommand{\cftaftertoctitle}{\hfill}

\renewcommand{\cftchapfont}{\normalfont}  %% Im Inhaltsverzeichnis Titel normal. alternativ fett. \bfseries
\setcounter{tocdepth}{4}
\setcounter{secnumdepth}{4}

\renewcommand\thesection{\thechapter.\arabic{section}}   %% Nummerierung Section Römisch

\renewcommand\thesubsection{\thesection.\arabic{subsection}} %% Nummerierung Subsection arabisch usw.

\renewcommand\thesubsubsection{\thesubsection.\arabic{subsubsection}}

\usepackage{blindtext}

\begin{document}

\tableofcontents

\chapter{A chapter with a title much too long as there aren't any dots any more}
\blindtext

\section{A section that is ok as there are at least two dots left}
\blindtext

\subsection{A subsection again not fitting as it is only ONE dot left}
\blindtext

\end{document}

答案1

一种方法是直接修补\@dottedtocline内部命令,以便它产生至少两个 em 长的引线(比如说):

\documentclass{scrbook}

\makeatletter

\renewcommand*\@dottedtocline[5]{%
  \ifnum #1>\c@tocdepth \else
    \vskip \z@ \@plus.2\p@
    {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
     \parindent #2\relax\@afterindenttrue
     \interlinepenalty\@M
     \leavevmode
     \@tempdima #3\relax
     \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
     {#4}\nobreak
     \leaders\hbox{$\m@th
        \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
        mu$}\hskip 2em \@plus 1fill % <<< PATCH
     \nobreak
     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
     \par}%
  \fi}

\makeatother

\begin{document}

\tableofcontents

\chapter{One}
Lorem ipsum.

\section{Some words to fill the line, words to fill the line,
    words to fill the line}
Dolor sit amet.

\section{Some words to fill the line, words to fill the line,
    words to fill the line, w}
Consectetur adipisci elit.

\section{Some words to fill the line, words to fill the line,
    words to fill the line, wo}
Numquam faucibus,.

\end{document}

这俩记事本类最终调用\@dottedtocline来生成带有引导符的目录条目,因此补丁应该可以起作用。

输出:

示例代码的输出

添加

我忘了说,和往常一样,\patchcmd电子工具箱可以使用包来代替\renewcommand(需要重复完整的定义):

\documentclass{scrbook}
\usepackage{etoolbox}

\makeatletter
\patchcmd{\@dottedtocline}{\hfill}{\hskip 2em \@plus 1fill }{}{}
\makeatother

\begin{document}

\tableofcontents

\chapter{One}
Lorem ipsum.

\section{Some words to fill the line, words to fill the line,
    words to fill the line}
Dolor sit amet.

\section{Some words to fill the line, words to fill the line,
    words to fill the line, w}
Consectetur adipisci elit.

\section{Some words to fill the line, words to fill the line,
    words to fill the line, wo}
Numquam faucibus,.

\end{document}

第二次添加

评论需要针对托克洛夫特包。快速检查后发现,此包不依赖于\@dottedtocline来生成领导者,而是\cftdotfill为此目的定义了自己的命令,即 。因此,这是在这种情况下必须修补的命令:

\documentclass{scrbook}
\usepackage{tocloft}

\makeatletter

\renewcommand{\cftdotfill}[1]{%
  \def\@tempa{#1}%
  \def\@tempb{\cftnodots}%
  \ifx\@tempa\@tempb
    \hfill % <<< this has not been changed
  \else
    \leaders\hbox{$\m@th\mkern #1 mu\hbox{\cftdot}\mkern #1 mu$}%
      \hskip 2em \@plus 1fill \relax % <<< PATCH
  \fi
}

\makeatother

\begin{document}

\tableofcontents

\chapter{One}
Lorem ipsum.

\section{Some words to fill the line, words to fill the line,
    words to fill the line}
Dolor sit amet.

\section{Some words to fill the line, words to fill the line,
    words to fill the line, w}
Consectetur adipisci elit.

\section{Some words to fill the line, words to fill the line,
    words to fill the line, wo}
Numquam faucibus,.

\end{document}

答案2

Knuth & Plass 1981 年“将段落分成几行”解释了 TeX 断行算法背后的盒子和粘合模型,并展示了由该算法实现的一些烟火效果。

使用其中一个技巧,我们可以设定一个更宏伟的目标:当由于空间不足而将前导符和页码放在它们自己的行中时,用前导符填充前一行,使其在右侧固定的边距内。

当我们强制增加一条线时,请注意领导者的右边缘匹配的方式。

您可以通过调整来控制额外的引线突出到下一行出现的页码上方右边距的程度\rmargin

在此处输入图片描述

\documentclass[a5paper]{article}     

\usepackage{fontspec}

\setmainfont{Times New Roman}

\parindent=0pt % optional, mimick TOC environment

\newdimen\pagenumwidth \pagenumwidth=0.5cm  % reserved right margin space for page numbers
                                                                                  % leaders will reach flush with it 
\newdimen\rmargin \rmargin=0.5cm  % reserved right margin for leaders followed by linbreal
\newdimen\minspc \minspc=1.6em    % if this much hspace isn't available for leaders, break                                                

\def\fillwith{\hbox to 1ex {\hss.\hss}} 

\def\DotsAndPage#1{%
    \leaders\fillwith\hfil
    \hskip \rmargin 
    \penalty50  
    \hskip - \rmargin plus -1fil  % Thanks Gustavo
    \hbox{}      
    \unskip\leaders\fillwith\hskip \minspc plus 1fill
    \nobreak
    {\bfseries\normalsize \hbox to \pagenumwidth{\hfil#1}}%
    \break}

\begin{document}  

{
\hsize=2.4in
A chapter with a title any \DotsAndPage{1}%\par
A chapter with a title A chapter with a title A chapter with a title\DotsAndPage{13}%\par
A chapter with a title A chapter with a title A chapter with a title with a title so t\DotsAndPage{132}
A chapter with a title A chapter with a title A chapter with a title with a title so th\DotsAndPage{132}
\rmargin=0.25cm % leaders tail bite into right margin
A chapter with a title with a title so th\DotsAndPage{132}
\rmargin=-0.1cm  
A chapter with a title with a title so th\DotsAndPage{132}\par      
}


\end{document}

相关内容