背景

背景

你好!我对字体了解不多,我想知道 Tex 中那些对排版非常了解的人能否帮我一下。

基本上,我对如何计算 Docx 文件中行与行之间的行距有一些疑问,我认为我的问题可能来自字体解析。首先让我解释一下整个困境。

我的要求是简单段落中的行间距与 Word 完全匹配,不一定符合 OOXML 规范。

为了尝试做到这一点,我构建了一个工具来分析我的布局和 Word 布局之间的差异。为此,它执行以下操作:

  1. 首先,它生成一个(或多个)docx 文件。
  2. 接下来,它从 docx 文件创建 PDF。它使用 Word 将 docx 渲染为 PDF,使用我的程序将 docx 渲染为 PDF。“word.pdf”和“me.pdf”
  3. 然后,它会分析生成的 PDF 中的布局差异。

因此,我的工具会说:

  1. 创建一个文档“template.docx”,其中包含具有相同属性的单次文本中包含 1000 个“a”字符。
  2. 从此 docx 创建“word.pdf”和“me.pdf”
  3. 从 PDF 中计算信息,特别是根据行上升和前一行下降之间的计算行距来计算行距(我们的“上升 + 下降”几乎相同,因此唯一不同的是行之间的空白)。我经常把它看作是行的空白...

该工具向我展示了不同字体的行距差异很大。

为了描述这一点,我使用该工具进行了数千次比较,特别是生成了:

  1. 对于系统中的每个字体
  2. 针对“a”、“y”以及字母和空格的混合。
  3. 适用于不同的字体大小。
  4. 适用于不同的行距类型(单倍行距、一倍半行距和双倍行距)

我希望找到分组,例如“这种字体的行距是我计算的 1.3 倍”。

我得出的结论比我期望的要少得多,我想知道您是否能进一步帮助我解决计算行距的问题。我为您提供了一个文件,最好下载并在 Excel 中打开,同时使用标题行中的过滤器。请注意,它并不完全完整,有缺失的条目,但我怀疑这对任何人来说都不会是个问题,我很快就会重新生成它,但它的速度相当慢,所以我先完成对它的一些更改。

这是我们的软件布局与我的系统上安装的每种字体的 Word 布局的比较,等等。

我不太确定,但我认为问题可能是以下之一:

  1. Word 计算字体“行距”的过程与我们不同。我们不会自己解析字体文件,而是依靠库来获取字体大小信息,也许在“字体文件的世界”中我遗漏了一些东西,Word 直接以不同的方式解析字体。
  2. Word 具有某种查找表来处理字体组,或者某种算法,可以根据我不知道的某些标准来缩放字体的行距。
  3. 除了行距、上升沿和下降沿之外,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等号Word1bp(大点),即1/72一英寸。

在我的Windows操作系统上,我使用了SimSun字体(在您的电子表格中)single line spacing0pt使用实际上有各种字体大小测量text height数数每页的行数,记录字体大小,最后转换在单位之间,我能够推断出

在某种single line spacing设置下,字体的行距SimSun似乎大约是1.3字体大小的倍数。

后来我发现,我的观察得到了以下事实的支持:这个答案到“Office Word 如何根据'OS/2'表中的信息计算单行间距?(标题已翻译)“ 让我解释:

  1. Word可以访问所谓的“表 OS/2”给出的字体度量,其中此答案需要三个值:units/em和。 winAscentwinDescent
    • 对于SimSun字体,虚拟 em-square 的宽度为units/em = 256,长度为winAscent = 220winDescent = 36。此信息部分可在此处找到在 GitHub 上(在网页内搜索“FONT METRICS”)。
  2. 要计算单个line heightWord将在的上方winAscent和下方添加额外的填充winDescent,每个填充都是的舍入单位0.15 * (winAscent + winDescent)
    • 对于SimSun字体来说,它们38每个都是单位。
  3. 然后,将line height设置为paddingabove + winAscent + winDescent + paddingbelow
    • 对于SimSun字体来说,这就是332单位。
  4. 行距恰好等于line height长度。用行距除以 em 大小可得出“基本比例”。
    • 对于SimSun字体,332/256 = 1.296875啊哈!1.3猜想得到证实!
  5. 如果你使用的是 Mac OS X,字体规格是从“表 hhea”读取的。
  6. 还有另一个值 LineGapTypoLineGap 0。我只用和/或测试了字体LineGap = 0

如果您已安装来源宋体,它是开源的,你可以重现上述计算:

  • 对于Source Han Serifunits/em = TypoAscender + |TypoDescender| = 1000winAscent = 1151winDescent = 286以及 否line gap。字体规格可在此网页
  • 每个额外填充都有216一个单位。
  • line height结果是1869单位。
  • 基本leading/fontsize比例是1869/1000 = 1.869
  • 使用信纸docx,设置top margin = 1inbottom margin = 1.27in,使用Source Han Serif14 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>即可得到新的行距。

相关内容