豎排標點的迷思
書接前文。這回我們要處理的是豎排的標點,我們先來看一個例子,有大概地瞭解:
上面的詩文部分中,逗號和字符空間大、不美觀,且不太適宜閱讀。下文要做的就是縮小它們之間的距離。這裏,依然對 zvp 文件的修改,先生成相應字體的 zvp 文件:
jfmutil vf2zvp -u --lenient upschrm-v
它是 uptex 默認字體中爲中文專門配置的虛擬字體(其中,codespace因爲篇幅太大做了刪減,可通過上面的命令生成完整的文件內容查看):
upschrm-v.zvp
(DIRECTION TATE)
(VTITLE )
(FAMILY UPSCH KANJI)
(FACE F MRR)
(CODINGSCHEME TEX KANJI TEXT)
(DESIGNSIZE R 10.0)
(CHECKSUM O 0)
(FONTDIMEN
(SLANT R 0.0)
(SPACE R 0.0)
(STRETCH R 0.1)
(SHRINK R 0.0)
(XHEIGHT R 1.0)
(QUAD R 1.0)
(EXTRASPACE R 1.25)
(EXTRASTRETCH R 0.2)
(EXTRASHRINK R 0.125)
)
(MAPFONT D 0
(FONTNAME upstsl-v)
(FONTCHECKSUM O 0)
(FONTAT R 1.0)
(FONTDSIZE R 10.0)
)
(GLUEKERN
(LABEL D 0)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(STOP)
(LABEL D 1)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(STOP)
(LABEL D 2)
(GLUE D 0 R 0.5 R 0.0 R 0.5)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(GLUE D 5 R 0.5 R 0.0 R 0.5)
(STOP)
(LABEL D 3)
(GLUE D 0 R 0.25 R 0.0 R 0.25)
(GLUE D 1 R 0.25 R 0.0 R 0.25)
(GLUE D 2 R 0.25 R 0.0 R 0.25)
(GLUE D 3 R 0.5 R 0.0 R 0.25)
(GLUE D 4 R 0.25 R 0.0 R 0.25)
(GLUE D 5 R 0.25 R 0.0 R 0.25)
(STOP)
(LABEL D 4)
(GLUE D 0 R 0.5 R 0.0 R 0.0)
(GLUE D 1 R 0.5 R 0.0 R 0.0)
(GLUE D 3 R 0.75 R 0.0 R 0.25)
(GLUE D 5 R 0.5 R 0.0 R 0.0)
(STOP)
(LABEL D 5)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(KRN D 5 R 0.0)
(STOP)
)
(CODESPACE
...
)
(CHARSINTYPE D 1
U2018 U201C U2329 U3008 U300A U300C U300E U3010 U3014 U3016 U3018
U301A U301D UFF08 UFF3B UFF5B UFF5F
)
(CHARSINTYPE D 2
U2019 U201D U232A U3001 U3009 U300B U300D U300F U3011 U3015 U3017
U3019 U301B U301E U301F UFF09 UFF0C UFF3D UFF5D UFF60
)
(CHARSINTYPE D 3
U00B7 U30FB UFF1A UFF1B
)
(CHARSINTYPE D 4
U3002 UFF0E
)
(CHARSINTYPE D 5
U2014 U2015 U2025 U2026
)
(TYPE D 0
(CHARWD R 1.0)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
(TYPE D 1
(CHARWD R 0.5)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(MOVERIGHT R -0.5)
(SETCHAR)
)
)
(TYPE D 2
(CHARWD R 0.5)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
(TYPE D 3
(CHARWD R 0.5)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(MOVERIGHT R -0.25)
(SETCHAR)
)
)
(TYPE D 4
(CHARWD R 0.5)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
(TYPE D 5
(CHARWD R 1.0)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
接下來根據該文件做修改,重命名爲 utbwa-v.zvp
,最後在 main.tex
中使用,下文是修改後得到的代碼:
utbwa-v.zvp
(DIRECTION TATE)
(VTITLE )
(FAMILY UPSCH KANJI)
(FACE F MRR)
(CODINGSCHEME TEX KANJI TEXT)
(DESIGNSIZE R 10.0)
(CHECKSUM O 0)
(FONTDIMEN
(SLANT R 0.0)
(SPACE R 0.0)
(STRETCH R 0.1)
(SHRINK R 0.0)
(XHEIGHT R 1.0)
(QUAD R 1.0)
(EXTRASPACE R 0.25)
(EXTRASTRETCH R 0.2)
(EXTRASHRINK R 0.125)
)
(MAPFONT D 0
(FONTNAME upstsl-v)
(FONTCHECKSUM O 0)
(FONTAT R 1.0)
(FONTDSIZE R 10.0)
)
(GLUEKERN
(LABEL D 0)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 2 R 0 R 0.0 R 0.15)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(STOP)
(LABEL D 1)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(STOP)
(LABEL D 2)
(GLUE D 0 R 0.25 R 0.25 R 0.0)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 3 R 0.5 R 0.0 R 0.25)
(GLUE D 5 R 0.5 R 0.0 R 0.5)
(GLUE D 6 R 0.15 R 0.0 R 0.15)
(STOP)
(LABEL D 3)
(GLUE D 0 R 0.25 R 0.0 R 0.25)
(GLUE D 1 R 0.25 R 0.0 R 0.25)
(GLUE D 2 R 0.5 R 0.0 R 0.25)
(GLUE D 3 R 0.5 R 0.0 R 0.25)
(GLUE D 4 R 0.25 R 0.0 R 0.25)
(GLUE D 5 R 0.25 R 0.0 R 0.25)
(STOP)
(LABEL D 4)
(GLUE D 0 R 0.35 R 0.15 R 0.0)
(GLUE D 1 R 0.5 R 0.0 R 0.0)
(GLUE D 3 R 0.75 R 0.0 R 0.25)
(GLUE D 5 R 0.5 R 0.0 R 0.0)
(STOP)
(LABEL D 5)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(KRN D 5 R 0.0)
(STOP)
(LABEL D 6)
(GLUE D 0 R 0.15 R 0.0 R 0.15)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 3 R 0.25 R 0.0 R 0.25)
(KRN D 5 R 0.0)
(STOP)
)
(CODESPACE
...
)
(COMMENT)
(CHARSINTYPE D 1
U2018 U201C U2329 U3008 U300A U300C U300E U3010 U3014 U3016 U3018
U301A U301D UFF08 UFF3B UFF5B UFF5F
)
(CHARSINTYPE D 2
U2019 U201D U232A U3001 U3009 U300B U300D U300F U3011 U3015 U3017
U3019 U301B U301E U301F UFF09 UFF0C UFF3D UFF5D UFF60
)
(CHARSINTYPE D 3
U00B7 U30FB UFF1A UFF1B
)
(CHARSINTYPE D 4
U3002 UFF0E
)
(CHARSINTYPE D 5
U2014 U2015 U2025 U2026
)
(CHARSINTYPE D 6
UFF1F UFF01
)
(COMMENT )
(TYPE D 0
(CHARWD R 1.0)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
(TYPE D 1
(CHARWD R 0.5)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(MOVERIGHT R -0.5)
(SETCHAR)
)
)
(TYPE D 2
(CHARWD R 0.30)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SELECTFONT D 0)
(SETCHAR)
)
)
(TYPE D 3
(CHARWD R 1)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(MOVERIGHT R -0.25)
(SETCHAR)
)
)
(TYPE D 4
(CHARWD R 0.25)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
(TYPE D 5
(CHARWD R 1.0)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
(TYPE D 6
(CHARWD R 1.0)
(CHARHT R 0.5)
(CHARDP R 0.5)
(MAP
(SETCHAR)
)
)
(COMMENT ,)
(CHARACTER H FF0C
(MAP
(SETCHAR)
)
)
(COMMENT :)
(CHARACTER H FF1A
(MAP
(SETCHAR H 003A)
)
)
upTeX標點被分成6類
執行 jfmutil zvp2vf -u --lenient utbwa-v.zvp
生成 utbwa-v.vf
和utbwa-v.tfm
兩個文件,與 mian.tex
放在一起編譯。那麼,上面修改的內容具體如何起作用的呢?把上面的 Uxxxx 形式的 unicode 代碼轉換爲字符:
(CHARSINTYPE D 1
‘ “ 〈 〈 《 「 『 【 〔 〖 〘
〚 〝 ( [ { ⦅
)
(CHARSINTYPE D 2
’ ” 〉 、 〉 》 」 』 】 〕 〗
〙 〛 〞 〟 ) , ] } ⦆
)
(CHARSINTYPE D 3
· ・ : ;
)
(CHARSINTYPE D 4
。 .
)
(CHARSINTYPE D 5
— ― ‥ …
)
(CHARSINTYPE D 6
? !
)
這裏實際上定義了 6 類標點符號,然後回到 upschrm-v.zvp 中帶有關鍵字 GLUEKERN 的行:
(GLUEKERN
...
(LABEL D 2) (COMMENT 標點分類中的第2類)
(GLUE D 0 R 0.25 R 0.25 R 0.0)
(GLUE D 1 R 0.5 R 0.0 R 0.5)
(GLUE D 3 R 0.5 R 0.0 R 0.25)
(GLUE D 5 R 0.5 R 0.0 R 0.5)
(GLUE D 6 R 0.15 R 0.0 R 0.15)
(STOP)
標點需要兩兩組合,分別處理
下表稍微解釋了上面代碼是什麼意思:
標點組合 | 組合類型 | 描述 |
---|---|---|
LABEL D 2 | 在標點兩兩組合組合中,第一個符號是 D 2 類型,如果 <br />LABEL D 5 那麼組合中第一個符號落在 D 5 類型<br />默認情況下,D 0 是漢字字符。 | |
GLUE D 0 | D2 + D0 組合 | ,<br />R1爲兩者之間距離的固定值,<br />R2表示距離擴展,<br />R3表示距離收縮 |
GLUE D 1 | D2 + D1 組合 | 同上 |
配置新生成的虛擬字體——測試成功
在 main.tex
中做 NFSS 字體配置:
% declare font family
\DeclareFontFamily{JY2}{fzwb}{}
\DeclareFontFamily{JT2}{fzwb}{}
% yoko definition
\DeclareFontShape{JY2}{fzwb}{m}{n }{<->s*[0.924690]utbwa-v}{} % 映射 FZBWKSGBX.OTF 方正北魏楷書_GB18030
\DeclareFontShape{JY2}{fzwb}{m}{it}{<->ssub*fzwb/m/n}{} % 按理說這裏也要做橫向虛擬字體的配置,本文中省略
\DeclareFontShape{JY2}{fzwb}{m}{sl}{<->ssub*fzwb/m/n}{}
\DeclareFontShape{JY2}{fzwb}{m}{sc}{<->ssub*fzwb/m/n}{}
% tate definition
\DeclareFontShape{JT2}{fzwb}{m}{n }{<->s*[0.924690]utbwa-v}{} % 這裏就是本文做的虛擬字體,專門用於豎排
\DeclareFontShape{JT2}{fzwb}{m}{it}{<->ssub*fzwb/m/n}{}
\DeclareFontShape{JT2}{fzwb}{m}{sl}{<->ssub*fzwb/m/n}{}
\DeclareFontShape{JT2}{fzwb}{m}{sc}{<->ssub*fzwb/m/n}{}
% command for using
\DeclareRobustCommand\poetfont{\kanjifamily{fzwb}\kanjiseries{m}\selectfont}
做一個測試:
\documentclass[dvipdfmx, uplatex]{utbook}
% 在這裏添加上面的字體配置
\begin{document}
\begin{quote}\fzwb
殿宇凋零倒塌,廊房寂寞傾頹。
磚破瓦十餘堆,盡是些歪梁折柱。
後盡生青草,塵埋朽爛香廚。
樓崩壞鼓無皮,琉璃香燈破損。
祖金身沒色,羅漢倒臥東西。
音淋壞盡成泥,楊柳淨瓶墜地。
內並無僧人,夜間盡宿狐狸。
\end{quote}
\end{document}
編譯上述文件,得到: