我要在卡片的页脚区域为卡片增加时间戳,例如,
2021 年 04 月 29 日 下午 6 时 30 分
然而,迄今为止,我还没介绍如何让 ConTeXt 支持汉字。
TeX 世界的汉字之痛
汉字,一直是 TeX 世界之痛。
与仅需要几十个字母的拼音文字不同,汉字要成千上万个字符。为汉字设计字体,全部字符需要使用字体设计软件逐一绘制而成。
字体大多是有版权的,需要付费获得字体设计公司的授权方能使用。中文 Windows 用户之所以能看到汉字,需要感谢微软出钱购买了汉字字体的授权,但也无需感谢,羊毛出在猪身上。不过,即使你使用的是正版 Windows 系统,倘若将其字体复制到非 Windows 系统里使用,依然很有可能是侵权行为……是不是很不荒唐,RMS 当年因为觉得类似这样的事情实在是荒唐至极,于是开创了自由软件项目。
微软 Office,金山 WPS,方正的飞腾以及 Adobe 的 InDesign 等商业排版类软件,它们不为汉字而痛,因为经营它们的这些公司有购买甚至设计汉字字体的实力。TeX 则不然,它是自由软件,负责它的开发和维护的组织是非盈利组织,没有这样的实力。
有些汉字字体是免费的。这份文档仅以此类字体为例,介绍如何在 ConTeXt 里使用,但是所讲述的知识对于任何 TrueType 和 OpenType 格式的汉字字体理应适用。
思源字体
Google 公司和 Adobe 公司联合开发了包含了汉字的思源字体,有黑体[1],也有宋体[2]。对于排版而言,黑体可用于排版文档的标题,宋体可用于排版正文,因此对于非专业性的文字排版工作,思源字体够用。
可从以下链接下载整套的思源宋体:
下载后,将 SourceHanSerifCN.zip 包解开,这份文档仅使用其中的 SourceHanSerifCN-Regular.otf 这款字体。
告诉 ConTeXt 字体在哪里
有很多种办法让 ConTeXt 在需要指定字体的时候能够找到字体文件,最简单的一种方法是将字体文件放在 ConTeXt 的安装目录里的指定位置。
我的机器运行的是 Linux 系统,我将 ConTeXt 安装到了 $HOME/opt/context
目录。对于不熟悉 Linux 系统目录结构及相关术语的 Windows 用户而言,可以想象为,我将 ConTeXt 安装到了 D:\Program Files\context
目录,这个目录就是所谓的 ConTeXt 的安装目录。
由于 SourceHanSerifCN-Regular.otf 是 Adob 公司设计的 OpenType 字体,所以应当将其安装到 ConTeXt 安装目录里的子目录
tex/texmf-fonts/fonts/opentype/adobe/SourceHanSerifCN
倘若没有这样的子目录,可自行逐级创建。
完成上述的字体安装过程后,需执行以下命令,为 ConTeXt 制备字体文件索引信息:
$ mtxrun --generate
$ mtxrun --script font --reload
使用以下命令可查看上述命令为 SourceHanSerifCN-Regular.otf 字体在 ConTeXt 里的一些信息:
$ mtxrun --script font --list --file -pattern=SourceHanSerifCN-Regular.otf
familyname weight style width variant fontname filename subfont fontweight
sourcehanserifcn normal normal normal normal sourcehanserifcnregular SourceHanSerifCN-Regular.otf conflict: regular
上述命令输出的第 1 列信息 sourcehanserifcn
,在 ConTeXt 源文件里通过这个名字使用 SourceHanSerifCN-Regular.otf 字体。
Hello,汉字!
现在,可以在卡片上显示汉字了。例如
\environment card-env
\definefontfamily[myfont][serif][sourcehanserifcn]
\setscript[hanzi]
\setupbodyfont[myfont]
\starttext
Hello,汉字!
\stoptext
排版结果为
现在可将
\definefontfamily[myfont][serif][sourcehanserifcn]
\setscript[hanzi]
\setupbodyfont[myfont]
挪移到 card-env.tex 文件里了!
页脚
在文档的页脚(footer)写入一些文字,可使用 ConTeXt 的 \setupfootertexts
命令。会设置页脚,就会设置页眉(header),因为 ConTeXt 也有个 \setupheadertexts
命令。
默认情况下,\setupfootertexts
可以在版心之下的页脚区域的两侧放置文字。例如,
\environment card-env
\setupfootertexts[foo][bar]
\showframe
\starttext
这是页脚的示例,看版心下面……
\stoptext
上述 ConTeXt 源文件的排版结果如下:
页脚区域的文字有一部分出框了,是 ConTeXt 默认设定的字号对于卡片而言略大所致。
倘若对 card-env.tex 文件里字体设定命令 \setupbodyfont
略作修改
\setupbodyfont[myfont,7pt]
这样,位于页脚区域的文字和页码,都不会再出框了,如下图所示:
如何将页脚里的 foo
或 bar
放到版心下方的正中位置呢?
ConTeXt 世界摊开了双手,无奈地说,没有多么优美的办法……但是可以用 \hfill
命令将 foo
或 bar
挤到正中位置,例如
\setupfootertexts[\hfill foo\hfill][bar]
我试了一下,果然可以,bar
还在右侧,foo
已然正中:
现在可以去掉 bar
了,然后将 foo
换为时间戳:
\setupfootertexts
[\hfill 2021 年 04 月 29 日 下午 6 时 30 分\hfill][]
然后再去掉脚手架 \showframe
,结果就有了一张带有时间戳的卡片:
结语
依然未触及 ConTeXt 里的 Lua,但是我已经给出了学习 ConTeXt 的一种途径,即倘若知道自己想要什么,那么就要勤于搜索 ConTeXt wiki 上的内容,特别是这个页面:
学习任何一种 TeX,都可以这样学,查阅文档,动手试验。
参考
- https://wiki.contextgarden.net/Use_the_fonts_you_want
- 很久以前我写的一份文档:http://liyanrui.is-programmer.com/2009/10/21/not-just-for-chinese.12264.html
网友评论