summaryrefslogtreecommitdiff
path: root/language/chinese/zhmcjk/source
diff options
context:
space:
mode:
Diffstat (limited to 'language/chinese/zhmcjk/source')
-rw-r--r--language/chinese/zhmcjk/source/Makefile72
-rwxr-xr-xlanguage/chinese/zhmcjk/source/zhmCJK-addmap.pl28
-rw-r--r--language/chinese/zhmcjk/source/zhmCJK.dtx1549
-rw-r--r--language/chinese/zhmcjk/source/zhmCJK.ins85
-rw-r--r--language/chinese/zhmcjk/source/zhmCJK.lua204
5 files changed, 1938 insertions, 0 deletions
diff --git a/language/chinese/zhmcjk/source/Makefile b/language/chinese/zhmcjk/source/Makefile
new file mode 100644
index 0000000000..260487bc5c
--- /dev/null
+++ b/language/chinese/zhmcjk/source/Makefile
@@ -0,0 +1,72 @@
+AUXFILES = *.dvi *.aux *.log *.glo *.gls *.idx *.ind *.ilg *.out *.hd *~
+MAP = zhmCJK.map texfonts.map.template
+SOURCE = zhmCJK.dtx zhmCJK.ins zhmCJK.lua zhmCJK-addmap.pl Makefile
+
+.PHONY: all
+all: zhmCJK.zip
+
+zhmCJK.zip: $(SOURCE) zhmCJK.sty $(MAP) zhmCJK.tfm doc zhmCJK-addmap.pl miktex-tfm.tar.bz2 zhmCJK.tds.zip
+ rm -rf zhmCJK
+ mkdir zhmCJK
+ cp README zhmCJK/
+ mkdir zhmCJK/source
+ cp $(SOURCE) zhmCJK/source/
+ mkdir zhmCJK/tex
+ cp zhmCJK.sty zhmCJK/tex/
+ mkdir zhmCJK/fontname
+ cp $(MAP) zhmCJK/fontname/
+ mkdir zhmCJK/tfm
+ cp zhmCJK.tfm zhmCJK/tfm/
+ mkdir zhmCJK/doc
+ cp zhmCJK.pdf zhmCJK-test.tex zhmCJK/doc/
+ cp miktex-tfm.tar.bz2 zhmCJK/
+ rm -f zhmCJK.zip
+ zip -r zhmCJK.zip zhmCJK/
+ zip zhmCJK.zip zhmCJK.tds.zip
+ rm -r zhmCJK
+
+zhmCJK.tds.zip: $(SOURCE) zhmCJK.sty $(MAP) zhmCJK.tfm doc
+ rm -rf tds
+ mkdir -p tds/source/latex/zhmCJK
+ cp $(SOURCE) tds/source/latex/zhmCJK/
+ mkdir -p tds/tex/latex/zhmCJK
+ cp zhmCJK.sty tds/tex/latex/zhmCJK/
+ mkdir -p tds/doc/latex/zhmCJK
+ cp zhmCJK.pdf zhmCJK-test.tex README tds/doc/latex/zhmCJK/
+ mkdir -p tds/fonts/map/fontname
+ cp $(MAP) tds/fonts/map/fontname/
+ mkdir -p tds/fonts/tfm/zhmCJK
+ cp zhmCJK.tfm tds/fonts/tfm/zhmCJK/
+ rm -f zhmCJK.tds.zip
+ cd tds && zip -r ../zhmCJK.tds.zip source tex doc fonts
+ rm -r tds
+
+.PHONY: doc
+doc: zhmCJK.pdf zhmCJK-test.tex README
+
+zhmCJK.sty zhmCJK-test.tex README: zhmCJK.dtx zhmCJK.ins
+ pdftex zhmCJK.ins
+ mv README.txt README
+
+$(MAP) zhmCJK.tfm: zhmCJK.lua
+ texlua zhmCJK.lua map
+
+miktex-tfm.tar.bz2: zhmCJK.lua
+ texlua zhmCJK.lua nomap
+ rm -f miktex-tfm.tar.bz2
+ tar cfj miktex-tfm.tar.bz2 miktex-tfm/
+ rm -r miktex-tfm/
+
+zhmCJK.pdf: zhmCJK.sty $(MAP)
+ latex zhmCJK.dtx
+ makeindex -s gind zhmCJK.idx
+ makeindex -s gglo -o zhmCJK.gls zhmCJK.glo
+ latex zhmCJK.dtx
+ latex zhmCJK.dtx
+ dvipdfmx zhmCJK.dvi
+ rm -f $(AUXFILES)
+
+.PHONY: clean
+clean:
+ rm -f $(AUXFILES)
+ rm -f zhmCJK.sty zhmCJK-test.tex README zhmCJK.pdf zhmCJK.tfm miktex-tfm.tar.bz2 $(MAP) zhmCJK.zip zhmCJK.tds.zip
diff --git a/language/chinese/zhmcjk/source/zhmCJK-addmap.pl b/language/chinese/zhmcjk/source/zhmCJK-addmap.pl
new file mode 100755
index 0000000000..92b5cd1517
--- /dev/null
+++ b/language/chinese/zhmcjk/source/zhmCJK-addmap.pl
@@ -0,0 +1,28 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2012--2016 by Leo Liu <leoliu.pku@gmail.com>
+#
+# Run this script to add tfm font map for zhmCJK package.
+
+chomp ( my $texmfdist = `kpsewhich -var-value=TEXMFDIST` ) ;
+my $texfontsmap = "$texmfdist/fonts/map/fontname/texfonts.map";
+
+my $absent = 1;
+
+if (-r "$texfontsmap") {
+ open (FOO, "<$texfontsmap");
+ my @lines = <FOO>;
+ chomp(@lines);
+ close(FOO);
+ for my $line (@lines) {
+ if ($line =~ m/^\s*include\s+zhmCJK\.map\s*/) {
+ $absent = 0;
+ }
+ }
+}
+
+if ($absent) {
+ open (FOO, ">>$texfontsmap") || die("Cannot write $texfontsmap\n");
+ print FOO "include zhmCJK.map\n";
+ close(FOO);
+}
diff --git a/language/chinese/zhmcjk/source/zhmCJK.dtx b/language/chinese/zhmcjk/source/zhmCJK.dtx
new file mode 100644
index 0000000000..03b2ed24a4
--- /dev/null
+++ b/language/chinese/zhmcjk/source/zhmCJK.dtx
@@ -0,0 +1,1549 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2012--2016 by Leo Liu <leoliu.pku@gmail.com>
+% ---------------------------------------------------------------------------
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Leo Liu.
+%
+% This work consists of the files zhmCJK.dtx,
+% zhmCJK.ins,
+% zhmCJK.lua,
+% zhmCJK-addmap.pl,
+% and the derived files zhmCJK.sty,
+% zhmCJK.pdf,
+% zhmCJK-test.tex,
+% README, (from zhmCJK.dtx)
+% zhmCJK.map,
+% texfonts.map.template,
+% zhmCJK.tfm,
+% miktex-tfm/zhm*/zhm**.tfm. (from zhmCJK.lua)
+%
+% \fi
+%
+% \iffalse
+%
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+ ==================
+ zhmCJK Package
+ ==================
+
+Introduction
+------------
+
+zhmCJK is a package written to ease the complex CJK fonts setup. All CJK
+fonts may share the same .tfm metrics. The package sets the NFSS font
+definition and actual font maappings using TeX macros dynamically. As a
+result, zhmCJK provides similar faculties and interface of xeCJK, TrueType CJK
+fonts are used to generate PDF output with pdfTeX or DVIPDFMx driver.
+
+This package is licensed under LPPL.
+
+Installation
+------------
+
+This package consists of the files zhmCJK.dtx,
+ zhmCJK.ins,
+ zhmCJK.lua,
+ zhmCJK-addmap.pl,
+ and the derived files zhmCJK.sty,
+ zhmCJK.pdf,
+ zhmCJK-test.tex,
+ README, (from zhmCJK.dtx)
+ zhmCJK.map,
+ texfonts.map.template,
+ zhmCJK.tfm,
+ miktex-tfm/zhm*/zhm**.tfm. (from zhmCJK.lua)
+
+* Compile zhmCJK.lua with command
+
+ texlua zhmCJK.lua map
+
+ to generate zhmCJK.map, texfonts.map.template, zhmCJK.tfm.
+
+ Or, for MiKTeX only, use
+
+ texlua zhmCJK.lua nomap
+
+ to generate miktex-tfm/zhm*/zhm**.tfm. (32 subdirectories, 8192 TFM files)
+
+* Compile zhmCJK.ins using an 8-bit TeX engine to obtain zhmCJK.sty,
+ zhmCJK-test.tex and this README file.
+
+* Compile zhmCJK.dtx using pdflatex or latex+dvipdfmx to obtain the
+ documentation zhmCJK.pdf.
+
+* Copy the files into proper directories searched by TeX.
+ TDS tree:
+
+ TEXMF/doc/latex/zhmCJK/zhmCJK-test.tex
+ TEXMF/doc/latex/zhmCJK/zhmCJK.pdf
+ TEXMF/doc/latex/zhmCJK/README
+ TEXMF/fonts/map/fontname/zhmCJK.map
+ TEXMF/fonts/tfm/zhmCJK/zhmCJK.tfm
+ TEXMF/source/latex/zhmCJK/zhmCJK.dtx
+ TEXMF/source/latex/zhmCJK/zhmCJK.ins
+ TEXMF/source/latex/zhmCJK/zhmCJK.lua
+ TEXMF/tex/latex/zhmCJK/zhmCJK.sty
+
+ And merge the file texfonts.map.template into
+
+ TEXMF/fonts/map/fontname/texfonts.map
+
+ Or simply run script zhmCJK-addmap.pl to append this line to the old
+ texfonts.map:
+
+ include zhmCJK.map
+
+ Or, for MiKTeX only, instead of copying texfonts.map, zhmCJK.map and
+ zhmCJK.tfm, copy all miktex-tfm/zhm*/zhm**.tfm into:
+
+ TEXMF/fonts/tfm/zhmCJK/miktex-tfm/zhm*/zhm**.tfm
+
+* Run texhash to refresh file name data base.
+
+
+Basic Usage
+-----------
+
+zhmCJK provides similar syntax to xeCJK, while the underlying package is CJK
+under pdfTeX or DVIPDFMx engine. A TeX source file is encoded in UTF-8 by
+default.
+
+The package provides the following commands to define a CJK font family:
+
+ \setCJKmainfont{ttf-file-name}[options]
+ \setCJKsansfont{ttf-file-name}[options]
+ \setCJKmonofont{ttf-file-name}[options]
+ \setCJKfamilyfont{family}{ttf-file-name}[options]
+
+For example, this setup some Chinese fonts on MS Windows:
+
+ \usepackage{zhmCJK}
+ \setCJKmainfont{simsun.ttc}[BoldFont=simhei.ttf, ItalicFont=simkai.ttf]
+
+You can read the PDF document (in Chinese) for more detailed explanations.
+
+Author
+------
+
+Leo Liu <leoliu.pku@gmail.com>
+
+If you are interested in the process of development you may observe
+
+ https://github.com/leo-liu/tex-pkg
+
+
+--- end of README ---
+%</readme>
+%<*internal>
+\fi
+%</internal>
+%
+%<*driver>
+\ProvidesFile{zhmCJK.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\ProvidesPackage{zhmCJK}
+%<*package>
+ [2016/11/23 v0.9c setup CJK fonts dynamically]
+%</package>
+%
+%<*driver>
+\documentclass[11pt,a4paper,
+ driverfallback=dvipdfmx,unicode]{ltxdoc}
+\usepackage[numbered]{hypdoc}
+\hypersetup{pdfstartview=FitH}
+\usepackage{zhmCJK}
+\setCJKmainfont{FandolSong-Regular.otf}
+ [cmap=UniGB-UTF16-H,
+ BoldFont=FandolSong-Bold.otf,
+ ItalicFont=FandolKai-Regular.otf]
+\setCJKsansfont{FandolHei-Regular.otf}
+ [cmap=UniGB-UTF16-H,
+ BoldFont=FandolHei-Bold.otf]
+\setCJKmonofont{FandolFang-Regular.otf}[cmap=UniGB-UTF16-H]
+\usepackage[T1]{fontenc}
+\def\MacroFont{\small\normalfont\ttfamily}
+\usepackage{amsmath}
+\usepackage{fancyvrb}
+\fvset{gobble=2}
+\usepackage{indentfirst}
+\setlength\parindent{2em}
+\linespread{1.2}
+\renewcommand\tablename{表}
+\renewcommand\refname{参考文档}
+\makeatletter
+\renewcommand\glossary@prologue{%
+ \section*{版本历史}
+ \markboth{版本历史}{版本历史}}
+\renewcommand\index@prologue{%
+ \section*{代码索引}
+ \markboth{代码索引}{代码索引}
+ 斜体的数字表示对应项说明所在的页码。下划线的数字表示定义所在的代码行号;而直
+ 立体的数字表示对应项使用时所在的行号。}
+\def\option{\begingroup
+ \catcode`\\12
+ \MakePrivateLetters \option@}
+\let\endoption\endtrivlist
+\long\def\option@#1{\endgroup \topsep\MacroTopsep \trivlist
+ \edef\saved@macroname{\string#1}%
+ \def\makelabel##1{\llap{##1}}%
+ \if@inlabel
+ \let\@tempa\@empty \count@\macro@cnt
+ \loop \ifnum\count@>\z@
+ \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+ \edef\makelabel##1{\llap{\vtop to\baselineskip
+ {\@tempa\hbox{##1}\vss}}}%
+ \advance \macro@cnt \@ne
+ \else \macro@cnt\@ne \fi
+ \edef\@tempa{\noexpand\item[%
+ \noexpand\PrintEnvName
+ {\string#1}]}%
+ \@tempa
+ \global\advance\c@CodelineNo\@ne
+ \SpecialMainOptionIndex{#1}\nobreak
+ \global\advance\c@CodelineNo\m@ne
+ \ignorespaces}
+\def\SpecialMainOptionIndex#1{\@bsphack
+ \special@index{%
+ #1\actualchar
+ {\string\ttfamily\space#1}
+ (option)%
+ \encapchar main}%
+ \@esphack}
+\makeatother
+\providecommand\eTeX{$\varepsilon$-\TeX}
+\newcommand\pkg[1]{\textsf{#1}}
+\newcommand{\enquote}[1]{``#1''}
+\AtBeginDocument{
+ \DeleteShortVerb{\|}
+ \MakeShortVerb{\"}}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{zhmCJK.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{794}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v0.1}{2012/02/02}{初始版本}
+% \changes{v0.2}{2012/02/02}{编写宏包文档。增加 \pkg{CJKpunct}。做一些小的代码
+% 调整。}
+% \changes{v0.5}{2012/02/05}{使用 Lua 脚本生成 TFM 和映射文件;为 MiKTeX 生成
+% 单独的 TFM 文件。将原来的 \texttt{zhmetrics.tfm} 改名为
+% \texttt{zhmCJK.tfm},不再依赖原有的 \pkg{zhmetrics} 包。}
+%
+% \DoNotIndex{\newcommand,\newenvironment,
+% \@ifpackageloaded, \@ne, \@onlypreamble, \@xxxii, \advance, \aftergroup,
+% \AtBeginDocument, \AtBeginDvi, \AtBeginShipoutFirst, \AtEndDocument,
+% \AtEndOfPackage, \begin, \clearpage, \DeclareBoolOption,
+% \DeclareRobustCommand, \def, \else, \end, \endinput, \fi, \font, \ifnum,
+% \ifpdf, \let, \m@ne, \mathrm, \mathsf, \mathtt, \newcount,
+% \not@math@alphabet, \ProcessKeyvalOptions, \providecommand, \relax,
+% \RequirePackage, \scantokens, \SetupKeyvalOptions, \the, \@nameuse,
+% \csname, \define@key, \DeclareStringOption, \edef, \endcsname,
+% \expandafter, \global, \hyphenchar, \ifcsname, \ifx, \PackageError,
+% \PackageWarning, \setkeys, \space, \unless, \xdef, \begingroup, \endgroup,
+% \@namedef, \author, \bfseries, \date, \documentclass, \maketitle, \textbf,
+% \textit, \textsf, \texttt, \title, \usepackage, \@font@warning, \dimexpr,
+% \strip@pt, \textsl, \@ifnextchar, \eTeXversion, \luatexversion,
+% \XeTeXrevision, \meaning, \string, \tempa, \tempb, \hbox, \hss, \unexpanded,
+% \symbol, \newif}
+%
+% \GetFileInfo{zhmCJK.dtx}
+% \title{\pkg{zhmCJK} 宏包}
+% \author{\textit{刘海洋} \\ \nolinkurl{leoliu.pku@gmail.com}}
+% \date{\filedate\ \fileversion}
+%
+% \maketitle
+%
+% \section{简介}
+%
+% \pkg{zhmCJK} 宏包是一个基于 \pkg{zhmetrics} 机制 \cite{Wang2009} 和
+% \pkg{CJK} 宏包 \cite{Lemberg2008} 的 CJK 文字配置宏包。宏包的名称
+% \pkg{zhmCJK} 就取自 \pkg{zhmetrics} 和 \pkg{CJK} 这两个包。它可以动态地设置
+% CJK 字体,仅指定字体文件名,就完成原来十分复杂的 CJK 字体安装设置工作。
+%
+% \pkg{zhmCJK} 提供了尽可能简单的用户界面。除了提供对 \pkg{CJK} 宏包所用字体的
+% 实时安装设置功能(默认 UTF-8 编码),\pkg{zhmCJK} 还同时加载了
+% \pkg{CJKpunct} 和 \pkg{CJKspace} 宏包处理标点压缩和字符间距。
+%
+% \pkg{zhmCJK} 支持 pdf\TeX{} 和 DVIPDFMx 两种输出驱动,可以使用 "pdflatex" 或
+% $"latex"+"dvipdfmx"$ 的方式编译。
+%
+% \section{用法}
+%
+% \subsection{宏包载入与选项}
+%
+% 只需要在导言区使用
+% \begin{Verbatim}
+% \usepackage{zhmCJK}
+% \end{Verbatim}
+% 即可载入宏包。
+%
+% 宏包可以带有一些选项(表~\ref{tab:pkgopt})。例如如果要打开自动伪斜体,就可以
+% 用
+% \begin{Verbatim}
+% \usepackage[AutoFakeSlant]{zhmCJK}
+% \end{Verbatim}
+% 一般来说使用默认的设置,即不用任何选项即可。
+%
+% \begin{table}[ht]
+% \centering
+% \begin{tabular}{l|l|p{14em}}
+% \hline
+% 选项 & 默认值 & 功能 \\
+% \hline
+% "encoding="\meta{编码} & "UTF8" & 设置 CJK 输入的编码,如 \texttt{GBK},
+% \texttt{Bg5} 等,参见 \cite{Lemberg2008}。 \\
+% "pdffakebold="\meta{\texttt{true}$|$\texttt{false}} & "true" & 设置伪粗体类型
+% 为 PDF 原语生成;若设置为 "false" 则沿用旧的 \pkg{CJK} 伪粗体机制 \\
+% "AutoFakeBold="\meta{数字} & 0.4 & 全局设置自动伪粗体的粗细,单位为 bp;若设
+% 置为 0 则禁用自动伪粗体。如果参数省略,取值为 0.4。 \\
+% "AutoFakeSlant="\meta{数字} & 0 & 全局设置自动伪斜体的倾斜度;若设置为 0 则禁
+% 用自动伪斜体。如果参数省略,取值为 0.167。 \\
+% "cmap="\meta{CMap 值} & "unicode" & 设置字体文件使用的 CMap 映射,对多数 CJK
+% 字体可以使用默认值 "unicode",相当于使用基于 UCS2 的字体编码;部分字体需要设置
+% 为 "UniGB-UTF16-H" 等映射。仅对 DVIPDFMx 有效。 \\
+% "embed="\meta{\texttt{true}$|$\texttt{false}} & "true" & 设置字体是否嵌入。仅
+% 对 DVIPDFMx 有效。 \\
+% \hline
+% \end{tabular}
+% \caption{\pkg{zhmCJK} 宏包选项}
+% \label{tab:pkgopt}
+% \end{table}
+%
+% \subsection{宏包提供的命令}
+%
+% \pkg{zhmCJK} 的基本用户界面与 \pkg{xeCJK} 宏包 \cite{Sun2012} 十分相似,定义
+% 字体的几个命令语法大体相同。
+%
+% \begin{quote}
+% \DescribeMacro{\setCJKmainfont}
+% "\setCJKmainfont{"\meta{字体文件名}"}["\meta{选项}"]" 或\\
+% "\setCJKmainfont["\meta{选项}"]{"\meta{字体文件名}"}"
+% \end{quote}
+% 设置正文默认罗马族的 CJK 字体,字体用 TrueType 文件名表示。该命令影响
+% "\rmfamily" 和 "\textrm" 的字体。
+%
+% 字体选项与宏包选项基本对应,可用的字体选项有:"BoldFont", "ItalicFont",
+% "BoldItalicFont", "SlantedFont", "BoldSlantedFont",分别用来设置不同字型的变
+% 体;"AutoFakeBold",设置单个字体族的伪粗体;"AutoFakeSlant",设置单个字体族
+% 的伪斜体;"encoding",设置单个字体使用的输入编码;"cmap",设置单个字体使用的
+% CMap 映射;"embed",设置单个字体是否嵌入。
+%
+% \DescribeMacro{\setCJKromanfont}
+% 是 "\setCJKmainfont" 的别名。
+%
+% 例如,使用
+% \begin{Verbatim}
+% \setCJKmainfont{simsun.ttc}[BoldFont=simhei.ttf,ItalicFont=simkai.ttf]
+% \end{Verbatim}
+% 将使用文件名为 "simsun.ttc" 的字体(中易宋体)作为正文罗马族字体,同时其粗体
+% 形式设置为 "simhei.ttf"(中易黑体),其斜体形式设置为 "simkai.ttf"(中易
+% 楷体)。
+%
+% 又如,使用
+% \begin{Verbatim}
+% \setCJKmainfont{FandolSong-Regular.otf}
+% [cmap=UniGB-UTF16-H,
+% BoldFont=FandolSong-Bold.otf,
+% ItalicFont=FandolKai-Regular.otf]
+% \end{Verbatim}
+% 可以设置 Fandol 字体作为正文字体。
+%
+% \begin{quote}
+% \DescribeMacro{\setCJKsansfont}
+% "\setCJKsansfont{"\meta{字体文件名}"}["\meta{选项}"]" 或\\
+% "\setCJKsansfont["\meta{选项}"]{"\meta{字体文件名}"}"
+% \end{quote}
+% 设置正文无衬线族的 CJK 字体。影响 "\sffamily" 和 "\textsf" 的字体。例如用
+% \begin{Verbatim}
+% \setCJKsansfont{simhei.ttf}
+% \end{Verbatim}
+% 将使用字体 "simhei.ttf"(中易黑体)作为正文无衬线字体。
+%
+% \begin{quote}
+% \DescribeMacro{\setCJKmonofont}
+% "\setCJKmonofont{"\meta{字体文件名}"}["\meta{选项}"]" 或\\
+% "\setCJKmonofont["\meta{选项}"]{"\meta{字体文件名}"}"
+% \end{quote}
+% 设置正文等宽族的 CJK 字体。影响 "\ttfamily" 和 "\texttt" 的字体。例如用
+% \begin{Verbatim}
+% \setCJKsansfont{simfang.ttf}
+% \end{Verbatim}
+% 将使用字体 "simfang.ttf"(中易仿宋体)作为正文等宽字体。
+%
+% \DescribeMacro{\setCJKfamilyfont}
+% \begin{quote}
+% "\setCJKfamilyfont{"\meta{族}"}{"\meta{字体文件名}"}["\meta{选项}"]" 或\\
+% "\setCJKfamilyfont{"\meta{族}"}["\meta{选项}"]{"\meta{字体文件名}"}"
+% \end{quote}
+% 定义新的 CJK 字体族并指定字体。例如用
+% \begin{Verbatim}
+% \setCJKfamilyfont{yahei}{msyh.ttc}[BoldFont=msyhbd.ttc]
+% \end{Verbatim}
+% 可以定义名为 "yahei" 的 CJK 字体族,其对应的实际字体文件名为 "msyh.ttc"(微
+% 软雅黑),粗体形式是 "msyhbd.ttc"(粗体的微软雅黑)。
+%
+% 以上字体设置命令只能在文档导言区使用。中文字体可以用 \pkg{CJK} 宏包的
+% "\CJKfamily" 命令切换。例如用 "\CJKfamily{yahei}" 就可以选择前面定义的微软雅
+% 黑字体。
+%
+%
+% \DescribeMacro{\CJKrmdefault}
+% 保存 "\rmfamily" 所使用的 CJK 字体族,默认值是 "rm"。类似西文字体的
+% "\rmdefault"。
+%
+% \DescribeMacro{\CJKsfdefault} 保存 "\sffamily" 所使用的 CJK 字体族,默认值是
+% "sf"。类似西文字体的 "\sfdefault"。
+%
+% \DescribeMacro{\CJKttdefault}
+% 保存 "\ttfamily" 所使用的 CJK 字体族,默认值是 "tt"。类似西文字体的
+% "\ttdefault"。
+%
+% \DescribeMacro{\CJKfamilydefault}
+% 保存 "\normalfont" 所使用的 CJK 字体族,默认值是 "\CJKrmdefault"。类似西文字
+% 体的 "\familydefault"。例如,使用
+% \begin{Verbatim}
+% \renewcommand\familydefault{\sfdefault}
+% \renewcommand\CJKfamilydefault{\CJKsfdefault}
+% \end{Verbatim}
+% 可以将全文的 CJK 和西文默认字体改为无衬线字体族。
+%
+% \subsection{示例文件}
+%
+% \begin{macrocode}
+%<*test>
+% UTF-8 编码
+% 使用 pdflatex 或 latex + dvipdfmx 编译
+\documentclass[12pt,a4paper]{article}
+
+\usepackage{zhmCJK}
+\setCJKmainfont{simsun.ttc}[BoldFont=simhei.ttf,ItalicFont=simkai.ttf]
+\setCJKsansfont{simhei.ttf}[AutoFakeBold=0]
+\setCJKmonofont{simfang.ttf}[AutoFakeSlant]
+\setCJKfamilyfont{xinwei}{STXINWEI.TTF}
+
+\title{\bfseries 一个华丽的 zhmCJK 测试}
+\author{Leo Liu}
+\date{2016 年 11 月 23 日}
+
+\begin{document}
+
+\maketitle
+
+正文是宋体字,\textbf{加粗变成黑体},\textit{意大利体变成楷体}。
+
+\textsf{这是黑体字,\textbf{禁用自动加粗},\textsl{默认不自动倾斜}}
+
+\texttt{这是仿宋字,\textbf{默认自动加粗},\textsl{打开自动倾斜}}
+
+{\CJKfamily{xinwei}还有华文新魏}
+
+\end{document}
+%</test>
+% \end{macrocode}
+%
+% \section{安装}
+%
+% \subsection{组成与依赖项}
+%
+% \pkg{zhmCJK} 源代码包包含如下文件:
+% \begin{itemize}
+% \item "zhmCJK.dtx", "zhmCJK.ins":这是 \pkg{zhmCJK} 的 \pkg{DocStrip} 包与
+% 驱动。
+% \item "zhmCJK.lua":这是用来生成 TFM 文件 \cite{Wang2009} 和字体名映射文件
+% 的 Lua 脚本。
+% \item "zhmCJK-addmap.pl":这是 TFM 字体映射的合并脚本。
+% \end{itemize}
+%
+% 除此以外,使用 \pkg{zhmCJK} 还依赖:
+% \begin{itemize}
+% \item \pkg{CJK}, \pkg{CJKutf8}, \pkg{CJKspace} 宏包,同属于 \pkg{CJK}
+% 集合。
+% \item \pkg{CJKpunct} 宏包。
+% \item \pkg{ifpdf}, \pkg{kvoptions} 宏包,同属于 \pkg{oberdiek} 集合。
+% \end{itemize}
+%
+% 编译使用 \pkg{zhmCJK} 的文档需要 \eTeX{} 支持,并要求使用较新版本的 pdf\TeX{}
+% 或 DVIPDFMx 生成 PDF 文件。
+%
+% \subsection{生成与安装}
+%
+% 生成格式文件和文档:
+% \begin{enumerate}
+% \item 对 \TeX\ Live 等发行版,执行
+% \begin{quote}
+% "texlua zhmCJK.lua map"
+% \end{quote}
+% 生成:
+% \begin{itemize}
+% \item "zhmCJK.tfm":通用的 CJK 字符 TFM 文件,可用于大部分常见的中文字
+% 体。
+% \item "zhmCJK.map", "texfonts.map.template":字体名映射文件。
+% \end{itemize}
+%
+% 对 MiKTeX 等发行版,执行
+% \begin{quote}
+% "texlua zhmCJK.lua nomap"
+% \end{quote}
+% 生成目录 "miktex-tfm" 下的 32 个子目录 "zhm*",每个子目录下有 256 个 TFM
+% 文件 "zhm**.tfm"。共 8192 个 TFM 文件 \path{miktex-tfm/zhm*/zhm**.tfm}。
+%
+% \item 执行:
+% \begin{quote}
+% "latex zhmCJK.ins"
+% \end{quote}
+% 生成格式文件 "zhmCJK.sty" 和示例文件 "zhmCJK-test.tex"。
+%
+% \item 执行:
+% \begin{quote}
+% "latex zhmCJK.dtx" \\
+% "makeindex -s gind zhmCJK.idx" \\
+% "makeindex -s gglo -o zhmCJK.gls zhmCJK.glo" \\
+% "latex zhmCJK.dtx" \\
+% "latex zhmCJK.dtx" \\
+% "dvipdfmx zhmCJK.dvi"
+% \end{quote}
+% 生成宏包文档。编译文档可以使用 "pdflatex" 命令。编译文档需要 \TeX{} 发行
+% 版安装有 Fandol 字体包。
+% \end{enumerate}
+%
+% 设 "TEXMF" 是 \TeX{} 系统的 TDS 根目录,按如下目录结构复制宏包的各个文件:
+% \begin{Verbatim}
+% TEXMF/doc/latex/zhmCJK/zhmCJK-test.tex
+% TEXMF/doc/latex/zhmCJK/zhmCJK.pdf
+% TEXMF/doc/latex/zhmCJK/README
+% TEXMF/fonts/map/fontname/zhmCJK.map
+% TEXMF/fonts/tfm/zhmCJK/zhmCJK.tfm
+% TEXMF/source/latex/zhmCJK/zhmCJK.dtx
+% TEXMF/source/latex/zhmCJK/zhmCJK.ins
+% TEXMF/source/latex/zhmCJK/zhmCJK.lua
+% TEXMF/tex/latex/zhmCJK/zhmCJK.sty
+% \end{Verbatim}
+% 并将 "texfonts.map.template" 内容合并到
+% \begin{Verbatim}
+% TEXMF/fonts/map/fontname/texfonts.map
+% \end{Verbatim}
+% 也可以运行 Perl 脚本 "zhmCJK-addmap.pl" 完成合并。复制完所有文件后运行
+% "texhash" 命令(可能需要管理员权限)刷新文件名数据库,宏包即可使用。
+%
+% 对于 MiKTeX,"texfonts.map" 和 "zhmCJK.map" 的映射机制无效,则需要复制整个
+% "miktex-tfm" 目录下的所有文件到:
+% \begin{Verbatim}
+% TEXMF/fonts/tfm/zhmCJK/miktex-tfm/zhm*/zhm**.tfm
+% \end{Verbatim}
+%
+% 注:实际下载的安装包已经生成好上述文件和文档,可以不必手工生成。如果下载的是
+% TDS 安装包,则只需按目录结构解压复制,刷新文件名数据库即可。对于 MiKTeX
+% 系统,需要把打包的 TFM 文件解压出来。
+%
+% \subsection{字体搜索路径}
+%
+% \pkg{zhmCJK} 可以使用 kpathsea 库 \cite{Berry2011} 所能搜索到的 Unicode 编码
+% CJK 字体,包括操作系统安装的字体。pdf\TeX{} 支持 TrueType 格式(扩展名
+% ".ttf", ".ttc"),DVIPDFMx 还支持 OpenType 格式(扩展名 ".otf")。
+%
+% Windows 操作系统下,MiKTeX 和 \TeX\ Live 可以不做特别的设置,即可正确搜索操
+% 作系统的字体目录。
+%
+% 在 Linux 操作系统下,需要设置 \TeX\ Live 的 "texmf.cnf" 配置文件,在其中的
+% "OSFONTDIR" 变量中增加操作系统字体目录。例如 \TeX\ Live 在目录
+% \path{/usr/local/share/texlive/} 安装,则新建(或修改)文件
+% \path{/usr/local/share/texlive/texmf.cnf},在其中增加如下内容:
+% \begin{Verbatim}
+% OSFONTDIR = /usr/share/fonts//;~/.fonts//
+% \end{Verbatim}
+% 详情可参考 \TeX\ Live 手册及原有 "texmf.cnf" 文件中的相关注释说明。
+%
+% 可以使用 "kpsewhich" 命令检查 \pkg{zhmCJK} 能否搜索到指定的字体文件。例如在
+% Windows 系统中使用命令:
+% \begin{Verbatim}
+% kpsewhich simsun.ttc
+% \end{Verbatim}
+% 应该得到输出:
+% \begin{Verbatim}
+% c:/Windows/fonts/simsun.ttc
+% \end{Verbatim}
+% 对非 Windows 系统,文件和路径区分大小写。
+%
+% \section{已知问题}
+%
+% \begin{itemize}
+% \item 受制于预定义的映射文件 "texfonts.map",使用 \pkg{zhmCJK} 在同一文档中
+% 能够使用的字体文件是有限的。目前只有 32 个。
+% \item 在 MiKTeX 中 "texfonts.map" 映射无效,无法使用单一 TFM 文件处理所有的
+% CJK 字体,因此需要生成所有对应的 TFM 文件才能使用。
+% \end{itemize}
+%
+% \StopEventually{
+% \begin{thebibliography}{9}
+% \bibitem{adobe2001}
+% \textsc{{Adobe Systems Incorporated}}.
+% \newblock \textit{PDF reference: Adobe portable document format version
+% 1.4}.
+% \newblock Addison-Wesley, third edition, 2001
+% \newline\url{http://www.adobe.com/devnet/pdf/pdf_reference.html}
+% \bibitem{Berry2011}
+% \textsc{Karl Berry, Olaf Weber and Taco Hoekwater}.
+% \newblock \textit{Kpathsea library}, version 6.0.1, 2011
+% \newline\url{CTAN://info/doc-k/kpathsea.pdf}
+% \bibitem{Cho2009}
+% \textsc{Jin-Hwan Cho}.
+% \newblock \enquote{DVI specials for PDF generation}.
+% \newblock \textit{TUGboat}, volume~30(1):pages 6--11, 2009
+% \newline\url{http://www.tug.org/TUGboat/Articles/tb30-1/tb94cho.pdf}
+% \bibitem{Lemberg2008}
+% \textsc{Werner Lemberg}.
+% \newblock \textit{\pkg{CJK}}, version 4.8.2, 2008
+% \newline\url{CTAN://language/chinese/CJK/cjk-4.8.2/doc/CJK.txt}
+% \bibitem{Lemberg2008fonts}
+% \textsc{Werner Lemberg}.
+% \newblock \textit{The fonts}, 2008
+% \newline\url{CTAN://language/chinese/CJK/cjk-4.8.2/doc/fonts.txt}
+% \bibitem{Thanh2009}
+% \textsc{H\`an~Th\^{\'e} Th\`anh}.
+% \newblock \enquote{A closer look at TrueType fonts and pdf\TeX}.
+% \newblock \textit{TUGboat}, volume~30(1):pages 32--34, 2009
+% \newline\url{http://www.tug.org/TUGboat/Articles/tb30-1/tb94thanh.pdf}
+% \bibitem{Sun2012}
+% 孙文昌.
+% \newblock \textit{\pkg{xeCJK} 宏包}, 版本 2.4.5, 2012
+% \newline\url{CTAN://macros/xetex/latex/xecjk/xeCJK.pdf}
+% \bibitem{Wang2009}
+% 王越.
+% \newblock \textit{\pkg{CJK} 宏包中,中文字体的秘密}.
+% \newblock C\TeX{} 论坛, 2009 年 5 月
+% \newline\url{http://bbs.ctex.org/viewthread.php?tid=50078}
+% \end{thebibliography}
+% }
+%
+% \clearpage
+% \section{代码实现}
+%
+% \subsection{字体设置包 \texttt{zhmCJK.sty}}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \changes{v0.7}{2012/02/06}{宏包载入时进行编译引擎测试}
+% 首先进行编译引擎测试。
+%
+% \begin{macro}{\ifzhm@primitive}
+% 测试是否为原始控制序列,用于判断编译引擎。代码参考 \pkg{ifetex} 宏包,有改动。
+% \begin{macrocode}
+\def\ifzhm@primitive#1{\begingroup
+ \edef\tempa{\meaning#1}%
+ \edef\tempb{\string#1}%
+ \expandafter\endgroup
+ \ifx\tempa\tempb}
+% \end{macrocode}
+% \end{macro}
+%
+% 需要 \eTeX{} 支持。对非 \eTeX{} 引擎报错并退出宏包。
+% \begin{macrocode}
+\ifzhm@primitive\eTeXversion\else
+ \PackageError{zhmCJK}%
+ {You are not running an eTeX-compatible engine.
+ zhmCJK needs an eTeX-compatible TeX engine}%
+ {If `latex' and `pdflatex' commands fail,
+ try `elatex' or `pdfelatex' command.
+ If all fail, you may need to upgrade your TeX system.}
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% 不支持 Lua\TeX{}。遇到 Lua\TeX{} 引擎报错并退出宏包。
+% \begin{macrocode}
+\ifzhm@primitive\luatexversion
+ \PackageError{zhmCJK}%
+ {You are wrongly using lualatex or dvilualatex to compile
+ the file. zhmCJK does not support LuaTeX engine.}%
+ {Use pdflatex or latex+dvipdfmx to compile the file.}
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% 不支持 XeTeX。当发现使用 XeTeX 时报错,并载入 \pkg{xeCJK} 宏包再退出。
+% \begin{macrocode}
+\ifzhm@primitive\XeTeXrevision
+ \PackageError{zhmCJK}%
+ {You are wrongly use xelatex to compile the file.
+ zhmCJK do not support XeTeX engine.}%
+ {You can use xeCJK instead.}
+ \RequirePackage{xeCJK}
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% 载入工具宏包。
+% \begin{macrocode}
+\RequirePackage{ifpdf}
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{
+ family=zhm@opt,
+ prefix=zhm@}
+% \end{macrocode}
+%
+% \changes{v0.9}{2013/08/08}{增加宏包 \texttt{cmap} 选项选择 DVIPDFMx 的 CMap
+% 映射。}
+% \begin{option}{cmap}
+% 定义使用的 DVIPDFMx 字体映射所使用的 CMap 映射,默认是 "unicode",即使用 UCS2
+% 编码的字体映射。多数 CJK 字体可以使用默认值,但少量需要单独设置才能使 DVIPDFMx
+% 工作正常。
+% \begin{macrocode}
+\DeclareStringOption[unicode]{cmap}
+% \end{macrocode}
+% \end{option}
+%
+% \changes{v0.9}{2013/08/10}{增加宏包 \texttt{embed} 选项,允许 DVIPDFMx 驱动
+% 不嵌入字体。}
+% \begin{option}{embed}
+% 控制字体是否嵌入。只对 DVIPDFMx 有效。
+% \begin{macrocode}
+\DeclareBoolOption[true]{embed}
+\AddToKeyvalOption*{embed}{%
+ \ifpdf
+ \PackageWarning{zhmCJK}
+ {The `embed' option is not supported by pdfTeX driver.\MessageBreak
+ Ignoring option `embed'}
+ \fi}
+% \end{macrocode}
+% \end{option}
+%
+% \changes{v0.8}{2012/02/06}{增加宏包 \texttt{encoding} 选项选择默认编码。}
+% \begin{option}{encoding}
+% 定义编码选项。初始化为 "UTF8",使用时不能省略参数。
+% \begin{macrocode}
+\DeclareStringOption[UTF8]{encoding}
+% \end{macrocode}
+% \end{option}
+%
+% \changes{v0.3}{2012/02/02}{增加宏包 \texttt{pdffakebold} 选项}
+% \begin{option}{pdffakebold}
+% 选择是否使用 PDF 原语生成伪粗体。默认是 "true",如果选 "false" 则改用原来
+% \pkg{CJK} 宏包平移输出的伪粗体机制。
+% \begin{macrocode}
+\DeclareBoolOption[true]{pdffakebold}
+% \end{macrocode}
+% \end{option}
+%
+% \changes{v0.4}{2012/02/04}{增加宏包 \texttt{AutoFakeBold} 选项}
+% \begin{option}{AutoFakeBold}
+% 使用 PDF 原语对 "b" 和 "bx" 系列生成伪粗体,并设置伪粗体描边线宽。初始化为
+% 0.4 (bp),无参数缺省值为 0.4。
+% \begin{macrocode}
+\DeclareStringOption[0.4]{AutoFakeBold}[0.4]
+% \end{macrocode}
+% \end{option}
+%
+% \changes{v0.6}{2012/02/05}{增加宏包 \texttt{AutoFakeSlant} 选项}
+% \begin{option}{AutoFakeSlant}
+% 使用 PDF 原语对 "sl" 形状生成伪斜体,并设置伪斜体倾斜度。初始化为 0(禁用),
+% 没有参数时缺省值为 0.167。
+% \begin{macrocode}
+\DeclareStringOption[0]{AutoFakeSlant}[0.167]
+% \end{macrocode}
+% \end{option}
+%
+% 执行选项。
+% \begin{macrocode}
+\ProcessKeyvalOptions*
+% \end{macrocode}
+%
+%
+% 载入 CJK 相关支持包。
+%
+% \pkg{CJK}:基本 CJK 支持。
+% \begin{macrocode}
+\RequirePackage{CJK}
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@check@encoding}
+% 检查编码有效性。
+% \begin{macrocode}
+\def\zhm@check@encoding{%
+ \unless\ifcsname CJK@\zhm@encoding @nfssenc\endcsname
+ \PackageError{zhmCJK}%
+ {There is no CJK encoding `\zhm@encoding', please
+ check it over. `UTF8' is used as default encoding.}%
+ {You can use `UTF8', `GBK', `Bg5', `JIS', `KS', etc.
+ Read CJK.txt from CJK package for all valid encodings.}
+ \def\zhm@encoding{UTF8}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% 检查全局编码。
+% \begin{macrocode}
+\zhm@check@encoding
+% \end{macrocode}
+%
+% 如果使用 UTF8 编码,载入 \pkg{CJKutf8} 包。注意为避免与前面已经载入的
+% \pkg{CJK} 发生选项冲突,在载入前模拟使用了 "encapsulated" 选项。
+% \begin{macrocode}
+\begingroup
+\def\zhm@UTF{UTF8}
+\ifx\zhm@encoding\zhm@UTF\endgroup
+ \@namedef{opt@CJK.sty}{encapsulated}
+ \let\CJK@global\relax
+ \let\CJK@active\relax
+ \let\CJK@local\relax
+ \RequirePackage{CJKutf8}
+\else\endgroup\fi
+% \end{macrocode}
+%
+% CJK 字符与西文字符之间的空格。
+% \begin{macrocode}
+\RequirePackage{CJKspace}
+% \end{macrocode}
+%
+% CJK 标点禁则与压缩。
+% \begin{macrocode}
+\RequirePackage{CJKpunct}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\zhm@nfssenc}
+% 保存当前编码对应的 NFSS 编码,如 "\zhm@encoding" 为默认值 "UTF8" 时,对应编
+% 码为 "C70"。
+% \begin{macrocode}
+\edef\zhm@nfssenc{\@nameuse{CJK@\zhm@encoding @nfssenc}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhm@sfd}
+% 保存当前编码对应的 SFD(subfont definition)文件名,不包括扩展名 ".sfd"。如
+% "\zhm@encodings" 为 "UTF8" 时,SFD 文件为 "Unicode.sfd",取值 "Unicode"。
+% \begin{macrocode}
+\edef\zhm@sfd{\@nameuse{zhm@\zhm@encoding @sfd}}
+% \end{macrocode}
+% \end{macro}
+%
+% 下面定义已知的编码与 SFD 文件名对应。注意这里假定使用的都是 Unicode 内码的字
+% 体,SFD 文件名以 "U" 开头。常见 \TeX{} 发行版附带的其他非 Unicode 的 SFD 文
+% 件不作考虑。
+% \begin{macrocode}
+\def\zhm@def@sfd#1#2{\@namedef{zhm@#1@sfd}{#2}}
+\zhm@def@sfd{UTF8}{Unicode}
+\zhm@def@sfd{Bg5}{UBig5}
+\zhm@def@sfd{Bg5+}{UBg5plus}
+\zhm@def@sfd{JIS}{UJIS}
+\zhm@def@sfd{KS}{UKS}
+\zhm@def@sfd{GB}{UGB}
+\zhm@def@sfd{GBK}{UGBK}
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@check@sfd}
+% 检查编码对应的 SFD 文件是否支持。
+% \begin{macrocode}
+\def\zhm@check@sfd{%
+ \unless\ifcsname zhm@\zhm@encoding @sfd\endcsname
+ \PackageError{zhmCJK}%
+ {No SFD file specified for `\zhm@encoding' encoding.
+ Only `UTF8', `Bg5', `Bg5+', `GB', `GBK', `JIS' and
+ `KS' are supported by now.}%
+ {}
+ \def\zhm@sfd{Unicode}
+ \fi}
+\zhm@check@sfd
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.9a}{2014/06/20}{使用 \texttt{CJK*} 的环境头代替完整 \texttt{CJK*}
+% 环境,可以减少一个全局分组。(由李清建议)}
+% \changes{v0.9b}{2015/04/08}{使用 \cs{CJK@@enc} 避免一些定义问题。}
+% \changes{v0.9b}{2015/05/01}{UTF8 编码不使用 \cs{CJK@makeActive}。}
+% 在导言区和正文中分别开启 \pkg{CJK} 的功能。非 UTF8 编码环境下,导言区使用
+% "\CJK@makeActive" 设置 128 以上字符为活动字符,并用 "\CJK@@enc" 定义这些活动字符。
+% 这里使用 "\CJK*" 代替原来的 "CJK" 环境,可以避免在 "document" 环境内引入一层分组,
+% 同时全局使用也不需要在全文最后使用 "\end{CJK}",最后也不需要 "\clearpage"。
+% \begin{macrocode}
+\begingroup\def\zhm@UTF{UTF8}\expandafter\endgroup
+\unless\ifx\zhm@encoding\zhm@UTF
+ \AtEndOfPackage{%
+ \CJK@makeActive
+ \CJK@@enc}
+\fi
+\AtBeginDocument{%
+ \@nameuse{CJK*}{\zhm@encoding}{\CJKfamilydefault}}
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@fontnum}
+% 已定义的 CJK 字体数。
+% \begin{macrocode}
+\newcount\zhm@fontnum
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\zhm@pdfliteral}
+% 插入 PDF 原语 \cite{Cho2009,Thanh2009}。用于实现伪斜体。
+% \begin{macrocode}
+\ifpdf
+ \def\zhm@pdfliteral#1{\pdfliteral{#1}}
+\else
+ \def\zhm@pdfliteral#1{\special{pdf:literal #1}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhm@pdfliteraldirect}
+% 直接插入 PDF 原语 \cite{Cho2009,Thanh2009}。用于实现伪粗体。相比
+% "\zhm@pdfliteral",这里不用先保存 PDF 坐标等状态,生成的代码更直接。伪斜体采
+% 用坐标变换实现,因此不能不保存位置直接插入。
+% \begin{macrocode}
+\ifpdf
+ \def\zhm@pdfliteraldirect#1{\pdfliteral direct {#1}}
+\else
+ \def\zhm@pdfliteraldirect#1{\special{pdf:literal direct #1}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+% 使用 PDF 原语生成伪粗体,参考 \cite[\S~4.3.3, \S~5.2.5]{adobe2001}。这里伪粗
+% 体是通过将字体轮廓用 "AutoFakeBold" 参数指定的宽度进行描边得到的。
+% \changes{v0.3}{2012/02/02}{使用 PDF 原语生成伪粗体}
+% \begin{macro}{\zhm@pdf@beginbold}
+% \begin{macrocode}
+\def\zhm@pdf@beginbold{%
+ \zhm@pdfliteraldirect{2 Tr \@nameuse{zhm@\CJK@family @embolden} w}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zhm@pdf@endbold}
+% \begin{macrocode}
+\def\zhm@pdf@endbold{\zhm@pdfliteraldirect{0 Tr}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifzhm@fakebold}
+% 判断当前字体是否使用伪粗体。当选项 "AutoFakeBold=0" 时,禁用伪粗体。
+% \begin{macrocode}
+\def\zhm@zero{0}
+\def\ifzhm@fakebold{\expandafter\unless\expandafter\ifx
+ \csname zhm@\zhm@fam @embolden\endcsname
+ \zhm@zero}
+\def\zhm@fakeboldfalse{\@namedef{zhm@\zhm@fam @embolden}{0}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% 使用 PDF 原语生成伪斜体,参考 \cite[\S~4.3.3]{adobe2001}。这里伪斜体是通过局
+% 部坐标变换得到的,变换公式为:
+% \begin{align*}
+% \begin{pmatrix} x' \\ y' \end{pmatrix}
+% &= \begin{pmatrix} a & c \\ b & d \end{pmatrix}
+% \times \begin{pmatrix} x \\ y \end{pmatrix}
+% + \begin{pmatrix} e \\ f \end{pmatrix} \\
+% &= \begin{pmatrix} 1 & \mathit{slant} \\ 0 & 1 \end{pmatrix}
+% \times \begin{pmatrix} x \\ y \end{pmatrix}
+% + \begin{pmatrix} 0 \\ 0 \end{pmatrix} \\
+% &= \begin{pmatrix} x + \mathit{slant}\cdot y \\ y \end{pmatrix}
+% \end{align*}
+%
+% \begin{macro}{\zhm@pdf@beginslant}
+% \begin{macrocode}
+\def\zhm@pdf@beginslant{%
+ \zhm@pdfliteral{1 0 \@nameuse{zhm@\CJK@family @slant} 1 0 0 cm}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\zhm@pdf@endslant}
+% \begin{macrocode}
+\def\zhm@pdf@endslant{%
+ \zhm@pdfliteral{1 0 \@nameuse{zhm@\CJK@family @negslant} 1 0 0 cm}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifzhm@CJK@bold@}
+% "\ifzhm@CJK@bold@" 对应于 \pkg{CJK} 中的 "\ifCJK@bold@",由 "\CJKbold" 和
+% "\CJKnormal" 控制,用于判断当前是否为伪粗体状态。
+% \begin{macrocode}
+\newif\ifzhm@CJK@bold@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifzhm@CJK@slant@}
+% 类似 "\ifzhm@CJK@bold@",由 "\CJKslant" 和 "\CJKnormal" 控制,用于判断当前是
+% 否为伪斜体状态。
+% \begin{macrocode}
+\newif\ifzhm@CJK@slant@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CJKbold}
+% 设置伪粗体(不斜)。根据 "pdffakebold" 选项选择伪粗体类型。
+% \begin{macrocode}
+\ifzhm@pdffakebold
+ \def\CJKbold{\global\zhm@CJK@bold@true\global\zhm@CJK@slant@false}
+\else
+ \def\CJKbold{\global\CJK@bold@true\global\zhm@CJK@slant@false}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CJKslant}
+% 设置伪斜体(不加粗)。
+% \begin{macrocode}
+\ifzhm@pdffakebold
+ \def\CJKslant{\global\zhm@CJK@bold@false\global\zhm@CJK@slant@true}
+\else
+ \def\CJKnormal{\global\CJK@bold@false\global\zhm@CJK@slant@false}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CJKboldslant}
+% 设置伪粗体加伪斜体。
+% \begin{macrocode}
+\ifzhm@pdffakebold
+ \def\CJKboldslant{\global\zhm@CJK@bold@true\global\zhm@CJK@slant@true}
+\else
+ \def\CJKnormal{\global\CJK@bold@false\global\zhm@CJK@slant@false}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CJKnormal}
+% 恢复无伪粗、伪斜体的状态。
+% \begin{macrocode}
+\ifzhm@pdffakebold
+ \def\CJKnormal{\global\zhm@CJK@bold@false\global\zhm@CJK@slant@false}
+\else
+ \def\CJKnormal{\global\CJK@bold@false\global\zhm@CJK@slant@false}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifzhm@fakeslant}
+% 判断 "\zhm@fam" 确定的字体是否使用伪斜体。当选项 "AutoFakeSlant=0" 时,禁用伪
+% 斜体。
+% \begin{macrocode}
+\def\ifzhm@fakeslant{\expandafter\unless\expandafter\ifx
+ \csname zhm@\zhm@fam @slant\endcsname
+ \zhm@zero}
+\def\zhm@fakeslantfalse{%
+ \@namedef{zhm@\zhm@fam @slant}{0}%
+ \@namedef{zhm@\zhm@fam @negslant}{0}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \changes{v0.9}{2013/08/08}{重新实现伪粗体、伪斜体功能,使之可以正常处理断行、
+% 标点压缩等问题。}
+% \begin{macro}{\CJKsymbol}
+% 重定义 "\CJKsymbol",增加 PDF 的伪粗体、伪斜体功能。
+%
+% 注意原来的 "\CJKsymbol" 在 \pkg{CJK} 包中由 "\DeclareRobustCommand" 定义,因此
+% 这里只重定义 "CJKsymbol" 后加空格的宏,修改其有效部分。这一定义不受
+% \pkg{CJKpunct} 等宏包对 "\CJKsymbol" 附加重定义的影响。
+% \begin{macrocode}
+\@namedef{CJKsymbol }#1{%
+ \ifzhm@CJK@slant@ \zhm@pdf@beginslant \fi
+ \ifzhm@CJK@bold@ \zhm@pdf@beginbold \fi
+ \symbol{#1}%
+ \ifCJK@bold@
+ \hbox to \CJKboldshift{\hss\symbol{#1}}%
+ \hbox to \CJKboldshift{\hss\symbol{#1}}%
+ \fi
+ \ifzhm@CJK@bold@ \zhm@pdf@endbold \fi
+ \ifzhm@CJK@slant@ \zhm@pdf@endslant \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\zhm@DeclareFontShape}
+% "\DeclareFontShape" 内部需要修改 "\catcode",因此在其他宏中声明时,使用
+% "\scantokens" 处理。
+% \begin{macrocode}
+\def\zhm@DeclareFontShape#1#2#3#4#5#6{%
+ \scantokens{\DeclareFontShape{#1}{#2}{#3}{#4}{#5}{#6}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.9}{2013/08/08}{支持伪粗斜体。}
+% 类似 "CJKb",定义 "CJKsl" 和 "CJKbsl" 尺寸函数,用于伪斜体、伪粗斜体的字形声
+% 明。
+% \begin{macrocode}
+\DeclareSizeFunction{CJKsl}{\CJK@empty\@font@warning}
+\DeclareSizeFunction{CJKbsl}{\CJK@empty\@font@warning}
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@mapline}
+% 添加实际字体映射行,两个参数是字体编号和字体文件名。为 pdf\TeX{} 与 DVIPDFMx
+% 引擎使用不同的命令完成 \cite{Thanh2009}。
+% \begin{macrocode}
+\ifpdf
+ \def\zhm@mapline#1#2{%
+ \pdfmapline{=zhm#1@\zhm@sfd @ <#2}}
+\else
+ \def\zhm@mapline#1#2{%
+ \special{pdf:mapline zhm#1@\zhm@sfd @ \zhm@cmap\space \ifzhm@embed\else!\fi#2}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhm@setfontmap}
+% \begin{macro}{\zhm@maplines}
+% \changes{v0.9a}{2014/06/20}{保存重复的字体映射。(李清)}
+% 设置字体映射,两个参数是字体编号和字体文件名。字体映射需要在输出例程初始处设
+% 置。同时将映射行完全展开后保存起来备用。
+% \begin{macrocode}
+\def\zhm@setfontmap#1#2{%
+ \AtBeginDvi{\zhm@mapline{#1}{#2}}%
+ \xdef\zhm@maplines{%
+ \unexpanded\expandafter{\zhm@maplines}%
+ \zhm@mapline{#1}{#2}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% 如果载入了 \pkg{atbegshi} 宏包,则还要处理修改了的输出例程。这会影响
+% \pkg{eso-pic} 等用户层宏包。
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{atbegshi}{%
+ \AtBeginShipoutFirst{\zhm@maplines}}{}}
+\let\zhm@maplines\empty
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@DeclareRealFont}
+% 分配实际字体,并设置字体映射。参数是字体文件名。如果实际字体已经分配,则不改
+% 变。
+% \begin{macrocode}
+\def\zhm@DeclareRealFont#1{
+ \unless\ifcsname zhm@#1@fontnum\endcsname
+ \global\advance\zhm@fontnum\@ne
+ \ifnum\zhm@fontnum>\@xxxii
+ \PackageError{zhmCJK}%
+ {No more CJK font families can be setup.}%
+ {There are at most 32 families setup by zhmCJK.}
+ \else
+ \expandafter\xdef\csname zhm@#1@fontnum\endcsname{\the\zhm@fontnum}
+ \zhm@setfontmap{\the\zhm@fontnum}{#1}
+ \fi
+ \fi
+ \edef\zhm@tfm{zhm\@nameuse{zhm@#1@fontnum}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v0.9}{2013/08/08}{设置字体 \texttt{cmap} 选项。}
+% \begin{macrocode}
+\define@key{zhm}{cmap}{%
+ \edef\zhm@cmap{#1}}
+% \end{macrocode}
+%
+% \changes{v0.9}{2013/08/10}{设置字体 \texttt{embed} 选项。}
+% \begin{macrocode}
+\define@key{zhm}{embed}[true]{%
+ \ifpdf
+ \PackageWarning{zhmCJK}
+ {The `embed' option is not supported by pdfTeX driver.\MessageBreak
+ Ignoring option `embed'}
+ \fi
+ \edef\zhm@embed{#1}%
+ \ifx\zhm@embed\zhm@true
+ \zhm@embedtrue
+ \else\ifx\zhm@embed\zhm@false
+ \zhm@embedfalse
+ \else
+ \PackageError{zhmCJK}%
+ {The `embed' option must be true or false.}%
+ {See the package manual for more information.}%
+ \fi\fi}
+\def\zhm@true{true}
+\def\zhm@false{false}
+% \end{macrocode}
+%
+% \changes{v0.8}{2012/02/06}{设置字体 \texttt{encoding} 选项。}
+% \begin{macrocode}
+\define@key{zhm}{encoding}{%
+ \edef\zhm@encoding{#1}%
+ \zhm@check@encoding
+ \edef\zhm@nfssenc{\@nameuse{CJK@\zhm@encoding @nfssenc}}%
+ \edef\zhm@sfd{\@nameuse{zhm@\zhm@encoding @sfd}}%
+ \zhm@check@sfd}
+% \end{macrocode}
+%
+% \changes{v0.4}{2012/02/04}{设置字体 \texttt{AutoFakeBold} 选项。}
+% 设置字体 "AutoFakeBold" 选项。缺省值是非 0 的全局选项值,或 0.4。
+% \begin{macrocode}
+\define@key{zhm}{AutoFakeBold}%
+ [\ifx\zhm@AutoFakeBold\zhm@zero 0.4\else\zhm@AutoFakeBold \fi]%
+ {\expandafter\xdef\csname zhm@\zhm@fam @embolden\endcsname{#1}}
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@neg}
+% 利用长度计算取负数。
+% \begin{macrocode}
+\def\zhm@neg#1{\strip@pt\dimexpr-#1pt\relax}
+% \end{macrocode}
+% \end{macro}
+% \changes{v0.6}{2012/02/05}{增加字体 \texttt{AutoFakeSlant} 选项}
+% 设置字体 "AutoFakeSlant" 选项。缺省值是非 0 的全局选项值,或 0.167。
+% \begin{macrocode}
+\define@key{zhm}{AutoFakeSlant}%
+ [\ifx\zhm@AutoFakeSlant\zhm@zero 0.167\else\zhm@AutoFakeSlant \fi]%
+ {\expandafter\xdef\csname zhm@\zhm@fam @slant\endcsname{#1}%
+ \expandafter\xdef\csname zhm@\zhm@fam @negslant\endcsname{\zhm@neg{#1}}}
+% \end{macrocode}
+%
+% \changes{v0.4}{2012/02/04}{设置字体 \texttt{BoldFont} 选项。}
+% 设置 "BoldFont" 选项。
+% \begin{macrocode}
+\define@key{zhm}{BoldFont}{
+ \zhm@DeclareRealFont{#1}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{b}{n}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{bx}{n}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}
+ \zhm@fakeboldfalse}
+% \end{macrocode}
+%
+% \changes{v0.4}{2012/02/04}{设置字体 \texttt{ItalicFont} 选项。}
+% 设置 "ItalicFont" 选项。
+% \begin{macrocode}
+\define@key{zhm}{ItalicFont}{
+ \zhm@DeclareRealFont{#1}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{m}{it}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}}
+% \end{macrocode}
+%
+% \changes{v0.4}{2012/02/04}{设置字体 \texttt{BoldItalicFont} 选项。}
+% 设置 "BoldItalicFont" 选项。
+% \begin{macrocode}
+\define@key{zhm}{BoldItalicFont}{
+ \zhm@DeclareRealFont{#1}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{b}{it}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{bx}{it}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}}
+% \end{macrocode}
+%
+% \changes{v0.4}{2012/02/04}{设置字体 \texttt{SlantedFont} 选项。}
+% 设置 "SlantedFont" 选项。
+% \begin{macrocode}
+\define@key{zhm}{SlantedFont}{
+ \zhm@DeclareRealFont{#1}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{m}{sl}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}
+ \zhm@fakeslantfalse}
+% \end{macrocode}
+%
+% \changes{v0.4}{2012/02/04}{设置字体 \texttt{BoldSlantedFont} 选项。}
+% 设置 "BoldSlantedFont" 选项。
+% \begin{macrocode}
+\define@key{zhm}{BoldSlantedFont}{
+ \zhm@DeclareRealFont{#1}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{b}{sl}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{bx}{sl}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}}
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@newfontfamily}
+% \changes{v0.7}{2012/02/06}{更改语法,修改选项位置。}
+% 设置一个 CJK 新字体族。三个参数分别为:字体族名,选项,字体文件名。
+% \begin{macrocode}
+\def\zhm@newfontfamily#1[#2]#3{
+ \begingroup
+% \end{macrocode}
+% 警告字体族重定义
+% \begin{macrocode}
+ \ifcsname zhm@#1@font\endcsname
+ \PackageWarning{zhmCJK}{Redefnition of CJK family `#1'}
+ \fi
+% \end{macrocode}
+% 缓存字体族名及对应主字体文件名。
+% \begin{macrocode}
+ \edef\zhm@fam{#1}
+ \expandafter\xdef\csname zhm@#1@font\endcsname{#3}
+% \end{macrocode}
+% 使全局的 "AutoFakeBold" 和 "AutoFakeSlant" 生效。
+% \begin{macrocode}
+ \setkeys{zhm}{%
+ AutoFakeBold=\zhm@AutoFakeBold,
+ AutoFakeSlant=\zhm@AutoFakeSlant}
+% \end{macrocode}
+% 定义 CJK 字体族。
+% \begin{macrocode}
+ \DeclareFontFamily{\zhm@nfssenc}{\zhm@fam}{\hyphenchar\font\m@ne}
+% \end{macrocode}
+% 执行选项,定义编码、CMap 和其他字形等。
+% \begin{macrocode}
+ \setkeys{zhm}{#2}
+% \end{macrocode}
+% 检查并定义实际字体,定义标准字形。模拟 ".fd" 文件的定义 \cite{Lemberg2008fonts}。
+% \begin{macrocode}
+ \zhm@DeclareRealFont{#3}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{m}{n}{<-> CJK * \zhm@tfm}%
+ {\CJKnormal}
+% \end{macrocode}
+% 按需要,定义伪粗体、伪斜体字形。
+% \begin{macrocode}
+ \ifzhm@fakebold
+ \zhm@DeclareRealFont{#3}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{bx}{n}%
+ {<-> CJKb * \zhm@tfm}{\CJKbold}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{b}{n}%
+ {<-> CJKb * \zhm@tfm}{\CJKbold}
+ \fi
+ \ifzhm@fakeslant
+ \zhm@DeclareRealFont{#3}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{m}{sl}%
+ {<-> CJKsl * \zhm@tfm}{\CJKslant}
+ \fi
+ \expandafter\ifzhm@fakeslant\ifzhm@fakebold
+ \zhm@DeclareRealFont{#3}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{bx}{sl}%
+ {<-> CJKbsl * \zhm@tfm}{\CJKboldslant}
+ \zhm@DeclareFontShape{\zhm@nfssenc}{\zhm@fam}{b}{sl}%
+ {<-> CJKbsl * \zhm@tfm}{\CJKboldslant}
+ \fi\fi
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhm@newfontfamily@post}
+% \begin{macro}{\zhm@newfontfamily@postaux}
+% 为了支持字体属性可选项在前在后两种语法,给出两个辅助工具。
+% \begin{macrocode}
+\def\zhm@newfontfamily@post#1#2{%
+ \@ifnextchar[%]
+ {\zhm@newfontfamily@postaux{#1}{#2}}%
+ {\zhm@newfontfamily{#1}[]{#2}}}
+\def\zhm@newfontfamily@postaux#1#2[#3]{%
+ \zhm@newfontfamily{#1}[{#3}]{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v0.9c}{2016/11/20}{支持字体属性可选项在后的新语法。}
+%
+% \begin{macro}{\setCJKfamilyfont}
+% \changes{v0.7}{2012/02/06}{修改可选参数位置,以与 \pkg{xeCJK} 包语法一致。}
+% 设置一个 CJK 字体族。实际有三个参数,语法与 "\zhm@newfontfamily" 大致相同,
+% 第二个参数可选。
+% \begin{macrocode}
+\newcommand*\setCJKfamilyfont[1]{%
+ \@ifnextchar[%]
+ {\zhm@newfontfamily{#1}}%
+ {\zhm@newfontfamily@post{#1}}}
+\@onlypreamble\setCJKfamilyfont
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\setCJKmainfont}
+% 设置 CJK 普通(罗马)字体。
+% \begin{macrocode}
+\newcommand*\setCJKmainfont{%
+ \setCJKfamilyfont{\CJKrmdefault}}
+\@onlypreamble\setCJKmainfont
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\setCJKromanfont}
+% \changes{v0.3}{2012/02/02}{新增。}
+% "\setCJKmainfont" 的别名。
+% \begin{macrocode}
+\let\setCJKromanfont\setCJKmainfont
+\@onlypreamble\setCJKromanfont
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\setCJKsansfont}
+% 设置 CJK 无衬线字体。
+% \begin{macrocode}
+\newcommand*\setCJKsansfont{%
+ \setCJKfamilyfont{\CJKsfdefault}}
+\@onlypreamble\setCJKsansfont
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\setCJKmonofont}
+% 设置 CJK 等宽(打字机)字体。
+% \begin{macrocode}
+\newcommand*\setCJKmonofont{%
+ \setCJKfamilyfont{\CJKttdefault}}
+\@onlypreamble\setCJKmonofont
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\CJKrmdefault}
+% CJK 罗马体默认字体族,作用于 "\rmfamily"。
+% \begin{macrocode}
+\providecommand*\CJKrmdefault{rm}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\CJKsfdefault}
+% CJK 无衬线体默认字体族,作用于 "\sffamily"。
+% \begin{macrocode}
+\providecommand*\CJKsfdefault{sf}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\CJKttdefault}
+% CJK 打字机体默认字体族,作用于 "\ttfamily"。
+% \begin{macrocode}
+\providecommand*\CJKttdefault{tt}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\CJKfamilydefault}
+% CJK 默认字体族,作用于 "\normalfont"。
+% \begin{macrocode}
+\providecommand*\CJKfamilydefault{\CJKrmdefault}
+% \end{macrocode}
+% \end{macro}
+%
+% 重定义 "\normalfont", "\rmfamily", "\sffamily" 和 "\ttfamily",使其同时设置
+% CJK 字体。
+% \begin{macrocode}
+\DeclareRobustCommand\normalfont
+ {\CJKfamily{\CJKfamilydefault}%
+ \usefont\encodingdefault
+ \familydefault
+ \seriesdefault
+ \shapedefault
+ \relax}
+\let\reset@font\normalfont
+\DeclareRobustCommand\rmfamily
+ {\not@math@alphabet\rmfamily\mathrm
+ \fontfamily\rmdefault\CJKfamily{\CJKrmdefault}\selectfont}
+\DeclareRobustCommand\sffamily
+ {\not@math@alphabet\sffamily\mathsf
+ \fontfamily\sfdefault\CJKfamily{\CJKsfdefault}\selectfont}
+\DeclareRobustCommand\ttfamily
+ {\not@math@alphabet\ttfamily\mathtt
+ \fontfamily\ttdefault\CJKfamily{\CJKttdefault}\selectfont}
+% \end{macrocode}
+%
+% \begin{macro}{\zhm@setup@pinyin@UTF8}
+% \changes{v0.9a}{2014/06/20}{处理 UTF-8 编码下的拼音符号输入。}
+% 下面简单处理 UTF-8 编码下的汉语拼音符号,让下列拼音符号
+% \begin{quote}
+% \ttfamily
+% āáǎà ōóǒò ēéěè ê īíǐì ūúǔù ǖǘǚǜü ńňǹ \\
+% ĀÁǍÀ ŌÓǑÒ ĒÉĚÈ Ê ŃŇǸ
+% \end{quote}
+% 可以直接输入,不受 \pkg{CJK} 包影响。
+% \begin{macrocode}
+\@namedef{zhm@setup@pinyin@UTF8}{%
+ \@namedef{u8:\detokenize{ā}}{\={a}}%
+ \@namedef{u8:\detokenize{á}}{\'{a}}%
+ \@namedef{u8:\detokenize{ǎ}}{\v{a}}%
+ \@namedef{u8:\detokenize{à}}{\`{a}}%
+ \@namedef{u8:\detokenize{ō}}{\={o}}%
+ \@namedef{u8:\detokenize{ó}}{\'{o}}%
+ \@namedef{u8:\detokenize{ǒ}}{\v{o}}%
+ \@namedef{u8:\detokenize{ò}}{\`{o}}%
+ \@namedef{u8:\detokenize{ē}}{\={e}}%
+ \@namedef{u8:\detokenize{é}}{\'{e}}%
+ \@namedef{u8:\detokenize{ě}}{\v{e}}%
+ \@namedef{u8:\detokenize{è}}{\`{e}}%
+ \@namedef{u8:\detokenize{ê}}{\^{e}}%
+ \@namedef{u8:\detokenize{ī}}{\={\i}}%
+ \@namedef{u8:\detokenize{í}}{\'{\i}}%
+ \@namedef{u8:\detokenize{ǐ}}{\v{\i}}%
+ \@namedef{u8:\detokenize{ì}}{\`{\i}}%
+ \@namedef{u8:\detokenize{ū}}{\={u}}%
+ \@namedef{u8:\detokenize{ú}}{\'{u}}%
+ \@namedef{u8:\detokenize{ǔ}}{\v{u}}%
+ \@namedef{u8:\detokenize{ù}}{\`{u}}%
+ \@namedef{u8:\detokenize{ǖ}}{\={\"{u}}}%
+ \@namedef{u8:\detokenize{ǘ}}{\'{\"{u}}}%
+ \@namedef{u8:\detokenize{ǚ}}{\v{\"{u}}}%
+ \@namedef{u8:\detokenize{ǜ}}{\`{\"{u}}}%
+ \@namedef{u8:\detokenize{ü}}{\"{u}}%
+ \@namedef{u8:\detokenize{ń}}{\'{n}}%
+ \@namedef{u8:\detokenize{ň}}{\v{n}}%
+ \@namedef{u8:\detokenize{ǹ}}{\`{n}}%
+ \@namedef{u8:\detokenize{Ā}}{\={A}}%
+ \@namedef{u8:\detokenize{Á}}{\'{A}}%
+ \@namedef{u8:\detokenize{Ǎ}}{\v{A}}%
+ \@namedef{u8:\detokenize{À}}{\`{A}}%
+ \@namedef{u8:\detokenize{Ō}}{\={O}}%
+ \@namedef{u8:\detokenize{Ó}}{\'{O}}%
+ \@namedef{u8:\detokenize{Ǒ}}{\v{O}}%
+ \@namedef{u8:\detokenize{Ò}}{\`{O}}%
+ \@namedef{u8:\detokenize{Ē}}{\={E}}%
+ \@namedef{u8:\detokenize{É}}{\'{E}}%
+ \@namedef{u8:\detokenize{Ě}}{\v{E}}%
+ \@namedef{u8:\detokenize{È}}{\`{E}}%
+ \@namedef{u8:\detokenize{Ê}}{\^{E}}%
+ \@namedef{u8:\detokenize{Ń}}{\'{N}}%
+ \@namedef{u8:\detokenize{Ň}}{\v{N}}%
+ \@namedef{u8:\detokenize{Ǹ}}{\`{N}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhm@setup@pinyin}
+% 调用具体编码下的拼音设置。目前只有 UTF-8 编码有合理的设置,其他编码较难实
+% 现。
+% \begin{macrocode}
+\def\zhm@setup@pinyin{%
+ \@nameuse{zhm@setup@pinyin@\zhm@encoding}}
+\zhm@setup@pinyin
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \subsection{TFM 及映射文件生成脚本 \texttt{zhmCJK.lua}}
+%
+% 这里字体脚本的实现参考了 \pkg{zhmetrics} 项目中吴凌云\footnote{中科院应用数
+% 学研究所副研究员。\nolinkurl{wulingyun@gmail.com}}、
+% zwhuang\footnote{\nolinkurl{zwhuang@gmail.com}} 编写的 "zhtfm.lua" 脚本。其
+% 中 TFM 生成原理参见 \cite{Wang2009}。
+%
+% \VerbatimInput[gobble=0,numbers=left,fontsize=\small]{zhmCJK.lua}
+% \changes{v0.7}{2012/02/06}{生成 TFM 时加入版权说明。}
+%
+% \PrintChanges
+% \PrintIndex
+% \Finale
+\endinput
diff --git a/language/chinese/zhmcjk/source/zhmCJK.ins b/language/chinese/zhmcjk/source/zhmCJK.ins
new file mode 100644
index 0000000000..b589877d13
--- /dev/null
+++ b/language/chinese/zhmcjk/source/zhmCJK.ins
@@ -0,0 +1,85 @@
+%% Copyright (C) 2012--2016 by Leo Liu <leoliu.pku@gmail.com>
+%% --------------------------------------------------------------------------
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Leo Liu.
+%%
+%% This work consists of the files zhmCJK.dtx,
+%% zhmCJK.ins,
+%% zhmCJK.lua,
+%% zhmCJK-addmap.pl,
+%% and the derived files zhmCJK.sty,
+%% zhmCJK.pdf,
+%% zhmCJK-test.tex,
+%% README, (from zhmCJK.dtx)
+%% zhmCJK.map,
+%% texfonts.map.template,
+%% zhmCJK.tfm,
+%% miktex-tfm/zhm*/zhm**.tfm (from zhmCJK.lua)
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2012--2016 by Leo Liu <leoliu.pku@gmail.com>
+--------------------------------------------------------------------------
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+\endpreamble
+
+\askforoverwritefalse
+\generate{\file{zhmCJK.sty}{\from{zhmCJK.dtx}{package}}}
+\nopostamble
+\generate{\file{zhmCJK-test.tex}{\from{zhmCJK.dtx}{test}}}
+\nopreamble
+\generate{\file{README.txt}{\from{zhmCJK.dtx}{readme}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into proper directories searched by TeX: *}
+\Msg{* *}
+\Msg{* zhmCJK.sty into tex/latex/zhmCJK/ *}
+\Msg{* zhmCJK.map into fonts/map/fontname/ *}
+\Msg{* zhmCJK.tfm into fonts/tfm/zhmCJK/ *}
+\Msg{* *}
+\Msg{* And merge the file texfonts.map.template *}
+\Msg{* into fonts/map/fontname/texfonts.map *}
+\Msg{* Or run zhmCJK-addmap.pl *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file zhmCJK.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* And move the source files and documentation: *}
+\Msg{* *}
+\Msg{* zhmCJK.pdf into doc/latex/zhmCJK/ *}
+\Msg{* zhmCJK-test.tex into doc/latex/zhmCJK/ *}
+\Msg{* README.txt into doc/latex/zhmCJK/README *}
+\Msg{* zhmCJK.dtx into source/latex/zhmCJK/ *}
+\Msg{* zhmCJK.ins into source/latex/zhmCJK/ *}
+\Msg{* zhmCJK.lua into source/latex/zhmCJK/ *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/language/chinese/zhmcjk/source/zhmCJK.lua b/language/chinese/zhmcjk/source/zhmCJK.lua
new file mode 100644
index 0000000000..cf42ec2a47
--- /dev/null
+++ b/language/chinese/zhmcjk/source/zhmCJK.lua
@@ -0,0 +1,204 @@
+-- Copyright (C) 2012--2016 by Leo Liu <leoliu.pku@gmail.com>
+-----------------------------------------------------------------------------
+-- This work may be distributed and/or modified under the
+-- conditions of the LaTeX Project Public License, either version 1.3
+-- of this license or (at your option) any later version.
+-- The latest version of this license is in
+-- http://www.latex-project.org/lppl.txt
+-- and version 1.3 or later is part of all distributions of LaTeX
+-- version 2005/12/01 or later.
+--
+-- This work has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is Leo Liu.
+--
+-- This work consists of the files zhmCJK.dtx,
+-- zhmCJK.ins,
+-- zhmCJK.lua,
+-- zhmCJK-addmap.pl,
+-- and the derived files zhmCJK.sty,
+-- zhmCJK.pdf,
+-- zhmCJK-test.tex,
+-- README, (from zhmCJK.dtx)
+-- zhmCJK.map,
+-- texfonts.map.template,
+-- zhmCJK.tfm,
+-- miktex-tfm/zhm*/zhm**.tfm. (from zhmCJK.lua)
+--
+-----------------------------------------------------------------------------
+-- This lua script is used to generate zhm*.tfm and zhmCJK.map.
+--
+-- Usage:
+--
+-- texlua zhmCJK.lua map
+--
+-- or (for MiKTeX only)
+--
+-- texlua zhmCJK.lua nomap
+--
+
+------------------------
+-- OS dependent settings
+------------------------
+
+if os.type == "unix" then
+ path_slash = "/"
+else
+ path_slash = "\\"
+end
+
+---------------
+-- Generate TFM
+---------------
+
+pl_template = {
+ char = [[
+(CHARACTER D %d
+ (CHARWD R 1.0)
+ (CHARHT R 0.8)
+ (CHARDP R 0.1)
+ )
+]],
+ header = [[
+(FAMILY %s)
+(CODINGSCHEME CJK-UNICODE)
+(DESIGNSIZE R 10.0)
+(HEADER D 18 H 43726561)
+(HEADER D 19 H 74656420)
+(HEADER D 20 H 62792060)
+(HEADER D 21 H 7A686D43)
+(HEADER D 22 H 4A4B2E6C)
+(HEADER D 23 H 7561272E)
+(HEADER D 24 H 20436F70)
+(HEADER D 25 H 79726967)
+(HEADER D 26 H 68742028)
+(HEADER D 27 H 43292032)
+(HEADER D 28 H 30313220)
+(HEADER D 29 H 6279204C)
+(HEADER D 30 H 656F204C)
+(HEADER D 31 H 6975203C)
+(HEADER D 32 H 6C656F6C)
+(HEADER D 33 H 69752E70)
+(HEADER D 34 H 6B754067)
+(HEADER D 35 H 6D61696C)
+(HEADER D 36 H 2E636F6D)
+(HEADER D 37 H 3E0D0A00)
+(CHECKSUM O 0)
+(FONTDIMEN
+ (SLANT R %f)
+ (SPACE R 0.5)
+ (STRETCH R 0.3)
+ (SHRINK R 0.1)
+ (XHEIGHT R 0.4)
+ (QUAD R 1.0)
+ )
+]],
+-- charset = (defined below)
+}
+
+function pl_charset()
+ local charset = {}
+ for cid = 0, 0xff do
+ charset[#charset + 1] = string.format(pl_template.char, cid)
+ end
+ return table.concat(charset)
+end
+
+pl_template.charset = pl_charset()
+
+function write_tfm(path, name, slant)
+ local fullname = path .. path_slash .. name
+ local s_pl = string.format(pl_template.header, string.upper(name), slant)
+ .. pl_template.charset
+ local f_pl = io.open(fullname .. ".pl", "w")
+ f_pl:write(s_pl)
+ f_pl:close()
+ os.execute([[pltotf "]] .. fullname .. [[.pl" "]] .. fullname .. [[.tfm"]])
+ os.remove(fullname .. ".pl")
+end
+
+---------------------------------------------
+-- Main functions to generate necessary files
+---------------------------------------------
+
+-- For TeX Live and other TeX distributions where texfonts.map is supported,
+-- we generate texfonts.map.template, zhmCJK.map, and zhmCJK.tfm.
+function generate_with_fontmap()
+ local f_map = io.open("zhmCJK.map", "w")
+ for fam = 1, 32 do
+ for sid = 0, 0xff do
+ f_map:write(string.format("zhmCJK.tfm zhm%d%02x.tfm\n",
+ fam, sid))
+ end
+ end
+ f_map:write("\n")
+ f_map:close()
+
+ f_map = io.open("texfonts.map.template", "w")
+ f_map:write("include zhmCJK.map\n\n")
+ f_map:close()
+
+ write_tfm(".", "zhmCJK", 0.0)
+end
+
+-- For MiKTeX and other TeX distributions where texfonts.map is not supported,
+-- we generate a lot of zhmXYY.tfm, where X from 1 to 32, Y from 0x00 to 0xff.
+function generate_without_fontmap()
+ lfs.mkdir("miktex-tfm")
+ for fam = 1, 32 do
+ local path = string.format("miktex-tfm" .. path_slash .. "zhm%d", fam)
+ lfs.mkdir(path)
+ print(path)
+ for sid = 0, 0xff do
+ local name = string.format("zhm%d%02x", fam, sid)
+ write_tfm(path, name, 0.0)
+ end
+ end
+end
+
+-------------------------
+-- Console User Interface
+-------------------------
+
+help_info = [[
+Usage:
+
+ texlua ]].. arg[0] .. [[ map|nomap
+
+ map: Generate a public TFM shared by all CJK fonts with mapping files.
+ It is suggested for TeX Live and other web2c distributions.
+
+ nomap: Generate all TFM files for CJK fonts into "miktex-tfm" directory.
+ MiKTeX needs this since it does not support TFM mappings.
+]]
+
+if #arg ~= 1 then
+ print(help_info)
+else
+ if arg[1] == "map" then
+ generate_with_fontmap()
+ elseif arg[1] == "nomap" then
+ generate_without_fontmap()
+ else
+ print("! Unknown option " .. arg[1])
+ print(help_info)
+ end
+end
+
+-- end of file zhmCJK.lua --
+--
+-----------------------------------------------------------------------------
+--
+-- The code is inspired by zhtfm.lua of zhmetrics bundle.
+--
+-- The zhmetrics bundle is distributed under LPPL 1.3 or later. The original
+-- authors of zhtfm.lua are:
+--
+-- Lingyun Wu <wulingyun@gmail.com>
+-- zwhuang <zwhuang@gmail.com>
+--
+-- For more information of zhmetrics, see the ctex-kit project:
+--
+-- https://github.com/CTeX-org/ctex-kit
+--
+