CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
972 stars 124 forks source link

CJKnumb 不再可用 #562

Closed lvjr closed 3 years ago

lvjr commented 3 years ago

xeCJK 文档说明,CJKnumb 必须在 xeCJK 之后载入,因此一直用下面的方法:

\documentclass{article}
\usepackage{ctex}
\usepackage{CJKnumb}
\begin{document}
1234
\end{document}

在之前的 ctex 2.4.11 中正常,但是在 ctex 2.5.5 中编译错误:提示 \CJKglue 已经定义。

仔细比较发现,新版本 ctex 导致载入了 CJK 宏包,但 xeCJK 文档中明确说明将会禁止在之后载入 CJK 宏包,也许是新版本 ctex 让它失效了。

stone-zeng commented 3 years ago

使用 xeCJK 的情况下请改用 zhnumber 宏包,实际上 ctex 宏包 / 文档类内部就已经载入了 zhnumber

lvjr commented 3 years ago

难道 xeCJK 文档都说支持 CJKnumb,而 ctex 破坏了它的功能,这不算 bug?

stone-zeng commented 3 years ago
\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 包的情况下也会出现。

lvjr commented 3 years ago

只要假装 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 的处理失效了。