
При оформлении моего тезиса издатель требует не менее двух точек в оглавлении - или строка должна быть разорвана (что, если делать это вручную, вызывает другие проблемы). Есть ли какие-либо идеи, которые могут создать более элегантное решение, чем -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}
Обакнигаиscrbookклассы в конечном итоге вызываются \@dottedtocline
для создания записей toc с лидерами, поэтому патч должен работать.
Выход:
Добавление
Я забыл упомянуть, что, как всегда, \patchcmd
возможность, предоставляемаяetoolboxpackage можно использовать вместо \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}
Второе дополнение
Комментарий требует аналогичного патча, адаптированного длятоклофтpackage. Быстрый осмотр показывает, что этот пакет не полагается на , \@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
Кнут и Пласс 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}