zhfonts 模块的用法
声明:可转载,可修改,也可以不注明作者和出处。
也许你已经看过『不仅仅是为了中文』(如果没有看过,那么请一定要看完它之后再来阅读本文),那篇文章的最后一部分说“故事刚刚开始”,实际上中文用户的故事还未开始。另外,文章的末尾说“下一篇,将讲述如何使用 ConTeXt 制作演示文档”,实际上这是当时我蓄意挖的坑,而且我现在也没有准备好动手去填,土还未攒够。下面我要讲述的依然是 ConTeXt MkIV 的中文文字排版方面的问题。
在『不仅仅是为了中文』 中,讲述了 ConTeXt 的 Typescript 机制以及易于使用的 Simplefonts 模块,对于不怎么讲究的中文排版,它们勉强够用。但是如果希望对中文标点符号的排版做一些控制,例如相邻标点的间距调整与文本左右边界处标点的纵向对齐 等,那么 Typescript 与 Simplefonts 便无能为力了。也许在不远的将来,ConTeXt 会内建支持中文排版的各种规则,但是很久以前我便已厌倦了这种等待。为了能够让填坑工作继续进行,只好拿出去年所写的 zhfonts 模块,暂时弥补 ConTeXt MkIV 的中文排版所欠缺的部分功能,不过我不能保证 zhfonts 会一直有效。
zhfonts 模块的获取与安装
如果会使用 git,可采用以下命令获取 zhfonts:
$ git clone https://github.com/liyanrui/zhfonts.git
或者在 https://github.com/liyanrui/zhfonts/archives/master 下载日期最新的包,解包后可得 zhfonts 目录。
将所得 zhfonts 目录,按以下说明安装至 ConTeXt Minimals 目录树中。
- 如果是 Windows 系统,ConTeXt Minimals 安装位置为 d:\context,将 zhfonts 目录放置于 d:\context\tex\texmf-local\tex\context\third 目录(若无该目录,请自行建立);
- 如 果是类 Unix 系统,假设 ConTeXt Minimals 安装位置为 ~/context 目录,那么就将 zhfonts 目录放置于 ~/context/tex/texmf-local/tex/context/third 目录(若无该目录,请自行建立)。
安装完成后,在命令行中输入命令:
context --generate
这样便完成了 zhfonts 模块的安装。
zhfonts 模块的基本用法
zhfonts 模块默认的中文、西文以及数学字体集如下:
% 中文字体 cjkfonts.serif.regular = 'nsimsun' cjkfonts.serif.bold = 'simhei' cjkfonts.serif.italic = 'nsimsun' cjkfonts.serif.bolditalic = 'simhei' cjkfonts.sans.regular = 'youyuan' cjkfonts.sans.bold = 'simhei' cjkfonts.sans.italic = 'youyuan' cjkfonts.sans.bolditalic = 'simhei' cjkfonts.mono.regular = 'fangsong' cjkfonts.mono.bold = 'simkai' cjkfonts.mono.italic = 'fangsong' cjkfonts.mono.bolditalic = 'simkai' % 西文字体 latinfonts.serif.regular = 'texgyrepagellaregular' latinfonts.serif.bold = 'texgyrepagellabold' latinfonts.serif.italic = 'texgyrepagellaitalic' latinfonts.serif.bolditalic = 'texgyrepagellabolditalic' latinfonts.sans.regular = 'texgyreherosregular' latinfonts.sans.bold = 'texgyreherosbold' latinfonts.sans.italic = 'texgyreherositalic' latinfonts.sans.bolditalic = 'texgyreherosbolditalic' latinfonts.mono.regular = 'lmmono10regular' latinfonts.mono.bold = 'lmmonolt10bold' latinfonts.mono.italic = 'lmmono10italic' latinfonts.mono.bolditalic = 'lmmonolt10boldoblique' % 数学字体 math_typeface.name = 'xits'
如果 zhfonts 的默认字体集满足需求,并且确信系统中具备这些字体,那么 zhfonts 模块的使用方法见下面示例:
% 加载 zhfonts 模块,默认的文档主字体为衬线字体,字号为 11pt \usemodule[zhfonts] \starttext 测试 English 与中文。 \stoptext
若另行设置文档主字体的类型与字号,见下例:
% 加载 zhfonts 模块,默认的文档主字体为无衬线字体,字号为 12pt \usemodule[zhfonts][style=ss, size=12pt] \starttext 测试 English 与中文。 \stoptext
替换默认字体
如果 zhfonts 所提供的默认字体不能满足需要,对于中文字体替换,可参考下面这一示例:
\usemodule[zhfonts] % 将默认的中文各衬线字体替换为 Adobe 宋体(adobesongstd) 与 Adobe 黑体 (adobeheitistd) \setupzhfonts [serif] % 对于非衬线字体与等宽字体,则该参数可换为 sans 与 mono [regular=adobesongstd, bold=adobeheitistd, italic=adobesongstd, bolditalic=adobeheitistd] \starttext 测试 English 与中文。 \stoptext
注意:使用 \setupzhfonts 宏时,需要向它提供各种字体的名称,而不是字体文件名称。
如果也需要要对英文字体进行替换,请参考下面这一示例:
\usemodule[zhfonts] % 将默认的中文各衬线字体替换为 Adobe 宋体(adobesongstd) 与 Adobe 黑体 (adobeheitistd) \setupzhfonts [serif] [regular=adobesongstd, bold=adobeheitistd, italic=adobesongstd, bolditalic=adobeheitistd] % 将默认的西文衬线字体替换为 Latin Modern 字体 \setupzhfonts [latin, serif] [regular=latinmodernroman, bold=latinmodernromanbold, italic=latinmodernromanitalic, bold=latinmodernromanbolditalic] \starttext 测试 English 与中文。 \stoptext
如果所使用的中文字体与西文字体的比例不协调,那么可以通过调整中文字体的缩放参数来解决,例如:
\usemodule[zhfonts] % 将中文衬线字体替换为 adobesontstd,并将其比例设置为西文字体的 1.1 倍 \setupzhfonts[serif][regular=adobesongstd@1.1] \starttext 测试 English 与中文。 \stoptext
对于 zhfonts 的默认字体,在调整缩放参数时,只需忽略字体名即可,例如:
\usemodule[zhfonts] \setupzhfonts[serif][regular=@1.1] \starttext 测试 English 与中文。 \stoptext
数学字体
zhfonts 支持以 typescript 名称的方式设定字体。看下面的示例:
\usemodule[zhfonts][style=rm, size=9pt] \usetypescriptfile[euler] \setupzhfonts[math][pagellaovereuler] \starttext 测试:\formula{{\Bbb P}(x) = \sum_{i=1}^n α_i x^i} \stoptext
其中,pagellaovereuler 便是 typescript 名称。结果如下图所示:
之所以采用字体的 typescript 名称而不直接使用字体名称,是因为数学字体有许多种,例如正体、斜体、粗体、花体等等。typescript 是 ConTeXt 的字体抽象机制,它可以将多种风格相似的数学字体组合起来,为它们取一个名字,这个名字便是 typescript 的名字。
ConTeXt MkIV 已经为数学字体定义了一组 typescript,可以在 \setupzhfonts 命令中直接使用它们,详见:http://wiki.contextgarden.net/Math_fonts#Using_Math_fonts_in_MkIV
与 Simplefonts 模块协作
zhfonts 模块没有为字体提供可以设定字体特效的接口,而 Wolfgang 的 Simplefonts 模块具备这一功能。如果需要对字体进行更为细致的设置,推荐使用 Simplefonts 模块完成字体加载,然后使用 zhfonts 模块进行标点微排版。
下面是一个单纯使用 Simplefonts 模块的中英文排版示例:
% 加载模块 \usemodule[simplefonts] % 设置西文衬线字体,并开启 proportional oldstyle 数字效果 \definefontfeature[minion][onum=yes, pnum=yes] \setmainfont[minionpro][features=minion, mode=node] % 设置中文衬线字体 \setcjkmainfont[adobesongstd] % 中文断行 \setscript[hanzi] \starttext “测试 T\smallcaps{est} 特效。” \blank “测试 0123456789 特效”。 \stoptext
排版效果见下图:
由 上图可见,采用 Simplefonts 模块可以实现中文与西文字体的载入,同时也支持字体特效,但是对于中文标点未进行任何处理。下面这个示例演示了如何使用 zhfonts 模块补充 Simplefonts 模块所欠缺的部分功能(当然这本该是 ConTeXt MkIV 的内建功能)。
\usemodule[simplefonts] \definefontfeature[minion][onum=yes, pnum=yes] \setmainfont[minionpro][features=minion, mode=node] \setcjkmainfont[adobesongstd] \usemodule[zhfonts][style=none] \starttext “测试 T\smallcaps{est} 特效。” \blank “测试 0123456789 特效”。 \stoptext
本例的排版效果如下图所示。
注意:2013 年 12 月之后,ConTeXt MkIV 内置了 simplefonts 模块的功能,设置字体的宏略有变化。与上述示例等效的代码如下:
\usemodule[zhfonts][style=none] \definefontfeature[minion][onum=yes, pnum=yes, mode=node] \definefallbackfamily[zhfonts][serif][adobesongstd][range:chinese] \definefontfamily[zhfonts][serif][texgyrepagella][features=minion] \setupbodyfont[zhfonts] \starttext “测试 T\smallcaps{est} 特效。” \blank “测试 0123456789 特效”。 \stoptext
后记
在上述中文字体排版支持基础之上,我准备写下一篇『ConTeXt 文稿的物理结构』。这次肯定不会再拖到明年。
转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com
2011年1月11日 05:48
太好了!
2011年1月12日 02:19
继续学习!
2011年1月13日 22:25
感谢你对Context的介绍,我第一次尝试ContexT就是看到你的一个pdf介绍,呵呵。luatex什么时候才能替代xetex啊
2011年1月17日 13:09
非常高兴恢复更新阿!新年得礼物!
2011年2月12日 17:05
路过……
2011年4月05日 13:27
谢谢 garfileo
匿名获取的命令 zhfonts 应该是
git clone https://github.com/liyanrui/zhfonts.git
2011年4月13日 15:05
@hezhit: 都一样的,而且,git 协议(其实是 ssh)应该更快一些。
2011年4月14日 10:02
@依云: 问题在于,我们都没有作者在 github 上的 public key
2011年4月14日 10:50
@hezhit: 嗯,怪我。当时我恰好登录了 github,然后从 github 上复制了那个地址 :)
现在改回来了。
2011年4月14日 13:38
@hezhit: 你要 public key 做什么?放你的 ~/.ssh/authorized_keys 里让别人登录你的机器?
2011年6月08日 01:40
你好,我在配置context的时候,下载不到adobe的楷体和仿宋,你可不可以发给我一份,谢谢
2011年6月08日 07:51
@lxping: http://bbs.ctex.org/viewthread.php?tid=47618
2011年6月08日 16:48
谢谢
2011年6月11日 17:33
能不能像ctex for latex一样可以设置winfonts和adobefonts?个人只有adobe字体。。。
2011年6月11日 17:56
@Mike Ma: 用 \setupzhfonts 宏挨个设定吧,你也可以单独作一个文件设置好字体,以后重复使用就是了。
2011年6月11日 18:07
@Mike Ma:
\usemodule[zhfonts]
\setupzhfonts
[serif]
[regular=adobesongstd,
bold=adobeheitistd,
italic=adobesongstd,
boiditalic=adobeheitistd]
\setupzhfonts
[sans]
[regular=adobekaitistd,
bold=adobeheitistd,
italic=adobekaitistd,
boiditalic=adobeheitistd]
\setupzhfonts
[sans]
[regular=adobefangsongstd,
bold=adobeheitistd,
italic=adobefangsongstd,
boiditalic=adobeheitistd]
2011年6月11日 18:12
@Garfileo: 设置参数比较简单~直接改源码很破坏移植性……所以希望有能设置的。。。
2011年6月11日 18:38
@Mike Ma: 你没明白我的意思,你按照上面的设定方式,自己分别做一个 winfont.tex 和 adobe.tex。以后用的时候,就 \input 或者按照 ConTeXt 的 environment 文件的组织方式使用。
如果考虑移植的问题,发布源码时,将 winfont.tex 或者 adobe.tex 打包一起发布即可。
2011年6月11日 18:39
上面配置文件有点错误,第二个 sans 应当改成 mono
2011年6月11日 23:16
@Garfileo: 好吧。。。
2012年1月09日 15:37
Garfileo, 这个不管用了啊,中文全部消失掉了……用的是最新的 context。
2012年1月09日 16:00
@依云: 正是因为你用的是*最新的* ConTeXt 才出的问题。
Hans Hagen said: I uploaded a new beta. Apart from some fixes the core font/type modules have been cleaned up so there might be temporary font side effects.
等我看出来哪儿出了问题之后,就去报告一下。
2012年1月09日 16:01
@依云: 嗯,已经有人报告了。
2012年1月09日 16:21
@Garfileo: 唉,好不容易有机会用下 ConTeXt,没想到出这种问题。好像也没有办法回滚到旧版 -_-|||
2012年1月09日 17:30
@依云: 使用 first-setup.sh 脚本的 `--context=current` 选项,可以回到一个稳定版。
2012年1月09日 18:45
@Garfileo: It works! Thank you!
2012年1月09日 18:55
@依云: 现在可以再更新到最新的 beta 了,那个问题已经修复 :)
2012年1月09日 19:06
@Garfileo: 呃,真折腾啊……
2014年1月04日 01:04
您好,非常感谢您的经验分享。正因为有您的介绍,我才能写一个简单的ConTeXt文档。
问题:
context的长footnote内的长中文不能正常断行。我看到之前有人提问过,但是没有得到解答,谢谢关注。
2014年1月04日 01:18
您好,溢美之词难以言表。我同时发现新的问题
问题2:使用了中文的设置后,我发现多个空格不能被忽略。
问题3:空白行不能代替一个新段落的开始
不知大家有无同感,谢谢。望解答。
2014年1月07日 15:05
@hu: \footnote{\setscript[hanzi]中文中文中文中阿理解啊阿斯顿了房间}……这样就可以断行了,现在只能这么干。
多个空格可以被忽略啊,当然你用中文的全角空格的话,那是忽略不了的。
空白行就是分段,你可能没有设置段落缩进,或者没有增大段间距。
zhfonts 只对中文字体与标点符号做了处理,排版上的东西它不管的。
2014年1月10日 12:30
谢谢rca,我安装您的提示我成功的解决了footnote不断行的问题。但是空白行分段的问题还不能解决。下面是我的部分文档。用的是最新的current版本,用texwork的前端。
\setscript[hanzi]
\setupindenting[yes,2em]
\usemodule[simplefonts]
\setscript[hanzi]
\usemodule[zhfonts]
\setupbodyfontenvironment
[default]
[em=bold]
\starttext
\completecontent
\chapter{哈佛幸福课 第一讲 什么是积极心理学?}
\section{Tal Ben Sharhar为什么学习和教授积极心理学}
各位,早上好,很高兴能回到这里,很高兴见到你们。我教授这门课是因为,在我读本科阶段时,非常希望能学习这样一门课程,可能这门课并不是你希望的那样,也可能并不适合你。但希望几堂课后,你能有个大概印象,让你决定这门课是否适合你。我1992年来到哈佛求学,大二期间,突然顿悟了,我意识到我身处让人神往大学校园,周围都是出色的同学,优秀的导师,我成绩优异,擅长体育运动,那时壁球打得不错,社交也游刃有余。\footnote{\setscript[hanzi]在很多情况下,大家都是拥有很多优势的人,但是我们很多时候都是\quote{一直向前冲},没有回头、低头看看自己所拥有}
一切都很顺利除了一点,我不快乐,而且我不明白为什么。也就是在那时,我决定要找出原因,变得快乐,于是我将研究方向,从计算机科学转向了哲学及心理系,目标只有一个,如何变得更快乐?渐渐地,我的确变得更快乐了。主要因为我接触了一个新的领域,但本质上属于积极心理学范畴,研究积极心理学,把其理念应用到生活中,让我无比快乐,而且这种快乐继续着,于是我决定将其与更多的人分享。选择教授这门学科,这就是积极心理学。1504号心理学课程,我们将一起探索这一全新,相对新兴,令人倾倒的领域,希望同时还能探索我们自己。
\stoptext
2014年1月14日 00:52
@hu: 给你一个比较小的例子,你看一下:
\usemodule[zhfonts]
\setuphead[title,section][indentnext=yes]
\setupindenting[yes,2em]
\starttext
\chapter{哈佛幸福课 第一讲 什么是积极心理学?}
\section{Tal Ben Sharhar为什么学习和教授积极心理学}
各位,早上好,很高兴能回到这里,很高兴见到你们。我教授这门课是因为,在我读本科阶段时,非常希望能学习这样一门课程……\footnote{\setscript[hanzi]在很多情况下,大家都是拥有很多优势的人,但是我们很多时候都是\quote{一直向前冲},没有回头、低头看看自己所拥有}
一切都很顺利除了一点,我不快乐,而且我不明白为什么。也就是在那时,我决定要找出原因,变得快乐,于是我将研究方向,从计算机科学转向了哲学及心理系,目标只有一个,如何变得更快乐?渐渐地,我的确变得更快乐了……
\stoptext
2014年1月16日 01:08
@rca
谢谢你的例子。我终于发现我的问题在于空行并不空,里面含有空格,所以导致我前面的问题。另外我从win里面复制来的回车可能也是一个原因。谢谢。
2014年1月16日 10:36
@hu: 不是,你要理解 \setuphead[title,section][indentnext=yes] 的作用。
2014年2月02日 20:52
我发现差别所在了,添加了\setuphead以后,在之后的紧接的段落里没有可以正常的缩进。谢谢提醒。
同时我在用footnote的时候发现,footnote一定不要用在段首否则就会编译报错。
2014年2月05日 16:01
@hu: 脚注嘛,自然得有正文的存在才可以『注』。
2014年4月05日 13:23
请问为什么 ConText 里 Mono 字体中文和英文字距大小不一样?
同一款等宽字体中文的就比英文的小 (和 zhfonts 模块无关), 如何调整?
2014年4月19日 17:38
@ft: 好久未至,抱歉。应该是字体大小不一致导致的吧。zhfonts 里提供了字体缩放的参数,试试看。