ctex的Lualatex or/+ MacOS15兼容性问题
系统: MacOS 15.0 MacTeX: 2024版
复现最小例:
\documentclass{ctexart}
\begin{document}
1
\end{document}
好像之前没这个问题, 现在直接调用了 ctex-fontset-macold.def , 打开之后看到里面有一句
{macOS fonts definition for Yosemite or earlier version (CTEX)}
会不会跟这个有关系呢?
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 里,
您好. 现在字体册里的pingfang港澳简繁4个都不显示位置. 但是自己下的字体, 以及一些别的自带字体 (Courier New) 都还是有显示文件位置.
系统: MacOS 15.0 MacTeX: 2024版
复现最小例:
\documentclass{ctexart} \begin{document} 1 \end{document}好像之前没这个问题, 现在直接调用了
ctex-fontset-macold.def, 打开之后看到里面有一句{macOS fonts definition for Yosemite or earlier version (CTEX)}会不会跟这个有关系呢?
但是在xelatex下是没有任何问题的
但是在xelatex下是没有任何问题的
- 如果 xelatex 下加载的也是
...-macold.def,只是没有后续的报错,那在命令行执行
也许能让 lualatex 下的行为和 xelatex 一致。sudo tlmgr conf texmf OSFONTDIR /System/Library/AssetsV2/com_apple_MobileAsset_Font7com_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 或全盘试着找找看。
看起来在 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 的苹方使用了一种没见过的可变技术 (
hvgltable) 来储存轮廓,还有另一个没见过的表 (cidgtable),并且 FTXViewer 都不能读。 https://x.com/alpha_argon/status/1800432640820170757
刚刚的两个文件都是生成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}先用着吧。
谢谢. 不过他们咋想的往那里塞了,,,
看到已经有人从 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。
xelatex用的不是new也不是old, 而是没有后缀的
还是 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)
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)
还真是,瞟了一眼没细看,我的
短期的方案,也许是找还在 macOS 14 的小伙伴(或各种镜像里)复制一个 PingFang.ttc。
中期,看起来 ctex 需要为 macOS 15 调整预设字体。
长期,希望(在苹果发布新格式的文档后),xetex 用的 fontconfig 和 luatex 用的 luaotfload 都能添加支持……
根据 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的字体.
把这个抓出来单独安装, 提示已安装. 用
sudo su -都不让往/System/Library/Fonts里塞东西了,,, 让macos13的朋友给我拷了一个PingFang.tcc, 直接提示不包含可安装在macos的字体.
可能要先关闭 SIP?
把这个抓出来单独安装, 提示已安装. 用
sudo su -都不让往/System/Library/Fonts里塞东西了,,, 让macos13的朋友给我拷了一个PingFang.tcc, 直接提示不包含可安装在macos的字体.可能要先关闭 SIP?
这下貌似有点难度了
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 里,
问题应该确实出在这里。 /System/Library/Fonts/PingFang.ttc不存在,不过文件夹还在。
我发现升级MacOS15后,默认字体都无法加粗了,看了一下代码,MacOS15下这个判断逻辑会有问题/System/Library/Fonts/PingFang.ttc不存在,导致fontset用的macold。
解决方法:
手动设置为macnew就正常了:
\documentclass[fontset=macnew]{ctexbook}
应该需要更新一下判断是否是新的mac的方法了。
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 里,问题应该确实出在这里。
/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会报错
我又重新测试了,结果如下:
- 判断
macnew的逻辑有问题, 默认必定是使用macold的,所以macnew是不会被使用的,除非手动设定fontset=macnew。 - 无论是
macold还是macnew,xelatex都不会报错,但lualatex都会报错, 无法运行。
结论
- mac下,
ctex的macnew的判断逻辑有问题,需要更新。 -
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
我又重新测试了,结果如下:
- 判断
macnew的逻辑有问题, 默认必定是使用macold的,所以macnew是不会被使用的,除非手动设定fontset=macnew。- 无论是
macold还是macnew,xelatex都不会报错,但lualatex都会报错, 无法运行。结论
- mac下,
ctex的macnew的判断逻辑有问题,需要更新。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
我刚刚按照这个方法修改了 ctex-fontset-mac.def, 在texstudio里用lualatex运行如下代码, 报错.
\documentclass[fontset=macnew]{ctexbook}
\begin{document}
1
\end{document}
两种方法单独或同时使用, 三种情况均不成功.
ctexbook_macnew_lualatex_fontset_Only.log
在 lualatex 版 log 第 531 行, 和 xelatex 版的 log 第 239行, 都有相同的一句话:
LaTeX Info: Package 'ctex.sty' has been disabled.
而这也都是 ctex 字段在各自的 log 文件最后出现的位置. 你的代码根本没把 ctex 带起来, 不报错那也是必然的.
没影响,我现在在写毕业论文,xelatex可以正常编译。
没影响,我现在在写毕业论文,xelatex可以正常编译。
确实不影响, 但是现在并不是说有没有影响的事情, 而是要解决这个问题. 非要用 ctex + lualatex + macos15的人几乎没有.
嗯嗯,现在是先定位问题。xelatex可以编译,可以排除字体本身的问题,说明是lualatex代码里的逻辑判断部分,在更新系统后出现的问题。另外ctex的判断macnew字体集的代码也有问题,需要更新。
我来提供另一个现象吧,xelatex编译的\lishu和\youyuan都未定义了,估计跟这个也有关系?
@xiehao
这个是ctex判断MacOS版本的问题的bug,默认使用的是macold,显式地设置fontset成macnew就可以:
\documentclass[fontset=macnew]{ctexbook}
\usepackage{ctex}
\begin{document}
\lishu 你好,世界!
\youyuan 你好,世界!
\end{document}
详情可以参考这条评论:
我又重新测试了,结果如下:
- 判断
macnew的逻辑有问题, 默认必定是使用macold的,所以macnew是不会被使用的,除非手动设定fontset=macnew。- 无论是
macold还是macnew,xelatex都不会报错,但lualatex都会报错, 无法运行。结论
- mac下,
ctex的macnew的判断逻辑有问题,需要更新。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
\documentclass[fontset=macnew]{ctexbook} \usepackage{ctex}
这两个 log 我之前说过了, 在 xelatex log 的第 239 行, lualatex log 的第 531 行, 都有一个同样的内容
LaTeX Info: Package 'ctex.sty' has been disabled.
如果根本没被导入, 又怎么会出bug呢?
在 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,没法直接测试和验证。)
遇到了同样的问题,\documentclass[fontset=macnew]{ctexbook} 无法解决。
