我尝试将节标题放在左侧的一列中,将内容放在右侧的另一列中。我发现了一个一个与此相关的问题,但是该解决方案有一个问题。如果一个部分以子部分开头,则子部分之前会有一个空格,导致部分标题和部分内容(子部分)无法垂直对齐。我似乎无法在另一个问题中提出的任何解决方案中解决这个问题。有人能帮忙解决这个问题吗?
\documentclass[a4paper]{article}
\usepackage[showframe]{geometry}
\usepackage{titlesec}
\usepackage{lipsum}
\geometry{left=6cm,right=3cm} % 3cm for the sections
\titleformat{\section}[leftmargin]
{\normalfont\bfseries\filright}
{\thesection}
{1em}
{}
\titlespacing*{\section}
{3cm}
{2ex plus .2ex minus .2ex}
{1sp}% should be 0, but it must be positive
\begin{document}
\lipsum[2]
\section{A title}
\subsection{A subsection}
\lipsum[3]
\section{A very very very very very long title}
\lipsum[3]
\end{document}
答案1
这里有一个解决方案,需要您使用新命令手动标记在节标题之后立即开始的子节\instantsubsection
:
\documentclass[a4paper]{article}
\usepackage[showframe]{geometry}
\usepackage{titlesec}
\usepackage{lipsum}
\geometry{left=6cm,right=3cm} % 3cm for the sections
\titleformat{\section}[leftmargin]
{\normalfont\bfseries\filright}
{\thesection}
{1em}
{}
\titlespacing*{\section}
{3cm}
{2ex plus .2ex minus .2ex}
{1sp}% should be 0, but it must be positive
\titleformat{\subsection}
{\normalfont\large\bfseries}
{\thesubsection}
{1em}
{}
\titlespacing*{\subsection}
{0pt}
{3.25ex plus 1ex minus .2ex}
{1.5ex plus .2ex}
\def\instantsubsection{%
\leavevmode
{\normalfont\large\bfseries \vskip-\baselineskip}%
\vspace*{-3.25ex plus 1ex minus .2ex}%
\subsection
}
\begin{document}
\lipsum[2]
\section{A title}
\instantsubsection{A subsection}
\lipsum[3]
\subsection{A subsection}
\lipsum[3]
\section{A very very very very very long title}
\lipsum[3]
\end{document}
标题格式和间距\subsection
已明确给出(默认值取自这个答案),这样一来,其中的魔法值从何\instantsubsection
而来就一目了然了。
\instantsubsection
首先进入水平模式,基本上就是开始新的段落行。然后设置与小节标题中使用的字体格式相同的字体格式。接下来发生的事情是,当前的虚拟行被一个负数删除\vskip
,\baselineskip
该负数是相邻基线之间的距离(“行高”)。另一个负数\vspace
删除每个小节前插入的垂直间距。现在我们可以继续使用正常\subsection
命令了。
如果我们之前没有更改字体格式,小节标题就不会与页边距中的节标题以相同的基线开始,因为段落行和标题通常具有不同的基线距离。正如您在输出中看到的那样,基线匹配得很好: