概述
之前我写过一篇关于电子书生僻字处理的帖子参见这里,其中讲了最为高大上的外挂字库方法。这段时间有很多同好询问制作生僻字外挂的方法,因此花点时间详细讲述一番。
预备知识
字库调用顺序
首先要了解电子书调取字库的基本原理,我在之前的帖子参见这里已经讲过fallback的一个机制,这里不再重复。对于阅读器来说,css中设定的字体族决定了正文字体的显示顺序,例如:
p {
text-align: justify;
text-indent: 2em;
line-height:130%;
font-family: "DK-SONGTI", "方正宋三简体", "方正书宋", "宋体", 明朝;
}
这里的字体族会首先调取多看阅读自带的方正书宋(DK-SONTI),如果遇到书宋显示不了的字符,再依次查找local名称为“方正宋三简体”、“方正书宋”、“宋体”和明朝体,如果这些字体找不到或者都不包括此字符,则该处显示为空白。
定义外挂字库
同样,css中可以定义外挂字库,或称第三方字体。多看中默认只有6中文2西文字体,如果想在电子书中嵌入你喜欢的字体,让其在所有手机上显示效果都一致,可以编写下面的代码:
@font-face {
font-family:"name1";
src:
local("localname1"),
url(../Fonts/xxx.ttf);
}
上述代码中,font-family和src/url属性是必须有的,font-family定义了该字体的定义名称,一般用英文(如宋体的定义名称是songti),调用时,只需css中为属性声明font-family即可。url是调用字体的路径,多看支持ttf、otf格式的字体文件,不支持fon这种点阵格式,需要特别注意的是,字体名称和后缀名都是大小写敏感的,大小写不一致会导致无法调用,建议全部改为小写。
前面一段说了local名称,这一段不是必须的,主要是增加可读性,它是字体定义名称的本地化译名(比如songti的本地化译名是“宋体”),调用时,声明引号+本地化名称也可以成功调用该字体。
预备的工具软件
本教程牵扯的知识比较广,先将需要的工具列举在下面,大家自行百度,不提供破解或下载什么的。
- sigil 0.9.9 不用多说的基础软件;
- fontstudio 5.2.2 用来修改字体,也有mac版;
- 汉字宝典 3.4 查找生僻字,也可以直接在guoxuedashi.com上在线搜索,对于奇葩生僻字在线可搜索图片字、手写字,比app效率好些。
小试牛刀
首先打开fontstudio,界面是全英文,不过这个不影响我们使用,因为我们不打算造字去卖(商业造字我估计都不是用这个软件),用的功能其实不多。
上一篇字体的帖子我们讲过了多看中西文字体在混用时,人名分隔符的尴尬情况,全用书宋的话,显示非英文的西文字母宽度不一,非常难看,而使用DK-SERIF(实际上是palatino字体)然后fallback到书宋的话,人名分隔符非常的窄,看着很不舒服。多看官方的解决办法是遇到西文人名就用span标签显示DK-SERIF(可能是因为不能修改购买的字体),这样显示非常完美,只不过代码页面就非常臃肿,一堆的span,可读性很差。我们现在通过修改字体的方式来完成下面三个目标:
- 人名分隔符全宽显示;
- 西文全部用DK-SERIF显示;
- 不用额外设置span,导致代码页面臃肿。
提取palatino字体
首先DK-SERIF就是Palatino字体,这个字体是win7系统自带的(当然你愿意也可以用别的西文字体,只要显示舒服就可以了):
在字体列表里面可以找到Palatino字体,这是个字体族,包括正常、斜体、粗体、粗斜体四个ttf。将其拖到桌面上就可以提取出来。
一般我们只使用正常字体一个ttf(名称为pala.ttf)就可以了,因为另外三种可以用strong和em标签画出来。当然标签是软件绘制的,不如真正做出来的ttf。如果有完美主义可以把四个ttf都嵌入,反正每个ttf也就400k左右。
用fontstudio打开pala.ttf,界面如下:
注意,选中了一个字符,会显示为蓝色。这里选择的00B7就是西文的人名间隔符(该字符属于Opentype字符表必须的字符,所以它的name和unicode都不一样,与中文字符不同)
选中了00B7之后,按下delete键,会弹出警告,确认删除之后,可以看到该字符背景变灰了(并不删除该字符,也说明了必须字符的特殊性,与中文字符不一样)
点击菜单的file-generate font,覆盖现有字体即可。现在这个字体就是缺失间隔符的字体了。
在sigil中新建一个epub文件,在css中写如下代码:
@font-face {
font-family:"pala";
src:
local("pala"),
url(../Fonts/pala.ttf);
}
p {
text-align: justify;
text-indent: 2em;
line-height:130%;
margin: 0.6em 0em;
font-family: "pala", "DK-SONGTI", "方正宋三简体", "方正书宋", "宋体", 明朝;
}
代码会先从修改的palatino去调用西文字符,然后遇到间隔符会fallback到书宋。
这里注意,local("pala")这一行可以不写,但是绝对不能写成local("palatino"),因为palatino这个本地化名称已经被多看定义到DK-SERIF了,如果你这样写,会导致多看优先使用内置的DK-SERIF来显示,而不是用这个外挂的改版pala.ttf。
现在在html中写一段西文字体看一下效果:
法国汉学家埃德温·沙畹(Édouard Chavannes)
多看中显示效果如下:
上图为书宋+palatino的显示效果,下图为更换为仿宋的效果。如果要让仿宋也有完美效果,可以按上述流程再定义一个字体,也可以用仿宋+palatino的方式增加定义。
关于造生僻字的教程,留在下一贴再详细阐述。