我使用memoir
类和\checkandfixthelayout
命令来计算,\textheight
以便可以容纳整数行。这非常有效:
但现在我想添加几个节标题。不幸的是,我的节标题的高度破坏了\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
和,因为默认情况下,所有标题中都会有一些粘连。请注意,它不适用于多行(或直接连续)标题 - 如果需要它们,您可以手动调整垂直空间,或按照\afterXskip
memoir
这个问题通过将行距设置为基线的倍数。
您可能感兴趣的其他问题:
我不知道
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 插入正确的行间跳转以确保“网格”排版。