为了使我的文本与基线网格保持同步,我将\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}
更新,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 增加\topskip
。0.5\baselineskip
如果\subsection
这种情况发生在页面顶部,它会根据0.5\baselineskip
需要将子部分的标题向下移动。如果\subsection
开始于页面中间某处,则不会产生任何影响:TeX\topskip
只会在第一个框放到页面上时查看。此外, 的增加\topskip
是局部的,因此不会影响后面的页面。
为了使这个想法奏效,我们必须查看我们在页面上的位置:当我们接近底部时,必须\pagebreak
在新的子节标题之前发出。关键是 TeX 通常会“消化”足够多的一页材料,然后再决定在哪里分页。因此,可能会发生(本地!)\topskip
更改在执行分页之前就已经消化了。为了防止这种情况,如果页面只剩下三行空间,我们必须手动分页。
现在,下面的代码在明确的\pagebreak
s 之后以及“自然”分页符处都可以工作。
\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
不会将文本分成几行。)