20 排版ctexbook时,如何设置让part和chapter在同一页而chapter之间仍然分页?

发布于 2025-05-15 17:13:53

排版ctexbook时,希望partchapter在同一页(part之后紧跟着就可以排版chapter),但是chapterchapter之间仍然互相分页,如何实现这样的效果?
以下是我的代码:

\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}

希望实现的效果:
wechat_2025-05-15_171218_687.jpg

查看更多

关注者
0
被浏览
176
尊咾哎哟
尊咾哎哟 1天前
¥a^2+b^2=c^2¥. . .

@u686 的回答中所给tse贴的方法对标准book文档类确实是有效的,但:

  • ctexbook文档类对各标题命令都进行了一定程度的重定义,所以一些基于patching的方法可能会失效;
  • tse贴中的方法没能完全覆盖题主的需求。

本人的方法省流:

  1. 导入etoolbox宏包;
  2. 设置条件变量,用于判断是否属于\part命令下的第一个\chapter命令
  3. 使用\apptocmd命令,将布尔变量“植入”\part,\chapter的定义中;
  4. 使用\patchcmd命令,从底层删掉\part命令之后的换页命令;
  5. \ctexset命令下,条件设置\chapter命令之前的换页操作。
  6. 调整\part命令所生成标题的前后间距;
  7. 修改\part命令所生成标题的样式

预处理

首先删掉选项twoside。该选项对于book文档类是默认导入的:
image.png

然后导入etoolbox宏包。

标准ctexbook文档类下的初始效果

先展示不做任何处理时的效果,以做对比:
image.png

设置条件变量,用于判断是否属于\part命令下的第一个\chapter命令

其实呢,你在每个\part命令下第二个及之后的\chapter命令之前手动换页就行了...但为了严格遵守“内容与格式分离”嘛...
\newif\ifrefreshpart
\refreshpartfalse

原理为:

  • 正文开始前,将变量初始化为FALSE
  • 每次使用\part命令时,将变量设为TRUE,表示:刷新为新的一个\part命令的标题
  • 每个\part命令下第一次使用\chapter前判断变量真值,为假则取消\chapter命令之前的换页操作;反之则保留
  • 每次执行了\chapter命令之后,将变量设为FALSE

使用\apptocmd命令,将布尔变量“植入”\part,\chapter的定义中

\apptocmd{\@part}{\refreshparttrue}{}{}
\apptocmd{\@chapter}{\refreshpartfalse}{}{}

删掉\part命令之后的换页操作、条件设置\chapter命令之前的换页操作

如图,ctexbook类重定义了\part命令,但一直展开到\@endpart时,可以发现是靠\newpage命令来换页的:
image.png

因此删掉这里的\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},
    },
}

MWE

\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}

效果:
image.png

2 个回答
其实有点卡
其实有点卡 1天前
这家伙很懒,什么也没写!

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览