从下图可以看出,我对超长章节名称的文本对齐存在问题。我该如何修复它,以便文本不会比章节名称的开头更靠左?也就是说,我不希望任何文本位于“附录 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
但没有找到正确的方法(肯定有一种方法)。
评论:
更新安装后,我发现
etoc
CTAN 的最新版本(1.07 版)将文档开头的样式重新设置为文档类的默认样式。我将提交错误报告,因为这意味着必须使用命令\etocsetstyle
后\begin{document}
。同时,一种解决方法是将代码chapter
作为命令section
的参数AtBeginDocument
。etoc
使用包xspace
。这似乎会导致产生额外的空间。可以使用或\etocnumber\hspace{.75cm}
来消除它。\etocnumber\unskip\hspace{.75cm}
{\etocnumber}\hspace{.75cm}
\textup{\etocnumber}
在章节样式中,使用和可能会更好\textup{\etocpage}
,因为标签和页码的斜体形状与章节的斜体形状形成对比。