zhdigits
我需要使用包中的函数zhnumber
按我想要的方式排版计数器,即将 235 转换为二三五。此包需要包xeCJK
才能正常工作,但xeCJK
会弄乱我的引号,所以我宁愿不使用它。
是否可以zhdigits
不用来实现xeCJK
?即,实现一个函数,根据以下映射将一串字符转换为另一串字符:
1 ↦ 一
2 ↦ 二
3 ↦ 三
4 ↦ 四
5 ↦ 五
6 ↦ 六
7 ↦ 七
8 ↦ 八
9 ↦ 九
0 ↦ 〇
答案1
您可以定义几个宏;在这里,我使用\zhnumber
任何显式(整数)数字来以中文数字形式排版,而\zhdigits
将计数器的名称作为参数,类似于\arabic
,\Roman
等等。我也将它用于\pagenumbering
,只是为了展示它的工作原理。
\documentclass{article}
\usepackage{fontspec}
\newfontfamily{\zhfont}{Songti SC}
\DeclareTextFontCommand{\textzh}{\zhfont}
\makeatletter
\def\zhdigits#1{\expandafter\@zhdigits\csname c@#1\endcsname}
\def\@zhdigits#1{\expandafter\textzh\expandafter{\expandafter\@slowzhdigits\number#1@}}
\def\zhnumber#1{\textzh{\@slowzhdigits#1@}}
\def\@slowzhdigits#1{%
\ifx @#1% terminate
\else
\if0#1〇\else\if1#1一\else\if2#1二\else\if3#1三\else\if4#1四%
\else\if5#1五\else\if6#1六\else\if7#1七\else\if8#1八\else\if9#1九%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
\expandafter\@slowzhdigits
\fi}
\makeatother
\pagenumbering{zhdigits}
\textheight=6cm % just to show the page number at the bottom
\begin{document}
\tableofcontents
\section{Test}
\zhnumber{0123456789876543210}
\textzh{〇一二三四五六七八九八七六五四三二一〇}
\textzh{一二〇}
\setcounter{page}{120}
\zhdigits{page}
\end{document}
答案2
如果您使用原始 XeTeX 或 LuaTeX,这里有一个非常简单的实现:
\documentclass{article}
\makeatletter
% The argument is not expanded
\def\zhdigits#1{%
\@tfor\next:=#1\do{%
\ifcase\next
〇\or 一\or 二\or 三\or 四\or 五\or 六\or 七\or 八\or 九%
\fi}}
% The argument is expanded first
\def\zhdigitx#1{%
\edef\next{#1}%
\expandafter\zhdigits\expandafter{\next}}
\makeatother
\font\song="SimSun"
\begin{document}
\song
\zhdigits{0123456789876543210}
% 〇一二三四五六七八九八七六五四三二一〇
\setcounter{page}{120}
第\zhdigitx{\arabic{page}}页
\end{document}
对于旧CJK
包,只需使用包\CJKdigits
中的包即可CJKnumb
。
无论如何,我想知道为什么xeCJK
在这里不能使用。也许我们可以找到更好的解决方案。