為什麼 Mac 下漢字詞句輸入西文 Helvetica 字體會整行下沉?

經過一段時間使用發現,只有自帶字體Helvetica會出現這種現象。

——————————

測試是在pages,但問題出現在很多地方,包括QQ聊天等。

可以很明顯的看到在【漢字】【輸入狀態】下會發生整行下沉的現象,曾經以為是輸入法的原因,結果我把Mac下幾乎所有的輸入法都測試了一遍,全都有這種現象,包括自帶。

另外,不是行距的問題,2倍行距依然有這種現象,但有趣的是【首字元是英文】的情況下,就不會出現這個現象!
測試環境:MacBook Pro with Retina,10.9.1
最後問題是:為什麼會有這種現象?有解決的辦法嗎?


  • 這不是 Helvetica 的問題。
    這是 Helvetica 與華文黑體混排時出現的問題——一個巴掌拍不響。
  • 各種西文字體和各種中文字體搭配經常都會遭遇這個問題。你的觀察不全面。和輸入法也確實無關,只和字體與排版環境有關。
  • 首先,你不懂一個基本概念:字體回退(font fallback)。
    你選定的字體是 Helvetica,但因為 Helvetica 不支持漢字,所以排版環境遇到漢字字元時會將字體回退到支持漢字的字體。你截圖裡的漢字展現的就是 OS X 的默認簡體中文字體,黑體-簡(以下稱作「華文黑體」[1])。所以,在你的同一行文本里,西文是用 Helvetica 顯示的,而中文是用華文黑體顯示的。
  • 至於為什麼會有行高跳動的問題,粗略地說:
    因為 Pages 之類文字處理工具的「X倍行距」(以及 OS X / iOS 中的許多軟體介面文本)的行距都不是直接相對於字型大小指定的,它是基於字體內部存儲的「默認行高」(這個措辭是我自己攢的,不知有沒有更確切的名字)等信息來指定的(比如「單倍行距」就是單倍的默認行高)。而 Helvetica 的默認行高比華文黑體大。於是,Helvetica 會把一行「撐起來」——當一行文本中只有華文黑體時,行高較小,當出現 Helvetica 時,行高會被 Helvetica 撐大——於是你那第二行漢字就下沉了。
  • 解決方法,以 Pages 為例:
    指定「精確」行高,不要用「X倍行距」這種基於字體默認行高的手法。
  • 如果略為詳細地解釋這個問題,那麼(普通用戶可忽略以下較為專業的內容):
    • OS X 的排版環境查詢字體的默認行高時,會從 TrueType/OpenType 字體的 hhea 表查詢 ascent, descent 以及 lineGap 這三個數值。很明顯,這三個數值分別指的是字體上端相對於基線的高度、字體下端相對於基線的高度、以及行間距。
    • 三個數值加起來再除以字體的 UPM(head.unitsPerEm)就是默認行高的比例。
    • 比如一個比較正常的現代中文字體可能會是

      head.unitsPerEm = 1000
      hhea.ascent = 880
      hhea.descent = -120
      hhea.lineGap = 500

      於是這個字體的默認行高就是 1.5 倍字型大小。

    • Helvetica 的默認行高是 1.2 倍,而華文黑體的是莫名其妙的 1.03 倍。於是 Helvetica 在排版環境沒有明確指定行高的時候就比華文黑體多佔用約 1/5 的縱向空間。
    • 另外,從 hhea.ascent, hhea.descent 二者與 head.unitsPerEm 的關係以及其他一些信息還可計算出基線的高度。而 Helvetica 和華文黑體的基線高度也不一樣,這也影響了用這兩種字體顯示的文本之間的對齊關係。其實即使兩種字體的默認行高一致,因為基線高度的差異依舊會有一方把行高頂起來。

[1] 黑體-簡與華文黑體的關係詳見:OS X 提供了哪些中文黑體?


推薦閱讀:

QQ for Mac 3.0 體驗如何?
為什麼讀者對國內技術書和作者的評價普遍較低?
如何定位 macOS 操作系統,它的優勢是什麼?

TAG:Mac | macOS | OS X 應用 | 輸入法 | 中文輸入法 |