我需要(出版商要求)以某种方式格式化文档中的章节标题,使章节编号与页面上的文本对齐,但如果章节长度超过一行,则以下几行应从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}