自定义目录中的文本对齐问题

自定义目录中的文本对齐问题

从下图可以看出,我对超长章节名称的文本对齐存在问题。我该如何修复它,以便文本不会比章节名称的开头更靠左?也就是说,我不希望任何文本位于“附录 A”部分下方。

我添加了那条红线只是为了显示我希望如何对齐(如果可能的话)。

在此处输入图片描述

这是我的 MWE:

\documentclass{book}
\let\cleardoublepage\clearpage

\RequirePackage{titletoc}
\RequirePackage{tikz}
\RequirePackage[explicit]{titlesec}
\RequirePackage{DejaVuSansCondensed}
\RequirePackage[normalem]{ulem}
\RequirePackage[
  left=2.25in,
  right=0.75in,
  top=1.25in,
  bottom=1.25in,
  marginparwidth=1.75in,
  marginparsep=.25in,
  asymmetric]{geometry}

\renewcommand*\familydefault{\sfdefault} % Set default font

%%% Table of Contents ----------------------------------------------------------
\setcounter{tocdepth}{1} % Show only Chapters and Sections

%%% Change font/color/layout of TOC
\makeatletter
\titlecontents{chapter}[-2em]
{\color{cyan}\bfseries\LARGE\addvspace{3mm}}
{\makebox[4.4em][r]{\@chapapp}\contentslabel{-0.25em}\hspace{1.9em}}
{}
{\hspace{3em}\contentspage}
\g@addto@macro{\appendix}{%
  \addtocontents{toc}{\protect\renewcommand*{\protect\@chapapp}{\protect\appendixname}}%
}
\makeatother

\titlecontents{section}[5.3em]
{\color{cyan}\large\itshape\addvspace{3mm}}
{\contentslabel{0em}\hspace{3.2em}}
{}
{\hspace{3em}\contentspage}
[\addvspace{0mm}]

%%% Chapter Header ----------------------------------------------------------
\makeatletter
\titleformat{\chapter}
  {\normalfont\sffamily\Huge\scshape}
  {}{0pt}
  {\thispagestyle{empty}    % Remove page number on new chapters
  %\setcounter{definition}{0}
  \begin{tikzpicture}[remember picture,overlay]
    \node[yshift=-3cm] at (current page.north west)
      {\begin{tikzpicture}[remember picture, overlay]
        \draw[fill=cyan] (0,-1) rectangle
          (25cm,3cm);
        \draw[fill=cyan] (0,-24) rectangle
          (25cm,-25cm);
        \ifttl@label% <---------------------- Added condition on \ifttl@label
          \node[anchor=west,xshift=.21\paperwidth,yshift=-.01\paperheight,rectangle]
              {\color{white}\LARGE \MakeUppercase{\@chapapp} \Huge\thechapter};
        \fi% <------------------------------- end condition on \ifttl@label
       \end{tikzpicture}
      };
   \end{tikzpicture}\endgraf
  \vskip-.7cm
  \color{cyan}\Huge\raggedright\leftskip-1cm
   \noindent\MakeUppercase{#1}\endgraf
  }
\makeatother

\titlespacing*{\chapter}{0pt}{10pt}{0pt}{}

\titleformat{\section}{\color{cyan}\itshape\LARGE}{\llap{\thesection} #1}{1em}{}[\titleline{\color{cyan}\titlerule[1pt]}]
\titleformat{\subsection}{\color{cyan}\normalfont\large}{\; #1}{1em}{}

\begin{document}
  \tableofcontents
  \chapter{Turing Machines}
    \section{The Turing Machine}
    \section{Variations of the Turing Machine}
      %\subsection{Non-deterministic Turing Machines}
    \section{The Church-Turing Thesis}
  \chapter{Decidability}
    \section{The Universal Turing Machine}

  \appendix
  \chapter{ON COMPUTABLE NUMBERS, WITH AN APPLICATION TO THE ENTSCHEIDUNGSPROBLEM}
\end{document}

答案1

为了简洁起见,我在这里仅指出我修改的代码区域:

%%% Table of Contents ----------------------------------------------------------
\setcounter{tocdepth}{1} % Show only Chapters and Sections

% this stuff moved here for clarity
\makeatletter
\g@addto@macro{\appendix}{%
  \addtocontents{toc}{\protect\renewcommand*{\protect\@chapapp}{\protect\appendixname}}}

%%% Change font/color/layout of TOC

% START OF MODIFIED CODE

\contentsmargin{1.5cm} % global right margin, perhaps also global left

\titlecontents{chapter}[3cm] % <-- seems to set some specific left margin
{\color{cyan}\bfseries\LARGE\addvspace{3mm}}
{\makebox[0cm][r]{\@chapapp\hspace{.5em}\thecontentslabel\hspace{.75cm}}}
{} %     ^^^ pretendously zero width box puts its contents in the left margin
{\hfill\makebox[-3cm]{\thecontentspage}}  % 3cm = twice 1.5cm

\titlecontents{section}[3cm] % <-- again this left (additional?) margin
{\color{cyan}\large\itshape\addvspace{3mm}}
{\makebox[0cm][r]{\thecontentslabel\hspace{.75cm}}} % box pushed to the left
{}
{\hfill\makebox[-3cm]{\thecontentspage}}  % 3cm = twice 1.5cm
[\addvspace{0mm}]

% END OF MODIFICATIONS

\makeatother

另外,添加连字符点:

  \appendix
  \chapter{ON COMPUTABLE NUMBERS, WITH AN APPLICATION TO THE ENT\-SCHEI\-DUNGS\-PROBLEM}

解释:由于不熟悉,titletoc 我去看了它的手册。我看到那里有一个命令\contentslabel{<length>}和另一个没有参数的命令\contentspage。从文档中很难理解它们到底是做什么的,所以我首先尝试了一下改变 OP 代码的长度。进一步阅读手册后,titletoc我发现\thecontentslabel\thecontentspage不会做神秘的事情,所以最后我决定在专门设计的盒子中使用它们。

似乎左边距被设置为括号内的(强制?)参数,用于每个分段级别,而右边距是使用命令全局设置的\contentsmargin

因此我将其设置\contentsmargin 为一个给定值,这里是 1.5 厘米,并将页码放在两个大的框中居中,但宽度为负,这样它们就会\hfill将它们推入边距,并且页码会正好位于另一个的下方。

我尽量避免使用给定的长度,因为em章节和部分的字体大小不一样,而且精确对齐会更加困难。所以我选择了法国大革命时期的公制。

布局的基本思想受到\titletoc手册中一张图的启发,从图中可以看出,名称排版在一个矩形块中,该矩形块由上述左右边距分隔。在第一行的开头,我放置了一个假装宽度为零的框,并与其右侧对齐,以便将第 x 章的内容以非常精确的距离放入左边距。章节编号同上。然后在矩形块最后一行的末尾,我将前面解释过的页码推入右边距。

目录

我没有对最终外观进行润色,并且@BarbaraBeeton的评论with是有根据的。以下是解决方法:

\contentsmargin{3cm}

\titlecontents{chapter}[3cm]
{\color{cyan}\bfseries\LARGE\addvspace{3mm}}
{\makebox[0cm][r]{\@chapapp\hspace{.5em}\thecontentslabel\hspace{.75cm}}%
 }
{}
{\hfill\makebox[-6cm]{\thecontentspage}}

\titlecontents{section}[3cm]
{\color{cyan}\large\itshape\addvspace{3mm}}
{\makebox[0cm][r]{\thecontentslabel\hspace{.75cm}}}
{}
{\hfill\makebox[-6cm]{\thecontentspage}}
[\addvspace{0mm}]

%%%%% additional hyphenation point
\chapter{ON COMPUTABLE NUMBERS, WITH AN APPLICATION TO THE ENT\-SCHEI\-DUNGS\-PRO\-BLEM}

请注意,我使用了德语连字符pro-blem(这样做确实有问题prob-lem……)。另外,我不知道如何titletoc排版章节名称。

目录

由于了解不够,titletoc我尝试了一下etoc。这是序言中的相关代码。如果我了解得更多,enumerate我会在章节和部分的规范中使用它etoc。这里的代码更基础一些,需要了解一些 TeX 中与段落相关的基本参数。

我还稍微修改了一下将页码放在右边距特定位置的方法。

%%% Change font/color/layout of TOC (with package etoc.)
% \RequirePackage{titletoc}
\usepackage{etoc}

% these margins will used additionally to the page margins
% set-up by package geometry
\newlength{\tocleftmargin}
\setlength{\tocleftmargin}{3.5cm}
\newlength{\tocrightmargin}
\setlength{\tocrightmargin}{1cm}

\makeatletter % for using \@chapapp of class book

\etocsetstyle{chapter}
{\parindent0pt
 \leftskip\tocleftmargin
 \rightskip\the\tocrightmargin plus 1fil
 \parfillskip0pt
 \color{cyan}}
{\addvspace{3mm}\leavevmode\bfseries\LARGE\upshape}
{\llap{\@chapapp\hspace{.5em}\etocnumber\hspace{.75cm}}\etocname
 \hfill\makebox[-\tocrightmargin][l]{\makebox[0pt]{\etocpage}}\par}
{}

\etocsetstyle{section}
{}
{\addvspace{3mm}\leavevmode\mdseries\large\itshape}
{\llap{\etocnumber\hspace{.75cm}}\etocname
 \hfill\makebox[-\tocrightmargin][l]{\makebox[0pt]{\etocpage}}\par}
{}

\makeatother

现在不需要\-在长附录名称中使用,因为不需要连字符!我尝试使用来实现相同的目的,titletoc但没有找到正确的方法(肯定有一种方法)。

评论:

  1. 更新安装后,我发现etocCTAN 的最新版本(1.07 版)将文档开头的样式重新设置为文档类的默认样式。我将提交错误报告,因为这意味着必须使用命令\etocsetstyle \begin{document}。同时,一种解决方法是将代码chapter作为命令section的参数AtBeginDocument

  2. etoc使用包xspace。这似乎会导致产生额外的空间。可以使用或\etocnumber\hspace{.75cm}来消除它。\etocnumber\unskip\hspace{.75cm}{\etocnumber}\hspace{.75cm}

  3. \textup{\etocnumber}在章节样式中,使用和可能会更好\textup{\etocpage},因为标签和页码的斜体形状与章节的斜体形状形成对比。

toc 用 etoc 完成

相关内容