Closed atxy-blip closed 2 years ago
“目录”依赖 \chapter*
,修改 \chapter
的样式就可以修改“目录”的样式。
修改“目录”之间的间距,感觉也不能方便多少。
敝校对目录标题单独指定了字体字号,小弟不才,最开始的实现办法是在目录前后分别修改\chapter
的格式,实在很繁琐。接着还想出了一个办法是手动绘制目录页面的标题,这样既能改文字又能指定格式,很好用,但如果用tocloft
的话又都会被覆盖掉。
所以换句话说,本人的核心问题是如何能简单修改目录条目的字体样式,只是换个字体就行。如果之前有表述不清楚的地方实在请原谅。
titletoc
包的格式定义颇为复杂,而且会让大写罗马数字页码右侧不能对齐
titletoc
几乎重构整个目录的格式,我比较喜欢其中的悬挂缩进,尤其是 label 宽度不同的情况下(比如"第十章"和“第十一章”)。页码右对齐应该可以实现。
tocloft
包会覆盖CTeX原有的目录格式
tocloft
比较轻量级,基本上只在 2e kernel 的基础上加了一些接口供用户调整。CTeX 宏集应该是兼容 tocloft
的,最好给个 MWE 详细讨论。
而且不能通过覆盖
\tableofcontents
命令换页输出图表清单(只能手动在正文加\cleardoublepage
);
\cleardoublepage
最好加到 \listoffigures
的重定义里。
此外在修改格式后每页目录均会出现
underfull \vbox
信息
目录的分页会避免孤行和寡行。所以在设置垂直间距时最好允许一定的弹性。另外还可以考虑全局设置 \raggedbottom
禁止底部对齐。
敝校对目录标题单独指定了字体字号
这种情况最好重定义 \tableofcontents
:
\renewcommand\tableofcontents{%
...
\begingroup
\ctextset{
contentsname = {目\hspace{2em}录},
chapter/format = {\fontsize{}{}\selectfont},
}%
\chapter*{\contentsname}%
\endgroup
...
}
这样用 \ctexset
设置的 chapter/format
就只在 \begingroup
至 \endgroup
的作用域里有效。
这种情况最好重定义
\tableofcontents
我先删去了目前使用的 tocloft
包测试这个方法,发现是我用来插入书签的 tocbibind
会引发冲突,取消了以上两个包以后确实成功修改了标题。
这样用
\ctexset
设置的chapter/format
就只在\begingroup
至\endgroup
的作用域里有效。
听君一席话胜读十年书!原来可以这样写,学艺不精贻笑大方了。
我接着看看 tocloft
的兼容情况。
使用titles
选项引入tocloft
的兼容情况目前是良好的,形如 \RequirePackage[titles]{tocloft}
。如不加此选项会造成页面被这个包的预设替换,请看如下MWE:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mytest}
\LoadClass[zihao=-4]{ctexbook}
\RequirePackage[]{tocloft}
\renewcommand\tableofcontents{%
\begingroup
\ctexset{
contentsname = {目\hspace{2em}录},
chapter/format = {\centering\songti\bf\zihao{3}\selectfont},
}%
\chapter*{\contentsname}%
\endgroup
\addcontentsline{toc}{chapter}{\contentsname}
\@starttoc{toc}%
\cleardoublepage
}
使用这个简单的cls后会发现目录标题是左对齐的……
另一方面,关于titletoc
与大写罗马数字的兼容情况,以下可以代表我在模板中的设置。可以发现这个设置对于数字页码是右对齐的,然而对于较长的大写罗马数字则是中心对齐的。
\documentclass{ctexbook}
\usepackage{zhlipsum}
\usepackage{titletoc}
\titlecontents{chapter}% 标题级别
[5em]% 标题左间距
{\heiti\zihao{4}\vspace{10pt}}% 标题格式
{\contentslabel{4em}}% 标题标志
{\hspace*{-4em}}% 无序号标题
{~\titlerule*[0.6pc]{$.$}~\contentspage}% 指引线与页码
\titlecontents{section}
[5em]
{\zihao{-4}\vspace{0pt}}
{\contentslabel{2.5em}}
{\hspace*{-4em}}
{~\titlerule*[0.6pc]{$.$}~\contentspage}
\titlecontents{subsection}
[8em]
{\zihao{-4}\vspace{0pt}}
{\contentslabel{3em}}
{\hspace*{-4em}}
{~\titlerule*[0.6pc]{$.$}~\contentspage}
\pagenumbering{Roman}
\begin{document}
\tableofcontents
\chapter{test}
\zhlipsum[1-10][name=zhufu]
\section{test}
\zhlipsum[11-20][name=zhufu]
\subsection{test}
\zhlipsum[21-30][name=zhufu]
\chapter{test}
\zhlipsum[31-40][name=zhufu]
\section{test}
\zhlipsum[41-50][name=zhufu]
\subsection{test}
\zhlipsum[51-60][name=zhufu]
\end{document}
使用这个简单的cls后会发现目录标题是左对齐的……
确实,不过这个应该理解为 titletoc
的设计就是这样的,ctex
不应该取代其默认行为。
另一方面,关于
titletoc
与大写罗马数字的兼容情况,以下可以代表我在模板中的设置。可以发现这个设置对于数字页码是右对齐的,然而对于较长的大写罗马数字则是中心对齐的。
可以阅读 titletoc
中 \contentspage
的源码,它是输出到固定宽度为 \@pnumwidth
的盒子中,默认是 1.55 em。你可以用 \contentsmargin{3em}
把这个值调大一些就可以装得下整个罗马数字了。
明白了!我认为我的问题已经得到了很好的解答。
感谢您对此的关注!
@atxy-blip 另外重定义 \tableofcontents
、\listoffigures
这些命令时,\cleardoublepage
最好放到开始处,这样有更好的灵活性。
\cleardoublepage
最好放到开始处
嗯嗯,又学到了!
贵开发者您好,目前我在尝试制作本校论文模板时,在目录格式设置方面使用两个常见的宏包均遇到了一些问题,譬如
titletoc
包的格式定义颇为复杂,而且会让大写罗马数字页码右侧不能对齐tocloft
包会覆盖CTeX原有的目录格式,而且不能通过覆盖\tableofcontents
命令换页输出图表清单(只能手动在正文加\cleardoublepage
);此外在修改格式后每页目录均会出现underfull \vbox
信息事实上本人的需求比较简单,对 ctexbook 默认样式的改动仅包括“目录”两个字以及目录中的章节标题两处调整字体字号,此外也打算仅在目录页标题上将
\contentsname
定义为目\hspace{2em}录
,因此希望CTeX能提供一些较为简捷的修改方式。不知这个需求能否在未来实现并加入CTeX?感谢贵组织一直以来对中文排版工具的付出!