《Lua-in-ConTeXt》05:時間戳

garfileo發表於2023-02-01
上一篇:卡片

我要在卡片的頁尾區域增加時間戳,例如

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,都可以這樣學,查閱文件,動手試驗。

下一篇:偽豎排

參考

相關文章