Skip to content

Documentation:ctxdoc文档类影响xecjk文档中的mdcode中盒子内部+和-符号的基线 #1060

Closed

Description

@Explorer-cc

这是对 #1054 的一点补充。注意到在 xeCJK-v3.10.5-rc5 中的文档文件xeCJK.pdf中(Page.5),还存在关于 \mdcode 高度不平齐的问题:

Image

考虑如下的两个MWE:

\documentclass{article}
\usepackage[fontset=fandol]{ctex}
\ExplSyntaxOn
\XeTeXcharclass`- = \xeCJK_class_num:n { Default }
\ExplSyntaxOff
% https://github.com/CTeX-org/ctex-kit/blob/47639ff1eb2cc7b2c0a0c05c1cb2385c99936ebd/xeCJK/xeCJK.dtx#L244-L281
\usepackage{menukeys}
\begin{document}

你好+和-你好\texttt{+}和\texttt{-}你好

你好 + 和 - 你好 \texttt{+} 和 \texttt{-} 你好

你好+和--你好\texttt{+}和\texttt{-}你好

你好 + 和 -- 你好 \texttt{+} 和 \texttt{-} 你好

你好~\menu{+} 和~\menu{-} 你好~\menu{\texttt{+}} 和 \menu{\texttt{-}} 你好

\end{document}
Image

这是对的齐的。

但是如果切换文档类为 ctxdoc,则由于字体改变,出现了符号的不对齐(汗...)

\documentclass{ctxdoc}%<----------
\ExplSyntaxOn
\XeTeXcharclass`- = \xeCJK_class_num:n { Default }
\ExplSyntaxOff
% https://github.com/CTeX-org/ctex-kit/blob/47639ff1eb2cc7b2c0a0c05c1cb2385c99936ebd/xeCJK/xeCJK.dtx#L244-L281
\usepackage{menukeys}

\begin{document}

你好+和-你好\texttt{+}和\texttt{-}你好

你好 + 和 - 你好 \texttt{+} 和 \texttt{-} 你好

你好+和--你好\texttt{+}和\texttt{-}你好

你好 + 和 -- 你好 \texttt{+} 和 \texttt{-} 你好

你好~\menu{+} 和~\menu{-} 你好~\menu{\texttt{+}} 和 \menu{\texttt{-}} 你好

\end{document}
Image

根因在这里:

\setmonofont{cmun}[
Extension = .otf,
UprightFont = *btl,
BoldFont = *tb,
ItalicFont = *bto,
BoldItalicFont = *tx,
HyphenChar = None]

Activity

  1. added theissue type on Aug 7, 2026
  2. changed the title [-]Documentation:`ctxdoc`文档类影响`xecjk`文档中的`mdcode`中盒子内部符号的基线[/-] [+]Documentation:`ctxdoc`文档类影响`xecjk`文档中的`mdcode`中盒子内部`+`和`-`符号的基线[/+] on Aug 7, 2026
  3. github-actions commented on Aug 7, 2026

    @github-actions
    Contributor

    🐛 Bug 分析 #1060

    项目 结果
    根因 \mdcode 以基线为轴缩放 menukeys 盒子;该盒子的深度占比大于汉字,缩放后外边框仍向基线下方伸出过多。ctxdoc 选择的字体度量使这一偏差更明显。
    严重程度 🟢 low
    适合后续自动实现 ❌ 否(当前版本已经修复,无需再进入实现流程)

    当前分析使用的提交 47639ff1eb2cc7b2c0a0c05c1cb2385c99936ebd 已包含修复:缩放后根据汉字实际墨迹深度上移盒子,使外边框底边与周围汉字对齐。因此,Issue 中的现象不是仍待修复的当前缺陷。

    📋 详细分析

    复现路径:

    1. 使用 ctxdoc 文档类加载 menukeys。
    2. 按 xeCJK 文档中的 \mdcode 形式缩放 \menu 盒子。
    3. 观察缩放后的外边框相对周围汉字向下偏移;字体不同会改变偏移的可见程度。

    代码定位: xeCJK/xeCJK.dtx:245-279

    问题原因: \box_scale:Nnn 围绕基线同时缩放盒子的高度和深度。menukeys 生成的盒子在基线以下所占比例比汉字大,所以仅把总高度缩放到一个汉字宽度不能保证视觉基线对齐。当前实现测量汉字深度,并按字形墨迹与声明深度的实测比例 1.131 计算目标深度,再用 \box_move_up:nn 上移缩放后的盒子。提交记录显示该修复在 \small、正常字号和 \large 下均进行了像素墨迹检查,同时通过了文档构建和 xeCJK 测试。


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

  4. Explorer-cc commented on Aug 7, 2026

    @Explorer-cc
    ContributorAuthor

    🐛 Bug 分析 #1060

    项目 结果
    根因 \mdcode 以基线为轴缩放 menukeys 盒子;该盒子的深度占比大于汉字,缩放后外边框仍向基线下方伸出过多。ctxdoc 选择的字体度量使这一偏差更明显。
    严重程度 🟢 low
    适合后续自动实现 ❌ 否(当前版本已经修复,无需再进入实现流程)
    当前分析使用的提交 47639ff1eb2cc7b2c0a0c05c1cb2385c99936ebd 已包含修复:缩放后根据汉字实际墨迹深度上移盒子,使外边框底边与周围汉字对齐。因此,Issue 中的现象不是仍待修复的当前缺陷。

    📋 详细分析

    复现路径:

    1. 使用 ctxdoc 文档类加载 menukeys。
    2. 按 xeCJK 文档中的 \mdcode 形式缩放 \menu 盒子。
    3. 观察缩放后的外边框相对周围汉字向下偏移;字体不同会改变偏移的可见程度。

    代码定位: xeCJK/xeCJK.dtx:245-279

    问题原因: \box_scale:Nnn 围绕基线同时缩放盒子的高度和深度。menukeys 生成的盒子在基线以下所占比例比汉字大,所以仅把总高度缩放到一个汉字宽度不能保证视觉基线对齐。当前实现测量汉字深度,并按字形墨迹与声明深度的实测比例 1.131 计算目标深度,再用 \box_move_up:nn 上移缩放后的盒子。提交记录显示该修复在 \small、正常字号和 \large 下均进行了像素墨迹检查,同时通过了文档构建和 xeCJK 测试。

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

    分析完全脱离重点,现在的问题不是「盒子和汉字的相对高度问题」,而是「盒子内部的符号的基线不符合预期」。要注意区分。

  5. Explorer-cc commented on Aug 7, 2026

    @Explorer-cc
    ContributorAuthor

    这本质是个 CMUTypewriter 字体符号的基线问题,本着有问题必问的原则,我在这里开了个帖子。

    在 ctex-kit 端,我不知道为何ctxdoc.cls要选用 cm-unicode 包提供的这个 Typewriter Font,如果切回 lmtt 能解决的话,切回去似乎也行...

  6. myhsia commented on Aug 7, 2026

    @myhsia
    Member

    @Explorer-cc 原来是这样啊, 那我知道了, 你试试 l3doc

  7. myhsia commented on Aug 7, 2026

    @myhsia
    Member

    @myhsia 如果依旧, 那就是因为 l3doc 的默认字体, 有个 lm-default 选项

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions