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

ctex的Lualatex or/+ MacOS15兼容性问题

Open xiaoyuleiba opened this issue 1 year ago • 41 comments

系统: MacOS 15.0 MacTeX: 2024版

1.log

复现最小例:

\documentclass{ctexart}
\begin{document}
1
\end{document}

好像之前没这个问题, 现在直接调用了 ctex-fontset-macold.def , 打开之后看到里面有一句

{macOS fonts definition for Yosemite or earlier version (CTEX)}

会不会跟这个有关系呢?

xiaoyuleiba avatar Sep 23 '24 13:09 xiaoyuleiba

log 里有一串找不到字体的 fontspec error,STKaiti, STHeiti, STSong 通通找不到/无法解析。

现在直接调用了 ctex-fontset-macold.def

新旧判断的依据是 /System/Library/Fonts/PingFang.ttc 文件是否存在:

https://github.com/CTeX-org/ctex-kit/blob/0fb196c42c56287403fecca6eb6b137c00167f40/ctex/ctex.dtx#L10814-L10816

我还在 macOS 14,GitHub Actions 也还没提供 macOS 15,无法直接测试。你能查看/System/Library/Fonts/PingFang.ttc 这个文件是否存在吗?如果不存在,那么 Font Book.app 里,有 PingFang SC 字体吗(也许需要下载),有的话,对应的文件位置在哪?

比如 macOS 14.6.1 里, image

muzimuzhi avatar Sep 23 '24 16:09 muzimuzhi

您好. 现在字体册里的pingfang港澳简繁4个都不显示位置. 但是自己下的字体, 以及一些别的自带字体 (Courier New) 都还是有显示文件位置.

截屏2024-09-24 2 08 26 截屏2024-09-24 2 09 09 截屏2024-09-24 2 13 21

xiaoyuleiba avatar Sep 23 '24 17:09 xiaoyuleiba

还有, 现在我的/System/Library/Fonts里是这样的, 可以作为一点参考.

fonts.log

xiaoyuleiba avatar Sep 23 '24 17:09 xiaoyuleiba

系统: MacOS 15.0 MacTeX: 2024版

1.log

复现最小例:

\documentclass{ctexart}
\begin{document}
1
\end{document}

好像之前没这个问题, 现在直接调用了 ctex-fontset-macold.def , 打开之后看到里面有一句

{macOS fonts definition for Yosemite or earlier version (CTEX)}

会不会跟这个有关系呢?

但是在xelatex下是没有任何问题的

xiaoyuleiba avatar Sep 23 '24 17:09 xiaoyuleiba

但是在xelatex下是没有任何问题的

  • 如果 xelatex 下加载的也是 ...-macold.def,只是没有后续的报错,那在命令行执行
    sudo tlmgr conf texmf OSFONTDIR /System/Library/AssetsV2/com_apple_MobileAsset_Font7
    
    也许能让 lualatex 下的行为和 xelatex 一致。com_apple_MobileAsset_Font7 里的数字 7 可能变了,你可以在 AssetsV2 里搜 "otf" 判断现在的目录名
  • 如果 xelatex 下加载的是 ...-macnew.def,那就有点奇怪了。可以用 xelatex 和 lualatex 分别执行
    \documentclass{article}
    \begin{document}
    \ExplSyntaxOn
    \file_if_exist:nTF { /System/Library/Fonts/PingFang.ttc } TF
    \ExplSyntaxOff
    \end{document}
    
    再次确认一下(行为的不一致)

PingFang.ttc 新路径的问题,我白天应该能碰到 macOS 15 的机器。你可以先在 /System/Library/AssetsV2/com_apple_MobileAsset_Font7 或全盘试着找找看。

muzimuzhi avatar Sep 23 '24 17:09 muzimuzhi

看起来在 macOS 15,苹方对应的字体名是 PingFangUI.ttc

更新 1:根据 https://gitlab.freedesktop.org/freetype/freetype/-/issues/1281 ,它可能在

/System/Library/PrivateFrameworks/FontServices.framework/Versions/A/Resources/Reserved/PingFangUI.ttc

那就 \documentclass[fontset=macnew]{ctexart} 先用着吧。

更新 2:根据 https://zhuanlan.zhihu.com/p/703590357 ,这个新的苹方字体用了新的字体格式,很可能 xe- 和 lua-latex 里都(暂且)无法使用。hmm

更新 3:

macOS Sequoia 的苹方使用了一种没见过的可变技术 (hvgl table) 来储存轮廓,还有另一个没见过的表 (cidg table),并且 FTXViewer 都不能读。 https://x.com/alpha_argon/status/1800432640820170757

muzimuzhi avatar Sep 23 '24 17:09 muzimuzhi

刚刚的两个文件都是生成F.

看起来在 macOS 15,苹方对应的字体名是 PingFangUI.ttc

根据 https://gitlab.freedesktop.org/freetype/freetype/-/issues/1281 ,它可能在

/System/Library/PrivateFrameworks/FontServices.framework/Versions/A/Resources/Reserved/PingFangUI.ttc

那就 \documentclass[fontset=macnew]{ctexart} 先用着吧。

谢谢. 不过他们咋想的往那里塞了,,,

xiaoyuleiba avatar Sep 23 '24 18:09 xiaoyuleiba

不对, \documentclass[fontset=macnew]{ctexart}也还是报错

macnew.log

xiaoyuleiba avatar Sep 23 '24 18:09 xiaoyuleiba

不对, \documentclass[fontset=macnew]{ctexart}也还是报错

macnew.log

xelatex的log: xelatex.log

xiaoyuleiba avatar Sep 23 '24 18:09 xiaoyuleiba

看到已经有人从 PingFangUI.ttc 提取了单独的 otf 格式 https://github.com/dsrkafuu/dsr-blog/discussions/9#discussioncomment-9926574

根据 https://github.com/ACT-02/PingFang-for-Windows/commit/fff349b9529cf7a349d8e3b609771e6b372bb07a ,在 macOS 15 beta 1 时,PingFangUI.ttc 在 /System/Library/AssetsV2/com_apple_MobileAsset_Font7/PingFang.ttc。

muzimuzhi avatar Sep 23 '24 18:09 muzimuzhi

xelatex用的不是new也不是old, 而是没有后缀的

xelatex_No_Option.log

xiaoyuleiba avatar Sep 23 '24 18:09 xiaoyuleiba

xelatex用的不是new也不是old, 而是没有后缀的

xelatex_No_Option.log

还是 old,你看 195 行

% xelatex_No_Option.log, lines 190-196
(/usr/local/texlive/2024/texmf-dist/tex/latex/ctex/fontset/ctex-fontset-mac.def
File: ctex-fontset-mac.def 2022/07/14 v2.5.10 macOS fonts definition (CTEX)

(/usr/local/texlive/2024/texmf-dist/tex/latex/ctex/fontset/ctex-fontset-macold.
def
File: ctex-fontset-macold.def 2022/07/14 v2.5.10 macOS fonts definition for Yos
emite or earlier version (CTEX)

muzimuzhi avatar Sep 23 '24 18:09 muzimuzhi

xelatex用的不是new也不是old, 而是没有后缀的 xelatex_No_Option.log

还是 old,你看 195 行

% xelatex_No_Option.log, lines 190-196
(/usr/local/texlive/2024/texmf-dist/tex/latex/ctex/fontset/ctex-fontset-mac.def
File: ctex-fontset-mac.def 2022/07/14 v2.5.10 macOS fonts definition (CTEX)

(/usr/local/texlive/2024/texmf-dist/tex/latex/ctex/fontset/ctex-fontset-macold.
def
File: ctex-fontset-macold.def 2022/07/14 v2.5.10 macOS fonts definition for Yos
emite or earlier version (CTEX)

还真是,瞟了一眼没细看,我的

xiaoyuleiba avatar Sep 23 '24 18:09 xiaoyuleiba

短期的方案,也许是找还在 macOS 14 的小伙伴(或各种镜像里)复制一个 PingFang.ttc。

中期,看起来 ctex 需要为 macOS 15 调整预设字体。

长期,希望(在苹果发布新格式的文档后),xetex 用的 fontconfig 和 luatex 用的 luaotfload 都能添加支持……

muzimuzhi avatar Sep 23 '24 19:09 muzimuzhi

根据 ACT-02/PingFang-for-Windows@fff349b ,在 macOS 15 beta 1 时,PingFangUI.ttc 在 /System/Library/AssetsV2/com_apple_MobileAsset_Font7/PingFang.ttc。

把这个抓出来单独安装, 提示已安装. 用sudo su -都不让往/System/Library/Fonts里塞东西了,,,
让macos13的朋友给我拷了一个PingFang.tcc, 直接提示 不包含可安装在macos的字体.

xiaoyuleiba avatar Sep 24 '24 06:09 xiaoyuleiba

把这个抓出来单独安装, 提示已安装. 用sudo su -都不让往/System/Library/Fonts里塞东西了,,, 让macos13的朋友给我拷了一个PingFang.tcc, 直接提示 不包含可安装在macos的字体.

可能要先关闭 SIP

stone-zeng avatar Sep 24 '24 06:09 stone-zeng

把这个抓出来单独安装, 提示已安装. 用sudo su -都不让往/System/Library/Fonts里塞东西了,,, 让macos13的朋友给我拷了一个PingFang.tcc, 直接提示 不包含可安装在macos的字体.

可能要先关闭 SIP

这下貌似有点难度了 截屏2024-09-24 16 12 52

xiaoyuleiba avatar Sep 24 '24 07:09 xiaoyuleiba

log 里有一串找不到字体的 fontspec error,STKaiti, STHeiti, STSong 通通找不到/无法解析。

现在直接调用了 ctex-fontset-macold.def

新旧判断的依据是 /System/Library/Fonts/PingFang.ttc 文件是否存在:

https://github.com/CTeX-org/ctex-kit/blob/0fb196c42c56287403fecca6eb6b137c00167f40/ctex/ctex.dtx#L10814-L10816

我还在 macOS 14,GitHub Actions 也还没提供 macOS 15,无法直接测试。你能查看/System/Library/Fonts/PingFang.ttc 这个文件是否存在吗?如果不存在,那么 Font Book.app 里,有 PingFang SC 字体吗(也许需要下载),有的话,对应的文件位置在哪?

比如 macOS 14.6.1 里, image


问题应该确实出在这里。 /System/Library/Fonts/PingFang.ttc不存在,不过文件夹还在。

我发现升级MacOS15后,默认字体都无法加粗了,看了一下代码,MacOS15下这个判断逻辑会有问题/System/Library/Fonts/PingFang.ttc不存在,导致fontset用的macold

解决方法:

手动设置为macnew就正常了:

\documentclass[fontset=macnew]{ctexbook}

应该需要更新一下判断是否是新的mac的方法了。

Fanchengyan avatar Sep 30 '24 09:09 Fanchengyan

log 里有一串找不到字体的 fontspec error,STKaiti, STHeiti, STSong 通通找不到/无法解析。

现在直接调用了 ctex-fontset-macold.def

新旧判断的依据是 /System/Library/Fonts/PingFang.ttc 文件是否存在: https://github.com/CTeX-org/ctex-kit/blob/0fb196c42c56287403fecca6eb6b137c00167f40/ctex/ctex.dtx#L10814-L10816

我还在 macOS 14,GitHub Actions 也还没提供 macOS 15,无法直接测试。你能查看/System/Library/Fonts/PingFang.ttc 这个文件是否存在吗?如果不存在,那么 Font Book.app 里,有 PingFang SC 字体吗(也许需要下载),有的话,对应的文件位置在哪? 比如 macOS 14.6.1 里, image

问题应该确实出在这里。 /System/Library/Fonts/PingFang.ttc不存在,不过文件夹还在。

我发现升级MacOS15后,默认字体都无法加粗了,看了一下代码,MacOS15下这个判断逻辑会有问题/System/Library/Fonts/PingFang.ttc不存在,导致fontset用的macold

解决方法:

手动设置为macnew就正常了:

\documentclass[fontset=macnew]{ctexbook}

应该需要更新一下判断是否是新的mac的方法了。

你看之前的有一个 ‘macnew.log‘ ,这样还是报错。现在是xelatex和lualatex均调用 ‘macold‘ ,但只有lualatex会报错

xiaoyuleiba avatar Oct 01 '24 00:10 xiaoyuleiba

我又重新测试了,结果如下:

  1. 判断macnew的逻辑有问题, 默认必定是使用macold的,所以macnew是不会被使用的,除非手动设定fontset=macnew
  2. 无论是macold还是macnewxelatex都不会报错,但lualatex都会报错, 无法运行。

结论

  1. mac下,ctexmacnew的判断逻辑有问题,需要更新。
  2. xelatex可以正常运行,说明字体本身是没有问题的,可能是lualatex的问题。

附:强制使用macnew的方法

测试的时候,使用了2种强制macnew方法:

1. 手动设定fontset=macnew:

\documentclass[fontset=macnew]{ctexbook}

2. 修改ctex-fontset-mac.def文件30行,将macnew的判断逻辑改为必定使用macnew

\file_if_exist:nTF { /System/Library/Fonts/PingFang.ttc }
  { \ctex_file_input:n { ctex-fontset-macnew.def } }
  { \ctex_file_input:n { ctex-fontset-macnew.def } }
%%  { \ctex_file_input:n { ctex-fontset-macold.def } }

这两种方法都可以成功。

使用macnew 下, xelatex和lualatex运行的log

test_xelatex.log test_lualatex.log

Fanchengyan avatar Oct 01 '24 04:10 Fanchengyan

我又重新测试了,结果如下:

  1. 判断macnew的逻辑有问题, 默认必定是使用macold的,所以macnew是不会被使用的,除非手动设定fontset=macnew
  2. 无论是macold还是macnewxelatex都不会报错,但lualatex都会报错, 无法运行。

结论

  1. mac下,ctexmacnew的判断逻辑有问题,需要更新。
  2. xelatex可以正常运行,说明字体本身是没有问题的,可能是lualatex的问题。

附:强制使用macnew的方法

测试的时候,使用了2种强制macnew方法:

1. 手动设定fontset=macnew:

\documentclass[fontset=macnew]{ctexbook}

2. 修改ctex-fontset-mac.def文件30行,将macnew的判断逻辑改为必定使用macnew

\file_if_exist:nTF { /System/Library/Fonts/PingFang.ttc }
  { \ctex_file_input:n { ctex-fontset-macnew.def } }
  { \ctex_file_input:n { ctex-fontset-macnew.def } }
%%  { \ctex_file_input:n { ctex-fontset-macold.def } }

这两种方法都可以成功。

使用macnew 下, xelatex和lualatex运行的log

test_xelatex.log test_lualatex.log

我刚刚按照这个方法修改了 ctex-fontset-mac.def, 在texstudio里用lualatex运行如下代码, 报错.

\documentclass[fontset=macnew]{ctexbook}
\begin{document}
1
\end{document}

两种方法单独或同时使用, 三种情况均不成功.

ctexbook_macnew_lualatex_fontset_Only.log

ctexbook_macnew_lualatex_DefOnly.log

ctexbook_macnew_lualatex_both.txt

xiaoyuleiba avatar Oct 01 '24 10:10 xiaoyuleiba

test_xelatex.log test_lualatex.log

在 lualatex 版 log 第 531 行, 和 xelatex 版的 log 第 239行, 都有相同的一句话:

LaTeX Info: Package 'ctex.sty' has been disabled.

而这也都是 ctex 字段在各自的 log 文件最后出现的位置. 你的代码根本没把 ctex 带起来, 不报错那也是必然的.

xiaoyuleiba avatar Oct 01 '24 10:10 xiaoyuleiba

没影响,我现在在写毕业论文,xelatex可以正常编译。

Fanchengyan avatar Oct 01 '24 11:10 Fanchengyan

没影响,我现在在写毕业论文,xelatex可以正常编译。

确实不影响, 但是现在并不是说有没有影响的事情, 而是要解决这个问题. 非要用 ctex + lualatex + macos15的人几乎没有.

xiaoyuleiba avatar Oct 01 '24 11:10 xiaoyuleiba

嗯嗯,现在是先定位问题。xelatex可以编译,可以排除字体本身的问题,说明是lualatex代码里的逻辑判断部分,在更新系统后出现的问题。另外ctex的判断macnew字体集的代码也有问题,需要更新。

Fanchengyan avatar Oct 01 '24 11:10 Fanchengyan

我来提供另一个现象吧,xelatex编译的\lishu\youyuan都未定义了,估计跟这个也有关系?

xiehao avatar Nov 18 '24 11:11 xiehao

@xiehao

这个是ctex判断MacOS版本的问题的bug,默认使用的是macold,显式地设置fontset成macnew就可以:

\documentclass[fontset=macnew]{ctexbook}
\usepackage{ctex}

\begin{document}

\lishu 你好,世界!

\youyuan 你好,世界!

\end{document}
image

详情可以参考这条评论:

我又重新测试了,结果如下:

  1. 判断macnew的逻辑有问题, 默认必定是使用macold的,所以macnew是不会被使用的,除非手动设定fontset=macnew
  2. 无论是macold还是macnewxelatex都不会报错,但lualatex都会报错, 无法运行。

结论

  1. mac下,ctexmacnew的判断逻辑有问题,需要更新。
  2. xelatex可以正常运行,说明字体本身是没有问题的,可能是lualatex的问题。

附:强制使用macnew的方法

测试的时候,使用了2种强制macnew方法:

1. 手动设定fontset=macnew:

\documentclass[fontset=macnew]{ctexbook}

2. 修改ctex-fontset-mac.def文件30行,将macnew的判断逻辑改为必定使用macnew

\file_if_exist:nTF { /System/Library/Fonts/PingFang.ttc }
  { \ctex_file_input:n { ctex-fontset-macnew.def } }
  { \ctex_file_input:n { ctex-fontset-macnew.def } }
%%  { \ctex_file_input:n { ctex-fontset-macold.def } }

这两种方法都可以成功。

使用macnew 下, xelatex和lualatex运行的log

test_xelatex.log test_lualatex.log

Fanchengyan avatar Nov 19 '24 11:11 Fanchengyan

\documentclass[fontset=macnew]{ctexbook}
\usepackage{ctex}

这两个 log 我之前说过了, 在 xelatex log 的第 239 行, lualatex log 的第 531 行, 都有一个同样的内容

LaTeX Info: Package 'ctex.sty' has been disabled.

如果根本没被导入, 又怎么会出bug呢?

xiaoyuleiba avatar Nov 20 '24 08:11 xiaoyuleiba

test_xelatex.log test_lualatex.log

在 lualatex 版 log 第 531 行, 和 xelatex 版的 log 第 239行, 都有相同的一句话:

LaTeX Info: Package 'ctex.sty' has been disabled.

而这也都是 ctex 字段在各自的 log 文件最后出现的位置. 你的代码根本没把 ctex 带起来, 不报错那也是必然的.

不是这样的。之前加载的 ctexbook.cls 已经包含了 ctex.sty 的功能,所以在 ctex(art|rep|book|beamer) 文档类中,都抑制了 ctex.sty 的加载。可以看那条 LaTeX Info 之前的 warning

Package ctexhook Warning: Package `ctex' can not be loaded with `ctexbook'.

LaTeX Info: Package 'ctex.sty' has been disabled.
            Load request ignored on input line 3.

(我依然没有升级到 macOS 15,没法直接测试和验证。)

muzimuzhi avatar Nov 20 '24 11:11 muzimuzhi

遇到了同样的问题,\documentclass[fontset=macnew]{ctexbook} 无法解决。

dirichy avatar Jan 24 '25 12:01 dirichy