我怎样才能使 \titlespacing 不省略顶部间距?

我怎样才能使 \titlespacing 不省略顶部间距?

在linehight 文本multicols*{2}的环境中12pt,我使用

\titlespacing*{\subsection}{0pt}{12pt}{12pt}

12pt在子节前后创建恰好为 的空间。加上12pt子节字体的行高为 ,这将创建36pt-height 的子节,覆盖 3 行普通文本。

这在页面上的任何位置都可以正常工作,但如果子部分恰好位于列的顶部,则顶部间距会自动省略。我想强制执行36pt部分所在的总高度。

如何才能\titlespacing不省略列顶部的顶部间距?

更新 2:

我编辑了问题以使用12pt,因为建议的解决方案似乎没有涵盖迄今为止的所有情况,或者引入了稍微错误的间隙(+/- ~ 2pt),如果使用过于人为的点尺寸,这些间隙不容易被发现。以下 MWE 现在使用12pt线条并涵盖所有三个相关情况:列内的标题、第 1 列的顶部和第 2 列上的标题。

\documentclass[12pt]{article}

\usepackage{lipsum} 
\usepackage{multicol} 

\usepackage[compact]{titlesec}  

\titleformat{\subsection}
  {\fontsize{10pt plus 0pt minus 0pt}{12pt plus 0pt minus 0pt}\selectfont\bf} % format
  {} % label
  {0pt} %sep
  {} %after

\titlespacing*{\subsection}{0pt}{12pt}{12pt}

\begin{document}

\fontsize{10pt}{12pt}\selectfont

\begin{multicols}{2}\raggedcolumns

\subsection*{Bad Section}
\lipsum[1-2]
\columnbreak
\lipsum[1]
\subsection*{Good Section}
\lipsum[2]

\end{multicols}

\newpage

\begin{multicols}{2}\raggedcolumns

\lipsum[1]
\subsection*{Good Section}
\lipsum[2]
\columnbreak
\subsection*{Bad Section}
\lipsum[1-2]

\end{multicols}

\end{document}

答案1

您可以添加\vspace{-1cm}\vspace*{1cm}适当的参数\titleformat——两个空间将相互抵消,但页面顶部除外。这比 tohecz 的“盒子”解决方案更简单,并且与 egreg 的解决方案不同,它不会导致 a\section和直接相邻的 a之间出现额外的垂直空间\subsection。(请注意,在这种情况下,\section的“后”空间将覆盖 的\subsection“前”空间。)

编辑:无论出于什么原因,似乎还必须减去 \baselineskip\vspace*(并将其重新添加到 中\vspace)。

EDIT2:这是我能想到的最好的办法(一个我无法解释的破解方法):

  1. 在 内\titleformat,fonsize 和 之间的差值\baselineskip(在您修改的示例中为:2pt)必须用 减去\vspace,然后用 重新加上\vspace*

  2. 对于任何\subsection紧随其后的内容,必须在文档正文中减去 (12pt)\begin{multicols}的值。\baselineskip\vspace*


\documentclass[12pt]{article}

\usepackage{lipsum} 
\usepackage{multicol} 

\usepackage[compact]{titlesec}  

\titleformat{\subsection}
  {\vspace{\dimexpr -12pt+10pt}\vspace*{\dimexpr 12pt-10pt}%
  \fontsize{10pt plus 0pt minus 0pt}{12pt plus 0pt minus 0pt}\selectfont\bf} % format
  {} % label
  {0pt} %sep
  {} %after

\titlespacing*{\subsection}{0pt}{12pt}{12pt}

\begin{document}

\fontsize{10pt}{12pt}\selectfont

\begin{multicols}{2}\raggedcolumns

\vspace*{-12pt}

\subsection*{Bad Section}
\lipsum[1-2]
\columnbreak
\lipsum[1]
\subsection*{Good Section}
\lipsum[2]

\end{multicols}

\newpage

\begin{multicols}{2}\raggedcolumns

\lipsum[1]
\subsection*{Good Section}
\lipsum[2]
\columnbreak
\subsection*{Bad Section}
\lipsum[1-2]

\end{multicols}

\end{document}

答案2

您应该在章节标题中插入“垂直空格”,但不能跳过。相反,您必须使用一条不可见的规则;这是\subsection\section您可以根据需要进行定义。

然而,我不明白这如何能改善文档的印刷质量,特别是如果跳跃没有这里用于示例的那么大(1cm)。

\documentclass{article}

\usepackage{lipsum} 
\usepackage{multicol} 

\usepackage{titlesec}

\titleformat{\subsection}
  [block]
  {\normalsize\bfseries}
  {\thesubsection}
  {\quad}
  {\vrule height\dimexpr\ht\strutbox+1cm\relax width 0pt depth 0pt }
\titlespacing*{\subsection}{0pt}{0pt}{1cm}

\begin{document}\raggedcolumns

\begin{multicols}{2}

\lipsum[1]
\subsection*{Good section}
\lipsum[2-3]

\end{multicols}

\newpage

\begin{multicols}{2}\raggedcolumns

\subsection*{Bad Section}
\lipsum[1-3]

\end{multicols}

\end{document}

在此处输入图片描述

答案3

解决方案是将每个部分都括\subsection起来\vbox

\vbox{\subsection*{Bad section}}

\section如果您想自动执行此操作,这是可能的,但您必须对要以这种方式使用的每个分段命令( ,, ...)和每个变体(带星号、带有可选参数、不带可选参数)重复此技巧\subsection

\documentclass[a4paper]{article}

\usepackage{lipsum} 
\usepackage{multicol} 

\usepackage{sectsty}
\allsectionsfont{\normalsize\bfseries}

\usepackage[compact]{titlesec}  
\titlespacing*{\subsection}{0pt}{1cm}{1cm}

\makeatletter
%section
\let\x@section\section
\def\xs@section*#1   {\vbox{\x@section*{#1}}}
\def\xb@section[#1]#2{\vbox{\x@section[#1]{#2}}}
\def\xx@section#1    {\vbox{\x@section{#1}}}
\def\section{\@ifnextchar*\xs@section{\@ifnextchar[\xb@section\xx@section}}
%subsection
\let\x@subsection\subsection
\def\xs@subsection*#1   {\vbox{\x@subsection*{#1}}}
\def\xb@subsection[#1]#2{\vbox{\x@subsection[#1]{#2}}}
\def\xx@subsection#1    {\vbox{\x@subsection{#1}}}
\def\subsection{\@ifnextchar*\xs@subsection{\@ifnextchar[\xb@subsection\xx@subsection}}
\makeatother

\begin{document}\raggedcolumns

\begin{multicols}{2}

\lipsum[1]
\subsection*{Good section}
\lipsum[2-3]


\end{multicols}

\newpage

\begin{multicols}{2}\raggedcolumns

\subsection*{Bad Section}
\lipsum[1-3]

\end{multicols}

\end{document}

我必须补充一点,尽管我理解你的理由(让所有章节标题命令占用相同的空间),但结果并不是很好看。

相关内容