summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-07-23 21:57:29 +0000
committerKarl Berry <karl@freefriends.org>2012-07-23 21:57:29 +0000
commitca063a3b051262e45eab720a035a2e4fb4268204 (patch)
treef44374d32fbd6142abd88d2ae971ed3e1a00e695
parent572e26630db65b54448140e24335b2cb1472044d (diff)
zhnumber (23jul12)
git-svn-id: svn://tug.org/texlive/trunk@27120 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/zhnumber/README3
-rw-r--r--Master/texmf-dist/doc/latex/zhnumber/zhnumber.pdfbin159005 -> 255534 bytes
-rw-r--r--Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx1013
-rw-r--r--Master/texmf-dist/source/latex/zhnumber/zhnumber.ins13
-rw-r--r--Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-big5.cfg91
-rw-r--r--Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-gbk.cfg112
-rw-r--r--Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-utf8.cfg112
-rw-r--r--Master/texmf-dist/tex/latex/zhnumber/zhnumber.sty601
8 files changed, 1346 insertions, 599 deletions
diff --git a/Master/texmf-dist/doc/latex/zhnumber/README b/Master/texmf-dist/doc/latex/zhnumber/README
index cdca2bfd0b6..1cee7cb6da9 100644
--- a/Master/texmf-dist/doc/latex/zhnumber/README
+++ b/Master/texmf-dist/doc/latex/zhnumber/README
@@ -22,8 +22,9 @@ This work consists of the file zhnumber.dtx,
zhnumber.sty,
zhnumber-utf8.cfg,
zhnumber-gbk.cfg,
+ zhnumber-big5.cfg,
zhnumber.ins and
- README.txt (this file).
+ README (this file).
Basic Usage
-----------
diff --git a/Master/texmf-dist/doc/latex/zhnumber/zhnumber.pdf b/Master/texmf-dist/doc/latex/zhnumber/zhnumber.pdf
index 8f2a436475a..c57b314c996 100644
--- a/Master/texmf-dist/doc/latex/zhnumber/zhnumber.pdf
+++ b/Master/texmf-dist/doc/latex/zhnumber/zhnumber.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx b/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx
index 7615b9cd405..559498c7c57 100644
--- a/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx
+++ b/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx
@@ -28,8 +28,9 @@ This work consists of the file zhnumber.dtx,
zhnumber.sty,
zhnumber-utf8.cfg,
zhnumber-gbk.cfg,
+ zhnumber-big5.cfg,
zhnumber.ins and
- README.txt (this file).
+ README (this file).
Basic Usage
-----------
@@ -110,8 +111,9 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
zhnumber.sty,
zhnumber-utf8.cfg,
zhnumber-gbk.cfg,
+ zhnumber-big5.cfg,
zhnumber.ins and
- README.txt.
+ README.
\endpostamble
\ifnum\shellescape=1 \else
\errmessage{
@@ -123,9 +125,12 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}}}
\usedir{tex/latex/zhnumber/config}
\generate{
- \file{\jobname-utf8.cfg}{\from{\jobname.dtx}{config-utf8}}
- \file{\jobname-gbk.cfg}{\from{\jobname.dtx}{config-gbk}}}
+ \file{\jobname-utf8.cfg}{\from{\jobname.dtx}{config,utf8}}
+ \file{\jobname-big5.cfg}{\from{\jobname.dtx}{config,big5}}
+ \file{\jobname-gbk.cfg}{\from{\jobname.dtx}{config,gbk}}}
+\immediate\write18{iconv -f utf-8 -t big-5 \jobname-big5.cfg > \jobname-big5.temp}
\immediate\write18{iconv -f utf-8 -t gbk \jobname-gbk.cfg > \jobname-gbk.temp}
+\immediate\write18{mv -f \jobname-big5.temp \jobname-big5.cfg}
\immediate\write18{mv -f \jobname-gbk.temp \jobname-gbk.cfg}
%</batchfile>
%<batchfile>\endbatchfile
@@ -144,20 +149,26 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
%
%<*driver|package>
\NeedsTeXFormat{LaTeX2e}
-%<driver>\ProvidesFile{zhnumber.dtx}
+%<*driver>
+\ProvidesFile{zhnumber.dtx}
+%</driver>
\RequirePackage{expl3}
%</driver|package>
-%<config-gbk|config-utf8>\ExplSyntaxOff
-%<package>\ProvidesExplPackage {zhnumber}
-%<config-gbk>\ProvidesExplFile {zhnumber-gbk.cfg}
-%<config-utf8>\ProvidesExplFile {zhnumber-utf8.cfg}
-%<package|config-gbk|config-utf8> {2012/05/21} {1.4}
-%<package> {package for typesetting numbers with Chinese glyphs}
-%<config-gbk> {Chinese numerals with GBK encoding}
-%<config-utf8> {Chinese numerals with UTF8 encoding}
+%<package|config>\GetIdInfo$Id: zhnumber.dtx 351 2012-07-20 05:30:58Z sobenlee $
+%<package> {package for typesetting numbers with Chinese glyphs}
+%<config&utf8> {Chinese numerals with UTF8 encoding}
+%<config&big5> {Chinese numerals with Big5 encoding}
+%<config&gbk> {Chinese numerals with Big5 encoding}
+%<package>\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{1.6}{\ExplFileDescription}
+%<config>\ProvidesExplFile
+%<config&utf8> {\ExplFileName-utf8.cfg}
+%<config&big5> {\ExplFileName-big5.cfg}
+%<config&gbk> {\ExplFileName-gbk.cfg}
+%<config> {\ExplFileDate} {1.6} {\ExplFileDescription}
%
%<*driver>
\documentclass{l3doc}
+\usepackage{amsmath}
\usepackage{xeCJK}
\usepackage{zhnumber}
\usepackage{fvrb-ex}
@@ -169,6 +180,7 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
\addtolength\textheight{8\baselineskip}
\setmainfont{TeX Gyre Pagella}
\setmonofont{Inconsolata}
+\xeCJKDeclareCharClass{CJK}{ "25CB }
\setCJKmainfont[BoldFont=Adobe Heiti Std,ItalicFont=Adobe Kaiti Std]{Adobe Song Std}
\setCJKmonofont{Adobe Kaiti Std}
\xeCJKsetup{PunctStyle=kaiming}
@@ -184,6 +196,12 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
\def\argbrace#1{\char`\{#1\char`\}}
\@addtoreset{CodelineNo}{section}
\makeatother
+\def\indexname{代码索引}
+\IndexPrologue{%
+ \section*{\indexname}
+ \markboth{\indexname}{\indexname}
+ 斜体的数字表示对应项说明所在的页码,下划线的数字表示定义所在的代码行号,而直立体的
+ 数字表示对应项使用时所在的行号。}
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
@@ -204,16 +222,14 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% 的三个格式转换命令 |\zhnumber|,|\zhdigits| 和 |\zhnum| 都是可以适当展开的,可以
% 正常使用于 |PDF| 书签和交叉引用。
%
-% \pkg{zhnumber} 支持 |GBK| 和 |UTF8| 编码,依赖 \LaTeX~3 项目的 \pkg{expl3},
+% \pkg{zhnumber} 支持 |GBK|,|Big5| 和 |UTF8| 编码,依赖 \LaTeX~3 项目的 \pkg{expl3},
% \pkg{xparse} 和 \pkg{l3keys2e} 宏包。
%
-% 目前 |\zhnumber| 能正确处理的最大整数是 $10^{48}-1$,|\zhditits| 不受这个大小的限制。
-%
% \section{使用方法}
%
-% \begin{function}{encoding}
+% \begin{function}[updated=2012-5-25]{encoding}
% \begin{syntax}
-% encoding = \meta{GBK\orvar{}UTF8}
+% encoding = \meta{GBK\orvar{}Big5\orvar{}UTF8}
% \end{syntax}
% 用于指定编码的宏包选项,可以在调用宏包的时候设定,也可以用 |\zhnumsetup| 在导言区内设定。
% 对于 \XeLaTeX 和 \LuaLaTeX ,不用指定编码,宏包将自动使用 |UTF8| 编码。只有 \LaTeX
@@ -262,6 +278,62 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% \end{SideBySideExample}
% \end{function}
%
+% \begin{function}[added=2012-5-25]{\zhweekday}
+% \begin{syntax}
+% \cs{zhweekday} \Arg{yyyy/mm/dd}
+% \end{syntax}
+% 输出日期当天的星期。例如\\[1ex]
+% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.6\linewidth,gobble=5]
+% \zhweekday{2012/5/20}
+% \end{SideBySideExample}
+% \end{function}
+%
+% \begin{function}[added=2012-5-25]{\zhdate}
+% \begin{syntax}
+% \cs{zhdate} \Arg{yyyy/mm/dd}
+% \cs{zhdate*} \Arg{yyyy/mm/dd}
+% \end{syntax}
+% 以中文格式输出日期,其中带 |*| 的命令还输出星期。例如\\[1ex]
+% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.6\linewidth,gobble=5]
+% \zhdate{2012/5/21}\\
+% \zhdate*{2012/5/21}
+% \end{SideBySideExample}
+% \end{function}
+%
+% \begin{function}[added=2012-5-25]{\zhtoday}
+% 与 |\today| 类似,以中文输出当天的日期。例如\\[1ex]
+% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.6\linewidth,gobble=5]
+% \zhtoday
+% \end{SideBySideExample}
+% \end{function}
+%
+% \begin{function}[added=2012-5-25]{\zhtime}
+% \begin{syntax}
+% \cs{zhtime} \Arg{hh:mm}
+% \end{syntax}
+% 以中文格式输出时间。例如\\[1ex]
+% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.6\linewidth,gobble=5]
+% \zhtime{23:56}
+% \end{SideBySideExample}
+% \end{function}
+%
+% \begin{function}[added=2012-5-25]{\zhcurrtime}
+% 输出当前的时间。例如\\[1ex]
+% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.6\linewidth,gobble=5]
+% \zhcurrtime
+% \end{SideBySideExample}
+% \end{function}
+%
+% \begin{function}[added=2012-5-25]{\zhnumExtendScaleMap}
+% \begin{syntax}
+% \cs{zhnumExtendScaleMap} \oarg{character} \argbrace{\meta{character 1}, \meta{character 2}, ..., \meta{character n}}
+% \end{syntax}
+% 缺省状态下 |\zhnumber| 能正确中文格式化的最大整数是 $10^{48}-1$,|\zhditits| 不受
+% 这个大小的限制。可以通过 |\zhnumExtendScaleMap| 来扩展 |\zhnumber|。
+% \meta{character} $i$ 设置 $10^{4(i+11)}$。若给出可选项 \meta{character},则当
+% 数字大于 $10^{4(n+12)}-1$ 时,统一用 \meta{character} 设置输出数字的进位。
+% \end{function}
+%
% \begin{function}{\zhnumsetup}
% \begin{syntax}
% \cs{zhnumsetup} \argbrace{\meta{key1}=\meta{var1}, \meta{key2}=\meta{var2}, ...}
@@ -269,14 +341,26 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% 用于在导言区或文档中,设置中文数字的输出格式。目前可以设置的 \meta{key} 如下介绍。
% \end{function}
%
-% \begin{function}{style}
+% \begin{function}[added=2012-5-25]{time}
+% \begin{syntax}
+% time = \argbrace{\meta{Arabic}\orvar\meta{Chinese}}
+% \end{syntax}
+% 设置日期和时间的数字格式,\meta{Arabic} 为阿拉伯数字,而 \meta{Chinese} 为中文数字。
+% 默认使用阿拉伯数字。例如\\[1ex]
+% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.6\linewidth,gobble=5]
+% \zhnumsetup{time=Chinese}
+% \zhtoday\zhcurrtime
+% \end{SideBySideExample}
+% \end{function}
+%
+% \begin{function}[updated=2012-5-25]{style}
% \begin{syntax}
% style = \argbrace{\meta{Simplified}\orvar\meta{Traditional}\orvar\meta{Normal}\orvar\meta{Financial}\orvar\meta{Ancient}}
% \end{syntax}
% 意义分别为
% \begin{itemize}[font=\ttfamily,labelsep=1em]
-% \item[Simplified] 以简体中文输出数字;
-% \item[Traditional] 以繁体中文输出数字;
+% \item[Simplified] 以简体中文输出数字(对 |Big5| 编码无效);
+% \item[Traditional] 以繁体中文输出数字(对 |Big5| 编码无效);
% \item[Normal] 以小写形式输出中文数字;
% \item[Financial] 以大写形式输出中文数字;
% \item[Ancient] 以廿输出 20,以卅输出 30,以卌输出 40,以皕输出 200。
@@ -295,25 +379,27 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% null = \meta{\TFF}
% \end{syntax}
% 缺省状态下,除了 |\zhdigits| 外,其它的格式转换命令,将 0 映射成零,如果需要将 0 映射
-% 成〇,可以使用这个选项。
+% 成〇,可以使用这个选项。\strut
% \end{function}
%
-% \smallskip
-%
% \pkg{zhnumber} 提供下列选项来控制阿拉伯数字的中文映射。
% \begin{verbatim}[frame=single]
-% - -0 0 1 2 3 4 5 6 7 8 9 10 20 30 40 200 dot and parts
+% - -0 0 1 2 3 4 5 6 7 8 9 10 20 30 40 200
% E2 E3 E4 E8 E12 E16 E20 E24 E28 E32 E36 E40 E44
+% F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 FE2 FE3
+% dot and parts
+% year month day hour minute weekday mon tue wed thu fri sat sun
% \end{verbatim}
% 其中 |-| 设置负,|-0| 设置〇,|dot| 设置小数的点,|and| 和 |parts| 分别设置分数
-% 的“又”和“分之”,而 |E|$n$ 设置 $10^n$。例如
+% 的“又”和“分之”,|E|$n$ 设置 $10^n$,而 |F|$n$ 设置数字 $n$ 的大写。其它的选项同
+% 字面意思,不再赘述。例如
% \begin{verbatim}[frame=single]
% \zhnumsetup{2={两}}
% \end{verbatim}
-% 可以将 2 映射成两。需要说明的是,\pkg{zhnumber} 将优先使用这里的设置,所以将会影响
+% 可以将 2 映射成两。需要说明的是,\pkg{zhnumber} 将优先使用这里的设置,所以可能会影响
% 到 |style| 选项。如果要恢复 |style| 的功能,可以使用 |reset| 选项。
%
-% \begin{function}{reset}
+% \begin{function}[updated=2012-5-25]{reset}
% \begin{syntax}
% reset
% \end{syntax}
@@ -351,7 +437,7 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
'l3kernel'~and~'l3packages'\\\\
using~your~TeX~package~manager~or~from~CTAN.
}
-\@ifpackagelater { expl3 } { 2012/02/19 } { }
+\@ifpackagelater { expl3 } { 2012/07/16 } { }
{ \msg_error:nn { zhnumber } { l3-too-old } }
% \end{macrocode}
%
@@ -410,12 +496,12 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
{
\quark_if_nil:nTF {#3}
{
- \zhnum_blank_to_zero:f {#1} \c_zhnum_over_tl
+ \zhnum_blank_to_zero:f {#1} \c_zhnum_parts_tl
\zhnum_blank_to_zero:f {#2}
}
{
\tl_if_blank:fF {#2} { \zhnumber {#2} \c_zhnum_and_tl }
- \zhnum_blank_to_zero:f {#1} \c_zhnum_over_tl
+ \zhnum_blank_to_zero:f {#1} \c_zhnum_parts_tl
\zhnum_blank_to_zero:f {#3}
}
}
@@ -429,7 +515,7 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
\cs_new_nopar:Nn \zhnum_decimal:nn
{
\zhnum_blank_to_zero:f {#1} \c_zhnum_dot_tl
- \tl_if_blank:fTF {#2} { \zhnum_digit_map:n \c_zero } { \zhdigits * {#2} }
+ \tl_if_blank:fTF {#2} { \c_zhnum_zero_tl } { \zhdigits * {#2} }
}
\cs_generate_variant:Nn \tl_if_blank:nTF { f }
% \end{macrocode}
@@ -462,15 +548,11 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% 对整数的处理。
% \begin{macrocode}
\cs_new_nopar:Nn \zhnum_integer:n
- { \zhnum_integer_aux:f { \zhnum_erase_separator:n {#1} } }
-\cs_new_nopar:Nn \zhnum_integer_aux:n
{
- \int_compare:nNnT { \int_get_sign:n {#1} \c_one } < \c_zero
- { \zhnum_digit_map:n \c_minus_one }
- \zhnum_parse_number:f { \zhnum_trim_zeros:f { \int_get_digits:n {#1} } }
+ \int_compare:nNnT { \__int_get_sign:n {#1} \c_one } < \c_zero { \c_zhnum_minus_tl }
+ \zhnum_parse_number:f { \zhnum_trim_zeros:f { \zhnum_erase_separator:n {#1} } }
}
-\cs_generate_variant:Nn \zhnum_integer:n { f , v }
-\cs_generate_variant:Nn \zhnum_integer_aux:n { f }
+\cs_generate_variant:Nn \zhnum_integer:n { f , v , V }
% \end{macrocode}
% \end{macro}
%
@@ -479,8 +561,7 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% \begin{macrocode}
\cs_new_nopar:Nn \zhnum_erase_separator:n
{ \cs_to_str:c { \tl_map_function:nN {#1} \zhnum_erase_separator_aux:N } }
-\cs_new_nopar:Nn \zhnum_erase_separator_aux:N
- { \str_if_eq:xxF {#1} \c_zhnum_separator_tl {#1} }
+\cs_new_nopar:Nn \zhnum_erase_separator_aux:N { \zhnum_if_number:NT {#1} {#1} }
\cs_new_nopar:Nn \zhnum_trim_zeros:n
{
\tl_if_empty:nTF {#1} \c_zero
@@ -489,117 +570,106 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
{ \zhnum_trim_zeros:o { \use_none:n #1 } } {#1}
}
}
+\prg_new_conditional:Nnn \zhnum_if_number:N { p , T , F , TF }
+ {
+ \if_int_compare:w \c_one < 1 #1 \exp_stop_f:
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
\cs_generate_variant:Nn \zhnum_trim_zeros:n { f , o }
\cs_generate_variant:Nn \cs_to_str:N { c }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]
-% {\zhnum_parse_number:n,\zhnum_parse_number:nn,\zhnum_parse_number:nnn}
+% \begin{macro}[internal]{\zhnum_parse_number:n,\zhnum_parse_number:nn}
% \begin{macrocode}
\cs_new_nopar:Nn \zhnum_parse_number:n
- { \zhnum_parse_number:nf {#1} { \tl_length:n {#1} } }
-\cs_new_nopar:Nn \zhnum_parse_number:nn
{
- \int_compare:nNnTF {#2} < \c_five
- {
- \int_compare:nNnTF {#1} = \c_zero
- { \zhnum_digit_map:n \c_zero }
- { \zhnum_process_number:NNn \c_true_bool \c_true_bool {#1} }
- }
+ \zhnum_parse_number:nff {#1}
+ { \tl_count:n {#1} }
+ { \int_mod:nn { \tl_count:n {#1} } \c_four }
+ }
+\cs_new_nopar:Nn \zhnum_parse_number:nnn
+ {
+ \int_compare:nNnTF {#2} < \c_two
+ { \zhnum_digit_map:n {#1} }
{
- \int_compare:nNnTF { \int_mod:nn {#2} \c_four } = \c_zero
- {
- \zhnum_split_number:nNNnfn {#1} \c_true_bool \c_true_bool { \c_zero }
- { \int_div_truncate:nn { #2 - \c_one } \c_four }
- { \c_zero }
- }
+ \zhnum_split_number:fNNfn { \zhnum_insert_zeros:n {#3} #1 }
+ \c_true_bool \c_true_bool
{
- \zhnum_parse_number:nnf {#1} {#2}
- {
- \use:c
- {
- zhnum_use_
- \int_to_roman:n { \int_mod:nn {#2} \c_four }
- _delimit_by_q_stop:w
- }
- #1 \q_stop
- }
+ \int_compare:nNnTF {#3} = \c_zero
+ { \int_eval:n { (#2) / \c_four - \c_one } }
+ { \int_div_truncate:nn {#2} \c_four }
}
+ { \c_zero }
}
}
-\cs_new_nopar:Nn \zhnum_parse_number:nnn
+\cs_generate_variant:Nn \zhnum_parse_number:n { f }
+\cs_generate_variant:Nn \zhnum_parse_number:nnn { nff }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_insert_zeros:n}
+% 为了处理的方便,在整数前面补上适当的 $0$,使其位数可以被 $4$ 整除。
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_insert_zeros:n
{
- \zhnum_process_number:NNn \c_true_bool \c_true_bool {#3}
- \zhnum_scale_map:n { \int_div_truncate:nn { #2 - \c_one } \c_four }
- \int_compare:nNnTF { \int_mod:nn {#3} \c_ten } = \c_zero
- { \zhnum_split_number:nNNffn {#1} \c_false_bool \c_true_bool }
- { \zhnum_split_number:nNNffn {#1} \c_true_bool \c_false_bool }
- { \int_mod:nn {#2} \c_four }
- { \int_eval:n { \int_div_truncate:nn { #2 - \c_one } \c_four - \c_one } }
- { \c_zero }
+ \if_case:w \int_eval:n { #1 - \c_one } \exp_stop_f:
+ \or: \exp_after:wN \use_none:n
+ \or: \exp_after:wN \use_none:nn
+ \else: \exp_after:wN \use_none:nnn
+ \fi:
+ 000
}
-\cs_generate_variant:Nn \zhnum_parse_number:n { f }
-\cs_generate_variant:Nn \zhnum_parse_number:nn { nf }
-\cs_generate_variant:Nn \zhnum_parse_number:nnn { nnf }
-\cs_new_nopar:Npn \zhnum_use_i_delimit_by_q_stop:w #1#2 \q_stop {#1}
-\cs_new_nopar:Npn \zhnum_use_ii_delimit_by_q_stop:w #1#2#3 \q_stop {#1#2}
-\cs_new_nopar:Npn \zhnum_use_iii_delimit_by_q_stop:w #1#2#3#4 \q_stop {#1#2#3}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\zhnum_split_number:nNNnnn}
-% 将输入的整数由低位到高位,以四位为一段进行处理。
+% \begin{macro}[internal]{\zhnum_split_number:nNNnn}
+% 将输入的整数由高位到低位,以四位为一段进行处理。
% \begin{macrocode}
-\cs_new_nopar:Nn \zhnum_split_number:nNNnnn
+\cs_new_nopar:Nn \zhnum_split_number:nNNnn
{
- \exp_args:Nf \zhnum_split_number_aux:nnnnnnn
- { \zhnum_number_item:nn {#1} { \c_one + #4 + #6 * \c_four } }
- {#1} {#2} {#3} {#4} {#5} {#6}
+ \zhnum_split_number_aux:fnNNnn { \zhnum_number_item:nn {#1} {#5} }
+ {#1} #2#3 {#4} {#5}
}
-\cs_new_nopar:Nn \zhnum_split_number_aux:nnnnnnn
+\cs_new_nopar:Nn \zhnum_split_number_aux:nnNNnn
{
\int_compare:nNnTF {#1} = \c_zero { \use_i_ii:nnn }
{
- \bool_if:NF #3 { \zhnum_digit_map:n \c_zero }
- \zhnum_process_number:NNn {#3} {#4} {#1}
- \zhnum_scale_map:n { #6 - #7 }
+ \bool_if:NF #3 { \c_zhnum_zero_tl }
+ \zhnum_process_number:NNn #3#4 {#1}
+ \zhnum_scale_map:n { #5 - #6 }
\int_compare:nNnTF { \int_mod:nn {#1} \c_ten } = \c_zero
{ \use_i_ii:nnn } { \zhnum_use_i_iii:nnn }
}
- { \int_compare:nNnF { #6 - #7 } = \c_zero }
+ { \int_compare:nNnF {#5} = {#6} }
{ {
- \zhnum_split_number:nNNnnf
- {#2} \c_false_bool \c_true_bool {#5} {#6} { \int_eval:n { #7 + \c_one } }
+ \zhnum_split_number:nNNnf
+ {#2} \c_false_bool \c_true_bool {#5} { \int_eval:n { #6 + \c_one } }
} }
{ {
- \zhnum_split_number:nNNnnf
- {#2} \c_true_bool \c_false_bool {#5} {#6} { \int_eval:n { #7 + \c_one } }
+ \zhnum_split_number:nNNnf
+ {#2} \c_true_bool \c_false_bool {#5} { \int_eval:n { #6 + \c_one } }
} }
}
\cs_new_nopar:Nn \zhnum_use_i_iii:nnn {#1#3}
-\cs_generate_variant:Nn \zhnum_split_number:nNNnnn { nNNnf , nNNff , nNNnnf }
+\cs_generate_variant:Nn \zhnum_split_number:nNNnn { fNNf , nNNnf }
+\cs_generate_variant:Nn \zhnum_split_number_aux:nnNNnn { f }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\zhnum_number_item:nn,\zhnum_number_item_aux:nN}
+% \begin{macro}[internal]{\zhnum_number_item:nn,\zhnum_number_item_aux:nNNNN}
% 截取整数的其中四位数。
% \begin{macrocode}
\cs_new_nopar:Nn \zhnum_number_item:nn
+ { \zhnum_number_item_aux:nNNNN {#2} #1 \q_recursion_stop }
+\cs_new_nopar:Nn \zhnum_number_item_aux:nNNNN
{
- \zhnum_number_item_aux:nN {#2} #1
- \q_recursion_tail
- \prg_break_point:n { }
- }
-\cs_new_nopar:Nn \zhnum_number_item_aux:nN
- {
- \quark_if_recursion_tail_break:n {#2}
- \int_compare:nNnTF {#1} = \c_one
- { \zhnum_recursion_break:NNNNw #2 }
- { \zhnum_number_item_aux:fN { \int_eval:n { #1 - \c_one } } }
+ \int_compare:nNnTF {#1} = \c_zero
+ { \zhnum_recursion_stop:NNNNw #2#3#4#5 }
+ { \zhnum_number_item_aux:fNNNN { \int_eval:n { #1 - \c_one } } }
}
-\cs_generate_variant:Nn \zhnum_number_item_aux:nN { f }
-\cs_new_nopar:Npn \zhnum_recursion_break:NNNNw #1#2#3#4#5 \prg_break_point:n #6 {#1#2#3#4}
+\cs_generate_variant:Nn \zhnum_number_item_aux:nNNNN { f }
+\cs_new_nopar:Npn \zhnum_recursion_stop:NNNNw #1#2#3#4#5 \q_recursion_stop {#1#2#3#4}
% \end{macrocode}
% \end{macro}
%
@@ -607,55 +677,43 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% 对四位数字按情况进行处理。
% \begin{macrocode}
\cs_new_nopar:Nn \zhnum_process_number:NNn
- {
- \zhnum_process_number:ffffNN
- { \int_mod:nn {#3} \c_ten }
- { \int_mod:nn { \int_div_truncate:nn {#3} \c_ten } \c_ten }
- { \int_mod:nn { \int_div_truncate:nn {#3} \c_one_hundred } \c_ten }
- { \int_div_truncate:nn {#3} \c_one_thousand }
- {#1} {#2}
- }
+ { \zhnum_process_number:NNNNNN #3#1#2 }
\cs_new_nopar:Nn \zhnum_process_number:NNNNNN
{
- \int_compare:nNnTF {#4} = \c_zero
- { \bool_if:NF #6 { \zhnum_digit_map:n \c_zero } }
- { \zhnum_digit_map:n {#4} \zhnum_digit_map:n \c_one_thousand }
- \int_compare:nNnTF {#3} = \c_zero
- { \int_compare:nNnT { #4 * (#2#1) } > \c_zero { \zhnum_digit_map:n \c_zero } }
+ \int_compare:nNnTF {#1} = \c_zero
+ { \bool_if:NF #6 { \c_zhnum_zero_tl } }
+ { \zhnum_digit_map:n {#1} \c_zhnum_thousand_tl }
+ \int_compare:nNnTF {#2} = \c_zero
+ { \int_compare:nNnT { #1 * (#3#4) } > \c_zero { \c_zhnum_zero_tl } }
{
\bool_if:nTF
- { \l_zhnum_ancient_bool && \int_compare_p:nNn {#3} = \c_two }
- { \zhnum_digit_map:n { #3 * \c_one_hundred } }
- { \zhnum_digit_map:n {#3} \zhnum_digit_map:n \c_one_hundred }
+ { \l_zhnum_ancient_bool && \int_compare_p:nNn {#2} = \c_two }
+ { \zhnum_digit_map:n { #2 00 } }
+ { \zhnum_digit_map:n {#2} \c_zhnum_hundred_tl }
}
- \int_compare:nNnTF {#2} = \c_zero
- { \int_compare:nNnT { #3 * #1 } > \c_zero { \zhnum_digit_map:n \c_zero } }
+ \int_compare:nNnTF {#3} = \c_zero
+ { \int_compare:nNnT { #2 * #4 } > \c_zero { \c_zhnum_zero_tl } }
{
\bool_if:nF
{
- \int_compare_p:nNn {#2} = \c_one &&
- \int_compare_p:nNn {#4#3} = \c_zero && #6 && #5
+ \int_compare_p:nNn {#3} = \c_one &&
+ \int_compare_p:nNn {#1#2} = \c_zero && #6 && #5
}
{
\bool_if:nTF
{
\l_zhnum_ancient_bool &&
- ( \int_compare_p:nNn {#2} = \c_two ||
- \int_compare_p:nNn {#2} = \c_three ||
- \int_compare_p:nNn {#2} = \c_four )
+ ( \int_compare_p:nNn {#3} = \c_two ||
+ \int_compare_p:nNn {#3} = \c_three ||
+ \int_compare_p:nNn {#3} = \c_four )
}
- {
- \zhnum_digit_map:n { #2 * \c_ten }
- \use_none:nn
- }
- { \zhnum_digit_map:n {#2} }
+ { \zhnum_digit_map:n { #3 0 } \use_none:n }
+ { \zhnum_digit_map:n {#3} }
}
- \zhnum_digit_map:n \c_ten
+ \c_zhnum_ten_tl
}
- \int_compare:nNnF {#1} = \c_zero { \zhnum_digit_map:n {#1} }
+ \int_compare:nNnF {#4} = \c_zero { \zhnum_digit_map:n {#4} }
}
-\cs_generate_variant:Nn \zhnum_process_number:NNn { NNf }
-\cs_generate_variant:Nn \zhnum_process_number:NNNNNN { ffff }
% \end{macrocode}
% \end{macro}
%
@@ -673,33 +731,30 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
\IfNoValueTF {#1} { \tl_map_function:fN {#2} #3 }
{ \group_begin: \zhnumsetup {#1} \tl_map_function:fN {#2} #3 \group_end: }
}
-\cs_generate_variant:Nn \tl_map_function:nN { f }
+\cs_new_nopar:Nn \zhnum_digits_null:n { \tl_map_function:fN {#1} \zhnum_digits_null_aux:N }
+\cs_generate_variant:Nn \zhnum_digits_null:n { V }
+\cs_generate_variant:Nn \tl_map_function:nN { f }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]
-% {\zhnum_digits_null_aux:N,\zhnum_digits_zero_aux:N,\zhnum_digits_aux:nn}
+% {\zhnum_digits_null_aux:N,\zhnum_digits_zero_aux:N,\zhnum_digits_aux:NN}
% 将输入的数字输出为中文数字串输出。
% \begin{macrocode}
-\cs_new_nopar:Nn \zhnum_digits_null_aux:N { \zhnum_digits_aux:nn \c_zhnum_null_int {#1} }
-\cs_new_nopar:Nn \zhnum_digits_zero_aux:N { \zhnum_digits_aux:nn \c_zero {#1} }
-\cs_new_nopar:Nn \zhnum_digits_aux:nn
+\cs_new_nopar:Nn \zhnum_digits_null_aux:N { \zhnum_digits_aux:NN \c_true_bool #1 }
+\cs_new_nopar:Nn \zhnum_digits_zero_aux:N { \zhnum_digits_aux:NN \c_false_bool #1 }
+\cs_new_nopar:Nn \zhnum_digits_aux:NN
{
- \str_if_eq:xxF {#2} \c_zhnum_separator_tl
+ \str_if_eq_x:nnTF {#2} . \c_zhnum_dot_tl
{
- \str_if_eq:xxTF {#2} . \c_zhnum_dot_tl
+ \str_if_eq_x:nnTF {#2} -
+ { \c_zhnum_minus_tl }
{
- \zhnum_digit_map:n
+ \zhnum_if_number:NT {#2}
{
- \str_if_eq:xxTF {#2} - \c_minus_one
- {
- \bool_if:nTF
- {
- \int_compare_p:nNn {#2} = \c_zero &&
- \int_compare_p:nNn {#1} = \c_zhnum_null_int
- }
- { \c_zhnum_null_int } {#2}
- }
+ \bool_if:nTF { \int_compare_p:nNn {#2} = \c_zero }
+ { \bool_if:NTF #1 \c_zhnum_null_tl \c_zhnum_zero_tl }
+ { \zhnum_digit_map:n {#2} }
}
}
}
@@ -707,69 +762,241 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\c_zhnum_null_int}
-% 设置“〇”对应的阿拉伯数字。
+% \begin{macro}{\zhdate}
+% 输出中文日期。
% \begin{macrocode}
-\int_const:Nn \c_zhnum_null_int { -10 }
+\DeclareExpandableDocumentCommand \zhdate { s m }
+ {
+ \zhnum_date:w #2 \q_stop
+ \IfBooleanT {#1} { \zhweekday {#2} }
+ }
+\cs_new_nopar:Npn \zhnum_date:w #1/#2/#3 \q_stop
+ {
+ \zhnum_check_time:Nn \zhnum_digits_null:n {#1} \c_zhnum_year_tl
+ \zhnum_check_time:Nn \zhnum_integer:f {#2} \c_zhnum_month_tl
+ \zhnum_check_time:Nn \zhnum_integer:f {#3} \c_zhnum_day_tl
+ }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\zhnum_digit_map:n}
-% 阿拉伯数字与中文数字的映射。
+% \begin{macro}{\zhtoday}
+% 输出当天日期。
% \begin{macrocode}
-\cs_new_nopar:Nn \zhnum_digit_map:n
+\cs_new_nopar:Npn \zhtoday
{
- \prg_case_int:nnn {#1}
+ \zhnum_check_time:Nn \zhnum_digits_null:V \tex_year:D \c_zhnum_year_tl
+ \zhnum_check_time:Nn \zhnum_integer:V \tex_month:D \c_zhnum_month_tl
+ \zhnum_check_time:Nn \zhnum_integer:V \tex_day:D \c_zhnum_day_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_check_time:Nn}
+% 判断是用中文数字还是用阿拉伯数组。
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_check_time:Nn
+ { \bool_if:NTF \l_zhnum_time_bool {#1} { \int_eval:n } {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhweekday}
+% 输出星期
+% \begin{macrocode}
+\cs_new_nopar:Npn \zhweekday #1 { \zhnum_week_day:w #1 \q_stop }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_Zeller:nnn,\zhnum_Zeller_aux:Nnnn,\zhnum_two_digits:n}
+% 用 Zeller 公式\footnote{\url{http://en.wikipedia.org/wiki/Zeller's_congruence}}
+% 计算星期几。
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_Zeller:nnn
+ {
+ \int_compare:nNnTF
+ { #1 \zhnum_two_digits:n {#2} \zhnum_two_digits:n {#3} } > { 1582 10 04 }
+ { \zhnum_Zeller_aux:Nnnn \zhnum_Zeller_Gregorian:nnn }
+ { \zhnum_Zeller_aux:Nnnn \zhnum_Zeller_Julian:nnn }
+ {#1} {#2} {#3}
+ }
+\cs_new_nopar:Nn \zhnum_Zeller_aux:Nnnn
+ {
+ \int_compare:nNnTF {#3} < \c_three
+ { #1 { #2 - \c_one } { #3 + \c_twelve } {#4} }
+ { #1 {#2} {#3} {#4} }
+ }
+\cs_new_nopar:Nn \zhnum_two_digits:n
+ {
+ \int_compare:nNnT {#1} < \c_ten { 0 }
+ \int_eval:n {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_Zeller_Gregorian:nnn}
+% 格里历(\zhdate{1582/10/15}及以后)的计算公式
+% \[
+% h = \biggl(q + \biggl\lfloor\frac{26(m+1)}{10}\biggr\rfloor + Y +
+% \biggl\lfloor\frac Y4\biggr\rfloor + 6\biggl\lfloor\frac Y{100}\biggr\rfloor
+% + \biggl\lfloor\frac Y{400}\biggr\rfloor\biggr) \pmod 7
+% \]
+% 其中 $Y$ 为年,$m$ 为月,$q$ 为日;若 $m=1,2$,则令 $m\mathbin{{+}{=}}12$,同时 $Y\mathop{--}{}$。
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_Zeller_Gregorian:nnn
+ {
+ \int_mod:nn
{
- { \c_minus_one } { \c_zhnum_minus_tl }
- { \c_zero } { \c_zhnum_zero_tl }
- { \c_one } { \c_zhnum_one_tl }
- { \c_two } { \c_zhnum_two_tl }
- { \c_three } { \c_zhnum_three_tl }
- { \c_four } { \c_zhnum_four_tl }
- { \c_five } { \c_zhnum_five_tl }
- { \c_six } { \c_zhnum_six_tl }
- { \c_seven } { \c_zhnum_seven_tl }
- { \c_eight } { \c_zhnum_eight_tl }
- { \c_nine } { \c_zhnum_nine_tl }
- { \c_ten } { \c_zhnum_ten_tl }
- { \c_one_hundred } { \c_zhnum_hundred_tl }
- { \c_one_thousand } { \c_zhnum_thousand_tl }
- { \c_zhnum_null_int } { \c_zhnum_null_tl }
- { 20 } { \c_zhnum_twenty_tl }
- { 30 } { \c_zhnum_thirty_tl }
- { 40 } { \c_zhnum_forty_tl }
- { 200 } { \c_zhnum_two_hundred_tl }
+ \int_eval:n {#3}
+ + \int_div_truncate:nn { 26 * ( \int_eval:n {#2} + \c_one ) } \c_ten
+ + \int_eval:n {#1}
+ + \int_div_truncate:nn {#1} \c_four
+ + \c_six * \int_div_truncate:nn {#1} \c_one_hundred
+ + \int_div_truncate:nn {#1} { 400 }
}
- { \prg_do_nothing: }
+ { \c_seven }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\zhnum_scale_map:n}
+% \begin{macro}[internal]{\zhnum_Zeller_Julian:nnn}
+% 儒略历(\zhdate{1582/10/04}及以前)的计算公式
+% \[
+% h = \biggl(q + \biggl\lfloor\frac{26(m+1)}{10}\biggr\rfloor + Y +
+% \biggl\lfloor\frac Y4\biggr\rfloor + 5\biggr) \pmod 7
+% \]
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_Zeller_Julian:nnn
+ {
+ \int_mod:nn
+ {
+ \int_eval:n {#3}
+ + \int_div_truncate:nn { 26 * ( \int_eval:n {#2} + \c_one ) } \c_ten
+ + \int_eval:n {#1}
+ + \int_div_truncate:nn {#1} \c_four
+ + \c_five
+ }
+ { \c_seven }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_week_day:w}
+% 用 Zeller 公式计算的结果 $h$ 与实际星期的关系是 $d=h+5\pmod7+1$。
+% \begin{macrocode}
+\cs_new_nopar:Npn \zhnum_week_day:w #1/#2/#3 \q_stop
+ {
+ \if_case:w \int_eval:n { \zhnum_Zeller:nnn {#1} {#2} {#3} } \exp_stop_f:
+ \c_zhnum_sat_tl
+ \or: \c_zhnum_sun_tl
+ \or: \c_zhnum_mon_tl
+ \or: \c_zhnum_tue_tl
+ \or: \c_zhnum_wed_tl
+ \or: \c_zhnum_thu_tl
+ \or: \c_zhnum_fri_tl
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhtime}
+% 输出时间。
+% \begin{macrocode}
+\cs_new_nopar:Npn \zhtime #1 { \zhnum_time:w #1 \q_stop }
+\group_begin:
+\char_set_lccode:nn { `\; } { `\: }
+\tl_to_lowercase:n
+ {
+ \group_end:
+ \cs_new_nopar:Npn \zhnum_time:w #1 ; #2 \q_stop
+ {
+ \zhnum_check_time:Nn \zhnum_integer:f {#1} \c_zhnum_hour_tl
+ \zhnum_check_time:Nn \zhnum_integer:f {#2} \c_zhnum_minute_tl
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhcurrtime}
+% 输出当前时间。
+% \begin{macrocode}
+\cs_new_nopar:Npn \zhcurrtime
+ {
+ \zhnum_check_time:Nn \zhnum_integer:f
+ { \int_div_truncate:nn \tex_time:D { 60 } } \c_zhnum_hour_tl
+ \zhnum_check_time:Nn \zhnum_integer:f
+ { \int_mod:nn \tex_time:D { 60 } } \c_zhnum_minute_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_digit_map:n}
+% 阿拉伯数字与中文数字的映射。
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_digit_map:n
+ { \tl_use:c { c_zhnum_ \zhnum_int_to_word:n {#1} _tl } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_scale_map:n,\zhnum_scale_map_loop:n}
% 大数系统的映射。
% \begin{macrocode}
\cs_new_nopar:Nn \zhnum_scale_map:n
{
- \prg_case_int:nnn {#1}
+ \cs_if_exist_use:cF { c_zhnum_scale_ \zhnum_int_to_word:n {#1} _tl }
+ { \zhnum_scale_map_hook:n {#1} }
+ }
+\cs_new_nopar:Nn \zhnum_scale_map_loop:n
+ { \zhnum_scale_map:n { \int_mod:nn {#1} \g_zhnum_scale_int } }
+\int_new:N \g_zhnum_scale_int
+\int_set_eq:NN \g_zhnum_scale_int \c_eleven
+\cs_new_eq:NN \zhnum_scale_map_hook:n \zhnum_scale_map_loop:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\zhnumExtendScaleMap}
+% \begin{macrocode}
+\NewDocumentCommand \zhnumExtendScaleMap { > { \TrimSpaces } o m }
+ {
+ \int_zero:N \l_tmpa_int
+ \clist_map_inline:nn {#2}
{
- { \c_zero } { \c_zhnum_scale_zero_tl }
- { \c_one } { \c_zhnum_scale_one_tl }
- { \c_two } { \c_zhnum_scale_two_tl }
- { \c_three } { \c_zhnum_scale_three_tl }
- { \c_four } { \c_zhnum_scale_four_tl }
- { \c_five } { \c_zhnum_scale_five_tl }
- { \c_six } { \c_zhnum_scale_six_tl }
- { \c_seven } { \c_zhnum_scale_seven_tl }
- { \c_eight } { \c_zhnum_scale_eight_tl }
- { \c_nine } { \c_zhnum_scale_nine_tl }
- { \c_ten } { \c_zhnum_scale_ten_tl }
- { \c_eleven } { \c_zhnum_scale_eleven_tl }
+ \int_incr:N \l_tmpa_int
+ \tl_set:Nx \l_tmpa_tl
+ { c_zhnum_scale_ \zhnum_int_to_word:n { \l_tmpa_int + \c_eleven } _tl }
+ \tl_if_exist:cF \l_tmpa_tl { \int_incr:N \g_zhnum_scale_int }
+ \tl_set:cn { \l_tmpa_tl } {##1}
}
- { \zhnum_scale_map_hook:n {#1} }
+ \IfValueT {#1} { \cs_set:Nn \zhnum_scale_map_hook:n {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\zhnum_int_to_word:n}
+% 将整数转换成英文单词。
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_int_to_word:n
+ {
+ \if_case:w \int_eval:n {#1} \exp_stop_f:
+ zero
+ \or: one
+ \or: two
+ \or: three
+ \or: four
+ \or: five
+ \or: six
+ \or: seven
+ \or: eight
+ \or: nine
+ \or: ten
+ \or: eleven
+ \else:
+ \int_case:nnn {#1}
+ {
+ { 20 } { twenty } { 30 } { thirty }
+ { 40 } { forty } { 200 } { two_hundred }
+ }
+ { \int_to_roman:n {#1} }
+ \fi:
}
-\cs_new_nopar:Nn \zhnum_scale_map_hook:n
- { \zhnum_scale_map:n { \int_mod:nn {#1} \c_eleven } }
% \end{macrocode}
% \end{macro}
@@ -777,43 +1004,118 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% \begin{macrocode}
\keys_define:nn { zhnum / options }
{
- - .tl_set:N = \c_zhnum_minus_tl ,
- -0 .tl_set:N = \c_zhnum_null_tl ,
- 0 .tl_set:N = \c_zhnum_zero_tl ,
- 1 .tl_set:N = \c_zhnum_one_tl ,
- 2 .tl_set:N = \c_zhnum_two_tl ,
- 3 .tl_set:N = \c_zhnum_three_tl ,
- 4 .tl_set:N = \c_zhnum_four_tl ,
- 5 .tl_set:N = \c_zhnum_five_tl ,
- 6 .tl_set:N = \c_zhnum_six_tl ,
- 7 .tl_set:N = \c_zhnum_seven_tl ,
- 8 .tl_set:N = \c_zhnum_eight_tl ,
- 9 .tl_set:N = \c_zhnum_nine_tl ,
- 10 .tl_set:N = \c_zhnum_ten_tl ,
- 20 .tl_set:N = \c_zhnum_twenty_tl ,
- 30 .tl_set:N = \c_zhnum_thirty_tl ,
- 40 .tl_set:N = \c_zhnum_forty_tl ,
- 200 .tl_set:N = \c_zhnum_two_hundred_tl ,
- E2 .tl_set:N = \c_zhnum_hundred_tl ,
- E3 .tl_set:N = \c_zhnum_thousand_tl ,
- E4 .tl_set:N = \c_zhnum_scale_one_tl ,
- E8 .tl_set:N = \c_zhnum_scale_two_tl ,
- E12 .tl_set:N = \c_zhnum_scale_three_tl ,
- E16 .tl_set:N = \c_zhnum_scale_four_tl ,
- E20 .tl_set:N = \c_zhnum_scale_five_tl ,
- E24 .tl_set:N = \c_zhnum_scale_six_tl ,
- E28 .tl_set:N = \c_zhnum_scale_seven_tl ,
- E32 .tl_set:N = \c_zhnum_scale_eight_tl ,
- E36 .tl_set:N = \c_zhnum_scale_nine_tl ,
- E40 .tl_set:N = \c_zhnum_scale_ten_tl ,
- E44 .tl_set:N = \c_zhnum_scale_eleven_tl ,
+ - .tl_set:N = \l_zhnum_minus_tl ,
+ -0 .tl_set:N = \l_zhnum_null_tl ,
+ E2 .tl_set:N = \l_zhnum_hundred_tl ,
+ E3 .tl_set:N = \l_zhnum_thousand_tl ,
+ FE2 .tl_set:N = \l_zhnum_financial_hundred_tl ,
+ FE3 .tl_set:N = \l_zhnum_financial_thousand_tl ,
+ }
+\clist_map_inline:nn
+ { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 20 , 30 , 40 , 200 }
+ {
+ \keys_define:nn { zhnum / options }
+ { #1 .tl_set:c = { l_zhnum_ \zhnum_int_to_word:n {#1} _tl } }
+ \int_compare:nNnF {#1} > \c_ten
+ {
+ \keys_define:nn { zhnum / options }
+ { F#1 .tl_set:c = { l_zhnum_financial_ \zhnum_int_to_word:n {#1} _tl } }
+ }
}
+\clist_map_inline:nn
+ { 4 , 8 , 12 , 16 , 20 , 24 , 28 , 32 , 36 , 40 , 44 }
+ {
+ \keys_define:nn { zhnum / options }
+ { E#1 .tl_set:c = { l_zhnum_scale_ \zhnum_int_to_word:n { #1 / 4 } _tl } }
+ }
+\clist_map_inline:nn
+ {
+ dot , and , parts , year , month , day , weekday , hour , minute
+ mon , tue , wed , thu , fri , sat , sun
+ }
+ { \keys_define:nn { zhnum / options } { #1 .tl_set:c = { l_zhnum_ #1 _tl } } }
% \end{macrocode}
%
+% \begin{macro}[internal]
+% {\zhnum_parse_config:,\zhnum_check_simp:nn,\zhnum_check_financial:nn,
+% \zhnum_set_zero:,\zhnum_set_week_day:}
+% 将配置文件中的中文数字保存起来。
+% \begin{macrocode}
+\cs_new_nopar:Nn \zhnum_parse_config:
+ {
+ \prop_map_function:NN \g_zhnum_cfg_map_prop \zhnum_check_simp:nn
+ \prop_map_function:NN \g_zhnum_cfg_map_prop \zhnum_check_financial:nn
+ \zhnum_set_zero:
+ \zhnum_set_week_day:
+ }
+\cs_new_nopar:Nn \zhnum_check_simp:nn
+ {
+ \zhnum_check_simp_aux:nn {#1} {#2}
+ \prop_get:NnNT \g_zhnum_cfg_map_finan_prop {#1} \l_tmpa_tl
+ { \exp_args:NnV \zhnum_check_simp_aux:nn { financial_ #1 } \l_tmpa_tl }
+ }
+\cs_new_nopar:Nn \zhnum_check_simp_aux:nn
+ {
+ \prop_get:NnNTF \g_zhnum_cfg_map_var_prop { #1 _trad } \l_tmpa_tl
+ {
+ \prop_get:NnNTF \g_zhnum_cfg_map_var_prop { #1 _simp } \l_tmpb_tl
+ {
+ \tl_set:cx { l_zhnum_ #1 _tl }
+ {
+ \exp_not:n { \bool_if:NTF \l_zhnum_simp_bool }
+ { \exp_not:V \l_tmpb_tl } { \exp_not:V \l_tmpa_tl }
+ }
+ }
+ {
+ \tl_set:cx { l_zhnum_ #1 _tl }
+ {
+ \exp_not:n { \bool_if:NTF \l_zhnum_simp_bool }
+ { \exp_not:n {#2} } { \exp_not:V \l_tmpa_tl }
+ }
+ }
+ }
+ { \tl_set:cn { l_zhnum_ #1 _tl } {#2} }
+ }
+\cs_new_nopar:Nn \zhnum_check_financial:nn
+ {
+ \prop_get:NnNTF \g_zhnum_cfg_map_finan_prop {#1} \l_tmpa_tl
+ {
+ \tl_set:cx { c_zhnum_ #1 _tl }
+ {
+ \exp_not:n { \bool_if:NTF \l_zhnum_normal_bool }
+ { \exp_not:c { l_zhnum_ #1 _tl } }
+ { \exp_not:c { l_zhnum_financial_ #1 _tl } }
+ }
+ }
+ { \tl_set:cx { c_zhnum_ #1 _tl } { \exp_not:c { l_zhnum_ #1 _tl } } }
+ }
+\cs_new_nopar:Nn \zhnum_set_zero:
+ {
+ \tl_set:Nx \l_zhnum_zero_tl
+ {
+ \exp_not:n { \bool_if:nTF \l_zhnum_null_bool }
+ { \exp_not:V \l_zhnum_null_tl } { \exp_not:V \l_zhnum_zero_tl }
+ }
+ }
+\cs_new_nopar:Nn \zhnum_set_week_day:
+ {
+ \tl_set:Nx \l_zhnum_mon_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_one_tl }
+ \tl_set:Nx \l_zhnum_tue_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_two_tl }
+ \tl_set:Nx \l_zhnum_wed_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_three_tl }
+ \tl_set:Nx \l_zhnum_thu_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_four_tl }
+ \tl_set:Nx \l_zhnum_fri_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_five_tl }
+ \tl_set:Nx \l_zhnum_sat_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_six_tl }
+ \tl_set:Nx \l_zhnum_sun_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_day_tl }
+ \clist_map_inline:nn { mon , tue , wed , thu , fri , sat , sun }
+ { \tl_set:cx { c_zhnum_ ##1 _tl } { \exp_not:c { l_zhnum_ ##1 _tl } } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[internal]{\zhnum_load_cfg:}
% 根据选定编码载入配置文件。
% \begin{macrocode}
-\cs_new:Nn \zhnum_load_cfg:
+\cs_new:Nn \zhnum_load_cfg:n
{
\cs_if_exist:NT \CJK@makeActive
{
@@ -821,47 +1123,93 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
{ \bool_set_false:N \l_zhnum_set_CJK_active_bool }
{ \bool_set_true:N \l_zhnum_set_CJK_active_bool \CJK@makeActive }
}
- \file_input:n { zhnumber - \bool_if:NTF \g_zhnum_gbk_bool { gbk } { utf8 } .cfg }
+ \prop_clear:N \g_zhnum_cfg_map_prop
+ \prop_clear:N \g_zhnum_cfg_map_var_prop
+ \prop_clear:N \g_zhnum_cfg_map_finan_prop
+ \file_input:n { zhnumber - #1 .cfg }
+ \zhnum_parse_config:
\bool_if:nT { \cs_if_exist_p:N \CJK@makeInactive && \l_zhnum_set_CJK_active_bool }
{ \CJK@makeInactive }
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[internal]
+% {\zhnum_set_digits_map:nn,\zhnum_set_digits_map:nnn,
+% \zhnum_set_financial_map:nn,\zhnum_set_financial_map:nnn}
+% \begin{macrocode}
+\cs_new_protected_nopar:Nn \zhnum_set_digits_map:nn
+ { \prop_put:Nnn \g_zhnum_cfg_map_prop {#1} {#2} }
+\cs_new_protected_nopar:Nn \zhnum_set_digits_map:nnn
+ {
+ \prop_put_if_new:Nnn \g_zhnum_cfg_map_prop {#1} {#3}
+ \prop_put:Nnn \g_zhnum_cfg_map_var_prop {#1_#2} {#3}
+ }
+\cs_new_protected_nopar:Nn \zhnum_set_financial_map:nn
+ { \prop_put:Nnn \g_zhnum_cfg_map_finan_prop {#1} {#2} }
+\cs_new_protected_nopar:Nn \zhnum_set_financial_map:nnn
+ {
+ \prop_put_if_new:Nnn \g_zhnum_cfg_map_finan_prop {#1} {#3}
+ \prop_put:Nnn \g_zhnum_cfg_map_var_prop { financial_#1_#2 } {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {\g_zhnum_cfg_map_prop,\g_zhnum_cfg_map_var_prop,\g_zhnum_cfg_map_finan_prop}
+% \begin{macrocode}
+\prop_new:N \g_zhnum_cfg_map_prop
+\prop_new:N \g_zhnum_cfg_map_var_prop
+\prop_new:N \g_zhnum_cfg_map_finan_prop
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{encoding,style,null,reset}
% 宏包设置选项。
% \begin{macrocode}
\keys_define:nn { zhnum / options }
{
- encoding .choice: ,
- encoding / UTF8 .code:n = { \bool_gset_false:N \g_zhnum_gbk_bool \zhnum_load_cfg: } ,
- encoding / GBK .code:n = { \bool_gset_true:N \g_zhnum_gbk_bool \zhnum_load_cfg: } ,
- encoding .default:n = { GBK } ,
+ encoding .choice_code:n =
+ {
+ \tl_gset:Nx \c_zhnum_encoding_tl
+ { \exp_args:NV \tl_expandable_lowercase:n \l_keys_choice_tl }
+ \zhnum_load_cfg:n { \c_zhnum_encoding_tl }
+ } ,
+ encoding .generate_choices:n = { UTF8 , GBK , Big5 } ,
+ encoding .default:n = { GBK } ,
+ encoding / Bg5 .meta:n = { encoding = Big5 } ,
+ encoding / unknown .code:n =
+ { \msg_error:nnx { zhnumber } { encoding-invalid } { \l_keys_value_tl } } ,
style .multichoice: ,
- style / Normal .code:n =
+ style / Normal .code:n =
{
\bool_set_false:N \l_zhnum_ancient_bool
\bool_set_true:N \l_zhnum_normal_bool
} ,
- style / Financial .code:n =
+ style / Financial .code:n =
{
\bool_set_false:N \l_zhnum_ancient_bool
\bool_set_false:N \l_zhnum_normal_bool
} ,
- style / Ancient .code:n =
+ style / Ancient .code:n =
{
\bool_set_true:N \l_zhnum_ancient_bool
\bool_set_true:N \l_zhnum_normal_bool
} ,
- style / Simplified .code:n = { \bool_set_true:N \l_zhnum_simp_bool } ,
- style / Traditional .code:n = { \bool_set_false:N \l_zhnum_simp_bool } ,
- style .default:n = { Normal , Simplified } ,
- null .bool_set:N = \l_zhnum_null_bool ,
- reset .code:n = \zhnum_load_cfg: ,
- dot .tl_set:N = \c_zhnum_dot_tl ,
- and .tl_set:N = \c_zhnum_and_tl ,
- parts .tl_set:N = \c_zhnum_over_tl ,
- separator .tl_set:N = \c_zhnum_separator_tl ,
+ style / Simplified .code:n = { \bool_set_true:N \l_zhnum_simp_bool } ,
+ style / Traditional .code:n = { \bool_set_false:N \l_zhnum_simp_bool } ,
+ style .default:n = { Normal , Simplified } ,
+ null .bool_set:N = \l_zhnum_null_bool ,
+ time .choice: ,
+ time / Chinese .code:n = { \bool_set_true:N \l_zhnum_time_bool } ,
+ time / Arabic .code:n = { \bool_set_false:N \l_zhnum_time_bool } ,
+ time .default:n = { Arabic } ,
+ reset .code:n = { \zhnum_load_cfg:n { \c_zhnum_encoding_tl } } ,
+ }
+\msg_new:nnn { zhnumber } { encoding-invalid }
+ {
+ The~encoding~'#1'~is~invalid,~please~check~it~over.\\\\
+ Available~encoding~are~'UTF8',~'GBK'~and~'Big5'.\\
}
% \end{macrocode}
% \end{macro}
@@ -879,14 +1227,14 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
%
% 初始化设置和执行宏包选项。
% \begin{macrocode}
-\keys_set:nn { zhnum / options } { style , null = false , separator = {,} }
+\keys_set:nn { zhnum / options } { style , time }
\ProcessKeysOptions { zhnum / options }
% \end{macrocode}
%
% 如果没有选定编码,则根据引擎自动设置编码。
% \begin{macrocode}
\ExplSyntaxOn
-\bool_if_exist:NF \g_zhnum_gbk_bool
+\tl_if_exist:NF \c_zhnum_encoding_tl
{
\exp_args:Nnx \keys_set:nn { zhnum / options }
{
@@ -904,48 +1252,124 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
%</package>
% \end{macrocode}
%
-% \section{中文数字设置}
+% \section{中文数字配置文件}
% \label{sec:zhnum-map}
%
% \begin{macrocode}
-%<*config-gbk|config-utf8>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\tl_set:Nn \c_zhnum_minus_tl { \bool_if:NTF \l_zhnum_simp_bool { 负 } { 負 } }
-\tl_set:Nn \c_zhnum_zero_tl { \bool_if:nTF \l_zhnum_null_bool \c_zhnum_null_tl { 零 } }
-\tl_set:Nn \c_zhnum_null_tl { \bool_if:NTF \l_zhnum_normal_bool { 〇 } { 零 } }
-\tl_set:Nn \c_zhnum_one_tl { \bool_if:NTF \l_zhnum_normal_bool { 一 } { 壹 } }
-\tl_set:Nn \c_zhnum_two_tl { \bool_if:NTF \l_zhnum_normal_bool { 二 } { \bool_if:NTF \l_zhnum_simp_bool { 贰 } { 貳 } } }
-\tl_set:Nn \c_zhnum_three_tl { \bool_if:NTF \l_zhnum_normal_bool { 三 } { \bool_if:NTF \l_zhnum_simp_bool { 叁 } { 叄 } } }
-\tl_set:Nn \c_zhnum_four_tl { \bool_if:NTF \l_zhnum_normal_bool { 四 } { 肆 } }
-\tl_set:Nn \c_zhnum_five_tl { \bool_if:NTF \l_zhnum_normal_bool { 五 } { 伍 } }
-\tl_set:Nn \c_zhnum_six_tl { \bool_if:NTF \l_zhnum_normal_bool { 六 } { \bool_if:NTF \l_zhnum_simp_bool { 陆 } { 陸 } } }
-\tl_set:Nn \c_zhnum_seven_tl { \bool_if:NTF \l_zhnum_normal_bool { 七 } { 柒 } }
-\tl_set:Nn \c_zhnum_eight_tl { \bool_if:NTF \l_zhnum_normal_bool { 八 } { 捌 } }
-\tl_set:Nn \c_zhnum_nine_tl { \bool_if:NTF \l_zhnum_normal_bool { 九 } { 玖 } }
-\tl_set:Nn \c_zhnum_ten_tl { \bool_if:NTF \l_zhnum_normal_bool { 十 } { 拾 } }
-\tl_set:Nn \c_zhnum_hundred_tl { \bool_if:NTF \l_zhnum_normal_bool { 百 } { 佰 } }
-\tl_set:Nn \c_zhnum_thousand_tl { \bool_if:NTF \l_zhnum_normal_bool { 千 } { 仟 } }
-\tl_set:Nn \c_zhnum_twenty_tl { 廿 }
-\tl_set:Nn \c_zhnum_thirty_tl { 卅 }
-\tl_set:Nn \c_zhnum_forty_tl { 卌 }
-\tl_set:Nn \c_zhnum_two_hundred_tl { 皕 }
-\tl_set:Nn \c_zhnum_dot_tl { \bool_if:NTF \l_zhnum_simp_bool { 点 } { 點 } }
-\tl_set:Nn \c_zhnum_and_tl { 又 }
-\tl_set:Nn \c_zhnum_over_tl { 分之 }
-\tl_set:Nn \c_zhnum_scale_zero_tl { }
-\tl_set:Nn \c_zhnum_scale_one_tl { \bool_if:NTF \l_zhnum_simp_bool { 万 } { 萬 } }
-\tl_set:Nn \c_zhnum_scale_two_tl { \bool_if:NTF \l_zhnum_simp_bool { 亿 } { 億 } }
-\tl_set:Nn \c_zhnum_scale_three_tl { 兆 }
-\tl_set:Nn \c_zhnum_scale_four_tl { 京 }
-\tl_set:Nn \c_zhnum_scale_five_tl { 垓 }
-\tl_set:Nn \c_zhnum_scale_six_tl { 秭 }
-\tl_set:Nn \c_zhnum_scale_seven_tl { 穰 }
-\tl_set:Nn \c_zhnum_scale_eight_tl { \bool_if:NTF \l_zhnum_simp_bool { 沟 } { 溝 } }
-\tl_set:Nn \c_zhnum_scale_nine_tl { \bool_if:NTF \l_zhnum_simp_bool { 涧 } { 澗 } }
-\tl_set:Nn \c_zhnum_scale_ten_tl { 正 }
-\tl_set:Nn \c_zhnum_scale_eleven_tl { \bool_if:NTF \l_zhnum_simp_bool { 载 } { 載 } }
+%<*config>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*!big5>
+\zhnum_set_digits_map:nnn { minus } { simp } { 负 }
+\zhnum_set_digits_map:nnn { minus } { trad } { 負 }
+%</!big5>
+%<*big5>
+\zhnum_set_digits_map:nn { minus } { 負 }
+%</big5>
+\zhnum_set_digits_map:nn { zero } { 零 }
+%<*!big5>
+\zhnum_set_digits_map:nn { null } { 〇 }
+%</!big5>
+%<*big5>
+\zhnum_set_digits_map:nn { null } { ○ }
+%</big5>
+\zhnum_set_digits_map:nn { one } { 一 }
+\zhnum_set_digits_map:nn { two } { 二 }
+\zhnum_set_digits_map:nn { three } { 三 }
+\zhnum_set_digits_map:nn { four } { 四 }
+\zhnum_set_digits_map:nn { five } { 五 }
+\zhnum_set_digits_map:nn { six } { 六 }
+\zhnum_set_digits_map:nn { seven } { 七 }
+\zhnum_set_digits_map:nn { eight } { 八 }
+\zhnum_set_digits_map:nn { nine } { 九 }
+\zhnum_set_digits_map:nn { ten } { 十 }
+\zhnum_set_digits_map:nn { hundred } { 百 }
+\zhnum_set_digits_map:nn { thousand } { 千 }
+\zhnum_set_digits_map:nn { twenty } { 廿 }
+\zhnum_set_digits_map:nn { thirty } { 卅 }
+\zhnum_set_digits_map:nn { forty } { 卌 }
+\zhnum_set_digits_map:nn { two_hundred } { 皕 }
+%<*!big5>
+\zhnum_set_digits_map:nnn { dot } { simp } { 点 }
+\zhnum_set_digits_map:nnn { dot } { trad } { 點 }
+%</!big5>
+%<*big5>
+\zhnum_set_digits_map:nn { dot } { 點 }
+%</big5>
+\zhnum_set_digits_map:nn { and } { 又 }
+\zhnum_set_digits_map:nn { parts } { 分之 }
+\zhnum_set_digits_map:nn { scale_zero } { }
+%<*!big5>
+\zhnum_set_digits_map:nnn { scale_one } { simp } { 万 }
+\zhnum_set_digits_map:nnn { scale_one } { trad } { 萬 }
+\zhnum_set_digits_map:nnn { scale_two } { simp } { 亿 }
+\zhnum_set_digits_map:nnn { scale_two } { trad } { 億 }
+%</!big5>
+%<*big5>
+\zhnum_set_digits_map:nn { scale_one } { 萬 }
+\zhnum_set_digits_map:nn { scale_two } { 億 }
+%</big5>
+\zhnum_set_digits_map:nn { scale_three } { 兆 }
+\zhnum_set_digits_map:nn { scale_four } { 京 }
+\zhnum_set_digits_map:nn { scale_five } { 垓 }
+\zhnum_set_digits_map:nn { scale_six } { 秭 }
+\zhnum_set_digits_map:nn { scale_seven } { 穰 }
+%<*!big5>
+\zhnum_set_digits_map:nnn { scale_eight } { simp } { 沟 }
+\zhnum_set_digits_map:nnn { scale_eight } { trad } { 溝 }
+\zhnum_set_digits_map:nnn { scale_nine } { simp } { 涧 }
+\zhnum_set_digits_map:nnn { scale_nine } { trad } { 澗 }
+%</!big5>
+%<*big5>
+\zhnum_set_digits_map:nn { scale_eight } { 澗 }
+%</big5>
+\zhnum_set_digits_map:nn { scale_ten } { 正 }
+%<*!big5>
+\zhnum_set_digits_map:nnn { scale_eleven } { simp } { 载 }
+\zhnum_set_digits_map:nnn { scale_eleven } { trad } { 載 }
+%</!big5>
+%<*big5>
+\zhnum_set_digits_map:nn { scale_eleven } { 載 }
+%</big5>
+\zhnum_set_digits_map:nn { year } { 年 }
+\zhnum_set_digits_map:nn { month } { 月 }
+\zhnum_set_digits_map:nn { day } { 日 }
+%<*!big5>
+\zhnum_set_digits_map:nnn { hour } { simp } { 时 }
+\zhnum_set_digits_map:nnn { hour } { trad } { 時 }
+%</!big5>
+%<*big5>
+\zhnum_set_digits_map:nn { hour } { 時 }
+%</big5>
+\zhnum_set_digits_map:nn { minute } { 分 }
+\zhnum_set_digits_map:nn { weekday } { 星期 }
+\zhnum_set_financial_map:nn { null } { 零 }
+\zhnum_set_financial_map:nn { zero } { 零 }
+\zhnum_set_financial_map:nn { one } { 壹 }
+\zhnum_set_financial_map:nn { two } { 貳 }
+%<*!big5>
+\zhnum_set_financial_map:nnn { three } { simp } { 叁 }
+\zhnum_set_financial_map:nnn { three } { trad } { 叄 }
+%</!big5>
+%<*big5>
+\zhnum_set_financial_map:nn { three } { 參 }
+%</big5>
+\zhnum_set_financial_map:nn { four } { 肆 }
+\zhnum_set_financial_map:nn { five } { 伍 }
+%<*!big5>
+\zhnum_set_financial_map:nnn { six } { simp } { 陆 }
+\zhnum_set_financial_map:nnn { six } { trad } { 陸 }
+%</!big5>
+%<*big5>
+\zhnum_set_financial_map:nn { six } { 陸 }
+%</big5>
+\zhnum_set_financial_map:nn { seven } { 柒 }
+\zhnum_set_financial_map:nn { eight } { 捌 }
+\zhnum_set_financial_map:nn { nine } { 玖 }
+\zhnum_set_financial_map:nn { ten } { 拾 }
+\zhnum_set_financial_map:nn { hundred } { 佰 }
+\zhnum_set_financial_map:nn { thousand } { 仟 }
% \end{macrocode}
%
% \begin{macrocode}
@@ -953,11 +1377,12 @@ and some specific Chinese Simplified fonts (TrueType or OpenType).
% \end{macrocode}
%
% \begin{macrocode}
-%</config-gbk|config-utf8>
+%</config>
% \end{macrocode}
%
% \end{implementation}
%
+% \PrintIndex
% \Finale
%
\endinput
diff --git a/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins b/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins
index f7cf9f41296..2631a321a1e 100644
--- a/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins
+++ b/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins
@@ -45,8 +45,9 @@
zhnumber.sty,
zhnumber-utf8.cfg,
zhnumber-gbk.cfg,
+ zhnumber-big5.cfg,
zhnumber.ins and
- README.txt.
+ README.
\endpostamble
\ifnum\shellescape=1 \else
\errmessage{
@@ -58,9 +59,12 @@
\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}}}
\usedir{tex/latex/zhnumber/config}
\generate{
- \file{\jobname-utf8.cfg}{\from{\jobname.dtx}{config-utf8}}
- \file{\jobname-gbk.cfg}{\from{\jobname.dtx}{config-gbk}}}
+ \file{\jobname-utf8.cfg}{\from{\jobname.dtx}{config,utf8}}
+ \file{\jobname-big5.cfg}{\from{\jobname.dtx}{config,big5}}
+ \file{\jobname-gbk.cfg}{\from{\jobname.dtx}{config,gbk}}}
+\immediate\write18{iconv -f utf-8 -t big-5 \jobname-big5.cfg > \jobname-big5.temp}
\immediate\write18{iconv -f utf-8 -t gbk \jobname-gbk.cfg > \jobname-gbk.temp}
+\immediate\write18{mv -f \jobname-big5.temp \jobname-big5.cfg}
\immediate\write18{mv -f \jobname-gbk.temp \jobname-gbk.cfg}
\endbatchfile
%%
@@ -69,7 +73,8 @@
%% zhnumber.sty,
%% zhnumber-utf8.cfg,
%% zhnumber-gbk.cfg,
+%% zhnumber-big5.cfg,
%% zhnumber.ins and
-%% README.txt.
+%% README.
%%
%% End of file `zhnumber.ins'.
diff --git a/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-big5.cfg b/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-big5.cfg
new file mode 100644
index 00000000000..77e0aa94e1c
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-big5.cfg
@@ -0,0 +1,91 @@
+%%
+%% This is file `zhnumber-big5.cfg',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% zhnumber.dtx (with options: `config,big5')
+%%
+%% Copyright (C) 2012 by Qing Lee <sobenlee@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 Qing Lee.
+%%
+\GetIdInfo$Id: zhnumber.dtx 351 2012-07-20 05:30:58Z sobenlee $
+ {Chinese numerals with Big5 encoding}
+\ProvidesExplFile
+ {\ExplFileName-big5.cfg}
+ {\ExplFileDate} {1.6} {\ExplFileDescription}
+\zhnum_set_digits_map:nn { minus } { t }
+\zhnum_set_digits_map:nn { zero } { s }
+\zhnum_set_digits_map:nn { null } { }
+\zhnum_set_digits_map:nn { one } { @ }
+\zhnum_set_digits_map:nn { two } { G }
+\zhnum_set_digits_map:nn { three } { T }
+\zhnum_set_digits_map:nn { four } { | }
+\zhnum_set_digits_map:nn { five } { }
+\zhnum_set_digits_map:nn { six } { }
+\zhnum_set_digits_map:nn { seven } { C }
+\zhnum_set_digits_map:nn { eight } { K }
+\zhnum_set_digits_map:nn { nine } { E }
+\zhnum_set_digits_map:nn { ten } { Q }
+\zhnum_set_digits_map:nn { hundred } { }
+\zhnum_set_digits_map:nn { thousand } { d }
+\zhnum_set_digits_map:nn { twenty } { }
+\zhnum_set_digits_map:nn { thirty } { }
+\zhnum_set_digits_map:nn { forty } { m }
+\zhnum_set_digits_map:nn { two_hundred } { ڷ }
+\zhnum_set_digits_map:nn { dot } { I }
+\zhnum_set_digits_map:nn { and } { S }
+\zhnum_set_digits_map:nn { parts } { }
+\zhnum_set_digits_map:nn { scale_zero } { }
+\zhnum_set_digits_map:nn { scale_one } { U }
+\zhnum_set_digits_map:nn { scale_two } { }
+\zhnum_set_digits_map:nn { scale_three } { }
+\zhnum_set_digits_map:nn { scale_four } { }
+\zhnum_set_digits_map:nn { scale_five } { }
+\zhnum_set_digits_map:nn { scale_six } { }
+\zhnum_set_digits_map:nn { scale_seven } { }
+\zhnum_set_digits_map:nn { scale_eight } { }
+\zhnum_set_digits_map:nn { scale_ten } { }
+\zhnum_set_digits_map:nn { scale_eleven } { }
+\zhnum_set_digits_map:nn { year } { ~ }
+\zhnum_set_digits_map:nn { month } { }
+\zhnum_set_digits_map:nn { day } { }
+\zhnum_set_digits_map:nn { hour } { }
+\zhnum_set_digits_map:nn { minute } { }
+\zhnum_set_digits_map:nn { weekday } { P }
+\zhnum_set_financial_map:nn { null } { s }
+\zhnum_set_financial_map:nn { zero } { s }
+\zhnum_set_financial_map:nn { one } { }
+\zhnum_set_financial_map:nn { two } { L }
+\zhnum_set_financial_map:nn { three } { }
+\zhnum_set_financial_map:nn { four } { v }
+\zhnum_set_financial_map:nn { five } { }
+\zhnum_set_financial_map:nn { six } { }
+\zhnum_set_financial_map:nn { seven } { m }
+\zhnum_set_financial_map:nn { eight } { }
+\zhnum_set_financial_map:nn { nine } { h }
+\zhnum_set_financial_map:nn { ten } { B }
+\zhnum_set_financial_map:nn { hundred } { }
+\zhnum_set_financial_map:nn { thousand } { a }
+\ExplSyntaxOff
+%%
+%% This package consists of the file zhnumber.dtx,
+%% and the derived files zhnumber.pdf,
+%% zhnumber.sty,
+%% zhnumber-utf8.cfg,
+%% zhnumber-gbk.cfg,
+%% zhnumber-big5.cfg,
+%% zhnumber.ins and
+%% README.
+%%
+%% End of file `zhnumber-big5.cfg'.
diff --git a/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-gbk.cfg b/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-gbk.cfg
index ef92991cae4..ddb11b0af3c 100644
--- a/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-gbk.cfg
+++ b/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-gbk.cfg
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% zhnumber.dtx (with options: `config-gbk')
+%% zhnumber.dtx (with options: `config,gbk')
%%
%% Copyright (C) 2012 by Qing Lee <sobenlee@gmail.com>
%% --------------------------------------------------------------------------
@@ -19,44 +19,75 @@
%% This work has the LPPL maintenance status "maintained".
%% The Current Maintainer of this work is Qing Lee.
%%
-\ExplSyntaxOff
-\ProvidesExplFile {zhnumber-gbk.cfg}
- {2012/05/21} {1.4}
- {Chinese numerals with GBK encoding}
-\tl_set:Nn \c_zhnum_minus_tl { \bool_if:NTF \l_zhnum_simp_bool { } { ؓ } }
-\tl_set:Nn \c_zhnum_zero_tl { \bool_if:nTF \l_zhnum_null_bool \c_zhnum_null_tl { } }
-\tl_set:Nn \c_zhnum_null_tl { \bool_if:NTF \l_zhnum_normal_bool { } { } }
-\tl_set:Nn \c_zhnum_one_tl { \bool_if:NTF \l_zhnum_normal_bool { һ } { Ҽ } }
-\tl_set:Nn \c_zhnum_two_tl { \bool_if:NTF \l_zhnum_normal_bool { } { \bool_if:NTF \l_zhnum_simp_bool { } { E } } }
-\tl_set:Nn \c_zhnum_three_tl { \bool_if:NTF \l_zhnum_normal_bool { } { \bool_if:NTF \l_zhnum_simp_bool { } { } } }
-\tl_set:Nn \c_zhnum_four_tl { \bool_if:NTF \l_zhnum_normal_bool { } { } }
-\tl_set:Nn \c_zhnum_five_tl { \bool_if:NTF \l_zhnum_normal_bool { } { } }
-\tl_set:Nn \c_zhnum_six_tl { \bool_if:NTF \l_zhnum_normal_bool { } { \bool_if:NTF \l_zhnum_simp_bool { ½ } { } } }
-\tl_set:Nn \c_zhnum_seven_tl { \bool_if:NTF \l_zhnum_normal_bool { } { } }
-\tl_set:Nn \c_zhnum_eight_tl { \bool_if:NTF \l_zhnum_normal_bool { } { } }
-\tl_set:Nn \c_zhnum_nine_tl { \bool_if:NTF \l_zhnum_normal_bool { } { } }
-\tl_set:Nn \c_zhnum_ten_tl { \bool_if:NTF \l_zhnum_normal_bool { ʮ } { ʰ } }
-\tl_set:Nn \c_zhnum_hundred_tl { \bool_if:NTF \l_zhnum_normal_bool { } { } }
-\tl_set:Nn \c_zhnum_thousand_tl { \bool_if:NTF \l_zhnum_normal_bool { ǧ } { Ǫ } }
-\tl_set:Nn \c_zhnum_twenty_tl { إ }
-\tl_set:Nn \c_zhnum_thirty_tl { ئ }
-\tl_set:Nn \c_zhnum_forty_tl { c }
-\tl_set:Nn \c_zhnum_two_hundred_tl { z }
-\tl_set:Nn \c_zhnum_dot_tl { \bool_if:NTF \l_zhnum_simp_bool { } { c } }
-\tl_set:Nn \c_zhnum_and_tl { }
-\tl_set:Nn \c_zhnum_over_tl { ֮ }
-\tl_set:Nn \c_zhnum_scale_zero_tl { }
-\tl_set:Nn \c_zhnum_scale_one_tl { \bool_if:NTF \l_zhnum_simp_bool { } { f } }
-\tl_set:Nn \c_zhnum_scale_two_tl { \bool_if:NTF \l_zhnum_simp_bool { } { | } }
-\tl_set:Nn \c_zhnum_scale_three_tl { }
-\tl_set:Nn \c_zhnum_scale_four_tl { }
-\tl_set:Nn \c_zhnum_scale_five_tl { }
-\tl_set:Nn \c_zhnum_scale_six_tl { }
-\tl_set:Nn \c_zhnum_scale_seven_tl { }
-\tl_set:Nn \c_zhnum_scale_eight_tl { \bool_if:NTF \l_zhnum_simp_bool { } { } }
-\tl_set:Nn \c_zhnum_scale_nine_tl { \bool_if:NTF \l_zhnum_simp_bool { } { } }
-\tl_set:Nn \c_zhnum_scale_ten_tl { }
-\tl_set:Nn \c_zhnum_scale_eleven_tl { \bool_if:NTF \l_zhnum_simp_bool { } { d } }
+\GetIdInfo$Id: zhnumber.dtx 351 2012-07-20 05:30:58Z sobenlee $
+ {Chinese numerals with Big5 encoding}
+\ProvidesExplFile
+ {\ExplFileName-gbk.cfg}
+ {\ExplFileDate} {1.6} {\ExplFileDescription}
+\zhnum_set_digits_map:nnn { minus } { simp } { }
+\zhnum_set_digits_map:nnn { minus } { trad } { ؓ }
+\zhnum_set_digits_map:nn { zero } { }
+\zhnum_set_digits_map:nn { null } { }
+\zhnum_set_digits_map:nn { one } { һ }
+\zhnum_set_digits_map:nn { two } { }
+\zhnum_set_digits_map:nn { three } { }
+\zhnum_set_digits_map:nn { four } { }
+\zhnum_set_digits_map:nn { five } { }
+\zhnum_set_digits_map:nn { six } { }
+\zhnum_set_digits_map:nn { seven } { }
+\zhnum_set_digits_map:nn { eight } { }
+\zhnum_set_digits_map:nn { nine } { }
+\zhnum_set_digits_map:nn { ten } { ʮ }
+\zhnum_set_digits_map:nn { hundred } { }
+\zhnum_set_digits_map:nn { thousand } { ǧ }
+\zhnum_set_digits_map:nn { twenty } { إ }
+\zhnum_set_digits_map:nn { thirty } { ئ }
+\zhnum_set_digits_map:nn { forty } { c }
+\zhnum_set_digits_map:nn { two_hundred } { z }
+\zhnum_set_digits_map:nnn { dot } { simp } { }
+\zhnum_set_digits_map:nnn { dot } { trad } { c }
+\zhnum_set_digits_map:nn { and } { }
+\zhnum_set_digits_map:nn { parts } { ֮ }
+\zhnum_set_digits_map:nn { scale_zero } { }
+\zhnum_set_digits_map:nnn { scale_one } { simp } { }
+\zhnum_set_digits_map:nnn { scale_one } { trad } { f }
+\zhnum_set_digits_map:nnn { scale_two } { simp } { }
+\zhnum_set_digits_map:nnn { scale_two } { trad } { | }
+\zhnum_set_digits_map:nn { scale_three } { }
+\zhnum_set_digits_map:nn { scale_four } { }
+\zhnum_set_digits_map:nn { scale_five } { }
+\zhnum_set_digits_map:nn { scale_six } { }
+\zhnum_set_digits_map:nn { scale_seven } { }
+\zhnum_set_digits_map:nnn { scale_eight } { simp } { }
+\zhnum_set_digits_map:nnn { scale_eight } { trad } { }
+\zhnum_set_digits_map:nnn { scale_nine } { simp } { }
+\zhnum_set_digits_map:nnn { scale_nine } { trad } { }
+\zhnum_set_digits_map:nn { scale_ten } { }
+\zhnum_set_digits_map:nnn { scale_eleven } { simp } { }
+\zhnum_set_digits_map:nnn { scale_eleven } { trad } { d }
+\zhnum_set_digits_map:nn { year } { }
+\zhnum_set_digits_map:nn { month } { }
+\zhnum_set_digits_map:nn { day } { }
+\zhnum_set_digits_map:nnn { hour } { simp } { ʱ }
+\zhnum_set_digits_map:nnn { hour } { trad } { r }
+\zhnum_set_digits_map:nn { minute } { }
+\zhnum_set_digits_map:nn { weekday } { }
+\zhnum_set_financial_map:nn { null } { }
+\zhnum_set_financial_map:nn { zero } { }
+\zhnum_set_financial_map:nn { one } { Ҽ }
+\zhnum_set_financial_map:nn { two } { E }
+\zhnum_set_financial_map:nnn { three } { simp } { }
+\zhnum_set_financial_map:nnn { three } { trad } { }
+\zhnum_set_financial_map:nn { four } { }
+\zhnum_set_financial_map:nn { five } { }
+\zhnum_set_financial_map:nnn { six } { simp } { ½ }
+\zhnum_set_financial_map:nnn { six } { trad } { }
+\zhnum_set_financial_map:nn { seven } { }
+\zhnum_set_financial_map:nn { eight } { }
+\zhnum_set_financial_map:nn { nine } { }
+\zhnum_set_financial_map:nn { ten } { ʰ }
+\zhnum_set_financial_map:nn { hundred } { }
+\zhnum_set_financial_map:nn { thousand } { Ǫ }
\ExplSyntaxOff
%%
%% This package consists of the file zhnumber.dtx,
@@ -64,7 +95,8 @@
%% zhnumber.sty,
%% zhnumber-utf8.cfg,
%% zhnumber-gbk.cfg,
+%% zhnumber-big5.cfg,
%% zhnumber.ins and
-%% README.txt.
+%% README.
%%
%% End of file `zhnumber-gbk.cfg'.
diff --git a/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-utf8.cfg b/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-utf8.cfg
index acba3e53cda..56ef8ea5cdf 100644
--- a/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-utf8.cfg
+++ b/Master/texmf-dist/tex/latex/zhnumber/config/zhnumber-utf8.cfg
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% zhnumber.dtx (with options: `config-utf8')
+%% zhnumber.dtx (with options: `config,utf8')
%%
%% Copyright (C) 2012 by Qing Lee <sobenlee@gmail.com>
%% --------------------------------------------------------------------------
@@ -19,44 +19,75 @@
%% This work has the LPPL maintenance status "maintained".
%% The Current Maintainer of this work is Qing Lee.
%%
-\ExplSyntaxOff
-\ProvidesExplFile {zhnumber-utf8.cfg}
- {2012/05/21} {1.4}
- {Chinese numerals with UTF8 encoding}
-\tl_set:Nn \c_zhnum_minus_tl { \bool_if:NTF \l_zhnum_simp_bool { 负 } { 負 } }
-\tl_set:Nn \c_zhnum_zero_tl { \bool_if:nTF \l_zhnum_null_bool \c_zhnum_null_tl { 零 } }
-\tl_set:Nn \c_zhnum_null_tl { \bool_if:NTF \l_zhnum_normal_bool { 〇 } { 零 } }
-\tl_set:Nn \c_zhnum_one_tl { \bool_if:NTF \l_zhnum_normal_bool { 一 } { 壹 } }
-\tl_set:Nn \c_zhnum_two_tl { \bool_if:NTF \l_zhnum_normal_bool { 二 } { \bool_if:NTF \l_zhnum_simp_bool { 贰 } { 貳 } } }
-\tl_set:Nn \c_zhnum_three_tl { \bool_if:NTF \l_zhnum_normal_bool { 三 } { \bool_if:NTF \l_zhnum_simp_bool { 叁 } { 叄 } } }
-\tl_set:Nn \c_zhnum_four_tl { \bool_if:NTF \l_zhnum_normal_bool { 四 } { 肆 } }
-\tl_set:Nn \c_zhnum_five_tl { \bool_if:NTF \l_zhnum_normal_bool { 五 } { 伍 } }
-\tl_set:Nn \c_zhnum_six_tl { \bool_if:NTF \l_zhnum_normal_bool { 六 } { \bool_if:NTF \l_zhnum_simp_bool { 陆 } { 陸 } } }
-\tl_set:Nn \c_zhnum_seven_tl { \bool_if:NTF \l_zhnum_normal_bool { 七 } { 柒 } }
-\tl_set:Nn \c_zhnum_eight_tl { \bool_if:NTF \l_zhnum_normal_bool { 八 } { 捌 } }
-\tl_set:Nn \c_zhnum_nine_tl { \bool_if:NTF \l_zhnum_normal_bool { 九 } { 玖 } }
-\tl_set:Nn \c_zhnum_ten_tl { \bool_if:NTF \l_zhnum_normal_bool { 十 } { 拾 } }
-\tl_set:Nn \c_zhnum_hundred_tl { \bool_if:NTF \l_zhnum_normal_bool { 百 } { 佰 } }
-\tl_set:Nn \c_zhnum_thousand_tl { \bool_if:NTF \l_zhnum_normal_bool { 千 } { 仟 } }
-\tl_set:Nn \c_zhnum_twenty_tl { 廿 }
-\tl_set:Nn \c_zhnum_thirty_tl { 卅 }
-\tl_set:Nn \c_zhnum_forty_tl { 卌 }
-\tl_set:Nn \c_zhnum_two_hundred_tl { 皕 }
-\tl_set:Nn \c_zhnum_dot_tl { \bool_if:NTF \l_zhnum_simp_bool { 点 } { 點 } }
-\tl_set:Nn \c_zhnum_and_tl { 又 }
-\tl_set:Nn \c_zhnum_over_tl { 分之 }
-\tl_set:Nn \c_zhnum_scale_zero_tl { }
-\tl_set:Nn \c_zhnum_scale_one_tl { \bool_if:NTF \l_zhnum_simp_bool { 万 } { 萬 } }
-\tl_set:Nn \c_zhnum_scale_two_tl { \bool_if:NTF \l_zhnum_simp_bool { 亿 } { 億 } }
-\tl_set:Nn \c_zhnum_scale_three_tl { 兆 }
-\tl_set:Nn \c_zhnum_scale_four_tl { 京 }
-\tl_set:Nn \c_zhnum_scale_five_tl { 垓 }
-\tl_set:Nn \c_zhnum_scale_six_tl { 秭 }
-\tl_set:Nn \c_zhnum_scale_seven_tl { 穰 }
-\tl_set:Nn \c_zhnum_scale_eight_tl { \bool_if:NTF \l_zhnum_simp_bool { 沟 } { 溝 } }
-\tl_set:Nn \c_zhnum_scale_nine_tl { \bool_if:NTF \l_zhnum_simp_bool { 涧 } { 澗 } }
-\tl_set:Nn \c_zhnum_scale_ten_tl { 正 }
-\tl_set:Nn \c_zhnum_scale_eleven_tl { \bool_if:NTF \l_zhnum_simp_bool { 载 } { 載 } }
+\GetIdInfo$Id: zhnumber.dtx 351 2012-07-20 05:30:58Z sobenlee $
+ {Chinese numerals with UTF8 encoding}
+\ProvidesExplFile
+ {\ExplFileName-utf8.cfg}
+ {\ExplFileDate} {1.6} {\ExplFileDescription}
+\zhnum_set_digits_map:nnn { minus } { simp } { 负 }
+\zhnum_set_digits_map:nnn { minus } { trad } { 負 }
+\zhnum_set_digits_map:nn { zero } { 零 }
+\zhnum_set_digits_map:nn { null } { 〇 }
+\zhnum_set_digits_map:nn { one } { 一 }
+\zhnum_set_digits_map:nn { two } { 二 }
+\zhnum_set_digits_map:nn { three } { 三 }
+\zhnum_set_digits_map:nn { four } { 四 }
+\zhnum_set_digits_map:nn { five } { 五 }
+\zhnum_set_digits_map:nn { six } { 六 }
+\zhnum_set_digits_map:nn { seven } { 七 }
+\zhnum_set_digits_map:nn { eight } { 八 }
+\zhnum_set_digits_map:nn { nine } { 九 }
+\zhnum_set_digits_map:nn { ten } { 十 }
+\zhnum_set_digits_map:nn { hundred } { 百 }
+\zhnum_set_digits_map:nn { thousand } { 千 }
+\zhnum_set_digits_map:nn { twenty } { 廿 }
+\zhnum_set_digits_map:nn { thirty } { 卅 }
+\zhnum_set_digits_map:nn { forty } { 卌 }
+\zhnum_set_digits_map:nn { two_hundred } { 皕 }
+\zhnum_set_digits_map:nnn { dot } { simp } { 点 }
+\zhnum_set_digits_map:nnn { dot } { trad } { 點 }
+\zhnum_set_digits_map:nn { and } { 又 }
+\zhnum_set_digits_map:nn { parts } { 分之 }
+\zhnum_set_digits_map:nn { scale_zero } { }
+\zhnum_set_digits_map:nnn { scale_one } { simp } { 万 }
+\zhnum_set_digits_map:nnn { scale_one } { trad } { 萬 }
+\zhnum_set_digits_map:nnn { scale_two } { simp } { 亿 }
+\zhnum_set_digits_map:nnn { scale_two } { trad } { 億 }
+\zhnum_set_digits_map:nn { scale_three } { 兆 }
+\zhnum_set_digits_map:nn { scale_four } { 京 }
+\zhnum_set_digits_map:nn { scale_five } { 垓 }
+\zhnum_set_digits_map:nn { scale_six } { 秭 }
+\zhnum_set_digits_map:nn { scale_seven } { 穰 }
+\zhnum_set_digits_map:nnn { scale_eight } { simp } { 沟 }
+\zhnum_set_digits_map:nnn { scale_eight } { trad } { 溝 }
+\zhnum_set_digits_map:nnn { scale_nine } { simp } { 涧 }
+\zhnum_set_digits_map:nnn { scale_nine } { trad } { 澗 }
+\zhnum_set_digits_map:nn { scale_ten } { 正 }
+\zhnum_set_digits_map:nnn { scale_eleven } { simp } { 载 }
+\zhnum_set_digits_map:nnn { scale_eleven } { trad } { 載 }
+\zhnum_set_digits_map:nn { year } { 年 }
+\zhnum_set_digits_map:nn { month } { 月 }
+\zhnum_set_digits_map:nn { day } { 日 }
+\zhnum_set_digits_map:nnn { hour } { simp } { 时 }
+\zhnum_set_digits_map:nnn { hour } { trad } { 時 }
+\zhnum_set_digits_map:nn { minute } { 分 }
+\zhnum_set_digits_map:nn { weekday } { 星期 }
+\zhnum_set_financial_map:nn { null } { 零 }
+\zhnum_set_financial_map:nn { zero } { 零 }
+\zhnum_set_financial_map:nn { one } { 壹 }
+\zhnum_set_financial_map:nn { two } { 貳 }
+\zhnum_set_financial_map:nnn { three } { simp } { 叁 }
+\zhnum_set_financial_map:nnn { three } { trad } { 叄 }
+\zhnum_set_financial_map:nn { four } { 肆 }
+\zhnum_set_financial_map:nn { five } { 伍 }
+\zhnum_set_financial_map:nnn { six } { simp } { 陆 }
+\zhnum_set_financial_map:nnn { six } { trad } { 陸 }
+\zhnum_set_financial_map:nn { seven } { 柒 }
+\zhnum_set_financial_map:nn { eight } { 捌 }
+\zhnum_set_financial_map:nn { nine } { 玖 }
+\zhnum_set_financial_map:nn { ten } { 拾 }
+\zhnum_set_financial_map:nn { hundred } { 佰 }
+\zhnum_set_financial_map:nn { thousand } { 仟 }
\ExplSyntaxOff
%%
%% This package consists of the file zhnumber.dtx,
@@ -64,7 +95,8 @@
%% zhnumber.sty,
%% zhnumber-utf8.cfg,
%% zhnumber-gbk.cfg,
+%% zhnumber-big5.cfg,
%% zhnumber.ins and
-%% README.txt.
+%% README.
%%
%% End of file `zhnumber-utf8.cfg'.
diff --git a/Master/texmf-dist/tex/latex/zhnumber/zhnumber.sty b/Master/texmf-dist/tex/latex/zhnumber/zhnumber.sty
index 387b52eb429..d46e95263d4 100644
--- a/Master/texmf-dist/tex/latex/zhnumber/zhnumber.sty
+++ b/Master/texmf-dist/tex/latex/zhnumber/zhnumber.sty
@@ -21,9 +21,9 @@
%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
-\ProvidesExplPackage {zhnumber}
- {2012/05/21} {1.4}
- {package for typesetting numbers with Chinese glyphs}
+\GetIdInfo$Id: zhnumber.dtx 351 2012-07-20 05:30:58Z sobenlee $
+ {package for typesetting numbers with Chinese glyphs}
+\ProvidesExplPackage{\ExplFileName}{\ExplFileDate}{1.6}{\ExplFileDescription}
\msg_new:nnn { zhnumber } { l3-too-old }
{
Support~package~'expl3'~too~old. \\\\
@@ -31,7 +31,7 @@
'l3kernel'~and~'l3packages'\\\\
using~your~TeX~package~manager~or~from~CTAN.
}
-\@ifpackagelater { expl3 } { 2012/02/19 } { }
+\@ifpackagelater { expl3 } { 2012/07/16 } { }
{ \msg_error:nn { zhnumber } { l3-too-old } }
\RequirePackage{xparse}
\RequirePackage{l3keys2e}
@@ -59,12 +59,12 @@
{
\quark_if_nil:nTF {#3}
{
- \zhnum_blank_to_zero:f {#1} \c_zhnum_over_tl
+ \zhnum_blank_to_zero:f {#1} \c_zhnum_parts_tl
\zhnum_blank_to_zero:f {#2}
}
{
\tl_if_blank:fF {#2} { \zhnumber {#2} \c_zhnum_and_tl }
- \zhnum_blank_to_zero:f {#1} \c_zhnum_over_tl
+ \zhnum_blank_to_zero:f {#1} \c_zhnum_parts_tl
\zhnum_blank_to_zero:f {#3}
}
}
@@ -72,7 +72,7 @@
\cs_new_nopar:Nn \zhnum_decimal:nn
{
\zhnum_blank_to_zero:f {#1} \c_zhnum_dot_tl
- \tl_if_blank:fTF {#2} { \zhnum_digit_map:n \c_zero } { \zhdigits * {#2} }
+ \tl_if_blank:fTF {#2} { \c_zhnum_zero_tl } { \zhdigits * {#2} }
}
\cs_generate_variant:Nn \tl_if_blank:nTF { f }
\cs_new_nopar:Nn \zhnum_blank_to_zero:n
@@ -87,19 +87,14 @@
{ \@nocounterr {#1} }
}
\cs_new_nopar:Nn \zhnum_integer:n
- { \zhnum_integer_aux:f { \zhnum_erase_separator:n {#1} } }
-\cs_new_nopar:Nn \zhnum_integer_aux:n
{
- \int_compare:nNnT { \int_get_sign:n {#1} \c_one } < \c_zero
- { \zhnum_digit_map:n \c_minus_one }
- \zhnum_parse_number:f { \zhnum_trim_zeros:f { \int_get_digits:n {#1} } }
+ \int_compare:nNnT { \__int_get_sign:n {#1} \c_one } < \c_zero { \c_zhnum_minus_tl }
+ \zhnum_parse_number:f { \zhnum_trim_zeros:f { \zhnum_erase_separator:n {#1} } }
}
-\cs_generate_variant:Nn \zhnum_integer:n { f , v }
-\cs_generate_variant:Nn \zhnum_integer_aux:n { f }
+\cs_generate_variant:Nn \zhnum_integer:n { f , v , V }
\cs_new_nopar:Nn \zhnum_erase_separator:n
{ \cs_to_str:c { \tl_map_function:nN {#1} \zhnum_erase_separator_aux:N } }
-\cs_new_nopar:Nn \zhnum_erase_separator_aux:N
- { \str_if_eq:xxF {#1} \c_zhnum_separator_tl {#1} }
+\cs_new_nopar:Nn \zhnum_erase_separator_aux:N { \zhnum_if_number:NT {#1} {#1} }
\cs_new_nopar:Nn \zhnum_trim_zeros:n
{
\tl_if_empty:nTF {#1} \c_zero
@@ -108,149 +103,121 @@
{ \zhnum_trim_zeros:o { \use_none:n #1 } } {#1}
}
}
+\prg_new_conditional:Nnn \zhnum_if_number:N { p , T , F , TF }
+ {
+ \if_int_compare:w \c_one < 1 #1 \exp_stop_f:
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
\cs_generate_variant:Nn \zhnum_trim_zeros:n { f , o }
\cs_generate_variant:Nn \cs_to_str:N { c }
\cs_new_nopar:Nn \zhnum_parse_number:n
- { \zhnum_parse_number:nf {#1} { \tl_length:n {#1} } }
-\cs_new_nopar:Nn \zhnum_parse_number:nn
{
- \int_compare:nNnTF {#2} < \c_five
- {
- \int_compare:nNnTF {#1} = \c_zero
- { \zhnum_digit_map:n \c_zero }
- { \zhnum_process_number:NNn \c_true_bool \c_true_bool {#1} }
- }
+ \zhnum_parse_number:nff {#1}
+ { \tl_count:n {#1} }
+ { \int_mod:nn { \tl_count:n {#1} } \c_four }
+ }
+\cs_new_nopar:Nn \zhnum_parse_number:nnn
+ {
+ \int_compare:nNnTF {#2} < \c_two
+ { \zhnum_digit_map:n {#1} }
{
- \int_compare:nNnTF { \int_mod:nn {#2} \c_four } = \c_zero
+ \zhnum_split_number:fNNfn { \zhnum_insert_zeros:n {#3} #1 }
+ \c_true_bool \c_true_bool
{
- \zhnum_split_number:nNNnfn {#1} \c_true_bool \c_true_bool { \c_zero }
- { \int_div_truncate:nn { #2 - \c_one } \c_four }
- { \c_zero }
- }
- {
- \zhnum_parse_number:nnf {#1} {#2}
- {
- \use:c
- {
- zhnum_use_
- \int_to_roman:n { \int_mod:nn {#2} \c_four }
- _delimit_by_q_stop:w
- }
- #1 \q_stop
- }
+ \int_compare:nNnTF {#3} = \c_zero
+ { \int_eval:n { (#2) / \c_four - \c_one } }
+ { \int_div_truncate:nn {#2} \c_four }
}
+ { \c_zero }
}
}
-\cs_new_nopar:Nn \zhnum_parse_number:nnn
+\cs_generate_variant:Nn \zhnum_parse_number:n { f }
+\cs_generate_variant:Nn \zhnum_parse_number:nnn { nff }
+\cs_new_nopar:Nn \zhnum_insert_zeros:n
{
- \zhnum_process_number:NNn \c_true_bool \c_true_bool {#3}
- \zhnum_scale_map:n { \int_div_truncate:nn { #2 - \c_one } \c_four }
- \int_compare:nNnTF { \int_mod:nn {#3} \c_ten } = \c_zero
- { \zhnum_split_number:nNNffn {#1} \c_false_bool \c_true_bool }
- { \zhnum_split_number:nNNffn {#1} \c_true_bool \c_false_bool }
- { \int_mod:nn {#2} \c_four }
- { \int_eval:n { \int_div_truncate:nn { #2 - \c_one } \c_four - \c_one } }
- { \c_zero }
+ \if_case:w \int_eval:n { #1 - \c_one } \exp_stop_f:
+ \or: \exp_after:wN \use_none:n
+ \or: \exp_after:wN \use_none:nn
+ \else: \exp_after:wN \use_none:nnn
+ \fi:
+ 000
}
-\cs_generate_variant:Nn \zhnum_parse_number:n { f }
-\cs_generate_variant:Nn \zhnum_parse_number:nn { nf }
-\cs_generate_variant:Nn \zhnum_parse_number:nnn { nnf }
-\cs_new_nopar:Npn \zhnum_use_i_delimit_by_q_stop:w #1#2 \q_stop {#1}
-\cs_new_nopar:Npn \zhnum_use_ii_delimit_by_q_stop:w #1#2#3 \q_stop {#1#2}
-\cs_new_nopar:Npn \zhnum_use_iii_delimit_by_q_stop:w #1#2#3#4 \q_stop {#1#2#3}
-\cs_new_nopar:Nn \zhnum_split_number:nNNnnn
+\cs_new_nopar:Nn \zhnum_split_number:nNNnn
{
- \exp_args:Nf \zhnum_split_number_aux:nnnnnnn
- { \zhnum_number_item:nn {#1} { \c_one + #4 + #6 * \c_four } }
- {#1} {#2} {#3} {#4} {#5} {#6}
+ \zhnum_split_number_aux:fnNNnn { \zhnum_number_item:nn {#1} {#5} }
+ {#1} #2#3 {#4} {#5}
}
-\cs_new_nopar:Nn \zhnum_split_number_aux:nnnnnnn
+\cs_new_nopar:Nn \zhnum_split_number_aux:nnNNnn
{
\int_compare:nNnTF {#1} = \c_zero { \use_i_ii:nnn }
{
- \bool_if:NF #3 { \zhnum_digit_map:n \c_zero }
- \zhnum_process_number:NNn {#3} {#4} {#1}
- \zhnum_scale_map:n { #6 - #7 }
+ \bool_if:NF #3 { \c_zhnum_zero_tl }
+ \zhnum_process_number:NNn #3#4 {#1}
+ \zhnum_scale_map:n { #5 - #6 }
\int_compare:nNnTF { \int_mod:nn {#1} \c_ten } = \c_zero
{ \use_i_ii:nnn } { \zhnum_use_i_iii:nnn }
}
- { \int_compare:nNnF { #6 - #7 } = \c_zero }
+ { \int_compare:nNnF {#5} = {#6} }
{ {
- \zhnum_split_number:nNNnnf
- {#2} \c_false_bool \c_true_bool {#5} {#6} { \int_eval:n { #7 + \c_one } }
+ \zhnum_split_number:nNNnf
+ {#2} \c_false_bool \c_true_bool {#5} { \int_eval:n { #6 + \c_one } }
} }
{ {
- \zhnum_split_number:nNNnnf
- {#2} \c_true_bool \c_false_bool {#5} {#6} { \int_eval:n { #7 + \c_one } }
+ \zhnum_split_number:nNNnf
+ {#2} \c_true_bool \c_false_bool {#5} { \int_eval:n { #6 + \c_one } }
} }
}
\cs_new_nopar:Nn \zhnum_use_i_iii:nnn {#1#3}
-\cs_generate_variant:Nn \zhnum_split_number:nNNnnn { nNNnf , nNNff , nNNnnf }
+\cs_generate_variant:Nn \zhnum_split_number:nNNnn { fNNf , nNNnf }
+\cs_generate_variant:Nn \zhnum_split_number_aux:nnNNnn { f }
\cs_new_nopar:Nn \zhnum_number_item:nn
+ { \zhnum_number_item_aux:nNNNN {#2} #1 \q_recursion_stop }
+\cs_new_nopar:Nn \zhnum_number_item_aux:nNNNN
{
- \zhnum_number_item_aux:nN {#2} #1
- \q_recursion_tail
- \prg_break_point:n { }
- }
-\cs_new_nopar:Nn \zhnum_number_item_aux:nN
- {
- \quark_if_recursion_tail_break:n {#2}
- \int_compare:nNnTF {#1} = \c_one
- { \zhnum_recursion_break:NNNNw #2 }
- { \zhnum_number_item_aux:fN { \int_eval:n { #1 - \c_one } } }
+ \int_compare:nNnTF {#1} = \c_zero
+ { \zhnum_recursion_stop:NNNNw #2#3#4#5 }
+ { \zhnum_number_item_aux:fNNNN { \int_eval:n { #1 - \c_one } } }
}
-\cs_generate_variant:Nn \zhnum_number_item_aux:nN { f }
-\cs_new_nopar:Npn \zhnum_recursion_break:NNNNw #1#2#3#4#5 \prg_break_point:n #6 {#1#2#3#4}
+\cs_generate_variant:Nn \zhnum_number_item_aux:nNNNN { f }
+\cs_new_nopar:Npn \zhnum_recursion_stop:NNNNw #1#2#3#4#5 \q_recursion_stop {#1#2#3#4}
\cs_new_nopar:Nn \zhnum_process_number:NNn
- {
- \zhnum_process_number:ffffNN
- { \int_mod:nn {#3} \c_ten }
- { \int_mod:nn { \int_div_truncate:nn {#3} \c_ten } \c_ten }
- { \int_mod:nn { \int_div_truncate:nn {#3} \c_one_hundred } \c_ten }
- { \int_div_truncate:nn {#3} \c_one_thousand }
- {#1} {#2}
- }
+ { \zhnum_process_number:NNNNNN #3#1#2 }
\cs_new_nopar:Nn \zhnum_process_number:NNNNNN
{
- \int_compare:nNnTF {#4} = \c_zero
- { \bool_if:NF #6 { \zhnum_digit_map:n \c_zero } }
- { \zhnum_digit_map:n {#4} \zhnum_digit_map:n \c_one_thousand }
- \int_compare:nNnTF {#3} = \c_zero
- { \int_compare:nNnT { #4 * (#2#1) } > \c_zero { \zhnum_digit_map:n \c_zero } }
+ \int_compare:nNnTF {#1} = \c_zero
+ { \bool_if:NF #6 { \c_zhnum_zero_tl } }
+ { \zhnum_digit_map:n {#1} \c_zhnum_thousand_tl }
+ \int_compare:nNnTF {#2} = \c_zero
+ { \int_compare:nNnT { #1 * (#3#4) } > \c_zero { \c_zhnum_zero_tl } }
{
\bool_if:nTF
- { \l_zhnum_ancient_bool && \int_compare_p:nNn {#3} = \c_two }
- { \zhnum_digit_map:n { #3 * \c_one_hundred } }
- { \zhnum_digit_map:n {#3} \zhnum_digit_map:n \c_one_hundred }
+ { \l_zhnum_ancient_bool && \int_compare_p:nNn {#2} = \c_two }
+ { \zhnum_digit_map:n { #2 00 } }
+ { \zhnum_digit_map:n {#2} \c_zhnum_hundred_tl }
}
- \int_compare:nNnTF {#2} = \c_zero
- { \int_compare:nNnT { #3 * #1 } > \c_zero { \zhnum_digit_map:n \c_zero } }
+ \int_compare:nNnTF {#3} = \c_zero
+ { \int_compare:nNnT { #2 * #4 } > \c_zero { \c_zhnum_zero_tl } }
{
\bool_if:nF
{
- \int_compare_p:nNn {#2} = \c_one &&
- \int_compare_p:nNn {#4#3} = \c_zero && #6 && #5
+ \int_compare_p:nNn {#3} = \c_one &&
+ \int_compare_p:nNn {#1#2} = \c_zero && #6 && #5
}
{
\bool_if:nTF
{
\l_zhnum_ancient_bool &&
- ( \int_compare_p:nNn {#2} = \c_two ||
- \int_compare_p:nNn {#2} = \c_three ||
- \int_compare_p:nNn {#2} = \c_four )
- }
- {
- \zhnum_digit_map:n { #2 * \c_ten }
- \use_none:nn
+ ( \int_compare_p:nNn {#3} = \c_two ||
+ \int_compare_p:nNn {#3} = \c_three ||
+ \int_compare_p:nNn {#3} = \c_four )
}
- { \zhnum_digit_map:n {#2} }
+ { \zhnum_digit_map:n { #3 0 } \use_none:n }
+ { \zhnum_digit_map:n {#3} }
}
- \zhnum_digit_map:n \c_ten
+ \c_zhnum_ten_tl
}
- \int_compare:nNnF {#1} = \c_zero { \zhnum_digit_map:n {#1} }
+ \int_compare:nNnF {#4} = \c_zero { \zhnum_digit_map:n {#4} }
}
-\cs_generate_variant:Nn \zhnum_process_number:NNn { NNf }
-\cs_generate_variant:Nn \zhnum_process_number:NNNNNN { ffff }
\DeclareExpandableDocumentCommand \zhdigits { s o m }
{
\IfBooleanTF {#1}
@@ -262,113 +229,273 @@
\IfNoValueTF {#1} { \tl_map_function:fN {#2} #3 }
{ \group_begin: \zhnumsetup {#1} \tl_map_function:fN {#2} #3 \group_end: }
}
-\cs_generate_variant:Nn \tl_map_function:nN { f }
-\cs_new_nopar:Nn \zhnum_digits_null_aux:N { \zhnum_digits_aux:nn \c_zhnum_null_int {#1} }
-\cs_new_nopar:Nn \zhnum_digits_zero_aux:N { \zhnum_digits_aux:nn \c_zero {#1} }
-\cs_new_nopar:Nn \zhnum_digits_aux:nn
+\cs_new_nopar:Nn \zhnum_digits_null:n { \tl_map_function:fN {#1} \zhnum_digits_null_aux:N }
+\cs_generate_variant:Nn \zhnum_digits_null:n { V }
+\cs_generate_variant:Nn \tl_map_function:nN { f }
+\cs_new_nopar:Nn \zhnum_digits_null_aux:N { \zhnum_digits_aux:NN \c_true_bool #1 }
+\cs_new_nopar:Nn \zhnum_digits_zero_aux:N { \zhnum_digits_aux:NN \c_false_bool #1 }
+\cs_new_nopar:Nn \zhnum_digits_aux:NN
{
- \str_if_eq:xxF {#2} \c_zhnum_separator_tl
+ \str_if_eq_x:nnTF {#2} . \c_zhnum_dot_tl
{
- \str_if_eq:xxTF {#2} . \c_zhnum_dot_tl
+ \str_if_eq_x:nnTF {#2} -
+ { \c_zhnum_minus_tl }
{
- \zhnum_digit_map:n
+ \zhnum_if_number:NT {#2}
{
- \str_if_eq:xxTF {#2} - \c_minus_one
- {
- \bool_if:nTF
- {
- \int_compare_p:nNn {#2} = \c_zero &&
- \int_compare_p:nNn {#1} = \c_zhnum_null_int
- }
- { \c_zhnum_null_int } {#2}
- }
+ \bool_if:nTF { \int_compare_p:nNn {#2} = \c_zero }
+ { \bool_if:NTF #1 \c_zhnum_null_tl \c_zhnum_zero_tl }
+ { \zhnum_digit_map:n {#2} }
}
}
}
}
-\int_const:Nn \c_zhnum_null_int { -10 }
-\cs_new_nopar:Nn \zhnum_digit_map:n
+\DeclareExpandableDocumentCommand \zhdate { s m }
{
- \prg_case_int:nnn {#1}
+ \zhnum_date:w #2 \q_stop
+ \IfBooleanT {#1} { \zhweekday {#2} }
+ }
+\cs_new_nopar:Npn \zhnum_date:w #1/#2/#3 \q_stop
+ {
+ \zhnum_check_time:Nn \zhnum_digits_null:n {#1} \c_zhnum_year_tl
+ \zhnum_check_time:Nn \zhnum_integer:f {#2} \c_zhnum_month_tl
+ \zhnum_check_time:Nn \zhnum_integer:f {#3} \c_zhnum_day_tl
+ }
+\cs_new_nopar:Npn \zhtoday
+ {
+ \zhnum_check_time:Nn \zhnum_digits_null:V \tex_year:D \c_zhnum_year_tl
+ \zhnum_check_time:Nn \zhnum_integer:V \tex_month:D \c_zhnum_month_tl
+ \zhnum_check_time:Nn \zhnum_integer:V \tex_day:D \c_zhnum_day_tl
+ }
+\cs_new_nopar:Nn \zhnum_check_time:Nn
+ { \bool_if:NTF \l_zhnum_time_bool {#1} { \int_eval:n } {#2} }
+\cs_new_nopar:Npn \zhweekday #1 { \zhnum_week_day:w #1 \q_stop }
+\cs_new_nopar:Nn \zhnum_Zeller:nnn
+ {
+ \int_compare:nNnTF
+ { #1 \zhnum_two_digits:n {#2} \zhnum_two_digits:n {#3} } > { 1582 10 04 }
+ { \zhnum_Zeller_aux:Nnnn \zhnum_Zeller_Gregorian:nnn }
+ { \zhnum_Zeller_aux:Nnnn \zhnum_Zeller_Julian:nnn }
+ {#1} {#2} {#3}
+ }
+\cs_new_nopar:Nn \zhnum_Zeller_aux:Nnnn
+ {
+ \int_compare:nNnTF {#3} < \c_three
+ { #1 { #2 - \c_one } { #3 + \c_twelve } {#4} }
+ { #1 {#2} {#3} {#4} }
+ }
+\cs_new_nopar:Nn \zhnum_two_digits:n
+ {
+ \int_compare:nNnT {#1} < \c_ten { 0 }
+ \int_eval:n {#1}
+ }
+\cs_new_nopar:Nn \zhnum_Zeller_Gregorian:nnn
+ {
+ \int_mod:nn
{
- { \c_minus_one } { \c_zhnum_minus_tl }
- { \c_zero } { \c_zhnum_zero_tl }
- { \c_one } { \c_zhnum_one_tl }
- { \c_two } { \c_zhnum_two_tl }
- { \c_three } { \c_zhnum_three_tl }
- { \c_four } { \c_zhnum_four_tl }
- { \c_five } { \c_zhnum_five_tl }
- { \c_six } { \c_zhnum_six_tl }
- { \c_seven } { \c_zhnum_seven_tl }
- { \c_eight } { \c_zhnum_eight_tl }
- { \c_nine } { \c_zhnum_nine_tl }
- { \c_ten } { \c_zhnum_ten_tl }
- { \c_one_hundred } { \c_zhnum_hundred_tl }
- { \c_one_thousand } { \c_zhnum_thousand_tl }
- { \c_zhnum_null_int } { \c_zhnum_null_tl }
- { 20 } { \c_zhnum_twenty_tl }
- { 30 } { \c_zhnum_thirty_tl }
- { 40 } { \c_zhnum_forty_tl }
- { 200 } { \c_zhnum_two_hundred_tl }
+ \int_eval:n {#3}
+ + \int_div_truncate:nn { 26 * ( \int_eval:n {#2} + \c_one ) } \c_ten
+ + \int_eval:n {#1}
+ + \int_div_truncate:nn {#1} \c_four
+ + \c_six * \int_div_truncate:nn {#1} \c_one_hundred
+ + \int_div_truncate:nn {#1} { 400 }
}
- { \prg_do_nothing: }
+ { \c_seven }
}
-\cs_new_nopar:Nn \zhnum_scale_map:n
+\cs_new_nopar:Nn \zhnum_Zeller_Julian:nnn
{
- \prg_case_int:nnn {#1}
+ \int_mod:nn
{
- { \c_zero } { \c_zhnum_scale_zero_tl }
- { \c_one } { \c_zhnum_scale_one_tl }
- { \c_two } { \c_zhnum_scale_two_tl }
- { \c_three } { \c_zhnum_scale_three_tl }
- { \c_four } { \c_zhnum_scale_four_tl }
- { \c_five } { \c_zhnum_scale_five_tl }
- { \c_six } { \c_zhnum_scale_six_tl }
- { \c_seven } { \c_zhnum_scale_seven_tl }
- { \c_eight } { \c_zhnum_scale_eight_tl }
- { \c_nine } { \c_zhnum_scale_nine_tl }
- { \c_ten } { \c_zhnum_scale_ten_tl }
- { \c_eleven } { \c_zhnum_scale_eleven_tl }
+ \int_eval:n {#3}
+ + \int_div_truncate:nn { 26 * ( \int_eval:n {#2} + \c_one ) } \c_ten
+ + \int_eval:n {#1}
+ + \int_div_truncate:nn {#1} \c_four
+ + \c_five
}
+ { \c_seven }
+ }
+\cs_new_nopar:Npn \zhnum_week_day:w #1/#2/#3 \q_stop
+ {
+ \if_case:w \int_eval:n { \zhnum_Zeller:nnn {#1} {#2} {#3} } \exp_stop_f:
+ \c_zhnum_sat_tl
+ \or: \c_zhnum_sun_tl
+ \or: \c_zhnum_mon_tl
+ \or: \c_zhnum_tue_tl
+ \or: \c_zhnum_wed_tl
+ \or: \c_zhnum_thu_tl
+ \or: \c_zhnum_fri_tl
+ \fi:
+ }
+\cs_new_nopar:Npn \zhtime #1 { \zhnum_time:w #1 \q_stop }
+\group_begin:
+\char_set_lccode:nn { `\; } { `\: }
+\tl_to_lowercase:n
+ {
+ \group_end:
+ \cs_new_nopar:Npn \zhnum_time:w #1 ; #2 \q_stop
+ {
+ \zhnum_check_time:Nn \zhnum_integer:f {#1} \c_zhnum_hour_tl
+ \zhnum_check_time:Nn \zhnum_integer:f {#2} \c_zhnum_minute_tl
+ }
+ }
+\cs_new_nopar:Npn \zhcurrtime
+ {
+ \zhnum_check_time:Nn \zhnum_integer:f
+ { \int_div_truncate:nn \tex_time:D { 60 } } \c_zhnum_hour_tl
+ \zhnum_check_time:Nn \zhnum_integer:f
+ { \int_mod:nn \tex_time:D { 60 } } \c_zhnum_minute_tl
+ }
+\cs_new_nopar:Nn \zhnum_digit_map:n
+ { \tl_use:c { c_zhnum_ \zhnum_int_to_word:n {#1} _tl } }
+\cs_new_nopar:Nn \zhnum_scale_map:n
+ {
+ \cs_if_exist_use:cF { c_zhnum_scale_ \zhnum_int_to_word:n {#1} _tl }
{ \zhnum_scale_map_hook:n {#1} }
}
-\cs_new_nopar:Nn \zhnum_scale_map_hook:n
- { \zhnum_scale_map:n { \int_mod:nn {#1} \c_eleven } }
+\cs_new_nopar:Nn \zhnum_scale_map_loop:n
+ { \zhnum_scale_map:n { \int_mod:nn {#1} \g_zhnum_scale_int } }
+\int_new:N \g_zhnum_scale_int
+\int_set_eq:NN \g_zhnum_scale_int \c_eleven
+\cs_new_eq:NN \zhnum_scale_map_hook:n \zhnum_scale_map_loop:n
+\NewDocumentCommand \zhnumExtendScaleMap { > { \TrimSpaces } o m }
+ {
+ \int_zero:N \l_tmpa_int
+ \clist_map_inline:nn {#2}
+ {
+ \int_incr:N \l_tmpa_int
+ \tl_set:Nx \l_tmpa_tl
+ { c_zhnum_scale_ \zhnum_int_to_word:n { \l_tmpa_int + \c_eleven } _tl }
+ \tl_if_exist:cF \l_tmpa_tl { \int_incr:N \g_zhnum_scale_int }
+ \tl_set:cn { \l_tmpa_tl } {##1}
+ }
+ \IfValueT {#1} { \cs_set:Nn \zhnum_scale_map_hook:n {#1} }
+ }
+\cs_new_nopar:Nn \zhnum_int_to_word:n
+ {
+ \if_case:w \int_eval:n {#1} \exp_stop_f:
+ zero
+ \or: one
+ \or: two
+ \or: three
+ \or: four
+ \or: five
+ \or: six
+ \or: seven
+ \or: eight
+ \or: nine
+ \or: ten
+ \or: eleven
+ \else:
+ \int_case:nnn {#1}
+ {
+ { 20 } { twenty } { 30 } { thirty }
+ { 40 } { forty } { 200 } { two_hundred }
+ }
+ { \int_to_roman:n {#1} }
+ \fi:
+ }
\keys_define:nn { zhnum / options }
{
- - .tl_set:N = \c_zhnum_minus_tl ,
- -0 .tl_set:N = \c_zhnum_null_tl ,
- 0 .tl_set:N = \c_zhnum_zero_tl ,
- 1 .tl_set:N = \c_zhnum_one_tl ,
- 2 .tl_set:N = \c_zhnum_two_tl ,
- 3 .tl_set:N = \c_zhnum_three_tl ,
- 4 .tl_set:N = \c_zhnum_four_tl ,
- 5 .tl_set:N = \c_zhnum_five_tl ,
- 6 .tl_set:N = \c_zhnum_six_tl ,
- 7 .tl_set:N = \c_zhnum_seven_tl ,
- 8 .tl_set:N = \c_zhnum_eight_tl ,
- 9 .tl_set:N = \c_zhnum_nine_tl ,
- 10 .tl_set:N = \c_zhnum_ten_tl ,
- 20 .tl_set:N = \c_zhnum_twenty_tl ,
- 30 .tl_set:N = \c_zhnum_thirty_tl ,
- 40 .tl_set:N = \c_zhnum_forty_tl ,
- 200 .tl_set:N = \c_zhnum_two_hundred_tl ,
- E2 .tl_set:N = \c_zhnum_hundred_tl ,
- E3 .tl_set:N = \c_zhnum_thousand_tl ,
- E4 .tl_set:N = \c_zhnum_scale_one_tl ,
- E8 .tl_set:N = \c_zhnum_scale_two_tl ,
- E12 .tl_set:N = \c_zhnum_scale_three_tl ,
- E16 .tl_set:N = \c_zhnum_scale_four_tl ,
- E20 .tl_set:N = \c_zhnum_scale_five_tl ,
- E24 .tl_set:N = \c_zhnum_scale_six_tl ,
- E28 .tl_set:N = \c_zhnum_scale_seven_tl ,
- E32 .tl_set:N = \c_zhnum_scale_eight_tl ,
- E36 .tl_set:N = \c_zhnum_scale_nine_tl ,
- E40 .tl_set:N = \c_zhnum_scale_ten_tl ,
- E44 .tl_set:N = \c_zhnum_scale_eleven_tl ,
- }
-\cs_new:Nn \zhnum_load_cfg:
+ - .tl_set:N = \l_zhnum_minus_tl ,
+ -0 .tl_set:N = \l_zhnum_null_tl ,
+ E2 .tl_set:N = \l_zhnum_hundred_tl ,
+ E3 .tl_set:N = \l_zhnum_thousand_tl ,
+ FE2 .tl_set:N = \l_zhnum_financial_hundred_tl ,
+ FE3 .tl_set:N = \l_zhnum_financial_thousand_tl ,
+ }
+\clist_map_inline:nn
+ { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 20 , 30 , 40 , 200 }
+ {
+ \keys_define:nn { zhnum / options }
+ { #1 .tl_set:c = { l_zhnum_ \zhnum_int_to_word:n {#1} _tl } }
+ \int_compare:nNnF {#1} > \c_ten
+ {
+ \keys_define:nn { zhnum / options }
+ { F#1 .tl_set:c = { l_zhnum_financial_ \zhnum_int_to_word:n {#1} _tl } }
+ }
+ }
+\clist_map_inline:nn
+ { 4 , 8 , 12 , 16 , 20 , 24 , 28 , 32 , 36 , 40 , 44 }
+ {
+ \keys_define:nn { zhnum / options }
+ { E#1 .tl_set:c = { l_zhnum_scale_ \zhnum_int_to_word:n { #1 / 4 } _tl } }
+ }
+\clist_map_inline:nn
+ {
+ dot , and , parts , year , month , day , weekday , hour , minute
+ mon , tue , wed , thu , fri , sat , sun
+ }
+ { \keys_define:nn { zhnum / options } { #1 .tl_set:c = { l_zhnum_ #1 _tl } } }
+\cs_new_nopar:Nn \zhnum_parse_config:
+ {
+ \prop_map_function:NN \g_zhnum_cfg_map_prop \zhnum_check_simp:nn
+ \prop_map_function:NN \g_zhnum_cfg_map_prop \zhnum_check_financial:nn
+ \zhnum_set_zero:
+ \zhnum_set_week_day:
+ }
+\cs_new_nopar:Nn \zhnum_check_simp:nn
+ {
+ \zhnum_check_simp_aux:nn {#1} {#2}
+ \prop_get:NnNT \g_zhnum_cfg_map_finan_prop {#1} \l_tmpa_tl
+ { \exp_args:NnV \zhnum_check_simp_aux:nn { financial_ #1 } \l_tmpa_tl }
+ }
+\cs_new_nopar:Nn \zhnum_check_simp_aux:nn
+ {
+ \prop_get:NnNTF \g_zhnum_cfg_map_var_prop { #1 _trad } \l_tmpa_tl
+ {
+ \prop_get:NnNTF \g_zhnum_cfg_map_var_prop { #1 _simp } \l_tmpb_tl
+ {
+ \tl_set:cx { l_zhnum_ #1 _tl }
+ {
+ \exp_not:n { \bool_if:NTF \l_zhnum_simp_bool }
+ { \exp_not:V \l_tmpb_tl } { \exp_not:V \l_tmpa_tl }
+ }
+ }
+ {
+ \tl_set:cx { l_zhnum_ #1 _tl }
+ {
+ \exp_not:n { \bool_if:NTF \l_zhnum_simp_bool }
+ { \exp_not:n {#2} } { \exp_not:V \l_tmpa_tl }
+ }
+ }
+ }
+ { \tl_set:cn { l_zhnum_ #1 _tl } {#2} }
+ }
+\cs_new_nopar:Nn \zhnum_check_financial:nn
+ {
+ \prop_get:NnNTF \g_zhnum_cfg_map_finan_prop {#1} \l_tmpa_tl
+ {
+ \tl_set:cx { c_zhnum_ #1 _tl }
+ {
+ \exp_not:n { \bool_if:NTF \l_zhnum_normal_bool }
+ { \exp_not:c { l_zhnum_ #1 _tl } }
+ { \exp_not:c { l_zhnum_financial_ #1 _tl } }
+ }
+ }
+ { \tl_set:cx { c_zhnum_ #1 _tl } { \exp_not:c { l_zhnum_ #1 _tl } } }
+ }
+\cs_new_nopar:Nn \zhnum_set_zero:
+ {
+ \tl_set:Nx \l_zhnum_zero_tl
+ {
+ \exp_not:n { \bool_if:nTF \l_zhnum_null_bool }
+ { \exp_not:V \l_zhnum_null_tl } { \exp_not:V \l_zhnum_zero_tl }
+ }
+ }
+\cs_new_nopar:Nn \zhnum_set_week_day:
+ {
+ \tl_set:Nx \l_zhnum_mon_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_one_tl }
+ \tl_set:Nx \l_zhnum_tue_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_two_tl }
+ \tl_set:Nx \l_zhnum_wed_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_three_tl }
+ \tl_set:Nx \l_zhnum_thu_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_four_tl }
+ \tl_set:Nx \l_zhnum_fri_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_five_tl }
+ \tl_set:Nx \l_zhnum_sat_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_six_tl }
+ \tl_set:Nx \l_zhnum_sun_tl { \exp_not:N \c_zhnum_weekday_tl \exp_not:V \l_zhnum_day_tl }
+ \clist_map_inline:nn { mon , tue , wed , thu , fri , sat , sun }
+ { \tl_set:cx { c_zhnum_ ##1 _tl } { \exp_not:c { l_zhnum_ ##1 _tl } } }
+ }
+\cs_new:Nn \zhnum_load_cfg:n
{
\cs_if_exist:NT \CJK@makeActive
{
@@ -376,51 +503,84 @@
{ \bool_set_false:N \l_zhnum_set_CJK_active_bool }
{ \bool_set_true:N \l_zhnum_set_CJK_active_bool \CJK@makeActive }
}
- \file_input:n { zhnumber - \bool_if:NTF \g_zhnum_gbk_bool { gbk } { utf8 } .cfg }
+ \prop_clear:N \g_zhnum_cfg_map_prop
+ \prop_clear:N \g_zhnum_cfg_map_var_prop
+ \prop_clear:N \g_zhnum_cfg_map_finan_prop
+ \file_input:n { zhnumber - #1 .cfg }
+ \zhnum_parse_config:
\bool_if:nT { \cs_if_exist_p:N \CJK@makeInactive && \l_zhnum_set_CJK_active_bool }
{ \CJK@makeInactive }
}
+\cs_new_protected_nopar:Nn \zhnum_set_digits_map:nn
+ { \prop_put:Nnn \g_zhnum_cfg_map_prop {#1} {#2} }
+\cs_new_protected_nopar:Nn \zhnum_set_digits_map:nnn
+ {
+ \prop_put_if_new:Nnn \g_zhnum_cfg_map_prop {#1} {#3}
+ \prop_put:Nnn \g_zhnum_cfg_map_var_prop {#1_#2} {#3}
+ }
+\cs_new_protected_nopar:Nn \zhnum_set_financial_map:nn
+ { \prop_put:Nnn \g_zhnum_cfg_map_finan_prop {#1} {#2} }
+\cs_new_protected_nopar:Nn \zhnum_set_financial_map:nnn
+ {
+ \prop_put_if_new:Nnn \g_zhnum_cfg_map_finan_prop {#1} {#3}
+ \prop_put:Nnn \g_zhnum_cfg_map_var_prop { financial_#1_#2 } {#3}
+ }
+\prop_new:N \g_zhnum_cfg_map_prop
+\prop_new:N \g_zhnum_cfg_map_var_prop
+\prop_new:N \g_zhnum_cfg_map_finan_prop
\keys_define:nn { zhnum / options }
{
- encoding .choice: ,
- encoding / UTF8 .code:n = { \bool_gset_false:N \g_zhnum_gbk_bool \zhnum_load_cfg: } ,
- encoding / GBK .code:n = { \bool_gset_true:N \g_zhnum_gbk_bool \zhnum_load_cfg: } ,
- encoding .default:n = { GBK } ,
+ encoding .choice_code:n =
+ {
+ \tl_gset:Nx \c_zhnum_encoding_tl
+ { \exp_args:NV \tl_expandable_lowercase:n \l_keys_choice_tl }
+ \zhnum_load_cfg:n { \c_zhnum_encoding_tl }
+ } ,
+ encoding .generate_choices:n = { UTF8 , GBK , Big5 } ,
+ encoding .default:n = { GBK } ,
+ encoding / Bg5 .meta:n = { encoding = Big5 } ,
+ encoding / unknown .code:n =
+ { \msg_error:nnx { zhnumber } { encoding-invalid } { \l_keys_value_tl } } ,
style .multichoice: ,
- style / Normal .code:n =
+ style / Normal .code:n =
{
\bool_set_false:N \l_zhnum_ancient_bool
\bool_set_true:N \l_zhnum_normal_bool
} ,
- style / Financial .code:n =
+ style / Financial .code:n =
{
\bool_set_false:N \l_zhnum_ancient_bool
\bool_set_false:N \l_zhnum_normal_bool
} ,
- style / Ancient .code:n =
+ style / Ancient .code:n =
{
\bool_set_true:N \l_zhnum_ancient_bool
\bool_set_true:N \l_zhnum_normal_bool
} ,
- style / Simplified .code:n = { \bool_set_true:N \l_zhnum_simp_bool } ,
- style / Traditional .code:n = { \bool_set_false:N \l_zhnum_simp_bool } ,
- style .default:n = { Normal , Simplified } ,
- null .bool_set:N = \l_zhnum_null_bool ,
- reset .code:n = \zhnum_load_cfg: ,
- dot .tl_set:N = \c_zhnum_dot_tl ,
- and .tl_set:N = \c_zhnum_and_tl ,
- parts .tl_set:N = \c_zhnum_over_tl ,
- separator .tl_set:N = \c_zhnum_separator_tl ,
+ style / Simplified .code:n = { \bool_set_true:N \l_zhnum_simp_bool } ,
+ style / Traditional .code:n = { \bool_set_false:N \l_zhnum_simp_bool } ,
+ style .default:n = { Normal , Simplified } ,
+ null .bool_set:N = \l_zhnum_null_bool ,
+ time .choice: ,
+ time / Chinese .code:n = { \bool_set_true:N \l_zhnum_time_bool } ,
+ time / Arabic .code:n = { \bool_set_false:N \l_zhnum_time_bool } ,
+ time .default:n = { Arabic } ,
+ reset .code:n = { \zhnum_load_cfg:n { \c_zhnum_encoding_tl } } ,
+ }
+\msg_new:nnn { zhnumber } { encoding-invalid }
+ {
+ The~encoding~'#1'~is~invalid,~please~check~it~over.\\\\
+ Available~encoding~are~'UTF8',~'GBK'~and~'Big5'.\\
}
\NewDocumentCommand \zhnumsetup { m }
{
\keys_set:nn { zhnum / options } {#1}
\tex_ignorespaces:D
}
-\keys_set:nn { zhnum / options } { style , null = false , separator = {,} }
+\keys_set:nn { zhnum / options } { style , time }
\ProcessKeysOptions { zhnum / options }
\ExplSyntaxOn
-\bool_if_exist:NF \g_zhnum_gbk_bool
+\tl_if_exist:NF \c_zhnum_encoding_tl
{
\exp_args:Nnx \keys_set:nn { zhnum / options }
{
@@ -438,7 +598,8 @@
%% zhnumber.sty,
%% zhnumber-utf8.cfg,
%% zhnumber-gbk.cfg,
+%% zhnumber-big5.cfg,
%% zhnumber.ins and
-%% README.txt.
+%% README.
%%
%% End of file `zhnumber.sty'.