排版小说的时候,(对仗句式的)回目标题较长,想要在目录实现双行显示,如何让换行后的目录整体显示协调,观感舒适?以下是我的代码:
\documentclass[b5paper,twoside,openany,UTF8,no-math]{ctexbook}
\usepackage[left=2.54cm,right=2.54cm,top=2.54cm,bottom=2.54cm]{geometry}
\usepackage{zhlipsum,indentfirst,hyperref}
\usepackage{subcaption,graphicx}
%==================回目编号与标题风格==================%
\ctexset{
contentsname = {\texorpdfstring{\makebox[5\ccwd][s]{目录}}{目录}},
chapter/name = {,},
chapter/number = {\texorpdfstring{\makebox[5\ccwd][s]{第\chinese{chapter}回}}{第\chinese{chapter}回}},
%定义回目编号及显示样式
}
\usepackage{titlesec}
\titleformat{\chapter}[display]{\centering\Large\vskip -1cm}{\makebox[5\ccwd][s]{第\chinese{chapter}回}}{0.5ex}{\vskip 15pt\centering}
%设定每一回的chapter标题样式
%===========================%中文目录配置%========================%
\usepackage[titles,subfigure]{tocloft}
\renewcommand{\cftdot}{$\cdot$}
\renewcommand{\cftdotsep}{2}
\setlength{\cftbeforechapskip}{0pt}
\renewcommand{\cftchapleader}{\cftdotfill{\cftchapdotsep}}
\renewcommand{\cftchapdotsep}{\cftdotsep}
\makeatletter
\renewcommand{\numberline}[1]{%
\settowidth\@tempdimb{#1\hspace{0.5em}}%
\ifdim\@tempdima<\@tempdimb%
\@tempdima=\@tempdimb%
\fi%
\hb@xt@\@tempdima{\@cftbsnum #1\@cftasnum\hfil}\@cftasnumb}
\makeatother
\begin{document}
\tableofcontents
\chapter[栊翠庵茶品梅花雪\\怡红院劫遇母蝗虫]{栊翠庵茶品梅花雪\hspace{2ex}怡红院劫遇母蝗虫}
\zhlipsum[1-4]
\chapter{这一回不需要双行目录}
\zhlipsum[1-2]
\end{document}
呈现效果
期望实现的效果
希望得到各位大神们的指点,谢谢!
一个不skilled的方法。
核心思路是使用盒子:
\parbox[l]{<字数>\ccwd}{<第一行内容>\newline{}<第二行内容>}
% <字数>的大小对应两行中字数较大者
这边无法确定正文是否也需要想目录那样对齐,所以下面分类解决.
所有情况下MWE的结果均为:
即:正文中两行之间要么用符号分隔,要么直接连成一句话.
\documentclass{ctexbook}
\ctexset{
chapter={
name={第,回},
number={\chinese{chapter}}
}
}
\usepackage[hidelinks,bookmarksnumbered=true, breaklinks=true]{hyperref}
\begin{document}
\tableofcontents
\chapter[\texorpdfstring{\parbox[l]{8\ccwd}{甄士隐梦幻识通\newline{}贾雨村风尘怀闺秀}}{甄士隐梦幻识通灵,贾雨村风尘怀闺秀}]{甄士隐梦幻识通灵,贾雨村风尘怀闺秀}
\chapter{这一回不需要双行目录}
\chapter[\texorpdfstring{\parbox[l]{8\ccwd}{甄士隐梦幻识通灵\newline{}贾雨村风尘怀闺秀}}{甄士隐梦幻识通灵贾雨村风尘怀闺秀}]{甄士隐梦幻识通灵贾雨村风尘怀闺秀}
\end{document}
从你给的图来看,不是所有的章标题都要双行,所以直接封装一个新的章标题命令\twolinechapter
:
\documentclass{ctexbook}
\ctexset{
chapter={
name={第,回},
number={\chinese{chapter}}
}
}
% ------------- 封装部分 -------------- %
\newcommand{\twolinechapter}[3]{
\chapter{\texorpdfstring{\parbox[l]{#1\ccwd}{#2\newline{}#3}}{#2,#3}} % \texorpdfstring命令是为了照顾到pdf书签中的输出内容,下同
}
% ====================================== %
\usepackage[hidelinks,bookmarksnumbered=true, breaklinks=true]{hyperref}
\begin{document}
\tableofcontents
\twolinechapter{8}{甄士隐梦幻识通灵}{贾雨村风尘怀闺秀}
\chapter{这一回不需要双行目录}
\twolinechapter{8}{甄士隐梦幻识通}{贾雨村风尘怀闺秀}
\end{document}
还是封装一个新的章标题命令\twolinechapter
。
\documentclass{ctexbook}
\ctexset{
chapter={
name={第,回},
number={\chinese{chapter}}
}
}
% ------------- 封装部分 -------------- %
\newcommand{\twolinechapter}[3]{
\chapter[\texorpdfstring{\parbox[l]{#1\ccwd}{#2\newline{}#3}}{#2,#3}]{#2,#3}
}
% ====================================== %
\usepackage[hidelinks,bookmarksnumbered=true, breaklinks=true]{hyperref}
\begin{document}
\tableofcontents
\twolinechapter{8}{甄士隐梦幻识通灵}{贾雨村风尘怀闺秀}
\chapter{这一回不需要双行目录}
\twolinechapter{8}{甄士隐梦幻识通}{贾雨村风尘怀闺秀}
\end{document}
\settowidth
命令对中文文本长度的获取貌似不准确,不然\twolinechapter
命令的第一个参数可以省去。
李清老师在2012年重排过一版《金瓶梅》,可见这个需要魔法的链接
为避免网络问题,这里上传相关的文件以供参考:
其中实现了类似的效果,可惜...我看不太懂李清在.sty
中的设置:
期待题主的排版大作早日问世~
感谢您的代码帮助。
基本实现了我的排版需要,但是目前存在一个小问题:页眉显示回目名称的时候,回目标题也做两行显示,如下图:

我希望页眉的回目名称仍然单行显示,中间间隔1ccwd。以下是我定制页眉页脚的代码
@u6746 我做了一个尝试,但你在回复中只给了一个片段,我并不确定你是如何使用这些
fancyhdr
进行设置。我按照我的理解把他们插入到上面的回答中。我在@u64726 老师的代码内加上了如下的patch(放在对
\chaptermark
的修改之前):这样在
\chapter[#1]{#2}
内部调用\@chapter
时将以{#2}
的内容(也即\twolinechapter
中的#2,#3
)作为mark
的内容。另外,考虑到命令的统一,可以考虑加一个逻辑判断把
\chapter
和\twolinechapter
.同时,要避免在一个提问里连续出现大段的代码追问,上面问题是因为你在在原回答构造mwe时没有考虑到可能对页眉的影响出现的。当看到一个回答里关于同一个问题有三四段长达五十行的代码时,是很容易产生混乱的(而且很难指代)。建议在能体现问题的前提下尽可能精简代码,如有必要,应开新的问题。
@u6746 直到目前我才大致明白你的全部需求(甚至可能依旧有误/不全面):
章标题在目录中双行、在正文中正常单行排列;
另外,在根问题的代码中有些地方我没太能理解:
plain
样式,就无需再加一些重复设置;book
文档类的默认设置重复了,以至于我分不清哪些语句发挥了作用;pagestyle虽然预设了,但我不清楚你分别用在正文中哪些具体位置(即:你没在正文中使用
\(this)pagestyle
命令);\chaptermark
的重定义来看,奇偶页分别想要显示的内容究竟是什么呢。而@u70550 老师的追加代码已基本解决了需求2的前半段,因此我基于该追加代码补充下后半段。pagestyle、header部分的代码还是希望你回头自己梳理一下~
如果章节标题在正文中的间隔方式是1个汉字长度空白,则原来
\twolinechapter
的封装内容改为如下即可:如果章节标题在正文中的间隔方式是逗号,则原来
\twolinechapter
的封装内容改为如下即可:@u64726 感谢。我原本的需求是:chapter标题在目录双行显示、在正文(第XX回下方)单行显示,用一字符间隔。您的
代码,虽然用逗号做了分隔,但是我自己在这个基础上做了修改后,实现了我自己的排版需要。
后期检查版面,发现正文页眉的回目标题显示为双行,经过@u70550 的
代码修正后,问题得到完美解决。感谢二位老师!@u70550 @u64726