Skip to content

xeCJKfntef:嵌套使用xeCJKfntef命令是否可以正确按照预期断行? #1057

Description

@Explorer-cc

在 v3.10.4 的文档中关于「xeCJKfntef」宏包有如下的表述:

xeCJK 包含有一个子宏包 xeCJKfntef,可以用它来实现汉字加点和可断行的下划线等。它是 CJKfntef 宏包在 XƎLATEX 下的替换版本,基本用法完全一致。

也有如下的表述:

在汉字下加点,可以和上述下划线命令嵌套使用。

Image

这似乎容易令人以为「上述的六个命令任意嵌套均可以正确断行」,考虑下面的例子:

\listfiles
\documentclass{article}
\usepackage[LoadFandol]{xeCJK}
\usepackage{xeCJKfntef}
\usepackage{xcolor}
\usepackage[paperwidth=10cm]{geometry}
\pagestyle{empty}
\begin{document}
\setlength\parindent{0pt}

虚室生白,吉祥止止\CJKunderline{\CJKunderanyline*{0.5ex}{\color{magenta}\rule{2pt}{2.5ex}}{虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止}}虚室生白,吉祥止止

\bigskip

虚室生白,吉祥止止\CJKunderanyline*{0.5ex}{\color{magenta}\rule{2pt}{2.5ex}}{\CJKunderline{虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止}}虚室生白,吉祥止止

\bigskip

虚室生白,吉祥止止\CJKunderdot{\CJKunderline{虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止}}虚室生白,吉祥止止

\bigskip

虚室生白,吉祥止止\CJKunderline{\CJKunderdot{虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止}}虚室生白,吉祥止止

\end{document}

在旧版的 xeCJKfntef (v3.9.1)的表现为:

Image

在新版的 xeCJKfntef (v3.10.4)的表现更为异常:

Image

对于「上述的六个命令在任意嵌套是的断行行为」,xeCJKfntef提供的支持有多少呢?如果是feature,也许在文档中提及会更好。我没有检索到类似的 issues 。


Edit

爱比较人士前排围观,lua-ul由于有了Callback的功能就是强啊...

\documentclass{article}
\usepackage[fontset=fandol]{ctex}
\usepackage[paperheight=5cm,paperwidth=10cm]{geometry}
\usepackage{xcolor}
\usepackage{luacolor}
\usepackage[soul]{lua-ul}
\pagestyle{empty}
\begin{document}

虚室生白,吉祥止止\underLine[color=magenta]{虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止}虚室生白,吉祥止止

虚室生白,吉祥止止\hl{虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止}虚室生白,吉祥止止

虚室生白,吉祥止止\hl{虚室 hello 生白,吉祥 world \underLine[color=magenta]{止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止虚室生白,吉祥止止 虚室 hello 生白,吉祥 world 止止}虚室生白,吉祥止止}虚室生白,吉祥止止

\end{document}
Image

Activity

  1. added theissue type on Aug 5, 2026
  2. github-actions commented on Aug 5, 2026

    @github-actions
    Contributor

    💬 回答 #1057

    不能。xeCJKfntef 不支持六种线型命令任意嵌套后仍可断行。

    手册所说的“可以和上述下划线命令嵌套使用”,主语是 \CJKunderdot,表示加点命令可以和前述线型命令组合。紧随其后的两个例子也只演示短文本中的“加点+下划线”,并没有承诺任意线型命令相互嵌套或嵌套内容能够断行:xeCJK.dtx:1592。

    当前实现对此有明确限制:检测到嵌套的线型装饰后,会发出 Nesting is not supported. 警告,并把内层装饰放入盒子。盒子内部不能参与外层段落断行:xeCJK.dtx:15074。因此:

    • \CJKunderdot 与线型命令包围较短片段的组合,是文档展示和测试覆盖的用法;
    • 两个线型命令互相嵌套时,内层整体不可断行;
    • 若内层内容很长,就可能溢出、产生异常行宽或出现版本间不同的异常输出;
    • v3.10.4 的结果不能视为新增了嵌套断行支持,它仍属于未支持用法下的表现。

    所以,示例中四种长文本嵌套均不应期待像单层 xeCJKfntef 命令那样正确断行。实际使用时,应避免让线型装饰覆盖另一条需要跨行的线型装饰;可以拆分成若干不跨行的短片段。

    文档确实可以进一步明确这一边界,例如在“可以嵌套使用”后补充:该说明只涉及加点与线型装饰的组合;嵌套的线型命令会把内层内容装入不可断行的盒子。


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

  3. removed theissue type on Aug 5, 2026
  4. Explorer-cc commented on Aug 5, 2026

    @Explorer-cc
    ContributorAuthor

    duplicated: #769

    但是文档可以新增一些提示/说明,这里暂不 close。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions