CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
972 stars 124 forks source link

可否在\ctexset内提供对目录样式的简洁设置 #588

Closed atxy-blip closed 2 years ago

atxy-blip commented 2 years ago

贵开发者您好,目前我在尝试制作本校论文模板时,在目录格式设置方面使用两个常见的宏包均遇到了一些问题,譬如

事实上本人的需求比较简单,对 ctexbook 默认样式的改动仅包括“目录”两个字以及目录中的章节标题两处调整字体字号,此外也打算仅在目录页标题上将\contentsname定义为目\hspace{2em}录,因此希望CTeX能提供一些较为简捷的修改方式。

不知这个需求能否在未来实现并加入CTeX?感谢贵组织一直以来对中文排版工具的付出!

sikouhjw commented 2 years ago

“目录”依赖 \chapter*,修改 \chapter 的样式就可以修改“目录”的样式。 修改“目录”之间的间距,感觉也不能方便多少。

atxy-blip commented 2 years ago

敝校对目录标题单独指定了字体字号,小弟不才,最开始的实现办法是在目录前后分别修改\chapter的格式,实在很繁琐。接着还想出了一个办法是手动绘制目录页面的标题,这样既能改文字又能指定格式,很好用,但如果用tocloft的话又都会被覆盖掉。

所以换句话说,本人的核心问题是如何能简单修改目录条目的字体样式,只是换个字体就行。如果之前有表述不清楚的地方实在请原谅。

zepinglee commented 2 years ago
  • 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 的作用域里有效。

atxy-blip commented 2 years ago

这种情况最好重定义 \tableofcontents

我先删去了目前使用的 tocloft 包测试这个方法,发现是我用来插入书签的 tocbibind 会引发冲突,取消了以上两个包以后确实成功修改了标题。

这样用 \ctexset 设置的 chapter/format 就只在 \begingroup\endgroup 的作用域里有效。

听君一席话胜读十年书!原来可以这样写,学艺不精贻笑大方了。

我接着看看 tocloft 的兼容情况。

atxy-blip commented 2 years ago

使用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}
zepinglee commented 2 years ago

使用这个简单的cls后会发现目录标题是左对齐的……

确实,不过这个应该理解为 titletoc 的设计就是这样的,ctex 不应该取代其默认行为。

另一方面,关于titletoc与大写罗马数字的兼容情况,以下可以代表我在模板中的设置。可以发现这个设置对于数字页码是右对齐的,然而对于较长的大写罗马数字则是中心对齐的。

可以阅读 titletoc\contentspage 的源码,它是输出到固定宽度为 \@pnumwidth 的盒子中,默认是 1.55 em。你可以用 \contentsmargin{3em} 把这个值调大一些就可以装得下整个罗马数字了。

atxy-blip commented 2 years ago

明白了!我认为我的问题已经得到了很好的解答。

感谢您对此的关注!

zepinglee commented 2 years ago

@atxy-blip 另外重定义 \tableofcontents\listoffigures 这些命令时,\cleardoublepage 最好放到开始处,这样有更好的灵活性。

atxy-blip commented 2 years ago

\cleardoublepage 最好放到开始处

嗯嗯,又学到了!