使用 KOMA 格式化多行章节标题

使用 KOMA 格式化多行章节标题

我需要(出版商要求)以某种方式格式化文档中的章节标题,使章节编号与页面上的文本对齐,但如果章节长度超过一行,则以下几行应从5mm第一行的开头有一个水平空间。

也许这张图片可以最好地解释这一点:

在此处输入图片描述

绿色箭头应为5mm,蓝色箭头可能不是5mm。

由于我使用 KOMA,因此无法使用titlesec。相反,我尝试通过修改 KOMA 指南中的示例来实现这一点:

\documentclass{scrbook}

\renewcommand*{\chapterformat}{\makebox[5mm][l]{\thechapter}}

\begin{document}
\chapter{A very long chapter title asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd}
kjdhfaksdjhf 
\end{document}

这会在章节号周围添加一个\mbox长度5mm,但现在的问题是(在图片中)蓝色箭头也总是5mm很长。当章节号变大(2 位数字)时,它们5mm就太短了。

现在的问题是:有没有办法仅在第二/第三/...行改变水平空间(当KOMA-script使用该类时)。

无论数字是多少,章节号和章节标题首字母之间的距离都应该相同。也就是说,无论数字是一位数还是两位数。

答案1

一种方法是修补排版章节标题的命令\@@makechapterhead并插入所需的空格。这样它就可以自动化,并且不会成为目录条目的一部分。可以使用etoolbox包裹

在下面的 MWE 中,您需要指定长度\chapnumwidth\chaplabelsep使用\setlength命令,补丁将处理其余部分。以这种方式使用/设置长度可以实现更通用的解决方案,将来可以轻松修改。

在此处输入图片描述

\documentclass{scrbook}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
\newsavebox{\@chapnumbox}% Box to store chapter number
\patchcmd{\@@makechapterhead}% <cmd>
  {\size@chapter{#1}}% <search>
  {\sbox{\@chapnumbox}{\size@chapter{\thechapter}}% Store chapter number
   \size@chapter{\hspace*{\dimexpr\chaplabelsep-\chapnumwidth+\wd\@chapnumbox\relax}#1}}% <replace>
  {}% <success>
  {}% <failure>
\makeatother
\renewcommand*{\chapterformat}{\makebox[\chapnumwidth][l]{\thechapter}}
\newlength{\chapnumwidth} \setlength{\chapnumwidth}{5mm}% Chapter number/label width
\newlength{\chaplabelsep} \setlength{\chaplabelsep}{2em}% Chapter number/label separation
\begin{document}
\chapter{A very long chapter title asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd}
kjdhfaksdjhf

\setcounter{chapter}{21}

\chapter{A very long chapter title asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd}
kjdhfaksdjhf 

\end{document}

修补的格式为

\patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}

如果成功,则用 替换并执行,否则,则<search>执行。<cmd><replace>会注意到,MWE 中的修补程序将章节编号(以适当的字体大小/格式)保存在一个框中<success><failure>

\sbox{\@chapnumbox}{\size@chapter{\thechapter}}% Store chapter number

并补充说

\hspace*{dimexpr\chaplabelsep-\chapnumwidth+\wd\@chapnumbox\relax}

在章节标题(#1)之前。这意味着您的章节标题将恰好\chaplabelsep从章节标签开始,因为删除的\chapnumwidth是实际\chapterformat宽度。当然,您可以根据需要进行修改。

总之,章节标题左边距的宽度由命令指定\chapterformat(正如您已经完成的那样),而第一行使用修补形式进行调整,该修补形式\@@makechapterhead恢复\chapterformat宽度,然后根据章节编号/标签的宽度将其前进\chaplabelsep

答案2

自 KOMA-Script 版本 3.19(当前为 3.23)起,您可以重新定义\chapterlinesformat以获得所需的结果:

\makeatletter
\renewcommand\chapterlinesformat[3]{%
  \ifstr{#1}{chapter}
  {\@hangfrom{\hskip5mm}{\hspace{-5mm}#2#3}}
  {\@hangfrom{#2}{#3}}%
}
\makeatother

例子:

\documentclass{scrbook}
\makeatletter
\renewcommand\chapterlinesformat[3]{%
  \ifstr{#1}{chapter}
  {\@hangfrom{\hskip5mm}{\hspace{-5mm}#2#3}}
  {\@hangfrom{#2}{#3}}%
}
\makeatother

\begin{document}
\chapter{A very long chapter title asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd}
kjdhfaksdjhf

\setcounter{chapter}{21}

\chapter{A very long chapter title asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd}
kjdhfaksdjhf 

\end{document}

相关内容