如何使标题达到整数行高(使用回忆录类)?

如何使标题达到整数行高(使用回忆录类)?

我使用memoir类和\checkandfixthelayout命令来计算,\textheight以便可以容纳整数行。这非常有效:

该图显示了 \checkandfixthelayout 的结果。

但现在我想添加几个节标题。不幸的是,我的节标题的高度破坏了\textheight与正常行高度之间的良好关系,导致段落之间出现拉伸(我使用\flushbottom):

该图显示了添加部分标题的结果。

解决方案似乎很明显;我只需要确保我的部分标题的高度 + 任何前后空格整数倍的法线高度。这在理论上似乎很简单,但在实践中我无法弄清楚如何计算各种参数来实现这一点。

我希望节标题的大小约为普通文本的两倍(即大约 22 点)。然后添加例如 1.5 行前空格和 0.5 行后空格应该可以解决问题(或者可能是 2 + 1 行,因为当节标题出现在页面顶部时,前空格可能会消失)。但我尝试过重新定义\huge和设置\setbeforesecskip\setaftersecskip为“合理”值,即基于\onelineskip\baselineskip,但仍然不起作用。我必须通过反复试验手动选择精确的点大小,这不是一种非常可靠的方法,如果我决定稍后更改某些值,则会导致大量工作。

那么,是否可以让标题自动达到整数行高(基于某些输入值,例如所需的字体大小)?请注意,我使用 来\setSingleSpace增加行距,这也可能使事情变得复杂(\baselineskip和的值\onelineskip不相同)。

下面是一个示例文档,用于创建上述图像(是的,我确实意识到孤行和孤儿行,或页面底部的章节标题,可能会导致拉伸,即使标题整数行高(暂时忽略这一点):

\documentclass[a4paper,11pt,twoside]{memoir}

\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}

\usepackage[osf,sc]{mathpazo}

\setSingleSpace{1.05}
\SingleSpacing

\setulmarginsandblock{1.8cm}{2.8cm}{*}
\checkandfixthelayout[nearest]

\setsecheadstyle{\mdseries\huge\itshape}

\usepackage{lipsum}

\begin{document}

\section*{Hello}

\noindent\lipsum[1]\par\lipsum*[2-7]

\end{document}

答案1

如果您的问题仍然存在,以下是使用类尝试解决网格排版问题的方法memoir。这些主要是提示,因为完整、万无一失的解决方案需要做很多工作。

关于标题的大小,也就是您的问题,您应该查看 .clo 文件并记下每种字体大小的行距。例如11pt\normalsize的基线跳跃为 13.6pt,\huge为 25pt。然后您可以计算:2*13.6-25=2.2pt,这是您必须对标题应用的修正。

或者,您可以使用以下方法重新定义字体大小:

(注意:还有其他方法可以做到,但这个方法对我来说很有效。)

\renewcommand*{\huge}{\fontsize{<size>}{<leading>}\selectfont}

然后你可以写:

\newdimen\addtohuge
\addtohuge=2.2pt
\setlength{\beforesecskip}{\baselinestretch\addtohuge}
\setlength{\aftersecskip}{\baselineskip}

(参见@egreg 的回答我的问题,这解释了这一点。)

务必在所有情况下都重新定义\beforeXskip和,因为默认情况下,所有标题中都会有一些粘连。请注意,它不适用于多行(或直接连续)标题 - 如果需要它们,您可以手动调整垂直空间,或按照\afterXskipmemoir这个问题通过将行距设置为基线的倍数。

您可能感兴趣的其他问题:

  • 我不知道setSpacing和朋友的情况,但使用时\renewcommand{\baselineskip},我发现\selectfont在尝试获得垂直对齐时,最好在之后写入。确保在布局修改之前定义它,就像你做的那样。

  • 您应该通过以下方式去除段落之间的粘连:(\setlength{\parskip}{0pt}或基线跳过)。

  • 如果您需要脚注,建议写类似的内容\setfootnoterule[\vfill]{\baselineskip}{0pt}{0pt}以使它们位于底部(参见memoir文档)。

    您还需要使用\setlength{\footnotesep}{.7\baselineskip},它将垂直对齐脚注(有关说明,请参阅这个帖子)。

  • 并且您需要重新定义所有浮动和所有列表,以便压缩垂直空间。列表环境应通过将垂直长度设置为z@或 baselineskip 的倍数来重新定义。对于 minipages,可能对你有用。数字和表格很难正确使用,但你可以从中获得灵感grid.sty。我从来没有找到解决\marginpar问题的方法,尽管你总是可以使用\marginnote\sidebar等。

  • 检查和调试垂直对齐问题的最佳方法是使用twocolumns(即使它与您的字体大小不相配)或让 pdf 查看器并排显示两页,以便您可以进行比较。

答案2

你可以通过以下方式解决\baselineskip和之间的差异:\onelineskip

\setlength{\onelineskip}{\baselineskip}

就在宣布之后\SingleSpacing

章节标题前的间距应为 (modified) 的整数倍\onelineskip,其后的间距必须计算。如果您\strut在章节标题中放置了 ,那么您将确定其高度和深度。

现在这只是一个计算的问题:

{\Huge\showthe\ht\strutbox}

将显示支柱的高度\Huge(如果主字体大小为 10pt,则为 17.49992pt)。因此,我们至少需要两行:标题后的空间应该是

2\baselineskip-17.49992pt

(或 3,随你选择)。但还有另一个问题:必须\prevdepth=0pt在章节标题和第一段之间加上一个空格,以便 TeX 插入正确的行间跳转以确保“网格”排版。

相关内容