例如,点引导线是目录中的点线。Bringhurst 这样描述它们:
[它们] 迫使眼睛在页面的整个宽度上移动,就像囚犯被押送回牢房一样(第 35 页)
他不是他的粉丝。我也不是。我试图在同一页上重现 Bringhurst 建议的风格。它具有以下特点:
- 章节标题左侧参差不齐。
- 页码右侧参差不齐。
- 两者之间有一个较大的中心点。
- 或多或少居中目录。
以下是我目前所掌握的信息:
\documentclass{article}
\usepackage{tocloft}
\usepackage{graphicx}
\newcommand\meddot{\scalebox{0.7}{\textbullet}}
\renewcommand\cftsecfont{\hfill}
\renewcommand\cftsecleader{\quad\meddot}
\renewcommand\cftsecpagefont{\normalfont}
\renewcommand\cftsecafterpnum{\cftparfillskip}
\renewcommand\cftdot{}
\usepackage{lipsum}
\begin{document}
\tableofcontents
\section{One}
\lipsum
\section{Two and then some more words to make it long}
\lipsum
\section{Three}
\setcounter{page}{40}
\lipsum
\section{Quattro}
\lipsum
\end{document}
现行法规的缺陷如下:
- 页码排列不正确。(添加
\raggedright
到\cftsecpagefont
没有效果。添加\flushleft
会破坏它。[Missing item
错误]) - 目录未居中:它太靠左边了。
我想真的like 是一种有三列的表格:节号、标题和页码。并且可以分别控制这三者的间距和对齐方式……
我的问题是,零碎地摆弄是不是tocloft
实现我想要的最好方法?如果是,我该如何实现。如果这不是最好的方法,我还有什么更好的选择来让目录看起来更美观?
答案1
如果我正确理解了您的要求,那么以下简单的代码就可以了(请根据需要随意更改长度和设置):
\documentclass{article}
\usepackage{titletoc}
\usepackage{lipsum}
\titlecontents{section}
[0cm]{\raggedleft\parshape 1 1cm \dimexpr\linewidth-3cm\relax}
{\contentslabel{1.5em}}{}{\hspace{0.8em}\textbullet\hspace{0.8em}\makebox[1em][l]{\thecontentspage}}
\begin{document}
\tableofcontents
\section{One}
\lipsum
\section{Two and then some more words to make it long}
\lipsum
\section{Three}
\setcounter{page}{40}
\lipsum
\section{Quattro}
\lipsum
\end{document}
答案2
非常好,但我不喜欢在不使用这种对称性的文档(例如所有标题)中使用居中目录。我喜欢排版师 Willberg 或 Forssman 在他们的一些书中使用的无页栏样式:
\documentclass{article}
\usepackage{tocstyle}
\usepackage[english]{babel}
\usepackage{blindtext}
\usetocstyle{nopagecolumn}
\settocfeature[toc][1]{entryhook}{\normalfont}% but with normal font
\iffalse% change to \iftrue, if you like a big fat dot
\usepackage{graphicx}
\newcommand\meddot{\scalebox{0.7}{\textbullet}}
\settocfeature{leaders}{\enskip\meddot\enskip}
\fi
\begin{document}
\tableofcontents
\blinddocument
\end{document}
有时我甚至喜欢删除目录中的章节编号:
\documentclass{article}
\usepackage{tocstyle}
\usepackage[english]{babel}
\usepackage{blindtext}
\usetocstyle{nopagecolumn}
\settocfeature[toc][1]{entryhook}{\normalfont}% but with normal font
\makeatletter
\renewcommand*{\tocstyle@@numberline}[1]{}% No section numbers
\makeatother
\begin{document}
\tableofcontents
\blinddocument
\end{document}
答案3
这里基于 tocloft 进行了修改:
\documentclass{article}
\usepackage{tocloft}
\usepackage{graphicx}
\newcommand\meddot{\scalebox{0.7}{\textbullet}}
\makeatletter
\renewcommand*{\l@section}[2]{%
\ifnum \c@tocdepth >\z@
\if@cfthaschapter
\vskip \cftbeforesecskip
\else
\addpenalty\@secpenalty
\addvspace{\cftbeforesecskip}
\fi
{\leftskip \cftsecindent\relax
\rightskip \@tocrmarg
\parfillskip -\rightskip
\parindent \cftsecindent\relax\@afterindenttrue
\interlinepenalty\@M
\leavevmode
\@tempdima \cftsecnumwidth\relax
\let\@cftbsnum \cftsecpresnum
\let\@cftasnum \cftsecaftersnum
\let\@cftasnumb \cftsecaftersnumb
\def\numberline##1{\mbox{}\llap{\makebox[\cftsecnumwidth][l]{##1}}}%
\null\nobreak\hskip \cftsecnumwidth%
\parbox[t]{.5\linewidth}{\cftsecfont #1}%
\nobreak\mbox{\quad\meddot}\nobreak
\cftsecfillnum{#2}}%
\fi}
\makeatother
\usepackage{lipsum}
\begin{document}
\tableofcontents
\section{One}
\lipsum
\section{Two and then some more words to make it long}
\lipsum
\section{Three}
\setcounter{page}{40}
\lipsum
\section{Quattro}
\lipsum
\end{document}
我的结果与 Gonzalo 不同,但我是这样理解您的问题。
代码解释
要修改目录中的条目,通常建议使用tocloft
或之类的软件包titlesec
。如果不使用这样的软件包,\@dottedtocline
则会提到该命令。在下面的说明中,我想解释如何在没有这些命令的情况下修改目录。
首先我们举一个简单的例子:
\documentclass{article}
\begin{document}
\tableofcontents
\section{foo}
\subsection{bar}
Text
\end{document}
\tableofcontents
创建目录,但命令还会读取文件\jobname.toc
并评估文件。在目录中,您将找到以下行:
\contentsline {section}{\numberline {1}foo}{1}
您会看到命令\contentsline
和三个参数:
{section} {\numberline {1}foo} {1}
在我们讨论参数之前,请仔细查看命令\contentsline
。该命令在文件中定义非常简单latex.ltx
\def\contentsline#1{\csname l@#1\endcsname}
你会看到我们扩展命令后的目录条目\contentsline
只有:
\l@section{\numberline {1}foo}{1}
下一步我们将分析第二个论点\l@section
:
{\numberline {1}foo}{1}
它包含论点{\numberline {1}foo}
和页码{1}
这样,\l@section
必须将其定义为一个使用两个参数以及的外部定义\numberline
或的内部定义的命令\l@section
。一个简单的例子是:
- 将章节编号设为粗体
- 在标题和页码之间添加项目符号
- 将单词添加
page
到页码中:
修改可以通过
\renewcommand\l@section[2]{%
%Definition for the skip above
{\def\numberline##1{\textbf{##1}\ }%
\null #1\hfill\textbullet\hfill\mbox{page~#2}%
}\par%
}
例子不看
\documentclass{article}
\makeatletter
\renewcommand\l@section[2]{%
%Definition for the skip above
{\def\numberline##1{\textbf{##1}\ }%
\null #1\hfill\textbullet\hfill\mbox{page~#2}%
}\par%
}
\makeatother
\begin{document}
\tableofcontents
\section{foo}
\subsection{bar}
Text
\end{document}
您的示例的结果是:
注意:解释适用于每个内容类型等同的。这样你可以修改\l@subfigure
或l@table
。