《Lua-in-ConTeXt》05:时间戳

上一篇:卡片

我要在卡片的页脚区域增加时间戳,例如

2023 年 01 月 26 日 凌晨 4 时 44 分

然而,迄今为止,尚未介绍如何让 ConTeXt 支持汉字。

汉字,一直是 TeX 世界之痛。

与仅需要几十个字母的拼音文字不同,汉字要成千上万个字符。为汉字设计字体,全部字符需要使用字体设计软件逐一绘制而成。

字体大多是有版权的,需要付费获得字体设计公司的授权方能使用。中文 Windows 用户之所以能看到汉字,需要感谢微软出钱购买了汉字字体的授权,但也无需感谢,羊毛出在猪身上。不过,即使你使用的是正版 Windows 系统,倘若将其字体复制到非 Windows 系统里使用,依然很有可能是侵权行为。RMS 当年因为觉得类似这样的事情实在是荒唐至极,愤而举起自由软件大旗。

微软 Office,金山 WPS,方正的飞腾以及 Adobe 的 InDesign 等商业排版类软件,它们不为汉字而痛,因为经营它们的这些公司有购买甚至设计汉字字体的实力。TeX 则不然,它是自由软件,负责它的开发和维护的组织是非盈利组织,没有这样的实力。

有些汉字字体是免费的。这份文档仅以此类字体为例,介绍如何在 ConTeXt 里使用,但是所讲述的知识对于任何 TrueType 和 OpenType 格式的汉字字体理应适用。

Google 公司和 Adobe 公司联合开发了包含了汉字的思源字体,有黑体1,也有宋体2。这份文档仅使用思源宋体,可从以下链接下载:

思源宋体

下载后,将 SourceHanSerifCN.zip 解开,这份文档仅使用其中的 SourceHanSerifCN-Regular.otf 字体。

有很多种办法让 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 字体。

现在,可以在卡片上显示汉字了。例如

\environment card-env
\definefontfamily[myfont][serif][sourcehanserifcn]
\setscript[hanzi]
\setupbodyfont[myfont]

\starttext
新冠,隔离,静默,全员核酸,大号流感,二十条,新十条,布洛芬,辉瑞药……
\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 默认设定的字号对于卡片而言略大所致。

倘若对 card-env.tex 文件里字体设定命令 \setupbodyfont 略作修改

\setupbodyfont[myfont,7pt]

这样,位于页脚区域的文字和页码,都不会再出框了,如下图所示:

如何将页脚里的 foobar 放到版心下方的正中位置呢?

ConTeXt 世界摊开了双手,无奈地说,没有多么优美的办法……但是可以用 \hfill 命令将 foobar 挤到正中位置,例如

\setupfootertexts[\hfill foo\hfill][bar]

结果为

现在可以去掉 bar 了,然后将 foo 换为时间戳:

\setupfootertexts
  [\hfill 2023 年 01 月 26 日 凌晨 4 时 44 分\hfill][]

然后再去掉脚手架 \showframe,结果就有了一张带有时间戳的卡片:

上述工作并未触及 ConTeXt 里的 Lua,但是给出了学习 ConTeXt 的一种途径,即倘若知道自己想要什么,那么就要勤于搜索 ConTeXt wiki 上的内容,特别是这个页面:

https://wiki.contextgarden.ne...

学习任何一种 TeX,都可以这样学,查阅文档,动手试验。

下一篇:伪竖排

参考


这里可能不会再更新了。

5.9k 声望
1.9k 粉丝
0 条评论
推荐阅读
ConTeXt 蹊径
大概是 2009 年,初学 ConTeXt 时,曾经写了一份笔记,内容颇为粗陋,当时 CTeX 论坛的朋友协助打包上传到了 CTAN。2011 年我对该笔记作了一些修改,并在文中许诺在当年年底作一番大修,然而我食言了。很多年后,...

garfileo阅读 628评论 3

Redis分布式锁的实现
很多新手将 分布式锁 和 分布式事务 混淆,个人理解:锁 是用于解决多程序并发争夺某一共享资源;事务 是用于保障一系列操作执行的一致性。我前面有几篇文章讲解了分布式事务,关于2PC、TCC和异步确保方案的实现...

KerryWu4阅读 7.2k评论 2

ConTeXt 蹊径
大概是 2009 年,初学 ConTeXt 时,曾经写了一份笔记,内容颇为粗陋,当时 CTeX 论坛的朋友协助打包上传到了 CTAN。2011 年我对该笔记作了一些修改,并在文中许诺在当年年底作一番大修,然而我食言了。很多年后,...

garfileo阅读 628评论 3

一文讲透 Redis 事务 (事务模式 VS Lua 脚本)
准确的讲,Redis 事务包含两种模式 : 事务模式 和 Lua 脚本。先说结论:Redis 的事务模式具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一致性的概念有分歧,假设在一致性的核心...

勇哥java实战分享阅读 527

封面图
什么是 LuaJIT?为什么 Apache APISIX 选择了 LuaJIT?
简单地说,LuaJIT 是 Lua 这种编程语言的实时编译(JIT,Just-In-Time Compilation)器的实现。对于不太了解 LuaJIT 的读者,我们可以将 LuaJIT 拆成 Lua 和 JIT 两个部分来理解。

API7_技术团队阅读 461

TMP的阴影性能如何
1)TMP的阴影性能如何​2)CommandBuffer.DrawMeshInstanced无法画阴影问题3)Unity编辑器在Require大量加载Lua文件时,经常报出not enough memory4)场景制作的时候,2D资源受后处理调色影响比较大

侑虎科技阅读 189

封面图
SRP Batcher在真机上失效
1)SRP Batcher在真机上失效​2)Shader里面对同一张纹理多次采样会影响效率吗3)为什么纹理开启了mipmap后,纹理内存反而下降了4)TMP为什么有多次Delegate.Combine()的GC

侑虎科技阅读 124

封面图

这里可能不会再更新了。

5.9k 声望
1.9k 粉丝
宣传栏