你好!我对字体了解不多,我想知道 Tex 中那些对排版非常了解的人能否帮我一下。
基本上,我对如何计算 Docx 文件中行与行之间的行距有一些疑问,我认为我的问题可能来自字体解析。首先让我解释一下整个困境。
我的要求是简单段落中的行间距与 Word 完全匹配,不一定符合 OOXML 规范。
为了尝试做到这一点,我构建了一个工具来分析我的布局和 Word 布局之间的差异。为此,它执行以下操作:
- 首先,它生成一个(或多个)docx 文件。
- 接下来,它从 docx 文件创建 PDF。它使用 Word 将 docx 渲染为 PDF,使用我的程序将 docx 渲染为 PDF。“word.pdf”和“me.pdf”
- 然后,它会分析生成的 PDF 中的布局差异。
因此,我的工具会说:
- 创建一个文档“template.docx”,其中包含具有相同属性的单次文本中包含 1000 个“a”字符。
- 从此 docx 创建“word.pdf”和“me.pdf”
- 从 PDF 中计算信息,特别是根据行上升和前一行下降之间的计算行距来计算行距(我们的“上升 + 下降”几乎相同,因此唯一不同的是行之间的空白)。我经常把它看作是行的空白...
该工具向我展示了不同字体的行距差异很大。
为了描述这一点,我使用该工具进行了数千次比较,特别是生成了:
- 对于系统中的每个字体
- 针对“a”、“y”以及字母和空格的混合。
- 适用于不同的字体大小。
- 适用于不同的行距类型(单倍行距、一倍半行距和双倍行距)
我希望找到分组,例如“这种字体的行距是我计算的 1.3 倍”。
我得出的结论比我期望的要少得多,我想知道您是否能进一步帮助我解决计算行距的问题。我为您提供了一个文件,最好下载并在 Excel 中打开,同时使用标题行中的过滤器。请注意,它并不完全完整,有缺失的条目,但我怀疑这对任何人来说都不会是个问题,我很快就会重新生成它,但它的速度相当慢,所以我先完成对它的一些更改。
这是我们的软件布局与我的系统上安装的每种字体的 Word 布局的比较,等等。
我不太确定,但我认为问题可能是以下之一:
- Word 计算字体“行距”的过程与我们不同。我们不会自己解析字体文件,而是依靠库来获取字体大小信息,也许在“字体文件的世界”中我遗漏了一些东西,Word 直接以不同的方式解析字体。
- Word 具有某种查找表来处理字体组,或者某种算法,可以根据我不知道的某些标准来缩放字体的行距。
- 除了行距、上升沿和下降沿之外,Word 还使用其他标准来确定行距。
你怎么看?你认为这可能是解析字体文件或与字体相关的问题吗?我是否错过了一个关键的理解?非常感谢!
请随时给我发送电子邮件:nathanb at windward dot net
非常感谢您的参与!
答案1
在 tex 中,基线间距几乎总是由文档类设置独立的字体。
例如,在默认article
类中,\normalsize
字体为 10pt,基线为 12pt,这是标记的代码行的结果(来自size10.clo
)
\renewcommand\normalsize{%
\@setfontsize\normalsize\@xpt\@xiipt% <<<< here 10pt on 12pt baseline
\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
\belowdisplayskip \abovedisplayskip
\let\@listi\@listI}
即使将默认字体从计算机现代字体更改为其他字体系列,此设置通常也不会更改。
答案2
我不知道docx
,当然也不想知道任何事情,Word
但是我确实了解一点LaTeX
,并且还了解传统的铅字排版。
铅字(一种字样)基本上是长度不到一英寸的矩形条,其高度与字体高度相对应,宽度足以容纳字母宽度。例如,对于 12pt 字体,其高度为 12pt。特定字符是字样表面上凸起的部分,适合高度/宽度区域。因此,打印字符的高度和宽度小于铅字本身的高度和宽度。在某些字体中,字符所用的区域比可用区域小得多,而在其他字体中,字符将更接近矩形边界。
打印时,字体排成一行,然后组装下一行,依此类推。如果排字员什么都不做,则行距为字体设计师指定的行距(字体行之间没有额外的间距),否则排字员可以在每行之间放上细铅条,使它们之间的距离更大。
我认为数字字体也一样。字体设计师会创建具有特定行距的字体。然后排版程序可以根据需要扩大或缩小文本行之间的自然间距。
答案3
背景
最近我在处理中文排版,偶然发现了我认为可以回答你的问题的答案(并且与我的答案也有某种关联)。
本答案中引用的一些网站是用中文写的,但我认为你可以读懂里面的一些图形(用英文写的)和数字。
显然,你和我并不是唯一对数学运算感到好奇的人Word
。我有一些用 LaTeX 写作的同学,但是强制遵守荒谬的大学规则,而这些规则讽刺地建立在……之上Word
。关于这件事,我不得不同意 Alan Munn 在这个答案。 但不管怎么说 …
Microsoft Word 如何计算单行间距?
首先,我假设您理解TeX 中的“one point
等号Word
” 1bp
(大点),即1/72
一英寸。
在我的Windows
操作系统上,我使用了SimSun
字体(在您的电子表格中)single line spacing
和0pt
(使用实际上有各种字体大小测量这text height
,数数每页的行数,记录字体大小,最后转换在单位之间,我能够推断出
在某种
single line spacing
设置下,字体的行距SimSun
似乎大约是1.3
字体大小的倍数。
后来我发现,我的观察得到了以下事实的支持:这个答案到“Office Word 如何根据'OS/2'表中的信息计算单行间距?(标题已翻译)“ 让我解释:
Word
可以访问所谓的“表 OS/2”给出的字体度量,其中此答案需要三个值:units/em
和。winAscent
winDescent
- 对于
SimSun
字体,虚拟 em-square 的宽度为units/em = 256
,长度为winAscent = 220
和winDescent = 36
。此信息部分可在此处找到在 GitHub 上(在网页内搜索“FONT METRICS”)。- 要计算单个
line height
,Word
将在的上方winAscent
和下方添加额外的填充winDescent
,每个填充都是的舍入单位0.15 * (winAscent + winDescent)
。
- 对于
SimSun
字体来说,它们38
每个都是单位。- 然后,将
line height
设置为paddingabove + winAscent + winDescent + paddingbelow
。
- 对于
SimSun
字体来说,这就是332
单位。- 行距恰好等于
line height
长度。用行距除以 em 大小可得出“基本比例”。
- 对于
SimSun
字体,332/256 = 1.296875
啊哈!1.3
猜想得到证实!- 如果你使用的是 Mac OS X,字体规格是从“表 hhea”读取的。
- 还有另一个值
LineGap
TypoLineGap 0
。我只用和/或测试了字体LineGap = 0
。
如果您已安装来源宋体,它是开源的,你可以重现上述计算:
- 对于
Source Han Serif
、units/em = TypoAscender + |TypoDescender| = 1000
、winAscent = 1151
和winDescent = 286
以及 否line gap
。字体规格可在此网页。- 每个额外填充都有
216
一个单位。line height
结果是1869
单位。- 基本
leading/fontsize
比例是1869/1000 = 1.869
。- 使用信纸
docx
,设置top margin = 1in
和bottom margin = 1.27in
,使用Source Han Serif
在14 points
。然后text height = (11 - 1 - 1.27)in = 8.73in = 628.56 points
,,leading = (14 * 1.869) points = 26.166 points
和请告诉我如果你数一下628.56/26.166 = about 24.0
第一页的行数。
Microsoft Word 如何计算<factor>
行距?
这很简单,将单数乘以line height
,<factor>
即可得到新的行距。