Skip to content

给pifont提供前后空格的内置支持? #1049

Closed as not planned
Closed as not planned

Description

@Explorer-cc

该问题是 #1047 的 follow-up,考虑如下的MWE:

\documentclass{article}
\usepackage{xeCJK}
\usepackage{pifont}

\begin{document}

前前前\ding{73}后后后

前前前 \ding{73}后后后

前前前\ding{73} 后后后

前前前 \ding{73} 后后后

\end{document}
Image

这与 #992 以及其 follow-up 有关....我记得提供了用户接口的....但是有内置支持应该更好,毕竟 pifont 也应该算是常用的「符号」...

Activity

  1. github-actions commented on Aug 4, 2026

    @github-actions
    Contributor

    📋 需求评审 #1049

    项目 评估
    业务价值 让 pifont 符号与相邻中文之间自动产生正常的中西文间距,避免用户手动添加空格,并使 \ding 的行为与直接输入西文符号一致。
    预估成本 🟢 small

    主要挑战:

    • 当前内置补丁只处理 pifont 字体切换造成的字符分类冲突和状态泄漏,没有恢复符号命令两侧的间距。
    • 需要同时验证有无源码空格、左右两侧以及 xCJKecglue=false/true,避免只修复示例中的一种写法。

    影响范围:

    • 仅影响 XeTeX 下同时使用 xeCJK 和 pifont 的文档。
    • 不涉及数据结构或迁移;回滚范围局限于 pifont 兼容补丁。
    • 预期应作用于底层 \Pisymbol,从而同时覆盖 \ding 和其他 Pi 字体符号。

    现有实验性接口已经能作为临时解决办法:

    \xeCJKsetup{
      experiment/boundary-register = {
        command = \Pisymbol,
        strategy = stream,
        mode = default
      }
    }

    本地宽度比对显示:设置明显可区分的 CJKecglue=5pt 时,当前实现比直接西文符号少 10pt,即左右各缺少 5pt;按上述方式注册 \Pisymbol 后差值归零。因此增加内置支持的技术路径明确。

    🔧 技术细节

    涉及模块: xeCJK 的第三方宏包兼容层和命令边界回归测试。

    关键文件:

    建议实现: 在现有 pifont 加载钩子中,将 Pisymbol 以内建 stream/default 策略注册到命令边界框架;随后扩展 pifont01,使用直接西文符号作为基准,覆盖左右边界和四种源码空格组合。

    技术风险: 较低。需要确认嵌套调用 \ding → \Pisymbol → \Pifont 不会重复启动边界捕获,并检查测试结束后捕获栈完全归零。


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

  2. Explorer-cc commented on Aug 4, 2026

    @Explorer-cc
    ContributorAuthor

    现有实验性接口已经能作为临时解决办法:

    \xeCJKsetup{
      experiment/boundary-register = {
        command = \Pisymbol,
        strategy = stream,
        mode = default
      }
    }

    本地宽度比对显示:设置明显可区分的 CJKecglue=5pt 时,当前实现比直接西文符号少 10pt,即左右各缺少 5pt;按上述方式注册 \Pisymbol 后差值归零。因此增加内置支持的技术路径明确。

    为什么要写\PiSymbol或者\Pifont才可,写\ding就不行....

    \documentclass{article}
    \usepackage{xeCJK}
    \usepackage{pifont}
    \xeCJKsetup{
      experiment/boundary-register = {
        % command = \Pifont,
        command = \ding,
        strategy = stream,
        mode = default
      }
    }
    \begin{document}
    
    前前前\ding{73}后后后
    
    前前前 \ding{73}后后后
    
    前前前\ding{73} 后后后
    
    前前前 \ding{73} 后后后
    
    \end{document}

    这将导致:

    ! Argument of \hook_use:nnw has an extra }.
    <inserted text> 
                    \par 
    l.14 前前前\ding
                 {73}后后后
    ? 

    补充一些来自 psfonts.dtx 的源码信息:

    %psfonts.dtx 
    % Line 186
    \newcommand{\Pifont}[1]{\fontfamily{#1}\fontencoding{U}%
    \fontseries{m}\fontshape{n}\selectfont}
    \newcommand{\Pisymbol}[2]{{\Pifont{#1}\char#2}}
    ...
    %Line 231
    \newcommand{\ding}{\Pisymbol{pzd}}

    而且「xeCJK/testfiles/pifont01.lvt」文件的存在似乎意味着测试过但是没增加 built-in 支持?

  3. Liam0205 commented on Aug 4, 2026

    @Liam0205
    Contributor

    为什么要写\PiSymbol或者\Pifont才可,写\ding就不行....

    这个是机制的限制,暂时不太好解决。

    而且「xeCJK/testfiles/pifont01.lvt」文件的存在似乎意味着测试过但是没增加 built-in 支持?

    pifont01.lvt 是更早引入的测试,和 #992 这一系没啥关系。暂时就不增加 built-in 支持了吧,这个功能最近也还有一些 bug report;看着还没收敛。收敛之前,暂时不增加 built-in support 以免扩大「攻击范围」(笑)。

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