修改與自制字體:更好地顯示時間/比分

是否有人在看視頻、做視頻時遇到下圖上邊這樣的問題?

如果你感覺到奇怪,是否希望改成上圖下邊的形式?
那么概括下這幾個月來的發(fā)現(xiàn)。

數(shù)字
實際上數(shù)字和茴香豆差不多,有4種寫法(沒算上斜杠〇)
[CSS Fonts Module Level 3 # 6.7. Numerical formatting: the font-variant-numeric property](https://www.w3.org/TR/css-fonts-3/#font-variant-numeric-prop)(英文)
[OT字體功能 # 數(shù)字樣式 | 微軟文檔](https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/opentype-font-features#numerical-styles)(微軟機(jī)翻)

數(shù)字有兩種樣式<numeric-figure-values>:李寧(lnum)和 舊式(onum)寫法肯定有差異,
有兩種間距<numeric-spacing-values>:比例(pnum)和 表格(tnum)寫法可能有差異,
2樣式和2間距可以乘出4種寫法;
還有一種特殊寫法:斜杠零(zero)
上文括號里的縮寫是OpenType(以下簡稱OT)的feature tags。一些優(yōu)良的OT字體會同時包含4\5種數(shù)字但默認(rèn)只顯示1種,需要手動在軟件OT特性開關(guān)里調(diào)用其他未映射的幾種。
[Feature tags - Typography | 微軟文檔](https://docs.microsoft.com/zh-cn/typography/opentype/spec/featuretags)(目前是英文)功能標(biāo)簽?特征類型?我不懂翻譯。
lnum/lining-nums/標(biāo)準(zhǔn)數(shù)字
阿拉伯?dāng)?shù)字本來高度一致的寫法。
onum/oldstyle-nums/舊式數(shù)字
把阿拉伯?dāng)?shù)字當(dāng)作高低參差的小寫拉丁字母來書寫??梢韵胂蠊ㄌ啬俏秲?。

pnum/proportional-nums/比例數(shù)字
每個數(shù)字占據(jù)寬度不同,就像手寫的間距。
tnum/tabular-nums/表格數(shù)字
每個數(shù)字占據(jù)寬度相等以便垂直對齊,方便財務(wù)比較。有時1字會加上腳部寫法撐胖。等寬字體必定表格數(shù)字不含比例數(shù),反之不然。

zero/slashed-zero/斜杠零
零+斜杠以強(qiáng)調(diào)字母O不是數(shù)字0,通常用于財務(wù)和編程。編程字體默認(rèn)是表格數(shù)+斜杠零。

顯然時間字體兩種樣式和斜杠零都無所謂,但間距只能選表格,否則用作計時整段數(shù)字就會抖來抖去。
冒號
可能看完上文的人會選擇等寬字體,但只是等寬還不行(有些等寬字體出于編程用途區(qū)分字符會故意做得不好看,何況冒號也沒必要與數(shù)字等寬)
冒號一般放置在基線上,與小寫對齊,所以就不能同時與數(shù)字(常與大寫差不多高)垂直居中對齊。時間、比分等需要整體垂直居中,由于沒有專門的居中冒號,過去排版者會特意手調(diào)。
雖然沒居中冒號,但有居中星號:[?]U+2217算術(shù)星號,與[*]默認(rèn)星號不同在于與數(shù)字對齊。
找到一個[∶]U+2236比號“RATIO”。相當(dāng)于居中冒號,就是左右間距可能太寬了,顯示比分倒沒問題。
這屬于排版技術(shù),所以可由字體解決。比較先進(jìn)的OT字體如蘋果表(Apple Watch)啟用的字體舊金山(SanFrancisco),可以就上下文判斷是否數(shù)字自動替換成居中冒號。我做個例圖演示下。

這個具體用到的是OT高級排版功能:calt/Contextual Alternates/上下文語境替代
calt是由Adobe登記的feature tag。順帶一提OT字體格式由Microsoft和Adobe共同開發(fā)。
試著反編譯舊金山字體這段calt腳本,發(fā)現(xiàn)也很簡單:
group @0_9 [zero one two three four five six seven eight nine]
???注:窮舉一遍數(shù)字,組團(tuán)。lookup SingleSubstitution?{
? sub colon -> colon.1;
……
? } 注:「colon.1」是個未映射的大寫對齊冒號。lookup ChainingContext?{
? subtable "table1 {
? ? context (@0_9) colon (@0_9);
? ? sub 0 SingleSubstitution;
? } 注:只要上下文出現(xiàn)「@0_9 冒號 @0_9」這種組合就按SingleSubstitution替換冒號。
也就是任意字體加個「colon.1」和這個腳本就解決哩——
并不。雖然蘋果的系統(tǒng)肯定支持,但許多老軟件,尤其非專業(yè)排版軟件支持有限或不支持OT高級排版。沒辦法,只能固定成ttf字體,即直接用「colon.1」代替「colon」放棄與小寫對齊(舊式數(shù)字可以例外,因為我覺得相當(dāng)于英文小寫)
實際上我制作了些專門用于顯示時間的字體。沒有OT特性的。
下載
請至:magictea.cc/topic/1251/ 后續(xù)如有更新請見評論。
運用
安裝字體后做視頻(比如給音樂MV加個進(jìn)度條)直接調(diào)用就可以。
對一般人也有用。假設(shè)你有裝Stylus之類調(diào)整網(wǎng)頁外觀的用戶樣式管理器,可以加一條樣式將播放器的時間字體修改了,如:
@-moz-document domain("bilibili.com") {
span[name="time_textarea"]?{font-family:"【字體名】"}
}?/*b站*/@-moz-document domain("xiami.com") {
.handle{font-family:"【字體名】"}
}?/*蝦米*/
等等。

如果上文有問題或遺漏請評論,b專欄編輯次數(shù)不夠用……