确保一个段落至少使用给定的高度?

确保一个段落至少使用给定的高度?

我正在根据回忆录制作一个自定义文档类,但我不知道如何实现章节摘要以便它能够按照我的要求完成(章节摘要是跟在章节标题后面的一个小的可选段落)。

我希望章节的实际第一段从章节标题下方的固定垂直位置开始,除非摘要很长,在这种情况下它应该将第一段向下推。它目前的样子如下:

章节标题和摘要

我有\setlength{\afterchapskip}{4\baselineskip}(从章节标题到第一段的距离)和(如果有摘要则\setlength{\prechapterprecisshift}{-3\baselineskip}删除)。如果我找不到解决方案,我会安排摘要后的间距,这样一行摘要就不会移动第一段。但是,我希望两行摘要仍然不会将第一段向下推。\afterchapskip2\baselineskip

鉴于回忆录定义和\chapterprecis提供钩子的方式,我不确定如何测量摘要的高度。我也想过制作某种段落级支柱,但我不知道怎么做(在摘要文本开头插入正常的零宽度规则会改变其第一行的高度,而不是整个摘要的高度)。\prechapterprecis\postchapterprecis


编辑-我当前的解决方案

我稍微调整了@Gonzalo 的方法以简化高度比较。minibox还需要它的[t]参数:

\newlength{\postchapterprecisskip}
\setlength{\prechapterprecisshift}{3\baselineskip}
\setlength{\postchapterprecisskip}{\baselineskip}
\renewcommand\prechapterprecis{\vspace*{-\prechapterprecisshift}}
\renewcommand\postchapterprecis{\vspace*{\postchapterprecisskip}}
\newsavebox\sba@precisbox
\newlength\sba@precisboxht
\newlength\sba@precisboxdp
\renewcommand\chapterprecishere[1]{%
    \begin{lrbox}{\sba@precisbox}%
        \begin{minipage}[t]{\linewidth}%
            \prechapterprecis
            \flushright
            \begin{balanced}{\linewidth}%
                \precisfont\strut##1\strut%
            \end{balanced}%
            \postchapterprecis
        \end{minipage}%
    \end{lrbox}%
    \settoheight\sba@precisboxht{\usebox\sba@precisbox}%
    \settoheight\sba@precisboxdp{\usebox\sba@precisbox}%
    \addtolength\sba@precisboxht{\sba@precisboxdp}%
    \usebox{\sba@precisbox}\par\unskip%
    \ifnum\sba@precisboxht<0pt
        \vspace*{-\sba@precisboxht}
    \fi}

对于有摘要的章节,它运行良好,第一章的垂直位置保持一致,只要摘要超过 2 行,就会被向下推。

正确:对齐第一段

正确:3 行摘要下推

但是,与没有摘要的第一段相比,略有变化(略低)。这种变化受到添加的影响,\hrule所以我猜这是一个问题......有什么想法吗\par\parskip

错误


编辑-接受的解决方案

我没有太多时间在我的代码中采用一种特定的解决方案;我接受了戴维的答案,因为它使用了一种原始技术,但贡萨洛的答案可能更通用一些,对周围的空白进行了一些调整。

答案1

作为装箱的替代,这只是用于\prevgraf查看前一段中有多少行,\baselineskip如果间距小于一定量(3在本例中为),则添加间距,这意味着 1、2 或 3 行段落占用相同的空间,但 4 行段落会将下面的文本向下推。

请注意,您应该始终在问题中提供完整的工作文档:由于您没有,我从 Gonzalo 的答案中借用了一个。

\documentclass[openany]{memoir}% option openany just for the example
\usepackage{lipsum}


\renewcommand\chapterprecishere[1]{%
  \prevgraf0
  \prechapterprecis #1\postchapterprecis
  {\count0 \numexpr3-\prevgraf\relax
    \precisfont% just needed in case this did a size change so get right baselien
   \ifnum\count0 >0 \vspace{\count0 \baselineskip}\fi}}

\begin{document}

\chapter{Test Chapter One}
\chapterprecishere{Test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test}
\lipsum[4]
\chapter{Test Chapter Two}
\chapterprecishere{Test test test test test}
\lipsum[4]
\chapter{Test Chapter Three}
\chapterprecishere{Test test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test test test test 
test test test test test test test}
\lipsum[4]
\chapter{Test Chapter Four}
\chapterprecishere{Test test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test test test}
\lipsum[4]
\chapter{Test Chapter Five}
\chapterprecishere{} % need this or need to hook the measuring code elsewhere
\lipsum[4]
\chapter{Test Chapter Six}
\chapterprecishere{Test test} 
\lipsum[4]


\end{document}

如果\postchapterprecis可以使用一些装饰,例如(乳胶)规则或其他装饰,重置\prevgraf更通用的版本将保存\prevgraf\baselineskip在摘要内部,然后在外部使用它们来调整间距,因此

\renewcommand\chapterprecishere[1]{%
  \prevgraf0
  \prechapterprecis #1%
  \par
  \xdef\precistmp{\noexpand\precisskip{\the\prevgraf}{\the\baselineskip}}%
  \postchapterprecis
  \precistmp}

所以\precistmp会扩展为类似

 \precisskip{3}{25pt}

因此,如果 25pt 基线上有 3 行段落,则需要定义该命令来执行您想要执行的任何操作。例如:

\def\precisskip#1#2{{%
    \count0 \numexpr3-#1\relax
    \dimen0=#2 %
   \ifnum >0 \vspace{\count0 \dimen0}\fi}}

答案2

如果我正确理解了您的问题,您可以将摘要装箱,测量其总高度(高度+深度)并有条件地决定(取决于计算出的箱子高度)是否使用重新定义添加一些垂直间距\postchapterprecis;所有这些都是在适当的重新定义中完成的\chapterprecishere;大致如下:

\documentclass[openany]{memoir}% option openany just for the example
\usepackage{lipsum}

% this is just for drawing a green rule on every page and test the code
% it can be safely deleted
\usepackage[contents={},angle=0,scale=1]{background}
\usetikzlibrary{calc}
\backgroundsetup{contents={%
  \begin{tikzpicture}[overlay]
  \draw[green,ultra thick] ( $ (current page.west) + (0,3.02cm) $ )-- ++(2\textwidth,0);
\end{tikzpicture}}}
% end of the code drawing the line

\newsavebox\mybox
\newlength\myboxht
\newlength\myboxdp

\setlength\afterchapskip{4\baselineskip}
\renewcommand\chapterprecishere[1]{%
  \begin{lrbox}{\mybox}
  \begin{minipage}{\dimexpr\linewidth-\leftmargin-25pt\relax}
  \precisfont #1
  \end{minipage}%
  \end{lrbox}%
  \settoheight\myboxht{\usebox\mybox}%
  \settoheight\myboxdp{\usebox\mybox}%
  \addtolength\myboxht{\myboxdp}%
  \ifnum\myboxht>\dimexpr\baselineskip\relax
    \renewcommand\postchapterprecis{\end{quote}}
  \else
    \renewcommand\postchapterprecis{\end{quote}\vskip\baselineskip}
  \fi%
  \vskip\dimexpr-\baselineskip+2pt\relax
  \prechapterprecis #1\postchapterprecis}

\begin{document}

\chapter{Test Chapter One}
\chapterprecishere{Test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test}
\lipsum[4]
\chapter{Test Chapter Two}
\chapterprecishere{Test test test test test}
\lipsum[4]
\chapter{Test Chapter Three}
\chapterprecishere{Test test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test test test test 
test test test test test test test}
\lipsum[4]
\chapter{Test Chapter Four}
\chapterprecishere{Test test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test test test test 
test test test test test test test test test test test test test test test test test test}
\lipsum[4]
\chapter{Test Chapter Five}
\lipsum[4]
\chapter{Test Chapter Six}
\chapterprecishere{Test test} 
\lipsum[4]

\end{document}

在背景包的帮助下,我绘制了一条水平绿色规则作为视觉指南。

第一章和第二章第一页的图像,显​​示一行和两行精确的距离相同:

在此处输入图片描述

如果摘要有三行或更多行,距离就会增加,如下图第三章和第四章第一页所示:

在此处输入图片描述

如果没有摘要,距离将与一行或两行摘要的情况相同,如下图第五章和第六章第一页所示:

根据您的实际设置,您可能需要调整使用的宽度minipage

在此处输入图片描述

相关内容