用更好的字体替换目录中的点引线

用更好的字体替换目录中的点引线

例如,点引导线是目录中的点线。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@subfigurel@table

相关内容