Closed lvjr closed 3 years ago
使用 xeCJK
的情况下请改用 zhnumber
宏包,实际上 ctex
宏包 / 文档类内部就已经载入了 zhnumber
。
难道 xeCJK 文档都说支持 CJKnumb,而 ctex 破坏了它的功能,这不算 bug?
\documentclass{ctexart}
\let\CJKglue\undefined % xelatex 编译时暂时取消定义
\usepackage{CJKnumb}
\begin{document}
\CJKnumber{1234}
\CJKdigits{5678}
\end{document}
以上代码再使用 pdflatex 之外的方式编译时,均会出现以下报错:
! Undefined control sequence.
\CJK@digit ...ll \else \CJK@zero \fi \or \CJK@one
\or \CJK@two \or \CJK@thre...
若使用 xelatex,还会有
! LaTeX Error: Command \CJKglue already defined.
Or name \end... illegal, see p.192 of the manual.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.809 ...glue}{\hskip \z@ \@plus .08\baselineskip}
?
这样的错误。后者在仅调用 CJK
包的情况下也会出现。
只要假装 CJK 宏包已经加载,在载入 CJKnumb 时就不会载入 CJK。下面的代码用 PDFLaTeX 和 XeLaTeX 编译都正常:
\documentclass{article}
\usepackage{ctex}
\makeatletter
\@namedef{ver@CJK.sty}{}
\makeatother
\usepackage{CJKnumb}
\begin{document}
\CJKnumber{1234}
\CJKdigits{5678}
\end{document}
实际上,xeCJK 里面就是这样处理的。因此,下面的代码用 XeLaTeX 编译也是正常的:
\documentclass{article}
\usepackage{xeCJK}
\usepackage{CJKnumb}
\begin{document}
\CJKnumber{1234}
\CJKdigits{5678}
\end{document}
就不知道 ctex 新版本里有什么改动,导致 xeCJK 的处理失效了。
xeCJK 文档说明,CJKnumb 必须在 xeCJK 之后载入,因此一直用下面的方法:
在之前的 ctex 2.4.11 中正常,但是在 ctex 2.5.5 中编译错误:提示 \CJKglue 已经定义。
仔细比较发现,新版本 ctex 导致载入了 CJK 宏包,但 xeCJK 文档中明确说明将会禁止在之后载入 CJK 宏包,也许是新版本 ctex 让它失效了。