對於老貓「漢字縱橫對齊」排版的補充

來源:史梅岑《中國印刷發展史》
老貓日前談到了縱橫的漢字排版傳統,引來了對岸錢先生的回應。而日前在W3C HTML Chinese IG郵件群組的熱烈討論也相當精彩。但這些討論其實應該考量到一些先決條件:
- 語言的差異;
- 過往排版處理的方法。
東亞四國:中、台、日、韓,在語言系統上,常以CJK一概稱之。但實際上簡體中文,繁體中文,日文,以及韓文在處理排版的細節時,的確有些差異。以「縱橫對齊」這個議題而言,簡體中文與繁體中文使用句號、逗號符號位置的不同——繁體置於字面正中,簡體橫排置於字面左下角——就無法同時適用於兩者。
例如,為了要實現縱橫對齊,必須允許一定程度的不避頭點。當使用繁體字時,如上面《中國印刷發展史》一樣,尚可接受;但簡體字,如套用:
word-break: break-all;
語法後強制不避頭點後,就會如下圖一般極為怪異。

所以在處理排版規則時,必須明確地將各種語言的特性切開來處理。
另外,日文排版規則有著兩份文件,一份是W3C i18n WG的〈日本語組版処理の要件〉(JLREQ),以及作為其基礎的日本國內產業標準JIS X 4051。JIS X 4051制定於1995年,當時正好是出版業朝向桌上出版(DTP, DeskTop Publishing)轉型期。排版軟體處理西文排版游刃有餘,但處理要直排、要壓縮標點的日文,就難以面面俱到。在當時產生了相當的問題,於是從活字排版的規則出發,制定出這套標準,供軟體業界參考並實做。
所以,你可以看到許多活字排版的痕跡,例如:在特定處將標點以半形處理,以達成段落頭尾對齊的目的。這份規則當時如何制定,我這邊沒有辦法得知;但間接詢問後,大致上可以理解是透過對排字師傅訪談後整理出來的一套規則。
讓我們回到「縱橫對齊」上頭。
台灣繁體中文沒有經過這樣的脈絡。但排版軟體既然能處理日文排版規則,採方塊字緊密排列、少將標點以半形處理的繁體中文,大致上也能通用。應該是從這時開始,避頭點由於軟體可以輕易做到,也就成了常見的規則。但在活字時代,其實避頭點不好處理,讓我們看這張圖:

來源:王藍《藍與黑》
為了避第四行的頭點,而將第三行最末一字「撥」移到第四行。再於第三行的兩個逗點後面插入二分之一空白來補足缺一字的空隙。但若前一行標點數量多或少時,都很難如此處理。翻遍活字印刷的舊書,不大好找到固定的規則。
但改使用軟體排版後,就能輕鬆地將這一字(有時候避頭點還會多於一字)的空白,平均分攤到該行各字之間。這種方法叫做Justification。使用Justification就可以處理現代中文書中的各種狀況。包括西文比例(Proportional)字的混排。請注意,西文字並不能稱為「半形字」,因為並非每個字母都是全形的一半,例如「w」與「i」的寬度就不一樣。當然也能使用固定寬度的Monospace字體,但也犧牲了編輯設計的美觀。
當在提出繁體中文排版關於行的排列時,大致上會希望達成這樣的目標:
- 使段落內各行之行首、行尾對齊。
- 使段落內各行中的漢字縱橫對齊。
關於1.的需求,目前只要在各段落中加入以下CSS就能辦到:
text-align: justify;
text-justify: inter-ideograph;
但這麼做,當遇到字數少的短欄,例如雜誌、報紙排版時,若行內有著長的西文字,加上避頭點等處理時,就會使得字距太鬆。這又是另外一件要處理的事。
若要做到2. 的話,就會遇到以下問題:
- 如何處理避頭點造成的缺字?
- 如何讓西文比例字組成的單字佔漢字整數倍寬/高?
- 當西文單字出現於行末,突出行尾對齊時,怎麼辦?
關於避頭點,基本上的處理會如這篇文章第一張圖一般,採取「完全不避頭點」的處理方式;尾點亦然。這已經規範在CSS Text Module Level 3的Line-break中。然而,現階段也能以前面提到的word-break語法來達成。
若需要避頭點,老貓推薦使用日文中的「標點懸吊」(ぶら下がり),同樣規範在CSS Text Module Level 3的hanging-punctuation中。但僅限一字,若遇到連續標點,則視為無法避免而讓其出現在行首。
然後,為了讓西文比例字構成的單字(於行內)佔漢字整數倍寬/高,所以必須透過動態調整漢字與西文單字間的空白,在西文單字前後加入介於等於0、小於漢字一半的空間,所佔空間填至漢字的整數倍。相關規範在CSS Text Level 4的text-spacing裡,這也是我們為了達成漢字縱橫對齊,唯一要加入的需求與處理方式。
若西文單字出現於行末時,則是以word-break: break-all,使其不分音節強制切斷。切斷的西文文字,前段需對齊行尾,文字前加入動態空白;後段需對齊行首,文字後加入動態空白致漢字整數倍。
以上就是為了實現漢字縱橫對齊的細節處理。可以參考MMDays.com的Mr. Friday的實作。
不可諱言的,錢先生的回應文標題〈縱橫對齊不是現代方法〉也沒有說錯。縱橫對齊的時代,不會想到有一天要處理大量的中西文與阿拉伯數字混排問題。而在處理手段上也是新創、並非來自於排版歷史中可見的處理。不過既然這是中文方塊字的特性,未嘗不能透過提出需求的方式保存在Web排版上頭。而且你依然可以如InDesign排版一般,使用Justification的方式處理行首與行尾的對齊。這也是繁體中文排版中極少需求中的一項。
反過來講,簡體中文與日文標點位置相同,更應該做的是列出JLREQ中有哪些排版的處理方式,也應用於簡體中文排版上;又有哪些處理不適用。相同點可以提高實作的優先程度,差異則能避免日後修正。這應該對於簡體中文的設計師、讀者來說,更為急切。