Skip to content

请参与 ctex-kit 的公测(ctex, xeCJK, CJKpunct 等宏包) #817

@Liam0205

Description

@Liam0205

ctex v2.6.0、xeCJK v3.10.0、CJKpunct v4.8.5 和 zhnumber v3.1 已经以 Pre-release 形式发布在 GitHub Release 页面,距离上一次正式版发布已经过去了近四年。这批更新包含大量 Bug 修复、Unicode 同步和若干 Breaking Change——在正式推送到 CTAN 之前,我们需要更广泛的社区测试来确认它们在真实文档中的稳定性。本文提供面向普通用户的完整测试流程:从了解变更内容,到下载安装、报告问题,最后到安全卸载。

本次更新有什么重大变化

ctex v2.6.0

这是一次大版本更新:

在最新的 macOS 系统上可以自动配置字体。自 macOS 15 开始,Apple 修改了字体在系统目录中的分布,同时将部分字体改为 downloadable。这使得之前的字体自动配置机制失效。fontset=mac 现在能正确检测和加载 macOS 15 的 downloadable 字体。

\newCJKfontfamily 定义的命令改为局部作用域。此前,在分组内用 \newCJKfontfamily 声明的字体切换命令会泄漏到分组外;现在它与 \newcommand 行为一致——只在当前分组内有效。如果你的文档依赖了「在 \begingroup...\endgroup 内声明字体命令、在组外使用」的写法,需要把声明提到分组外或导言区。

最低 LaTeX 版本要求提升到 2020/10/01。如果你的 TeX Live 版本低于 2021,可能无法使用此版本。移除了对旧版 LaTeX 字体钩子的兼容代码。

新功能方面:

  • 新增实验性 experiment/font-size-system 选项,可在 word(默认)和 letterpress(金属活字字号体系)之间切换,也支持自定义字号表。
  • 新增实验性 experiment/CJKecglue 选项,统一跨引擎的中西文间距接口。
  • 修复 LuaLaTeX 下 \verb 前 xkanjiskip 丢失的问题。

xeCJK v3.10.0

这是近四年以来 xeCJK 最大的一次更新,核心变化集中在边界恢复状态机的重写

  • 移除通用 whatsit 恢复:旧版在遇到任意 whatsit 节点时都会尝试恢复间距,这在 hyperref 等包的复杂场景下会产生错误的间距插入。新版收窄为只对 color/xcolorhyperref 两个已知安全来源做定点恢复。
  • 修复 \textcolor 导致 CJKecglue 丢失的长期问题(使用 xcolor 改变颜色后前后间距消失 #315)。
  • 修复字体切换组导致 ecglue 使用错误字体度量的问题——比如 中文\texttt{code}中文 的间距不再受 \texttt 字体影响。
  • 修复宏路径中空格 glue 遮蔽标记 kern 的问题(xecjk 不能消除 hyperref 宏包 autoref 命令之前的行末空格 #324)。
  • 同步到 Unicode 17.0。
  • 新增 \xeCJKchar 命令,提供绕过 interchar 机制的字符输出接口。
  • 新增实验性 experiment/halfright-prebreakpenalty 选项,阻止半角右标点出现在行首。

Breaking Change 与 ctex 相同:\newCJKfontfamily 局部化、最低 LaTeX 版本要求提升。此外,\xeCJKsetcharclass 被正式废弃,调用时会报错并提示改用 \xeCJKDeclareCharClass

CJKpunct v4.8.5

zhnumber v3.1

  • 提升 LaTeX3 最低版本要求至 2025/10/09。无功能变化。

如何下载和安装预发版宏包

第一步:下载

前往 CTeX-org/ctex-kit Releases 页面,找到标记为 Pre-release 的版本。每个版本提供一个 .zip 压缩包,例如:

  • ctex-v2.6.0-35416af2.zip
  • xecjk-v3.10.0-35416af2.zip
  • cjkpunct-v4.8.5.zip
  • zhnumber-v3.1-c8cce34a.zip

建议将 ctex 和 xeCJK 一起更新——它们在测试中是联动的。

第二步:确定 texmf-local 路径

texmf-local 是 TeX 发行版为用户自定义安装预留的目录树,其中的文件优先级高于发行版自带的文件。

操作系统 典型路径
Windows (TeX Live) C:\texlive\texmf-local\
Windows (MiKTeX) C:\Users\<用户名>\mytexmf\ 或通过 MiKTeX Console 设置
macOS (TeX Live) /usr/local/texlive/texmf-local/
Linux (TeX Live) /usr/local/texlive/texmf-local/

如果不确定路径,可以在终端执行:

kpsewhich -var-value TEXMFLOCAL

第三步:解压到正确位置

下载的 .zip 文件是 CTAN 标准打包格式,内部包含一个 <pkg>.tds.zip(TDS 结构包)和一个源文件目录。你需要:先从外层 zip 中提取 .tds.zip,再将 .tds.zip 的内容解压到 texmf-local

以 ctex 为例:

# Linux / macOS
cd ~/Downloads
unzip ctex-v2.6.0-35416af2.zip ctex.tds.zip     # 从外层 zip 提取 tds.zip
cd /usr/local/texlive/texmf-local/
sudo unzip ~/Downloads/ctex.tds.zip              # 将 TDS 内容解压到 texmf-local

# Windows (PowerShell, 以管理员身份)
cd ~\Downloads
Expand-Archive ctex-v2.6.0-35416af2.zip -DestinationPath ctex-temp
cd C:\texlive\texmf-local\
Expand-Archive ~\Downloads\ctex-temp\ctex.tds.zip -DestinationPath .

解压后,你应该能看到类似这样的目录结构:

texmf-local/
  tex/
    latex/
      ctex/
        ctex.sty
        ctexart.cls
        ...
  doc/
    latex/
      ctex/
        ...
  source/
    latex/
      ctex/
        ...

对 xeCJK、CJKpunct、zhnumber 重复同样的操作(对应的 TDS 包分别是 xecjk.tds.zipcjkpunct.tds.zipzhnumber.tds.zip)。

第四步:刷新文件名数据库

# TeX Live (所有平台)
sudo mktexlsr
# 或者等价的
sudo texhash

# MiKTeX
initexmf --update-fndb

第五步:验证安装

编译一个简单的测试文档确认版本号:

\documentclass{ctexart}
\begin{document}
ctex 版本:\csname ver@ctexart.cls\endcsname

xeCJK 版本:\csname ver@xeCJK.sty\endcsname

zhnumber 版本:\csname ver@zhnumber.sty\endcsname

CJKpunct 版本:\csname ver@CJKpunct.sty\endcsname

你好,世界!Hello, World!
\end{document}

版本号应显示 2026/05/04 v2.6.0(ctex)和 2026/05/04 v3.10.0(xeCJK)。注意使用文档类时应查询 ver@ctexart.cls(而非 ver@ctex.sty),因为 ctexart.cls 不通过 \RequirePackage{ctex} 加载,而是直接内联了 ctex 代码。

如何报告问题

如果在测试中发现问题,请在 GitHub Issue 中报告。一份有效的 Bug 报告应包含:

  1. 最小可复现示例(MWE):能触发问题的最短 LaTeX 代码。移除所有无关的包和内容,只保留触发问题所需的最少代码。
  2. 编译环境:操作系统、TeX 发行版版本、编译引擎(XeLaTeX / LuaLaTeX / pdfLaTeX)。
  3. 预期行为实际行为的描述。
  4. 编译日志.log 文件)中的相关片段,特别是警告和错误信息。

示例格式:

## 问题描述

在 xeCJK v3.10.0 下,使用 `\textcolor` 包裹 CJK 字符后,
后续的中西文间距消失。

## 最小可复现示例

​```latex
\documentclass{ctexart}
\usepackage{xcolor}
\begin{document}
正常间距 Hello

\textcolor{red}{异常}间距 Hello
\end{document}
​```

## 环境

- macOS 14.5, TeX Live 2025, XeLaTeX
- ctex v2.6.0, xeCJK v3.10.0

## 预期 vs 实际

预期:两行的中西文间距一致。
实际:第二行「异常」与「间距」之间缺少间距。

如果你不确定问题属于 ctex 还是 xeCJK,不必纠结——直接报告即可,维护者会做分流。

如何卸载预发版宏包

当你完成测试、或遇到严重问题需要回退到 TeX Live / MiKTeX 自带的公开版本时:

方法:删除 texmf-local 中的对应文件

# Linux / macOS
sudo rm -rf /usr/local/texlive/texmf-local/tex/latex/ctex
sudo rm -rf /usr/local/texlive/texmf-local/tex/latex/xeCJK
sudo rm -rf /usr/local/texlive/texmf-local/tex/latex/zhnumber
sudo rm -rf /usr/local/texlive/texmf-local/tex/latex/CJKpunct
sudo rm -rf /usr/local/texlive/texmf-local/doc/latex/ctex
sudo rm -rf /usr/local/texlive/texmf-local/doc/latex/xeCJK
sudo rm -rf /usr/local/texlive/texmf-local/doc/latex/zhnumber
sudo rm -rf /usr/local/texlive/texmf-local/doc/latex/CJKpunct
sudo rm -rf /usr/local/texlive/texmf-local/source/latex/ctex
sudo rm -rf /usr/local/texlive/texmf-local/source/latex/xeCJK
sudo rm -rf /usr/local/texlive/texmf-local/source/latex/zhnumber
sudo rm -rf /usr/local/texlive/texmf-local/source/latex/CJKpunct
sudo mktexlsr
# Windows (PowerShell, 管理员)
Remove-Item -Recurse C:\texlive\texmf-local\tex\latex\ctex
Remove-Item -Recurse C:\texlive\texmf-local\tex\latex\xeCJK
Remove-Item -Recurse C:\texlive\texmf-local\tex\latex\zhnumber
Remove-Item -Recurse C:\texlive\texmf-local\tex\latex\CJKpunct
Remove-Item -Recurse C:\texlive\texmf-local\doc\latex\ctex
Remove-Item -Recurse C:\texlive\texmf-local\doc\latex\xeCJK
Remove-Item -Recurse C:\texlive\texmf-local\doc\latex\zhnumber
Remove-Item -Recurse C:\texlive\texmf-local\doc\latex\CJKpunct
Remove-Item -Recurse C:\texlive\texmf-local\source\latex\ctex
Remove-Item -Recurse C:\texlive\texmf-local\source\latex\xeCJK
Remove-Item -Recurse C:\texlive\texmf-local\source\latex\zhnumber
Remove-Item -Recurse C:\texlive\texmf-local\source\latex\CJKpunct
mktexlsr

删除后刷新文件名数据库,TeX 就会回退到发行版自带的版本。可以用前面的验证文档确认版本号已经回退。

如果你只是临时想禁用预发版而不删除文件,也可以把 texmf-local/tex/latex/ctex 整个目录重命名(比如加 .bak 后缀),然后 mktexlsr——效果等价于卸载,但保留了文件方便日后恢复。

小结

这批预发布版代表了 ctex 生态近四年的积累。xeCJK 的边界恢复状态机重写解决了一大批与 \textcolorhyperref、字体切换相关的长期间距问题;ctex 的引擎适配层也进行了多处现代化更新。但正因为变更范围广,我们格外需要在正式发布前获得社区的测试反馈——哪怕只是「我的毕业论文/期刊模板能正常编译」这样的报告,对判断发布时机都很有价值。

安装测试很简单:下载 zip、解压到 texmf-local、刷新数据库。遇到问题随时在 GitHub Issue 报告,结束测试后删除文件即可回退。期待你的参与。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions