不含 xeCJK 的 zhnumber 包

不含 xeCJK 的 zhnumber 包

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在这里不能使用。也许我们可以找到更好的解决方案。

相关内容