Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] macOS 未提供字体 FangSong,建议改为 STFangsong #49

Closed
muzimuzhi opened this issue Mar 29, 2020 · 4 comments
Closed

[BUG] macOS 未提供字体 FangSong,建议改为 STFangsong #49

muzimuzhi opened this issue Mar 29, 2020 · 4 comments
Assignees
Labels
bug Something isn't working enhancement New feature or request

Comments

@muzimuzhi
Copy link

目前,模板的三个 fonts.tex 文件中都包含 \setmainfont{FangSong}。但 macOS 未提供字体 FangSong,而是提供了 STFangsong

以下提供两种兼容实现,差异在于判断条件的选取。

背景信息:在用户未手动指定 fontset=... 时,ctex 文档类会执行 \ctex_load_fontset: 判断操作系统并自动载入对应的字体设置文件。

  • 首先,执行 \ctex_detected_platform: 自动判断操作系统,并把结果(windowsmacfandol)写入 \g__ctex_fontset_tl
  • 然后,执行 \ctex_file_input:n { ctex-fontset- \g__ctex_fontset_tl .def } 载入对应的字体设置文件。

第一种兼容实现:判断 \g__ctex_fontset_tl 的内容,使用了 latex3 的函数

\ExplSyntaxOn
\cs_generate_variant:Nn \tl_if_eq:nnTF {Vn}

\tl_if_eq:VnTF \g__ctex_fontset_tl {mac}
  { \setCJKmainfont{STFangsong} } % macOS
  { \setCJKmainfont{FangSong} }   % Windows
\ExplSyntaxOff

第二种兼容实现:判断文件 ctex-fontset-mac.def 文件是否被载入,使用了 latex2e kernel 的内部宏 \@ifl@aded

\makeatletter
\@ifl@aded{def}{ctex-fontset-mac}
  {\setCJKmainfont{STFangsong}} % macOS
  {\setCJKmainfont{FangSong}}   % Windows
\makeatother

补充

  • 两种实现功能相同,第一种也许会健壮一点点(指,不容易因为 ctex 的更新而变化)
  • macOS 下用 xelatex 编译 zjuthesis.tex,目前没有遇到其他兼容问题。
@muzimuzhi muzimuzhi added the bug Something isn't working label Mar 29, 2020
@TheNetAdmin
Copy link
Owner

Nice job! 感谢你提供的代码,我会升级一下模板的。

另有个疑问,在 Mac 下的 STFangSong 字体有对应的粗体版本吗,比如 STFangSong Bold 是否存在。如果有对应粗体的话,可以在 Mac 下取消伪粗体。

我并没有 Mac 所以无法验证

@TheNetAdmin TheNetAdmin added the enhancement New feature or request label Mar 29, 2020
@TheNetAdmin TheNetAdmin self-assigned this Mar 29, 2020
TheNetAdmin added a commit that referenced this issue Mar 30, 2020
@TheNetAdmin
Copy link
Owner

我这用了你提供的第一种代码,并略作修改以便专业模板使用

\newcommand{\FangSongFontName}{FangSong}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_if_eq:nnTF {Vn}
\tl_if_eq:VnTF \g__ctex_fontset_tl {mac}
{ % macOS
\renewcommand{\FangSongFontName}{STFangsong}
}
{ % Windows or Linux or Other OS
\renewcommand{\FangSongFontName}{FangSong}
}
\ExplSyntaxOff
\setCJKmainfont{\FangSongFontName}

再次感谢你提供的代码!

@muzimuzhi
Copy link
Author

另有个疑问,在 Mac 下的 STFangSong 字体有对应的粗体版本吗,比如 STFangSong Bold 是否存在。如果有对应粗体的话,可以在 Mac 下取消伪粗体。

没有。

@muzimuzhi
Copy link
Author

发现模板源码中大量使用了 \ifthenelse{\equal{}{}}{<then>}{<else>},可以用它代替 \tl_if_eq:VnTF,少引入一些其他风格(latex3)的代码。

\newcommand{\FangSongFontName}{FangSong}
% ctex stores one of "windows", "mac", and "fandol" in \g__ctex_fontset_tl
\ifthenelse{\equal{\csname g__ctex_fontset_tl\endcsname}{mac}}
{ % macOS
    \renewcommand{\FangSongFontName}{STFangsong}
}
{}

\setCJKmainfont{\FangSongFontName}

TheNetAdmin added a commit that referenced this issue Mar 30, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants