Office Word 是如何根據字體的 OS/2 表等信息計算「單倍行距」的?

此問題衍生自:如何計算字體高度?

以 Office 2013 附帶的華文中宋為例計算默認行高 [1]:

  • 按蘋果最初為 TrueType 設計的 hhea 規則

    ( hhea.ascent + hhea.descent + hhea.lineGap ) / head.unitsPerEm

    計算得 1.325(華文中宋在 Pages 中的效果符合此數值);

  • 按 OpenType 規範的 sTypo 規則

    ( OS/2.sTypoAscender + OS/2.sTypoDescender + OS/2.sTypoLineGap )
    / head.unitsPerEm

    計算得 1.144;

  • 按 Windows 里最主流但不符合規範的 usWin 規則

    ( OS/2.usWinAscent + OS/2.usWinDescent ) / head.unitsPerEm

    計算得 1.137。

以上三個結果都與 Word 2013 里的「單倍行距」效果(似乎是一個介於 1.47 與 1.48 之間的數值,且「如果定義了文檔網格,則對齊到網格」已關閉)不一致。

那麼,Word 是如何計算並實現「單倍行距」的呢?

另外,Word for Mac 2011 里的「單倍行距」似乎和 Windows 版 Word 里的數值並不一致,和 Pages 也不一樣。它彷彿是這樣計算的,完全忽略 hhea.lineGap 數值,又自己給乘上 1.3,不符合任何規範或事實標準:

( hhea.ascent + hhea.descent ) / head.unitsPerEm * 1.3

這是造成同一文件在 Windows 與 Mac 版 Word 及 Pages 中開啟時版式不一致的原因之一嗎?

[1] 下附用 ttx dump 出的華文中宋相關數據供參考(若代碼未高亮請嘗試展開補充說明):

&
&
& &
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&

&
& &
&
& &
&
&
&
&
&
&
&
&
&
&
&
&
&

&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&


&
&
&
&
&
&
&
&
&
&
& & & & & &
&
&
&
&
&
&
&
&
& & &


先上一張圖吧,下圖為「華文中宋」字體「國」字,用的是FontCreater7.5,相應的字體參數已經標明。

通過在Word中手工測量(字體設置為200磅,放大到500%,測量像素然後轉為twips,再計算),以及使用FontCreater修改字體參數,發現了一些規律:

  1. Word中的字體高度僅取決於 WinAscent WinDescent 兩個值。

  2. 測量發現的高度總是大於 ( WinAscent + WinDescent ),說明Word在此基礎上有擴展的高度 Extend
  3. 多次測試不同字體以及不同字型大小之後發現,實際高度 LineHeight (WinAscent + WinDescent) 之間存在一個可能是固定的比例關係,大約在 1.29 ~ 1.31 之間,即 LineHeight = ( WinAscent + WinDescent ) * 1.3
  4. 通過FontCreater修改 WinAscent 或 WinDescent 之後發現,擴展的Extend是平均分配到上面和下面的,Extend1 與 Extend2 相等,如上圖所示。

    LineHeight = ( WinAscent + WinDescent ) * 1.3
    = ( WinAscent + WinDescent ) + ( WinAscent + WinDescent ) * 0.3
    = ( WinAscent + WinDescent ) + Extend1 + Extend2
    = ( WinAscent + WinDescent ) + Extend * 2

    Extend = ( WinAscent + WinDescent ) * 0.15

  5. 對於以上計算出的係數 0.15 目前沒有確切的值,可能有偏差,還可能跟不同的字體有關。通過程序驗證之後得到可能比較精確的值如下:

    第一種:0.14845,適用於 仿宋、宋體、幼圓、新宋體、方正姚體、方正舒體、楷體、隸書、黑體。

    第二種:0.15002,適用於 華文中宋、華文仿宋、華文宋體、華文新魏、華文楷體、華文琥珀、華文細黑、華文行楷、華文隸書、華文彩雲、宋體-方正超大字符集、微軟雅黑。

    不知道以上數據是否有什麼規律?


@Mili 給我說,他有精確公式,但是牽涉到的細節非常多(比如一些詭異的 rounding)


為什麼我這覺得實際情況非常簡單:

行高(像素)=字高(磅值)*1.2


推薦閱讀:

有沒有簡單的 LaTeX 中文支持方案?
Corbel 字體有何來歷?與 Royal Grotesk 有什麼區別?
設計師常用的中文字體有哪些?
全形西文字元是對中西文混排的優秀解決方案嗎?
曾經流行過的字體都有哪些?

TAG:字體 | MicrosoftWord |