文档使用了该类book
。目前我正在使用该包处理目录titletoc
。
附件是屏幕截图 1 和屏幕截图 2。屏幕截图以 80% 缩放比例拍摄。
截图 1:
截图 2:
两张截图中标记的内容如下:
- 短蓝线:章节标题 | 长蓝线:节号
- 短紫线:章节标题 | 长紫线:小节编号
- 短绿线:章节标题 | 长紫线:小节编号
- 短红线:章节标题 | 长红线:小节编号
问题概述:
屏幕截图 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
)。