Skip to content

CI:l3kernel 2026-09-09 激活两处弃用,xeCJK/zhnumber/ctex 的调试模式测试失败 #1095

Description

@Liam0205

现象

l3kernel 2026-09-09 进入 tlnet 后,PR #1056 的 CI 中 test-xeCJK、test-zhnumber、test-ctex、test-ctex-luatex 在三个平台上都失败(运行记录)。master 最近一次定时运行(09-21)时 tlnet 还没有这一版,所以仍是绿的;master 含有同样的代码,下一次定时运行也会失败。

原因

上游在 03b50f7e 和 17c031ed 中激活了两组早已宣布的弃用。开启 \debug_on:n { deprecation }(或 { all })时,弃用命令一被用到就会报错:

包 位置 弃用命令 替代命令 触发的测试
xeCJK xeCJK.dtx 中的 \__xeCJK_math_robust:NN \cs_argument_spec:N \cs_parameter_spec:N loading01(\debug_on:n { all })
zhnumber zhnumber.dtx 中的 \zhnum_set:n 等 4 处,以及 1 处变体生成 \keys_set_filter:nnnN/nnoN \keys_set_exclude_groups:nnnN/nnoN deprecation01(\debug_on:n { deprecation })

ctex 通过 checkdeps 加载仓库里的 zhnumber,所以 ctex 的 zhnumber 测试随之失败。zhnumber 的失败表现为 .log 为空:错误发生在 \START 之前,l3build 没有保留任何输出。

弃用只在调试模式下报错,普通文档编译不受影响。上游的旧名只是新名的别名,替换后行为不变。两个替代命令的引入时间(2022-06 与 2024-01)都早于两个包各自要求的最低版本。

排查记录
  • \exp_after:wN 虽然也在 2026-09-09 被标为弃用,但上游没有为它启用报错,这次的失败与它无关。
  • 按 2026-09-09 版 l3deprecation.dtx 中已启用的全部 65 个弃用命令在仓库里搜索,只命中上面两处和 ctex/test/support/cleveref-body.tex 中的 \seq_set_map_x:NNn。后者所在的测试这次没有失败,不在本 issue 范围内。
  • 同一轮 CI 中 doc-zhlineskip 的失败是下载 install-tl 时网络超时,与此无关。

修复计划

在 master 上替换这两处,然后把 #1056 rebase 上去。

Activity

  1. github-actions commented on Sep 27, 2026

    @github-actions
    Contributor

    🐛 Bug 分析 #1095

    项目 结果
    根因 源码仍使用已进入弃用报错阶段的 \\cs_argument_spec:N 与 \\keys_set_filter:* 接口;相关调试测试会在宏包加载或调用时直接中止。
    严重程度 🟡 medium
    适合后续自动实现 ✅ 是

    📋 详细分析

    复现路径:

    1. 使用 issue 所述的新版本 l3kernel。
    2. 运行 xeCJK 的 loading01;该测试在加载 xeCJK 前执行 \\debug_on:n { all }:loading01.lvt。
    3. 运行 zhnumber 的 deprecation01;该测试在加载 zhnumber 前执行 \\debug_on:n { deprecation }:deprecation01.lvt。ctex 的 zhnumber 回归也启用了同一调试项:zhnumber.lvt。

    代码定位:

    • xeCJK 在 \\__xeCJK_math_robust:NN 中调用旧接口 \\cs_argument_spec:N:xeCJK.dtx:12375-12384。
    • zhnumber 在 \\zhnum_set:n、\\@@_set_style:、\\@@_set_user:、\\@@_set_pre_pos: 的 4 处调用 \\keys_set_filter:nnnN/\\keys_set_filter:nnoN,并在末尾生成其 nno 变体:zhnumber.dtx:2081-2125。
    • ctex 直接加载 zhnumber,因此该依赖的弃用错误会传递到 ctex 测试:ctex-kernel.dtx:1243-1246;测试构建也明确把 zhnumber 列为依赖:ctex/build.lua:26-32。

    问题原因:

    上游仍保留旧名作为新名的别名,但在弃用调试开关下访问旧名会报错。故 xeCJK 的加载测试会在 \\START 前触发错误,zhnumber 的错误也发生在测试正文开始前;普通模式未开启该检查时行为不变。ctex 的失败是 zhnumber 依赖链的直接结果,不是 ctex 自身逻辑回归。

    建议修复:

    • 将 \\cs_argument_spec:N 替换为 \\cs_parameter_spec:N。
    • 将 4 处 \\keys_set_filter:nnnN/\\keys_set_filter:nnoN 及变体生成改为对应的 \\keys_set_exclude_groups:nnnN/\\keys_set_exclude_groups:nnoN。
    • 在目标 l3kernel 版本下重新运行 xeCJK、zhnumber、ctex(含 LuaTeX)回归测试。

    这是约 6 处明确的接口替换,替代命令是旧命令的等价新名,改动范围紧凑且无架构取舍,因此适合后续自动实现。临时绕过方式是暂不启用弃用调试或使用尚未激活这些报错的 l3kernel;这不能替代源码修复。


    由 codex / gpt-5.6-sol 生成;本流程只分析,不自动修改代码。

  2. added 9 commits that reference this issue on Sep 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions