排版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}效果:
感谢您提供的代码,问题已得到解决!