在 inkscape 中插入 LaTeX 与 ConTeXt 标签
ConTeXt 文稿的物理结构

zhfonts 模块的用法

Garfileo posted @ 2011年1月11日 03:29 in ConTeXt 笔记 with tags ConTeXt MkIV zhfonts simplefonts , 11733 阅读

声明:可转载,可修改,也可以不注明作者和出处。

也许你已经看过『不仅仅是为了中文』(如果没有看过,那么请一定要看完它之后再来阅读本文),那篇文章的最后一部分说“故事刚刚开始”,实际上中文用户的故事还未开始。另外,文章的末尾说“下一篇,将讲述如何使用 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 目录(若无该目录,请自行建立)。

安装完成后,在命令行中输入命令:

luatools --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]
\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

  • 无匹配
murong 说:
2011年1月12日 02:19

继续学习!

Avatar_small
vmlinz 说:
2011年1月13日 22:25

感谢你对Context的介绍,我第一次尝试ContexT就是看到你的一个pdf介绍,呵呵。luatex什么时候才能替代xetex啊

negatlov 说:
2011年1月17日 13:09

非常高兴恢复更新阿!新年得礼物!

milksea 说:
2011年2月12日 17:05

路过……

hezhit 说:
2011年4月05日 13:27

谢谢 garfileo
匿名获取的命令 zhfonts 应该是
git clone https://github.com/liyanrui/zhfonts.git

Avatar_small
依云 说:
2011年4月13日 15:05

@hezhit: 都一样的,而且,git 协议(其实是 ssh)应该更快一些。

hezhit 说:
2011年4月14日 10:02

@依云: 问题在于,我们都没有作者在 github 上的 public key

Avatar_small
Garfileo 说:
2011年4月14日 10:50

@hezhit: 嗯,怪我。当时我恰好登录了 github,然后从 github 上复制了那个地址 :)

现在改回来了。

Avatar_small
依云 说:
2011年4月14日 13:38

@hezhit: 你要 public key 做什么?放你的 ~/.ssh/authorized_keys 里让别人登录你的机器?

lxping 说:
2011年6月08日 01:40

你好,我在配置context的时候,下载不到adobe的楷体和仿宋,你可不可以发给我一份,谢谢

Avatar_small
Garfileo 说:
2011年6月08日 07:51

@lxping: http://bbs.ctex.org/viewthread.php?tid=47618

Avatar_small
Mike Ma 说:
2011年6月11日 17:33

能不能像ctex for latex一样可以设置winfonts和adobefonts?个人只有adobe字体。。。

Avatar_small
Garfileo 说:
2011年6月11日 17:56

@Mike Ma: 用 \setupzhfonts 宏挨个设定吧,你也可以单独作一个文件设置好字体,以后重复使用就是了。

Avatar_small
Garfileo 说:
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]

Avatar_small
Mike Ma 说:
2011年6月11日 18:12

@Garfileo: 设置参数比较简单~直接改源码很破坏移植性……所以希望有能设置的。。。

Avatar_small
Garfileo 说:
2011年6月11日 18:38

@Mike Ma: 你没明白我的意思,你按照上面的设定方式,自己分别做一个 winfont.tex 和 adobe.tex。以后用的时候,就 \input 或者按照 ConTeXt 的 environment 文件的组织方式使用。

如果考虑移植的问题,发布源码时,将 winfont.tex 或者 adobe.tex 打包一起发布即可。

Avatar_small
Garfileo 说:
2011年6月11日 18:39

上面配置文件有点错误,第二个 sans 应当改成 mono

Avatar_small
Mike Ma 说:
2011年6月11日 23:16

@Garfileo: 好吧。。。

Avatar_small
依云 说:
2012年1月09日 15:37

Garfileo, 这个不管用了啊,中文全部消失掉了……用的是最新的 context。

Avatar_small
Garfileo 说:
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.

等我看出来哪儿出了问题之后,就去报告一下。

Avatar_small
Garfileo 说:
2012年1月09日 16:01

@依云: 嗯,已经有人报告了。

Avatar_small
依云 说:
2012年1月09日 16:21

@Garfileo: 唉,好不容易有机会用下 ConTeXt,没想到出这种问题。好像也没有办法回滚到旧版 -_-|||

Avatar_small
Garfileo 说:
2012年1月09日 17:30

@依云: 使用 first-setup.sh 脚本的 `--context=current` 选项,可以回到一个稳定版。

Avatar_small
依云 说:
2012年1月09日 18:45

@Garfileo: It works! Thank you!

Avatar_small
Garfileo 说:
2012年1月09日 18:55

@依云: 现在可以再更新到最新的 beta 了,那个问题已经修复 :)

Avatar_small
依云 说:
2012年1月09日 19:06

@Garfileo: 呃,真折腾啊……

hu 说:
2014年1月04日 01:04

您好,非常感谢您的经验分享。正因为有您的介绍,我才能写一个简单的ConTeXt文档。

问题:

context的长footnote内的长中文不能正常断行。我看到之前有人提问过,但是没有得到解答,谢谢关注。

hu 说:
2014年1月04日 01:18

您好,溢美之词难以言表。我同时发现新的问题

问题2:使用了中文的设置后,我发现多个空格不能被忽略。

问题3:空白行不能代替一个新段落的开始

不知大家有无同感,谢谢。望解答。

Avatar_small
rca 说:
2014年1月07日 15:05

@hu: \footnote{\setscript[hanzi]中文中文中文中阿理解啊阿斯顿了房间}……这样就可以断行了,现在只能这么干。

多个空格可以被忽略啊,当然你用中文的全角空格的话,那是忽略不了的。

空白行就是分段,你可能没有设置段落缩进,或者没有增大段间距。

zhfonts 只对中文字体与标点符号做了处理,排版上的东西它不管的。

hu 说:
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

Avatar_small
rca 说:
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

hu 说:
2014年1月16日 01:08

@rca
谢谢你的例子。我终于发现我的问题在于空行并不空,里面含有空格,所以导致我前面的问题。另外我从win里面复制来的回车可能也是一个原因。谢谢。

Avatar_small
rca 说:
2014年1月16日 10:36

@hu: 不是,你要理解 \setuphead[title,section][indentnext=yes] 的作用。

hu 说:
2014年2月02日 20:52

我发现差别所在了,添加了\setuphead以后,在之后的紧接的段落里没有可以正常的缩进。谢谢提醒。

同时我在用footnote的时候发现,footnote一定不要用在段首否则就会编译报错。

Avatar_small
rca 说:
2014年2月05日 16:01

@hu: 脚注嘛,自然得有正文的存在才可以『注』。

ft 说:
2014年4月05日 13:23

请问为什么 ConText 里 Mono 字体中文和英文字距大小不一样?
同一款等宽字体中文的就比英文的小 (和 zhfonts 模块无关), 如何调整?

Avatar_small
Garfileo 说:
2014年4月19日 17:38

@ft: 好久未至,抱歉。应该是字体大小不一致导致的吧。zhfonts 里提供了字体缩放的参数,试试看。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter