竖排标点的迷思
书接前文。这回我们要处理的是竖排的标点,我们先来看一个例子,有大概地了解:
image.png上面的诗文部分中,逗号和字符空间大、不美观,且不太适宜阅读。下文要做的就是缩小它们之间的距离。这里,依然对 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}
编译上述文件,得到:
image.png
网友评论