Skip to content

xecjk文档中关于「五角星」的前后间距问题? #1047

Description

@Explorer-cc

在 xecjk v3.10.4 - 3.10.5-rc4 版本的文档中,出现了如下的异常间距现象:

Image

经过简单定位,可以考虑如下的MWE:

\documentclass{article}
\usepackage{xeCJK}
\usepackage{auxhook}
\usepackage{pifont}
\usepackage[hidelinks]{hyperref}
% https://github.com/CTeX-org/ctex-kit/blob/2dd5af6677fae81db63383f3241973e5e8a6d85f/support/ctxdoc.cls#L191-L198
\makeatletter
\newrobustcmd\exptarget{%
  \AddLineBeginMainAux{\csgdef{Codedoc@expstar}{}}%
  \Hy@raisedlink{\hypertarget{expstar}{}}}
\newrobustcmd\rexptarget{%
  \AddLineBeginMainAux{\csgdef{Codedoc@rexpstar}{}}%
  \Hy@raisedlink{\hypertarget{rexpstar}{}}}
\newrobustcmd\expstar{\hyperlink{expstar}{$\star$}}
\newrobustcmd\rexpstar{\hyperlink{rexpstar}{\ding{73}}}
\makeatother
\begin{document}

带有 \exptarget\expstar{} 或者 \rexptarget\rexpstar{} 标记的选项或命令
只能在导言区中使用,其中 \rexptarget\rexpstar{} 还表示这个

带有 \expstar{} 或者 \rexpstar{} 标记的选项或命令
只能在导言区中使用,其中 \rexpstar{} 还表示这个

带有 $\star$ 或者 \ding{73} 标记的选项或命令
只能在导言区中使用,其中 \ding{73} 还表示这个
 
\end{document}
Image

这里第一行的行为不符合预期。关于第三行的 \ding 的行为应该另开一个 issue (#1049) .

Activity

  1. github-actions commented on Aug 4, 2026

    @github-actions
    Contributor

    🐛 Bug 分析 #1047

    项目 结果
    根因 \exptarget 在正文与五角星链接之间留下零尺寸超链接目标盒子;该盒子没有接入 xeCJK 的透明边界恢复机制,遮蔽了实际的 CJK→公式边界。
    严重程度 🟢 low
    适合后续自动实现 ❌ 否

    📋 详细分析

    复现路径:

    1. 使用 Issue 中的 MWE,并加载 xeCJK 3.10.4 至 3.10.5-rc4。
    2. 比较 \exptarget\expstar、单独的 \expstar 和直接输入 $\star$。
    3. 只有第一种写法在五角星左侧出现异常间距。

    代码定位:

    问题原因: \exptarget 通过 \Hy@raisedlink{\hypertarget{...}{}} 插入不可见的零尺寸目标盒子,随后 \expstar 又开始一个内容为行内公式的链接。xeCJK 已为链接注释本身启动 stream capture,并能正确识别单独 \expstar 中的公式边界;但前置目标盒子不属于该 capture,也没有作为 transparent 或 post-transparent 命令登记。因此,它位于前一个汉字与链接五角星之间时,会遮蔽此前记录的 CJK 边界,导致链接开始处无法按直接输入 $\star$ 的规则恢复间距。

    这也解释了为什么去掉 \exptarget 后行为正常:问题不在五角星字形或 \hyperlink 本身,而在紧邻链接之前的不可见目标盒子。Issue 中提到的 \ding{73} 还涉及 pifont 字符输出与 XeTeX interchar 的另一条路径,不应与本问题合并判断。

    修复范围尚需在两种方案间决定:仅把 ctxdoc 的 \exptarget/\rexptarget 登记为透明边界命令,或者在 xeCJK 中统一适配 hyperref 的目标命令。后一种方案影响所有文档中的锚点,并需要补充“汉字—目标—公式链接”、普通链接、嵌套目标及加载顺序的回归测试,因此当前不建议直接交给后续自动实现。


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

  2. added 3 commits that reference this issue on Aug 5, 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