排版ctexbook
时,希望part
和chapter
在同一页(part
之后紧跟着就可以排版chapter
),但是chapter
和chapter
之间仍然互相分页,如何实现这样的效果?
以下是我的代码:
\documentclass[12pt,twoside,openany]{ctexbook}
\usepackage[paperwidth=168mm, paperheight=240mm, left=2.35cm, right=2.35cm, top=3cm, bottom=3cm]{geometry}
\begin{document}
\part{第一部分}
第一部分和第一章希望在同一页上。
\chapter{第一章}
第一章和第二章仍然分页。
\chapter{第二章}
\chapter{第三章}
\end{document}
希望实现的效果:
@u686 的回答中所给tse贴的方法对标准book
文档类确实是有效的,但:
ctexbook
文档类对各标题命令都进行了一定程度的重定义,所以一些基于patching
的方法可能会失效;本人的方法省流:
etoolbox
宏包;\part
命令下的第一个\chapter
命令;\apptocmd
命令,将布尔变量“植入”\part
,\chapter
的定义中;\patchcmd
命令,从底层删掉\part
命令之后的换页命令;\ctexset
命令下,条件设置\chapter
命令之前的换页操作。\part
命令所生成标题的前后间距;\part
命令所生成标题的样式首先删掉选项twoside
。该选项对于book
文档类是默认导入的:
然后导入etoolbox
宏包。
ctexbook
文档类下的初始效果先展示不做任何处理时的效果,以做对比:
\part
命令下的第一个\chapter
命令其实呢,你在每个\part
命令下第二个及之后的\chapter
命令之前手动换页就行了...但为了严格遵守“内容与格式分离”嘛...
\newif\ifrefreshpart
\refreshpartfalse
原理为:
\part
命令时,将变量设为TRUE,表示:刷新为新的一个\part
命令的标题\part
命令下第一次使用\chapter
前判断变量真值,为假则取消\chapter
命令之前的换页操作;反之则保留\chapter
命令之后,将变量设为FALSE\apptocmd
命令,将布尔变量“植入”\part
,\chapter
的定义中\apptocmd{\@part}{\refreshparttrue}{}{}
\apptocmd{\@chapter}{\refreshpartfalse}{}{}
\part
命令之后的换页操作、条件设置\chapter
命令之前的换页操作如图,ctexbook
类重定义了\part
命令,但一直展开到\@endpart
时,可以发现是靠\newpage
命令来换页的:
因此删掉这里的\newpage
即可:
\patchcmd{\@endpart}{\newpage}{}{}{}
\chapter
命令之前的样式属于ctex
宏集可操作的,因此在\ctexset
命令下根据之前提到的原理修改:
\ctexset{
chapter={
break={%条件设置\chapter之前的换页
\if@openright\cleardoublepage\else
\ifrefreshpart
\par
\else
\clearpage
\fi
\fi
},
}
}
\part
命令所生成标题的样式、前后间距题主所给的效果图中,\part
命令所生成标题满足:
所以在\ctexset
命令下修改:
\ctexset{
part={
aftername={\quad},
beforeskip={0pt plus 50pt},
afterskip={50pt},
},
}
\documentclass[12pt,openany]{ctexbook}
\usepackage[paperwidth=168mm, paperheight=240mm, left=2.35cm, right=2.35cm, top=3cm, bottom=3cm]{geometry}
\usepackage{etoolbox}
\newif\ifrefreshpart
\refreshpartfalse
\makeatletter
\apptocmd{\@part}{\refreshparttrue}{}{}
\apptocmd{\@chapter}{\refreshpartfalse}{}{}
\patchcmd{\@endpart}{\newpage}{}{}{}
\ctexset{
part={
aftername={\quad},
beforeskip={0pt plus 50pt},
afterskip={50pt},
},
chapter={
break={%条件设置\chapter之前的换页
\if@openright\cleardoublepage\else
\ifrefreshpart
\par
\else
\clearpage
\fi
\fi
},
}
}
\makeatother
\begin{document}
\part{层次一}
第一部分和第一章希望在同一页上。
\chapter{一层一}
第一章和第二章仍然分页。
\chapter{一层二}
\part{层次二}
\chapter{二层一}
\end{document}
效果:
感谢您提供的代码,问题已得到解决!