使用 titletoc 的 \contentspush{} 在 ToC 中非严格对齐标题

使用 titletoc 的 \contentspush{} 在 ToC 中非严格对齐标题

文档使用了该类book。目前我正在使用该包处理目录titletoc

附件是屏幕截图 1 和屏幕截图 2。屏幕截图以 80% 缩放比例拍摄。

截图 1: 屏幕截图 1 显示第 1 章。

截图 2: 屏幕截图 2 显示第 100 章。

两张截图中标记的内容如下:

  • 短蓝线:章节标题 | 长蓝线:节号
  • 短紫线:章节标题 | 长紫线:小节编号
  • 短绿线:章节标题 | 长紫线:小节编号
  • 短红线:章节标题 | 长红线:小节编号

问题概述:

屏幕截图 1 的错位有点微妙。屏幕截图 2 的错位更明显。

比较两个屏幕截图,您会发现随着章节编号从 1 位数字增加到 2 位数字再到 3 位数字,问题会变得更加严重。在屏幕截图和 MWE 中,我跳过了 2 位数字章节。

如屏幕截图 2 所示,由于未对齐,每种颜色都有两条单独的线条。如果对齐正确,两条单独的线条会对齐,每种颜色都会形成一条直线。彩色线条是使用外部图像编辑程序添加的。

我猜测错位源于使用\contentspush{}“非严格”对齐标题(而不是使用\contentslabel{}“严格”对齐标题)。

我的问题是:

1 - [主要问题] 如何排列这些彩色线条,同时继续使用\contentspush{}

2 - [主要问题] 有没有自动对齐这些彩色线条的方法?目前,我正在使用猜测(尝试和错误)来对齐它们。

3 - [小问题] 一些页码没有右对齐。如何将页码对齐/推到右边距?

4 - [小问题] 长标题会导致警告Overfull \hbox。如何“消除”这些警告,至少对于目录来说?

以下是 MWE:

\documentclass[a4paper,12pt,oneside]{book}

\usepackage{showframe}% to show the frames

\usepackage{titletoc}%

% chapter
\titlecontents{chapter}% <section-type>
   [5mm]% <left> % not guesswork
   {}% <above-code>
   {\bfseries\contentspush{\thecontentslabel\ \hspace{5mm}}\uppercase}% <numbered-entry-format>
   {}% <numberless-entry-format>
   {\bfseries\hfill\contentspage}% <filler-page-format>

% section (1.1)
\titlecontents{section}%
   [14mm]% guesswork
   {}%
   {\contentspush{\thecontentslabel\ \hspace{5mm}}}%
   {}%
   {\hfill\contentspage}%

% subsection (1.1.1)
\titlecontents{subsection}%
   [26mm]% guesswork
   {}%
   {\contentspush{\thecontentslabel\ \hspace{3mm}}}%
   {}%
   {\hfill\contentspage}%

% to simulate long titles
\newcommand{\lorem}{Lorem ipsum dolor sit amet, consectetuer adipiscing elit.}%

% to simulate long titles
\newcommand{\aenean}{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. 
Aenean commodo ligula eget dolor.}%

\begin{document}

\tableofcontents

% chapter 1
\chapter{\lorem}

\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{9}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{99}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

% chapter 100
\setcounter{chapter}{99}
\chapter{\lorem}

\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{9}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{99}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\end{document}

答案1

以下修改解决了所有四个问题;我们的想法是使用固定宽度的框(我选择18mm容纳三位数字)来排版参数中的部分单元编号\contenntspush;例如,对于章节:

% chapter
\titlecontents{chapter}% <section-type>
   [5mm]% <left> % not guesswork
   {}% <above-code>
   {\bfseries\contentspush{\makebox[18mm][l]{\thecontentslabel\hfill}}\uppercase}% <numbered-entry-format>
   {}% <numberless-entry-format>
   {\nolinebreak\titlerule*[1000pc]{.}\bfseries\contentspage}% <filler-page-format>

然后对于节,第一个可选参数不再是猜测,而是计算为23mm= 5mm(用于章节的第一个可选参数) + 18mm(的宽度\makebox)。其他节单元也适用类似的注释。

\hfill\contentspage我习惯于\nolinebreak\titlerule*[1000pc]{.}\contentspage防止标题和页码之间出现不必要的换行符。

完整示例代码:

\documentclass[a4paper,12pt,oneside,draft]{book}
\usepackage[latin]{babel}
\usepackage{showframe}% to show the frames

\usepackage{titletoc}%

% chapter
\titlecontents{chapter}% <section-type>
   [5mm]% <left> % not guesswork
   {}% <above-code>
   {\bfseries\contentspush{\makebox[18mm][l]{\thecontentslabel\hfill}}\uppercase}% <numbered-entry-format>
   {}% <numberless-entry-format>
   {\nolinebreak\titlerule*[1000pc]{.}\bfseries\contentspage}% <filler-page-format>

% section (1.1)
\titlecontents{section}%
   [23mm]% not guesswork: 5mm+18mm from chapter settings
   {}%
   {\contentspush{\makebox[18mm][l]{\thecontentslabel\hfill}}}%
   {}%
   {\nolinebreak\titlerule*[1000pc]{.}\contentspage}%

% subsection (1.1.1)
\titlecontents{subsection}%
   [41mm]% not guesswork: 23mm+18mm from section settings
   {}%
   {\contentspush{\makebox[18mm][l]{\thecontentslabel\hfill}}}%
   {}%
   {\nolinebreak\titlerule*[1000pc]{.}\contentspage}%

% to simulate long titles
\newcommand{\lorem}{Lorem ipsum dolor sit amet, consectetuer adipiscing elit.}%

% to simulate long titles
\newcommand{\aenean}{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. 
Aenean commodo ligula eget dolor.}%

\pagestyle{plain}

\begin{document}

\tableofcontents

% chapter 1
\chapter{\lorem}

\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{9}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{99}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

% chapter 100
\setcounter{chapter}{99}
\chapter{\lorem}

\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{9}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\setcounter{section}{99}
\section{\aenean}
\subsection{\aenean}
\subsection{\aenean}

\end{document}

最终的目录如下:

在此处输入图片描述

当然,您可以根据需要调整长度(例如,在章节条目中,的宽度\makebox可能小于18mm)。

相关内容