9

使用某种字体,我使用 Java 的 FontLayout 来确定它的上升、下降和前导。(请参阅此处的 Java 的 FontLayout 教程)

在我的具体情况下,我使用的是 Arial Unicode MS,字体大小为 8。使用以下代码:

    Font font = new Font("Arial Unicode MS", 0, 8);
    TextLayout layout = new TextLayout("Pp", font,
                               new FontRenderContext(null, true, true));
    System.out.println( "Ascent: "+layout.getAscent());
    System.out.println( "Descent: "+layout.getDescent());
    System.out.println( "Leading: "+layout.getLeading());

Java 给了我以下值:

    Ascent: 8.550781
    Descent: 2.1679688
    Leading: 0.0

到目前为止,一切都很好。但是,如果我将这些值的总和用作不同文本行的行距,这与 OpenOffice、Microsoft Word 等中使用的行距有很大不同:它更小。当使用默认的单行间距时,Word 和 OO 的行间距似乎约为13.7 pt(而不是像我使用上面的 Java 字体度量计算的10.7 pt)。

任何想法

  1. 这是为什么?
  2. 我是否可以以某种方式访问​​ Word 和 OpenOffice 似乎正在访问的字体信息,这会导致这种不同的行距?

到目前为止我尝试过的事情:

  • 使用 etc. 将所有字形添加到字形矢量font.getNumGlyphs()- 仍然获得相同的字体度量值
  • 如此处所述使用多行- 我得到每一行都具有与上述相同的字体度量。
  • 使用FontMetrics' 方法,例如getLeading()
4

2 回答 2

10

Zarkonnen 不值得他投反对票,因为他在正确的路线上。许多 Java 字体似乎在它们不应该的情况下返回零作为它们的前导。也许是由于这个错误:我不知道。将这个空白放回似乎取决于您。

排版行高通常定义为上升 + 下降 + 领先。上升和下降是从字符所在的基线向上和向下测量的,前导是一条线的下降和下方线的上升之间的空间。

替代文字

但领先不是固定的。您可以在大多数文字处理和印刷软件中设置领先地位。Word 将此称为行间距。最初的问题可能是询问 Microsoft Word 如何计算其单行间距。微软对 OpenType 字体的建议似乎表明不同平台上的软件计算它的方式不同。(也许这就是 Java 现在返回零的原因?)

快速搜索一下似乎表明领先的经验法则是单行间距或固定点间距的上升+下降的 120%;说在所有行之间领先 2 分。在没有我能找到的任何硬性或快速规则的情况下,我会说它归结为你所呈现的文本的易读性,你应该选择你认为最好的东西。

于 2009-06-03T11:55:40.933 回答
3

Word 和 OO 是否包括行之间的空白,而 Java 不包括?

所以在 Word / OO 中,你的数字是 Ascent + Descent + Whitespace,而在 Java 中你只有 Ascent + Descent?

于 2009-06-02T07:26:22.090 回答