编辑/更新

编辑/更新

为了使我的文本与基线网格保持同步,我将\section标题前后的垂直间距设置为整数倍\baselineskip(使用titlesec包)。\section在此示例中,标题前面正好有两个空白行,后面正好有一个空白行(如 Robert Bringhurst 所建议的)。TeX 的垂直拉伸和收缩可能有其优势,但这些优势与此特定项目不太相关,因为此项目不包含垂直材料,只有纯文本和标题,并且需要适当的网格排版。哦,整本书只有一种字体大小。

现在,\subsection我希望标题前面1.5\baselineskip,和后面都有0.5\baselineskip。考虑下面的 MWE。只要新标题的开头\subsection与新页面不重合,一切都很好——在这种情况下, 会1.5\baselineskip被吞噬,导致剩余的文本与网格不同步。当然,这是您所期望的,但我想知道是否有办法改变它;让其中 0.5 个1.5\baselineskip难以消化,以便让标题位于两行之间,但让文本的第一行再次同步。

到目前为止,我想到的只是一个变通办法,或者说是一个有点肮脏的黑客,它在标题前插入一条粗白线。除了有点肮脏之外,它还有缺点:(1) 依赖于通过反复试验确定的数字 ( 0.6\baselineskip),当其他因素发生变化时,这个数字可能会出错;(2) 当子节发生以下情况时,它无法正常工作:不是从新页面的顶部开始(取消同步第 3 页的文本)。

如果有任何其他想法,我都会感激不尽,提前致谢!顺便说一句,他们不必依赖 titlesec,这是我迄今为止没有的东西。

\documentclass[paper=a5,pagesize]{scrartcl}
\usepackage{blindtext,xcolor,tikz,eso-pic,titlesec}

\setkomafont{section}{\normalsize}

% baseline grid
\AddToShipoutPicture{%
\AtTextLowerLeft{
    \begin{tikzpicture}[overlay,remember picture]%
        \draw[red!10!white,thin]%
             (current page.south west) grid[step=\baselineskip]%
             (current page.north east);%
    \end{tikzpicture}%
    }%
}

% spacing for headings
\titlespacing*{\section}{0em}{2\baselineskip}{\baselineskip}
\titlespacing*{\subsection}{0em}{1.5\baselineskip}{0.5\baselineskip}
\titlespacing*{\subsubsection}{0em}{\baselineskip}{0em}

%% workaround
%\titlespacing*{\subsection}{0em}{1\baselineskip}{0.5\baselineskip}
%\titleformat{\subsection}{\sectfont{\color{white}\titlerule[0.6\baselineskip]}}{\thesubsection}{1ex}{}


\begin{document}
\section{Lorem Ipsum}
\Blindtext
\subsection{Lorem Ipsum}
\Blindtext\newpage
\subsection{Lorem Ipsum}
\Blindtext
\subsubsection{Lorem Ipsum}
\Blindtext
\end{document}

编辑/更新

接下来是解决方法的第二次改进(但它仍然是一种解决方法),现在是一个完整的 MWE:

\documentclass[paper=a5,pagesize]{scrartcl}
\usepackage{xcolor,tikz,eso-pic,titlesec,blindtext}
\setkomafont{section}{\normalfont}
\setkomafont{subsection}{\normalfont}
\setkomafont{subsubsection}{\normalfont}

% baseline grid
\AddToShipoutPicture{%
\AtTextLowerLeft{
\begin{tikzpicture}[overlay,remember picture]%
\draw[red!10!white,thin]%
 (current page.south west) grid[step=\baselineskip]%
 (current page.north east);%
 \end{tikzpicture}%
 }%
}

% spacing for headings
\titlespacing*{\section}{0em}{2\baselineskip}{\baselineskip}
\titlespacing*{\subsection}{0em}{1\baselineskip}{0.5\baselineskip}
\titlespacing*{\subsubsection}{0em}{\baselineskip}{0em}

%% workaround
\titleformat{\subsection}{\vspace{0.85\baselineskip}\vspace*{-0.35\baselineskip}}{\thesubsection}{1ex}{}

\begin{document}
\section{Lorem Ipsum}
\Blindtext
\subsection{Lorem Ipsum}
\Blindtext\newpage
\subsection{Lorem Ipsum}
\Blindtext
\subsubsection{Lorem Ipsum}
\Blindtext
\end{document}

航向降低约 0.5\baselineskip

更新,2月21日

(回复 Hendrik 的回答)抱歉,我在测试您的解决方案时有点太马虎了,亨德里克。\topskip如果新小节之前的分页符是手动的(如示例中所示),则此技巧确实有效,但如果分页符是自动的(就像在现实生活中,当标题之前的页面已满时那样),则标题位于第一基线上,而不是偏移0.5\baselineskip——空间会像往常一样被占用。请参见此处:

\begin{document}
\section{Lorem Ipsum}
\Blindtext
\subsection{Lorem Ipsum}
\Blindtext\newpage
\subsection{Lorem Ipsum}
\Blindtext
\subsection{Lorem Ipsum}
\blindtext\blindtext\blindtext\blindtext
\subsection{Lorem Ipsum} % <---------------- !
\blindtext
\end{document}

我并不是说这种\topskip方法是个坏主意;我只是目前不知道如何改进它。

答案1

(将其作为单独的答案发布,因为它提供了完全不同的解决方案。)

对于您的问题有一个非常简单的解决方案,它也应该适用于涉及脚注和其他内容的更复杂情况:在\baselineskip小节标题之前和之后放置一个(以便所有内容都在网格上),然后使用\raisebox将数字和标题都降低0.5\baselineskip

文本在网格上

注意可选参数[0pt][0pt]\raisebox它们使高度,特别是标题的深度为零,以便后续线条停留在网格上。

\documentclass[paper=a5,pagesize]{scrartcl}
\usepackage{blindtext,xcolor,tikz,eso-pic,titlesec}
\setkomafont{section}{\normalsize}
% baseline grid
\AddToShipoutPicture{%
\AtTextLowerLeft{
    \begin{tikzpicture}[overlay,remember picture]%
        \draw[red!10!white,very thin]%
             (current page.south west) grid[step=\baselineskip]%
             (current page.north east);%
    \end{tikzpicture}%
    }%
}
% spacing for headings
\titlespacing*{\section}{0em}{2\baselineskip}{\baselineskip}
\titlespacing*{\subsection}{0em}{\baselineskip}{\baselineskip}
\titlespacing*{\subsubsection}{0em}{\baselineskip}{0em}
\titleformat{\subsection}
            {\sffamily\bfseries}
            {\raisebox{-0.5\baselineskip}[0pt][0pt]{\thesubsection}}
            {1ex}
            {\raisebox{-0.5\baselineskip}[0pt][0pt]} % raise the title
\begin{document}
\section{Lorem Ipsum}
\Blindtext\newpage
\subsection{Lorem Ipsum}
\Blindtext
\subsection{Lorem Ipsum}
\blindtext\blindtext\blindtext\blindtext
\subsection{Lorem Ipsum} % Works now!
\blindtext
\end{document}

答案2

我的解决方案是将 s 增加\topskip0.5\baselineskip如果\subsection这种情况发生在页面顶部,它会根据0.5\baselineskip需要将子部分的标题向下移动。如果\subsection开始于页面中间某处,则不会产生任何影响:TeX\topskip只会在第一个框放到页面上时查看。此外, 的增加\topskip是局部的,因此不会影响后面的页面。

为了使这个想法奏效,我们必须查看我们在页面上的位置:当我们接近底部时,必须\pagebreak在新的子节标题之前发出。关键是 TeX 通常会“消化”足够多的一页材料,然后再决定在哪里分页。因此,可能会发生(本地!)\topskip更改在执行分页之前就已经消化了。为了防止这种情况,如果页面只剩下三行空间,我们必须手动分页。

现在,下面的代码在明确的\pagebreaks 之后以及“自然”分页符处都可以工作。

文本在网格上

\documentclass[paper=a5,pagesize]{scrartcl}
\usepackage{blindtext,xcolor,tikz,eso-pic,titlesec}
\setkomafont{section}{\normalsize}
% baseline grid
\AddToShipoutPicture{%
\AtTextLowerLeft{
    \begin{tikzpicture}[overlay,remember picture]%
        \draw[red!10!white,very thin]%
             (current page.south west) grid[step=\baselineskip]%
             (current page.north east);%
    \end{tikzpicture}%
    }%
}
% spacing for headings
\titlespacing*{\section}{0em}{2\baselineskip}{\baselineskip}
\titlespacing*{\subsection}{0em}{1.5\baselineskip}{0.5\baselineskip}
\titlespacing*{\subsubsection}{0em}{\baselineskip}{0em}
\makeatletter
\titleformat{\subsection}
 {\dimen@=\pagetotal
  \advance\dimen@ by 3.001\baselineskip
  \ifdim\dimen@>\pagegoal\pagebreak\fi
  \advance\topskip by 0.5\baselineskip
  \sffamily\bfseries}
 {\thesubsection}{1ex}{}
\makeatother
\begin{document}
\section{Lorem Ipsum}
\Blindtext\newpage
\subsection{Lorem Ipsum}
\Blindtext
\subsection{Lorem Ipsum}
\blindtext\blindtext\blindtext\blindtext
\subsection{Lorem Ipsum} % Works now!
\blindtext
\end{document}

答案3

一个替代方案是安排标题上方的 1.5\baselineskip 粘连中只有 1 个是可丢弃的。

这会进行修改,以便在子节上方有一个空行,其中包含 1(可丢弃)的基线跳过粘合(它可能小于基线跳过,具体取决于前一个项目的深度)。在带有空框的行之后是一个惩罚,以防止在该点处换行,然后将半个基线粘合到实际标题。这意味着即使在页面顶部,您也会得到一个空行和半个基线跳过。

\documentclass[paper=a5,pagesize]{scrartcl}
\usepackage{blindtext,xcolor,tikz,eso-pic,titlesec}

\setkomafont{section}{\normalsize}

% baseline grid
\AddToShipoutPicture{%
\AtTextLowerLeft{
    \begin{tikzpicture}[overlay,remember picture]%
        \draw[red!10!white,thin]%
             (current page.south west) grid[step=\baselineskip]%
             (current page.north east);%
    \end{tikzpicture}%
    }%
}

% spacing for headings
\titlespacing*{\section}{0em}{2\baselineskip}{\baselineskip}
\titlespacing*{\subsection}{0em}{.5\baselineskip}{0.5\baselineskip}
\titlespacing*{\subsubsection}{0em}{\baselineskip}{0em}



%% workaround
%\titlespacing*{\subsection}{0em}{1\baselineskip}{0.5\baselineskip}
%\titleformat{\subsection}{\sectfont{\color{white}\titlerule[0.6\baselineskip]}}{\thesubsection}{1ex}{}

\makeatletter
\def\xsubsection{subsection}
\let\oldttl@straight@ii\ttl@straight@ii
\def\ttl@straight@ii #1#2#3#4#5#6#7{%
\def\tmp{#6}%
\ifx\tmp\xsubsection
\null\nobreak
\fi
\oldttl@straight@ii{#1}{#2}{#3}{#4}{#5}{#6}{#7}}
\begin{document}
\section{Lorem Ipsum}
\Blindtext
\subsection{Lorem Ipsum}
\Blindtext\newpage
{\tracingall
\subsection{Lorem Ipsum}}
\Blindtext
\subsubsection{Lorem Ipsum}
\Blindtext
\end{document}

答案4

此外Hendrik Vogt 的这个回答,我想补充一点,使用

    \usepackage[explicit]{titlesec}

    \titleformat{\subsection}
        {}
        {}
        {}
        {\raisebox{-0.5\baselineskip}[0pt][0pt]%
         \parbox{textwidth}{\fontsize{14}{16}\it\thesubsection\hspace{1ex}#1}} % raise the title

将有机会在小节标题中使用不同的字体大小,并使其长度超过一行(\raisebox不会将文本分成几行。)

相关内容