我尝试了一段时间来弄清楚 LaTeX 如何确定两行之间的间距,但我非但没有变得更清楚,反而越来越困惑(而且似乎互联网也大多令人困惑),所以让我们看看是否能把它变成一个问题来澄清它!
天真的假设
首先,我对“行高”的简单理解,或者我认为存储在中的值\baselineskip
如下
因此,我假设设置\baselineskip
等于字体大小应该会导致线条互相“接触” - 线条之间没有实际的空白(包括字体的完整上升部和下降部)。
事实似乎并非如此
然而,我清楚地认识到,这不可能是真的。考虑以下情况:
\documentclass{article}
\begin{document}
\setlength{\parindent}{0pt}
% font size = \baselineskip - should result in lines "touching", shouldn't it?
\fontsize{10pt}{10pt}\selectfont
\textbar The quick brown fox jumps over the lazy dog\\
\textbar The quick brown fox jumps over the lazy dog
\fontsize{20pt}{20pt}\selectfont
\textbar The quick brown fox...\\
\textbar The quick brown fox...
\fontsize{30pt}{30pt}\selectfont
\textbar The quick brown fox...\\
\textbar The quick brown fox...
\end{document}
虽然我的假设似乎适用于较小的字体大小,但字体越大就越明显,这不可能是全部的事实!
将行高设置为字体大小的倍数?
类似的困惑也很明显对于那些试图将行距设置为字体大小的特定倍数的人来说。
使用\renewcommand*\baselinestretch{1.5}\selectfont
或类似功能可以做很多事情 - 但不会产生人们期望的一行半的间距!
这甚至导致了设置空间软件包,通常建议使用该软件包来实现所需的结果。然而,查看源代码可以发现,作者们也无法完全理解 LaTeX 所做的事情:
% GT: Sat 28 Sep 1996: No, I don't know understand the line spacing
% algorithms! If someone (LaTeX team) can enlighten me as to the
% general rule, please do! It would be very pleasant if setspace.sty
% were suited for document font sizes other than 10, 11 and 12 pt.
事实上,该包为提到的三种字体大小指定了一些硬编码值,以至少对于最常用的字体大小实现一致的行距。
为什么要关心?
显而易见的问题是:如果 TeX 所做的一切至少看起来“不错”,那么为什么还要那么在意呢?
在我的特定情况下,我想在 TeX 中实现一些类似于line-height
CSS/SVG 中的属性的功能,这样我就可以精确地将行距设置为字体大小的倍数。
到目前为止,我还没有找到解决方案,这让我很烦恼,因为我一直认为 TeX 应该在这方面更胜一筹,但事实证明,在这个特定情况下,它不愿意遵守。
因此,我希望您能给我清晰的说明,以便我实现我想要的内容,并解释哪些间距控制着 LaTeX 中两个字体基线的实际距离以及如何\baselineskip
发挥作用。
答案1
你的第一个假设和图片\baselineskip
是正确的,但是
因此,我假设设置
\baselineskip
等于字体大小应该会导致线条相互“接触”
由于两个不同的原因,这是错误的。
首先,“字体大小”本质上是字体设计师指定的任意数字,\fontsize{10pt}{10pt}\selectfont
选择标称大小为 10pt 且\baselineskip
等于 10pt 的字体,但字母的实际高度(尤其是括号和重音大写字母,甚至无重音大写字母)可能超过 10pt。因此,这可能会导致或不会导致\baselineskip
添加粘连,具体取决于实际使用的字母高度是大于还是小于 10pt。
其次,teX 不会强制使用无空格(或负空格)的基线跳过,两条超出高度的线不会过度打印,而是设置为强制\baselineskip
间距。如果要添加的间距小于参数,则使用\lineskiplimit
长度。\lineskip
默认情况下,标准类中的\lineskip
间距为 1pt,因此如果基线接触,您将看到最小 1pt 的间隔,但(有点奇怪)\lineskiplimit
是 0pt,因此距离可以在不\lineskip
使用的情况下接近于零,这将导致如果内容的高度逐渐增加,行间空间会出现“跳跃”。
如果你添加
\showoutput
\showboxdepth=3
到你的测试文件,首先注意它说
LaTeX Font Warning: Size substitutions with differences
(Font) up to 5.12pt have occurred.
因此,使用的字体并不总是要求的大小(但\baselineskip
总是完全符合要求),这解释了为什么在某些尺寸下效果更明显。日志将显示
\vbox(633.0+0.0)x407.0
.\glue 16.0
.\vbox(617.0+0.0)x345.0, shifted 62.0
..\vbox(12.0+0.0)x345.0, glue set 12.0fil
...\glue 0.0 plus 1.0fil
...\hbox(0.0+0.0)x345.0
..\glue 25.0
..\glue(\lineskip) 0.0
..\vbox(550.0+0.0)x345.0, glue set 426.9944fil
...\write-{}
...\glue(\topskip) 2.5
...\hbox(7.5+2.5)x345.0, glue set 143.77742fil []
...\penalty 300
...\glue(\baselineskip) 0.0
...\hbox(7.5+2.5)x345.0, glue set 143.77742fil []
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 1.945
...\hbox(15.555+5.185)x345.0, glue set 152.1931fil []
...\penalty 300
...\glue(\lineskip) 1.0
...\hbox(15.555+5.185)x345.0, glue set 152.1931fil []
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 6.155
...\hbox(18.66+6.22)x345.0, glue set 113.70607fil []
...\penalty 300
...\glue(\baselineskip) 5.12
...\hbox(18.66+6.22)x345.0, glue set 113.70607fil []
...\glue -5.0
...\glue 0.0 plus 1.0fil
...\glue 0.0
...\glue 0.0 plus 0.0001fil
..\glue(\baselineskip) 23.55556
..\hbox(6.44444+0.0)x345.0, glue set 170.0fil
...\glue 0.0 plus 1.0fil
...\OT1/cmr/m/n/10 1
...\glue 0.0 plus 1.0fil
\RequirePackage{fix-cm}
如果你通过在第一行添加来允许使用任意大小的字体,则不会收到字体大小警告
以及
\vbox(633.0+0.0)x407.0
.\glue 16.0
.\vbox(617.0+0.0)x345.0, shifted 62.0
..\vbox(12.0+0.0)x345.0, glue set 12.0fil
...\glue 0.0 plus 1.0fil
...\hbox(0.0+0.0)x345.0
..\glue 25.0
..\glue(\lineskip) 0.0
..\vbox(550.0+0.0)x345.0, glue set 427.45435fil
...\write-{}
...\glue(\topskip) 2.5
...\hbox(7.5+2.5)x345.0, glue set 143.77742fil []
...\penalty 300
...\glue(\baselineskip) 0.0
...\hbox(7.5+2.5)x345.0, glue set 143.77742fil []
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 2.5
...\hbox(15.0+5.0)x345.0, glue set 159.07242fil []
...\penalty 300
...\glue(\baselineskip) 0.0
...\hbox(15.0+5.0)x345.0, glue set 159.07242fil []
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 2.5
...\hbox(22.5+7.5)x345.0, glue set 66.10855fil []
...\penalty 300
...\glue(\baselineskip) 0.0
...\hbox(22.5+7.5)x345.0, glue set 66.10855fil []
...\glue -5.0
...\glue 0.0 plus 1.0fil
...\glue 0.0
...\glue 0.0 plus 0.0001fil
..\glue(\baselineskip) 23.55556
..\hbox(6.44444+0.0)x345.0, glue set 170.0fil
...\glue 0.0 plus 1.0fil
...\OT1/cmr/m/n/10 1
...\glue 0.0 plus 1.0fil
答案2
第二个测试的\lineskip
线间距为 1 pt,而第三个测试的线条高度不正好是 30 pt,因为\usepackage{fix-cm}
没有使用。