diff options
Diffstat (limited to 'language/chinese/zhmcjk/source')
-rw-r--r-- | language/chinese/zhmcjk/source/Makefile | 72 | ||||
-rwxr-xr-x | language/chinese/zhmcjk/source/zhmCJK-addmap.pl | 28 | ||||
-rw-r--r-- | language/chinese/zhmcjk/source/zhmCJK.dtx | 1549 | ||||
-rw-r--r-- | language/chinese/zhmcjk/source/zhmCJK.ins | 85 | ||||
-rw-r--r-- | language/chinese/zhmcjk/source/zhmCJK.lua | 204 |
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 +-- + |