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中的字體高度僅取決於 WinAscent 和 WinDescent 兩個值。
- 測量發現的高度總是大於 ( WinAscent + WinDescent ),說明Word在此基礎上有擴展的高度 Extend。
- 多次測試不同字體以及不同字型大小之後發現,實際高度 LineHeight 與 (WinAscent + WinDescent) 之間存在一個可能是固定的比例關係,大約在 1.29 ~ 1.31 之間,即 LineHeight = ( WinAscent + WinDescent ) * 1.3。
- 通過FontCreater修改 WinAscent 或 WinDescent 之後發現,擴展的Extend是平均分配到上面和下面的,Extend1 與 Extend2 相等,如上圖所示。
LineHeight = ( WinAscent + WinDescent ) * 1.3
= ( WinAscent + WinDescent ) + ( WinAscent + WinDescent ) * 0.3
= ( WinAscent + WinDescent ) + Extend1 + Extend2
= ( WinAscent + WinDescent ) + Extend * 2Extend = ( WinAscent + WinDescent ) * 0.15
- 對於以上計算出的係數 0.15 目前沒有確切的值,可能有偏差,還可能跟不同的字體有關。通過程序驗證之後得到可能比較精確的值如下:第一種:0.14845,適用於 仿宋、宋體、幼圓、新宋體、方正姚體、方正舒體、楷體、隸書、黑體。第二種:0.15002,適用於 華文中宋、華文仿宋、華文宋體、華文新魏、華文楷體、華文琥珀、華文細黑、華文行楷、華文隸書、華文彩雲、宋體-方正超大字符集、微軟雅黑。不知道以上數據是否有什麼規律?
@Mili 給我說,他有精確公式,但是牽涉到的細節非常多(比如一些詭異的 rounding)
為什麼我這覺得實際情況非常簡單:
行高(像素)=字高(磅值)*1.2
推薦閱讀:
※有沒有簡單的 LaTeX 中文支持方案?
※Corbel 字體有何來歷?與 Royal Grotesk 有什麼區別?
※設計師常用的中文字體有哪些?
※全形西文字元是對中西文混排的優秀解決方案嗎?
※曾經流行過的字體都有哪些?
TAG:字體 | MicrosoftWord |