ctex-kit icon indicating copy to clipboard operation
ctex-kit copied to clipboard

Fixed a bug of `"makespa"`

Open myhsia opened this issue 3 weeks ago • 7 comments

Windows / *nix 上在制作 .spa 时都会出现如下错误

396438169f41f729a6ad8bd91a7fbd4c

正确用法的_影子_可在 xetex 文档 pp. 10 查到: xetex manual \font\x="[CharisSIL-Italic.ttf]" at 24pt \x

具体复现与 Debug 细节,可参见 LaTeX 技术交流群记录(对于任何字体都会有,包括 fandol

和 @Explorer-cc 的讨论

@myhsia: 这个涉及到-shell-escape编组问题,i.e. 比如 win 上若文件名有-,则文件名需要"",而macOS则需要''

问题复现

  1. 安装最新版lxgw-fonts
  2. clone ctex-kit
  3. cd 到 ctex-kit/ctex
  4. 执行 l3build unpack
  5. 把抽取的 a. ctex-spa-macro.tex; b. ctex-spa-make.tex 临时放一个文件夹
  6. 在 ctex-spa-make.tex 添加这组“键值对(不严谨地讲,其实更像 l3case)”,并把其他内容注释掉(毕竟你不可能安装了所有系统字体)
    {lxgwzhsong}      {LXGWWenKaiLite-Regular} ,
    {lxgwzhsongb}     {LXGWWenKaiLite-Medium} ,
    {lxgwzhhei}       {LXGWMarkerGothic-Regular} ,
    {lxgwzhfs}        {LXGWXiaolai-Regular} ,
    {lxgwzhkai}       {LXGWYozai-Regular} ,
    {lxgwzhkaib}      {LXGWYozai-Medium} ,
  1. 命令行执行 xelatex -shell-escape ./ctex-spa-make.tex,看看是否会 font not found, \scan_stop:
  2. 无论会不会,将 ctex-spa-macro.tex 文件的 line 55 更改为:
\tex_font:D \l__ctex_punct_font = "[#2]" ~ at ~ 100 pt \scan_stop:

也就是把 "#2" 改为 "[#2]" 9. 再次执行 xelatex -shell-escape ./ctex-spa-make.tex,看看是否会得到报错/报错消失 10. 已知 macOS 需要这样更改,Windows 是否需要未知

此处省略部分问答

@Explorer-cc: 「7. 命令行执行 xelatex -shell-escape ./ctex-spa-make.tex,看看是否会 font not found, \scan_stop:」 会

这里的报错日志见 4 楼 @Explorer-cc 贴出的.

@Explorer-cc: 「8. 无论会不会,将 ctex-spa-macro.tex 文件的 line 55 更改为: \tex_font:D \l__ctex_punct_font = "[#2]" ~ at ~ 100 pt \scan_stop: 也就是把 "#2" 改为 "[#2]" 9. 再次执行 xelatex -shell-escape ./ctex-spa-make.tex,看看是否会得到报错/报错消失」 6e1a813baad038e46af5a2eb91f24b6c 报错消失了

@myhsia: 截图下目录中的 .spa 文件内容,我顺便比对下两个系统生成的spa数据是否一致

@Explorer-cc: .spa 内容

简述解决方法:注意到 xetex manual \font\x="[CharisSIL-Italic.ttf]" at 24pt \x 中的 "[字体文件]" 这种代码格式,over.

myhsia avatar Dec 03 '25 05:12 myhsia

所以是,之前的字体名刚好都不包含 -?好奇为什么之前能用。

(引用内容时,建议文字形式优先;实在要发图片时,建议保持图片比例一致,这样图里的文字大小也一致)

muzimuzhi avatar Dec 03 '25 22:12 muzimuzhi

之前的 macro 那个文件确实不包含那个方括号,我猜测应该是 -shell-escape 执行的脚本对应的程序在某个时间点更新了什么东西…

myhsia avatar Dec 04 '25 00:12 myhsia

(引用内容时,建议文字形式优先;实在要发图片时,建议保持图片比例一致,这样图里的文字大小也一致)

支持,文字形式的内容更容易被搜索引擎检索到(考虑到后来人需要检索类似错误时带来的便利性)。

第一幅图的文本形式内容(在windows11上测试的结果)为:

xelatex --shell-escape ctex-spa-make
This is XeTeX, Version 3.141592653-2.6-0.999997 (TeX Live 2025) (preloaded format=xelatex)
 \write18 enabled.
entering extended mode
(./ctex-spa-make.tex
LaTeX2e <2025-11-01>
L3 programming layer <2025-11-14>
(./ctex-spa-macro.tex
(c:/texlive/2025/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
(c:/texlive/2025/texmf-dist/tex/latex/l3kernel/expl3.sty
(c:/texlive/2025/texmf-dist/tex/latex/l3backend/l3backend-xetex.def))))
kpathsea: Running mktextfm LXGWXiaolai-Regular

The command name is C:\texlive\2025\bin\windows\mktextfm

kpathsea: Running mktexmf LXGWXiaolai-Regular.mf

The command name is C:\texlive\2025\bin\windows\mktexmf
name = LXGWXiaolai-Regular, rootname = LXGWXiaolai-Regular, pointsize = 
mktexmf: empty or non-existent rootfile!
Cannot find LXGWXiaolai-Regular.mf.
kpathsea: Appending font creation commands to missfont.log.

! Font \l__ctex_punct_font=LXGWXiaolai-Regular at 100.0pt not loadable: Metric  
(TFM) file or installed font not found.
<to be read again>
                   \scan_stop:
l.86   }

?

Explorer-cc avatar Dec 04 '25 02:12 Explorer-cc

BTW, make 文件中 fandolcases 的字体名有误, 缺少一些 -Regular. 我已在 macOS 测试, @Explorer-cc 已在 Windows 上测试. 就不新开 PR 了, 一起合并好了

对话记录:

@myhsia @北回归线-Explorer E 老师有时间可在 Windows 上再帮我测试一个类似的 case: <此处省略一万字>

  1. 注释掉 ctex-spa-make.tex\MAKESPA {ctexpunct.spa} 的所有内容,只保留 {fandolzh*} 开头的 6 行 cases
  2. 命令行执行 xetex -shell-escape ./ctex-spa-make.tex 也会相同报错
  3. 把 fandol 的6行替换为
    {fandolzhsong}    {FandolSong-Regular} ,
    {fandolzhsongb}   {FandolSong-Bold} ,
    {fandolzhhei}     {FandolHei-Regular} ,
    {fandolzhheib}    {FandolHei-Bold} ,
    {fandolzhkai}     {FandolKai-Regular} ,
    {fandolzhfs}      {FandolFang-Regular} ,

并再次命令行编译,如果顺利通过并生成 .spa 文件,发下 .spa 文件内容

@Explorer-cc 「1. 注释掉 ctex-spa-make.tex\MAKESPA {ctexpunct.spa} 的所有内容,只保留 {fandolzh*} 开头的 6 行 cases 2. 命令行执行

  xetex -shell-escape ./ctex-spa-make.tex

也会相同报错」 同样报错

@Explorer-cc a2d988596d7f358ce919ca7487350e87

其实就是是这个脚本旧了,以至于 Fandol 字体 filename 更新,这里都没来得及更新 :-)

e5651290b1d45164d747978a251367ee

myhsia avatar Dec 04 '25 02:12 myhsia

BTW, make 文件中 fandolcases 的字体名有误, 缺少一些 -Regular. 我已在 macOS 测试, @Explorer-cc 已在 Windows 上测试. 就不新开 PR 了, 一起合并好了

Fixed in Commit #be574c4

myhsia avatar Dec 04 '25 02:12 myhsia

BTW, make 文件中 fandolcases 的字体名有误, 缺少一些 -Regular. 我已在 macOS 测试, @Explorer-cc 已在 Windows 上测试. 就不新开 PR 了, 一起合并好了

补充:

@Explorer-cc 执行的起点是? 改不改 「#2」「[#2]」

@myhsia 改.

这说明这个 bug 是普遍性的,针对任何字体,包括 fandol.

myhsia avatar Dec 04 '25 02:12 myhsia

BTW, make 文件中 fandolcases 的字体名有误, 缺少一些 -Regular. 我已在 macOS 测试, @Explorer-cc 已在 Windows 上测试. 就不新开 PR 了, 一起合并好了

补充:

@Explorer-cc 执行的起点是? 改不改 「#2」「[#2]」

@myhsia 改.

这说明这个 bug 是普遍性的,针对任何字体,包括 fandol.

Hope to merge asap. This bug may block some font developers from developing the ctex-fontset file :-D

myhsia avatar Dec 06 '25 15:12 myhsia