我用它titlesec
来为我的部分分配一些自定义格式。特别是我想使用 margin \section
,这样标题部分就会排版在左边距上,并且该部分的文本将从与图块相同的高度开始。
但是我在间距方面遇到了一点问题:当 a\section
后面紧跟着 a\subsection
时,会添加不必要的垂直空间,并且子部分的标题不再与部分的标题对齐(参见下面的代码和图片)。我该如何解决这个问题?
\documentclass{article}
\usepackage{lipsum}
\usepackage{titlesec}
\titleformat{\section}[leftmargin]{\raggedright\scshape}{}{0pt}{}
\titlespacing*{\section}{2.5cm}{*2.5}{0.5cm}
\titleformat{\subsection}{\bfseries}{}{0pt}{}
\titlespacing*{\subsection}{0pt}{*2}{*1}
\begin{document}
\section{First}
\lipsum[1]
\section{Second}
\subsection{This is not nice}
\lipsum[1]
\subsection{This is fine}
\lipsum[1]
\end{document}
更新:因为我确实需要这个问题的答案(我正在一些我应该很快交付的文档中使用它),所以我将向任何能给我带来答案的人提供赏金。
对于决定解决这个问题的人,我已经浏览了 titlesec 的源代码,并找到了一些获得所需结果的黑客方法。它涉及抑制一些\leavevmode
,延迟对一些间距参数的分配后子节已排版,并且使 titlesec 将有问题的\subsection
标题直接排版到文档中,而不是排版到“框”中以便定位。遗憾的是,这也导致以下段落的缩进出现问题。
我会爱看到比这更简单的解决方案。从概念上讲,我想做的事情非常简单:在之后以\section
某种方式告诉 titlesec 抑制在下一个之前插入的任何垂直间距\subsection
。所以我仍然希望存在一些简单的解决方案,但我错过了它,因为我对间距、垂直/水平模式以及段落的排版方式没有太多经验。
即使解决方案有更复杂一点,理想的方案是与 titlesec 配合使用,并且不会破坏其任何其他选项。但是,最终我还是会选择一个次要的解决方案,该解决方案修补了 的定义\subsection
并使其至少在我的示例和我上面给出的预期配置中工作。
答案1
这是一个非常有趣的布局。尝试以下代码。布尔值与 挂钩\everypar
。这意味着如果首先是普通段落,则将其设置为 false,并且下一个子节将具有正常间距。还请注意命令\secskip
结束的奇怪位置,但它似乎有效。
编辑 1:恢复原样,并在将子部分向上移动之前\everypar
删除垂直空间。 移除所有胶水并添加以防止拉伸。\lastskip
\raggedbottom
编辑 2:看起来额外的垂直间距是否\baselineskip
\usepackage{titlesec}
\makeatletter
\newif\ifaftersec\aftersecfalse
\newcommand\setsubskip{%
\global\aftersectrue
\everypar{%
\global\aftersecfalse
\if@noskipsec
\global\@noskipsecfalse
\clubpenalty\@M
\hskip-\parindent
\begingroup
\@svsechd\unskip{\hspace{\@tempskipb}}%
\endgroup
\else
\clubpenalty\@clubpenalty\everypar{}%
\fi}}
\newcommand\subskip{%
\ifaftersec
\removelastskip% EDIT 2
\vspace{-\baselineskip}% EDIT 2 ??????????????
\fi
\global\aftersecfalse}
\titleformat{\section}[leftmargin]{\raggedright\scshape}{}{0pt}{}[\setsubskip]
\titlespacing*{\section}{2.5cm}{2.5ex}{0.5cm}
\titleformat{\subsection}{\subskip\bfseries}{}{0pt}{}[]
\titlespacing*{\subsection}{0pt}{2ex}{1ex}
\raggedbottom
\makeatother