\chapter{需要 zhfonts 吗？}

基于第 \in[chinese-fonts] 章介绍的汉字字体的设定方法，使用 \CONTEXT\ 足以排版中文文档，但是存在汉字标点符号的间距过大且无法与正文左右边界对齐等问题。若你对此无法忍受，可以考虑使用我写的 zhfonts 模块，另外该模块显著简化了中文字体的设定。

\section{zhfonts 初印象}

根据现在你已经掌握的 \CONTEXT\ 知识，理解以下代码，想必已不在话下：

\starttyping[option=TEX]
\definefallbackfamily
  [foo][rm][latinmodernroman][range={0x0000-0x0400},force=yes]
\definefontfamily[myfonts][rm][nsimsun][bf=simhei,it=kaiti,bi=simhei]
\setscript[hanzi]
\setupbodyfont[foo,12pt]
\setuppapersize[S4]
\setuplayout[width=middle]
\showglyphs  % 显示字形边界盒
\starttext
小知不及大知，小年不及大年。奚以知其然也？朝菌不知晦朔，蟪蛄不知春秋，此小年也。楚之南有冥灵者，以五百岁为春，五百岁为秋；上古有大椿者，以八千岁为春，八千岁为秋，此大年也。而彭祖乃今以久特闻，众人匹之，不亦悲乎！汤之问棘也是已。穷发之北，有冥海者，天池也。有鱼焉，其广数千里，未有知其修者，其名为鲲。有鸟焉，其名为鹏，背若泰山，翼若垂天之云，抟扶摇羊角而上者九万里，绝云气，负青天，然后图南，且适南冥也。斥鴳笑之曰：“彼且奚适也？我腾跃而上，不过数仞而下，翱翔蓬蒿之间，此亦飞之至也。而彼且奚适也？”此小大之辩也。
\stoptext
\stoptyping
\noindent 对应的排版结果如图 \in[none-zhfonts] 所示。

若使用 zhfonts 模块，则上述示例可改写为

\starttyping[option=TEX]
\usemodule[zhfonts][size=12pt]
\setuppapersize[S4]
\setuplayout[width=middle]
\showglyphs  % 显示字形边界盒
\starttext
小知不及大知，小年不及大年 [... 省略很多字 ...] 此小大之辩也。
\stoptext
\stoptyping
\noindent 对应的排版结果如图 \in[zhfonts] 所示。

若认真对比图 \in[none-zhfonts] 和图 \in[zhfonts] 中的标点符号的排版结果，则不难发现 zhfonts 模块解决的问题是标点间距微调。

\placefigure[here][none-zhfonts]{未使用 zhfonts 的中文标点排版效果}{%
  \clip[width=\textwidth,height=5cm,voffset=1.8cm]{%
    \externalfigure[zhfonts/none-zhfonts.pdf][width=\textwidth]}}
\placefigure[here][zhfonts]{使用 zhfonts 的中文标点排版结果}{%
  \clip[width=\textwidth,height=4.25cm,voffset=1.8cm]{%
    \externalfigure[zhfonts/zhfonts.pdf][width=\textwidth]}}

\section{安装 zhfonts}

\useURL[zhfonts][https://github.com/liyanrui/zhfonts/archive/refs/heads/master.zip]
下载 zhfonts-master.zip 包，网络链接为\\
\blueframed{\from[zhfonts]}\\
解包后可得目录 zhfonts-master，将其更名为 zhfonts 并移动至
\starttyping
$TEXROOT/texmf-local/tex/context/third
\stoptyping
\noindent 若无该目录\footnote{\type{$TEXROOT} 的含义详见 \in[fonts-installation] 节。}，可自行创建。

然后执行以下命令刷新 \CONTEXT\ 文件系统，

\starttyping
$ context --generate
\stoptyping

\noindent 以使 \CONTEXT\ 能够通过 \type{\usemodule[zhfonts]} 搜索并加载 zhfonts 模块的相关文件。

zhfonts 模块默认使用 simsun.ttc，simhei.ttf，simkai.ttf 这三款汉字字体——想必你早已按照 \in[fonts-installation] 节的介绍安装了它们——，西文字体默认使用随 \CONTEXT\ 发行的 Latin Modern 系列字体。

\section{基本用法}

zhfonts 默认使用 11 pt 正体字（宋体 + Latin Modern Serif）作为正文字体：

\starttyping[option=TEX]
\usemodule[zhfonts]  % 默认正文字号为 11 pt
\startTEXpage[frame=on,offset=4pt,width=12cm]
我能吞下玻璃而不伤身体。I can eat glass, it does not hurt me.
\stopTEXpage
\stoptyping
\placefigure[none]{}{\externalfigure[zhfonts/01.pdf]}

使用模块参数 \type{style=ss} 或 \type{style=tt}，可将正文字体切换为模块参数 \type{size} 所设定大小的无衬线字体或等宽字体。例如

\starttyping[option=TEX]
% 以 12 pt 的无衬线字体作为正文字体 
\usemodule[zhfonts][style=ss,size=12pt]
\startTEXpage[frame=on,offset=4pt,width=12cm]
我能吞下玻璃而不伤身体。I can eat glass, it does not hurt me.
\stopTEXpage
\stoptyping
\placefigure[none]{}{\externalfigure[zhfonts/02.pdf]}

\section{\type{\setupzhfonts}}

使用 \type{\setupzhfonts} 可替换 zhfonts 默认的中文和西文字体。例如，将默认的汉字的衬线字族的粗体更换为 NotoSerifCJK-Bold.ttc\footnote{Google 开发的 Noto 字体中的一款，需要你去网络上搜索获取并按照 \in[fonts-installation] 节所介绍的方式予以安装。}：

\starttyping[option=TEX]
\setupzhfonts
  [serif]
  [bold=notoserifcjkscbold,
   bolditalic=notoserifcjkscbold]
\stoptyping

亦可将默认的汉字字族全部替换为其他字体，例如替换衬线字族：

\starttyping[option=TEX]
\setupzhfonts
  [serif]
  [regular=notoserifcjkscregular,
   bold=notoserifcjkscbold,
   italic=notoserifcjkscregular,
   bolditalic=notoserifcjkscbold]
\stoptyping

西文字体的替换方式为

\starttyping[option=TEX]
\setupzhfonts
  [latin,serif|sans|mono]
  [regular=...,
   bold=...,
   italic=...,
   bolditalic=...]
\stoptyping

对于数学字体，zhfonts 使用 \CONTEXT\ 默认的数学字体。如果你想更换其他的数学字体，请参考 \CONTEXT\ wiki 页「Math fonts」\cite[math-fonts]，例如切换为 antykwa 字体，只需

\starttyping[option=TEX]
\setupzhfonts[math][antykwa]
\stoptyping

zhfonts 并未使用汉字字体中的西文字形，而是是将汉字字体作为 Fallback 字体「注入」到西文字体，从而将汉字字体与西文字体组成了混合字体，具体原因已在 \in[fallback-fonts] 节给出了说明。

两种不同的字体，混合到一起，可能会出现字形尺寸不一致的情况。若遇到这种情况，可使用 \type{\setupzhfonts} 的 \type{fontname@n.n} 的参数形式设置汉字的缩放比例。例如

\starttyping[option=TEX]
\usemodule[zhfonts][size=16pt]
\setupzhfonts
  [serif]
  [regular=@1.5, % 设置默认字体的 rscale 参数值
   bold=notoserifcjkscbold@0.5]
\startTEXpage[frame=on,offset=4pt]
这是汉字，These are English characters.\par
\bf 这是汉字，These are English characters.
\stopTEXpage
\stoptyping
\placefigure[none]{}{\externalfigure[zhfonts/03.pdf]}

\section{小结}

zhfonts 模块是基于 \CONTEXT\ 的传统的 Typescript 机制实现的汉字字体和英文字体的混合。若想见识一下 Typescript 的恐怖之处，只需编译以下内容的 \CONTEXT\ 源文件：

\starttyping[option=TEX]
\usemodule[zhfonts]
\starttext
\showzhfonts
\stoptext
\stoptyping