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

ctex: 升级 macOS 下的字体配置,增加默认罗马字族及无衬线字族的字重组合 #351

Closed
zepinglee opened this issue Apr 3, 2018 · 34 comments
Assignees

Comments

@zepinglee
Copy link
Member

zepinglee commented Apr 3, 2018

#335 (comment),但是好像没下文了。

目前 ctex 在 mac 下的默认字体是这样的:

1

我现在的设置是:

\setCJKmainfont{Songti SC}[
  UprightFont    = Songti SC Light,
  ItalicFont     = Kaiti SC,
  BoldItalicFont = Kaiti SC Bold,
]
\setCJKsansfont{Heiti SC}

效果:
2

但是还有两个问题:

  1. 上述设置代码放到 ctex-fontset-mac.def 上因为空格被去掉了导致错误
  2. 直接设置文件名 /Library/Fonts/Songti.ttc 有错误
@Liam0205 Liam0205 changed the title 增加 macOS 的字重 ctex: 增加 macOS 下字体设置的字重组合 Apr 3, 2018
@Liam0205 Liam0205 self-assigned this Apr 3, 2018
@Liam0205
Copy link
Contributor

Liam0205 commented Apr 3, 2018

本次对 macOS 下默认字体的修改,计划自 Sierra 开始兼容,放弃或部分放弃对更低版本 OS X/macOS 的兼容性。

Apple 官网可查 Sierra 默认预装的字体:https://support.apple.com/en-us/HT206872

@Liam0205
Copy link
Contributor

Liam0205 commented Apr 3, 2018

目前拟将 XeLaTeX 下的默认配置修改为:

\setCJKmainfont [ ItalicFont = Kaiti~SC, BoldItalicFont = Kaiti~SC~Bold ]  { Songti~SC }
\setCJKsansfont { Heiti~SC }
\setCJKmonofont { STFangsong }
\setCJKfamilyfont { zhsong } { Songti~SC }
\setCJKfamilyfont { zhhei }  { Heiti~SC }
\setCJKfamilyfont { zhfs }   { STFangsong }
\setCJKfamilyfont { zhkai }  { Kaiti~SC }

同时,将 macOS 的检测标志修改为 /Library/Fonts/Songti.ttc

@zepinglee
Copy link
Member Author

Songti SC Light 的字重跟 STSong 更接近,跟 SimSun 也更接近,所以 regular 应该设为这个

@mohuangrui
Copy link

mohuangrui commented Apr 3, 2018

@zepinglee @Liam0205

认同 @zepinglee 的建议,对比了一下,SimSum 比 Songti SC 要淡一点比 Songti SC Light 又要重一点, 总的来说, Songti SC Light 字重似乎更和 STSong 和 SimSum 接近。而且 Songti SC 自带 Bold 终于可以不用考虑用黑体替换粗宋体,因此也许可考虑:

\setCJKmainfont[ItalicFont = Kaiti~SC, BoldItalicFont = Kaiti~SC~Bold]{Songti~SC~Light}
\setCJKsansfont{Heiti~SC}
\setCJKmonofont{STFangsong}

@zepinglee ctex 用的 LaTeX3,所以需要 ~ 显式指定空格

下面贴一下我所用的测试代码和输出结果,以做参考:

 \begin{itemize}
    \item 宋体:国科大论文模板ucasthesis 或 \textrm{国科大论文模板ucasthesis}
    \item 粗宋体:{\bfseries 国科大论文模板ucasthesis} 或 \textbf{国科大论文模板ucasthesis}
    \item 黑体:{\sffamily 国科大论文模板ucasthesis} 或 \textsf{国科大论文模板ucasthesis}
    \item 粗黑体:{\bfseries\sffamily 国科大论文模板ucasthesis} 或 \textsf{\bfseries 国科大论文模板ucasthesis}
    \item 仿宋:{\ttfamily 国科大论文模板ucasthesis} 或 \texttt{国科大论文模板ucasthesis}
    \item 粗仿宋:{\bfseries\ttfamily 国科大论文模板ucasthesis} 或 \texttt{\bfseries 国科大论文模板ucasthesis}
    \item 楷体:{\itshape 国科大论文模板ucasthesis} 或 \textit{国科大论文模板ucasthesis}
    \item 粗楷体:{\bfseries\itshape 国科大论文模板ucasthesis} 或 \textit{\bfseries 国科大论文模板ucasthesis}
\end{itemize}

image

@mohuangrui
Copy link

对了,换字体过程中,我还遇到的一个状况就是似乎SC类字体xelatex调用没有任何异常时却不为luatex所识别,具体原因我也不知道,所以还请大神们在改代码时能关注测试一下。

@Liam0205
Copy link
Contributor

Liam0205 commented Apr 4, 2018

孫志貴的建议,无衬线字体可考虑使用苹方代替 Heiti Sc。或可仿照 windowsoldwindowsnew 的设计,配置 macoldmacnew;而后在 macnew 当中使用苹方作为默认的黑体。

若按此设计,则 macold 是 El Capitan 之前,而 macnew 是 El Capitan(含)之后。前者保持与当前 mac 一致,作为老系统的默认配置,以及新系统下用户有意回退到旧式配置的方案。

macnew 的参考配置:

\setCJKmainfont
  [
       UprightFont = Songti~SC~Light,
        ItalicFont = Kaiti~SC,
    BoldItalicFont = Kaiti~SC~Bold
  ] { Songti~SC }
\setCJKsansfont { PingFang~SC }
\setCJKmonofont { STFangsong }
\setCJKfamilyfont { zhsong } { Songti~SC }
\setCJKfamilyfont { zhhei }  { Heiti~SC }
\setCJKfamilyfont { zhpf }   { PingFang~SC }
\setCJKfamilyfont { zhfs }   { STFangsong }
\setCJKfamilyfont { zhkai }  { Kaiti~SC }

@Liam0205
Copy link
Contributor

Liam0205 commented Apr 4, 2018

@qinglee 之前在 #335 (comment) 中提及:「新加字重的字符集大概只覆盖到最基本的 GB2312,与原来字体并不一致」。

这个信息是在哪里查询得到的呢?或是自己测试得到的结论?

@qinglee
Copy link
Member

qinglee commented Apr 4, 2018

@Liam0205 是刚出新字体时测试的结果,现在应该不用考虑这个问题了。

@Liam0205
Copy link
Contributor

Liam0205 commented Apr 4, 2018

赞,了解了。

@leo-liu
Copy link
Member

leo-liu commented Apr 5, 2018

用 macold 加 macnew 是没问题的,同意。然后通过检测字体文件来区分新旧。

新字体集的话,无衬线肯定是用屏幕黑体(冬青黑、苹方之类)比较好,因为 beamer 默认是无衬线体。印刷黑体留给 \heiti 命令,仍然可以有多个字重。

如果比较多,是可以增加一些字体命令,类似 Windows 下的 \yahei 这种。
比如说,可以给 macOS 定义 \pingfang 命令,同时把 \yahei 和它定义成别名,以增强兼容性。

@zepinglee
Copy link
Member Author

zepinglee commented Apr 11, 2018

另外还可以把报隶字体作为 \lishu,但是我没搞懂 baoli.ttc 文件在哪里

@Liam0205
Copy link
Contributor

Liam0205 commented May 1, 2018

6c6e3b8 已完成代码开发,在 MacTeX 2018 下使用 XeLaTeX 编译测试通过。欢迎各位调试验证。无问题就 merge 回 master 分支了;同时请 @qinglee @leo-liu review code。

MWE:

\documentclass[UTF8, fontset = mac]{ctexart}
\begin{document}
\section{默认字体测试}
罗马字族 \textbf{罗马字族加粗} \textit{罗马字族意大利体} \textbf{\textit{罗马字族意大利体加粗}}

\textsf{无衬线字族} \textbf{\textsf{无衬线字族加粗}}

\texttt{等宽字族}

\section{字体选择命令测试}

{\songti 宋体 \textbf{宋体加粗}}

{\kaishu 楷书 \textbf{楷书加粗}}

{\heiti 黑体 \textbf{黑体加粗}}

{\fangsong 仿宋 \textbf{仿宋加粗}}

{\pingfang 苹方 \textbf{苹方加粗}}

{\yahei 伪·雅黑 \textbf{伪·雅黑加粗}}
\end{document}

macnew 下的表现应当是:
image

macold 下的表现应当是(报错,苹方和雅黑无定义,注释掉之后):
image

@zepinglee
Copy link
Member Author

我觉得“伪·雅黑”就不要加进去了吧

@Liam0205
Copy link
Contributor

Liam0205 commented May 2, 2018

@zepinglee 那是按照 @leo-liu 的建议,给 \yahei 留的兼容性。

@zepinglee
Copy link
Member Author

我现在为了把 windowsnew 的 sffamily 换成 simhei,写的是 \ifx\yahei\undefinedustctug/ustcthesis/ustcthesis.dtx#172),这就很尴尬啦

@mohuangrui
Copy link

@zepinglee 是不是你的设置考虑的过于细致了,其实可以考虑不管new还是old,都设成simhei,这样就没这个检测问题了。

@mohuangrui
Copy link

@zepinglee 对了,下面是我的对接 ctex 系统检测的方法,这样会比检测某些细节设定更加稳定和一致:

\RequirePackage{expl3}% LaTeX3 programming environment
\ExplSyntaxOn%
\providecommand{\g__ctex_fontset_tl}{}% platform fontset state variable
\edef\artxfontset{\g__ctex_fontset_tl}% expanded platform fontset state variable
\ExplSyntaxOff%
\newif\ifartx@windows \artx@windowsfalse
\newif\ifartx@mac \artx@macfalse
\newif\ifartx@adobe \artx@adobefalse
\newif\ifartx@times \artx@timesfalse
\newif\ifartx@others \artx@othersfalse
\RequirePackage{etoolbox}% a toolbox of programming facilities
\newcommand{\artxifstreq}{\expandafter\ifstrequal\expandafter}% expansion control
\artxifstreq{\artxfontset}{windows}{\artx@windowstrue\artx@timestrue}{%
\artxifstreq{\artxfontset}{mac}{\artx@mactrue\artx@timestrue}{%
\artxifstreq{\artxfontset}{adobe}{\artx@adobetrue\artx@timestrue}{%
\artx@otherstrue\artx@timesfalse}}}

核心就是首先对接然后检测 ctex 的全局 fontset 变量 \g__ctex_fontset_tl

@Liam0205
Copy link
Contributor

Liam0205 commented May 2, 2018

@mohuangrui 你的思路大体是对的:不应该检测实现细节;但是这个方案不能区分 windowsnewwindowsold

@zepinglee 可以检查装载了哪一个 ctex-fontset-*.def 文件来实现你的需求。

@mohuangrui
Copy link

@Liam0205 确实无法检测new和old,如ctex本身是通过\file_if_exist:nTF { C:/bootfont.bin }来检测new和old的。

实践中发现,往往不会考虑雅黑,所以,我的办法是不管new还是old,都设成simhei就好,简单粗暴但有效~

@Liam0205
Copy link
Contributor

Liam0205 commented May 2, 2018

macold 在 Yosemite 上验证通过。

@stone-zeng
Copy link
Member

话说,这个是不是跳一个大一点的版本号比较合适,比如 2.5.0 这样的?毕竟算是有新功能添加了。

@Liam0205
Copy link
Contributor

Liam0205 commented May 2, 2018

话是这样说,不过主体逻辑并没有改变,而且 tag 已经打了,所以就这样吧……

@zepinglee
Copy link
Member Author

学习了

@leo-liu
Copy link
Member

leo-liu commented May 3, 2018

所以说

\setCJKmainfont [ ItalicFont = Kaiti~SC, BoldItalicFont = Kaiti~SC~Bold ]  { Songti~SC }

为什么变成了

\setCJKmainfont [ UprightFont = Songti~SC~Light, ItalicFont = Kaiti~SC, BoldItalicFont = Kaiti~SC~Bold ]  { Songti~SC }

两个疑问:

  1. 默认的字重到底应该是 Regular(Songti SC)还是 Light?

  2. 若默认的字重是 Light,为了比较清楚,似乎也是这样写更好:

     \setCJKmainfont {Songti~ SC }
       [
        UprightFont = *~ Light,
         BoldFont = *~ Bold,
         ItalicFont = Kaiti~ SC,
         BoldItalicFont = Kaiti~ SC~ Bold,
       ]
    

另外,关于 \songtizhsong 族是不是应该以楷体为斜体,也可以讨论。

@Liam0205
Copy link
Contributor

Liam0205 commented May 3, 2018

@leo-liu

  1. 按照 @zepinglee@mohuangrui 的说法,Songti SC Light 更接近 SimSun 和 STSong,所以 \rmfamily\mdseries\upshape 用的是 Songti SC Light。写法上改成 *~Light*~Bold 确实更清楚,减少误解。这个我提交一下。
  2. \songti 这里我犹豫过。后来我的考虑是这是字体选择命令,用户明确说了「我要用宋体」,那么 \itshape 给楷书其实蛮奇怪的,如果是我的话宁愿给 AutoFakeSlant 上去。所以最后还是不设置楷书为 ItalicFont

@Liam0205
Copy link
Contributor

Liam0205 commented May 3, 2018

@zepinglee
Copy link
Member Author

还有建议加入 Baoli SC 作为 \lishu 的字体

@Liam0205 Liam0205 changed the title ctex: 增加 macOS 下字体设置的字重组合 ctex: 升级 macOS 下的字体配置,增加默认罗马字族及无衬线字族的字重组合 May 3, 2018
@leo-liu
Copy link
Member

leo-liu commented May 3, 2018

Mavericks 也有 Hiragino Sans GB W3 吧,其实和苹方基本是接近的屏幕黑体(事实上 PingFang.ttc 里面就有 Hiragino Sans GB Interface W3)。

以前我不怎么用 mac 所以也没有在这个问题上多考虑,冬青黑体在 Mavericks 上不能用么?

@leo-liu leo-liu reopened this May 3, 2018
@Liam0205
Copy link
Contributor

Liam0205 commented May 3, 2018

印象里 Mavericks 是可以用冬青黑的,不过我手头实在没有环境了,这个不好确认。

是准备把 macold 里设置无衬线为冬青黑?

@leo-liu
Copy link
Member

leo-liu commented May 4, 2018

我觉得设置为冬青黑是好一些。不过既然 macOS 更新那么果决其实也无所谓。

@Liam0205
Copy link
Contributor

Liam0205 commented May 6, 2018

我还是没想好 macold 应该怎么更新,直接换成冬青黑好像也不太好?

所以搞成这样又很麻烦……更多的是,很恶心……?

%<*macold>
\sys_if_engine_pdftex:TF
  { \ctex_fontset_error:n { mac } }
  {
    \sys_if_engine_uptex:TF
      { \ctex_fontset_error:n { mac } }
      {
        \setCJKmainfont [ BoldFont = STHeiti , ItalicFont = STKaiti ]  { STSong }
        \file_if_exist:nTF { /System/Library/Fonts/Hiragino~Sans~GB~W3.ttc }
          {
            \file_if_exist:nTF { /System/Library/Fonts/Hiragino~Sans~GB~W6.ttc }
              {
                \setCJKsansfont
                  [
                    BoldFont = HiraginoSansGB-W6
                  ] { HiraginoSansGB-W3 }
              }
              { \setCJKsansfong [ BoldFont = STHeiti ] { STXihei } }
          }
          { \setCJKsansfong [ BoldFont = STHeiti ] { STXihei } }
        \setCJKmonofont { STFangsong }
        \setCJKfamilyfont { zhsong } { STSong }
        \setCJKfamilyfont { zhhei }  { STHeiti }
        \setCJKfamilyfont { zhfs }   { STFangsong }
        \setCJKfamilyfont { zhkai }  { STKaiti }
        \file_if_exist:nT { /System/Library/Fonts/Hiragino~Sans~GB~W3.ttc }
          {
            \file_if_exist:nTF { /System/Library/Fonts/Hiragino~Sans~GB~W6.ttc }
              {
                \setCJKfamilyfont { zhdqh }
                  [
                    BoldFont = HiraginoSansGB-W6
                  ] { HiraginoSansGB-W3 }
              }
              { \setCJKfamilyfont { zhdqh }  { HiraginoSansGB-W3 } }
          }
      }
  }
%</macold>
%<macold>\file_if_exist:nT { /System/Library/Fonts/Hiragino~Sans~GB~W3.ttc }
%<macold>  { \NewDocumentCommand \dongqing { } { \CJKfamily { zhdqh } } }

@AlexaraWu
Copy link

建议加入 Baoli SC 作为 \lishu 的字体,Yuanti SC 作为 youyuan 的字体。

@Liam0205
Copy link
Contributor

@AlexaraWu \lishu 的问题参见 #360\youyuan 的问题你可以再开一个 issue 讨论。

@Liam0205
Copy link
Contributor

冬青黑的问题,目前 macold 还是保留旧配置。有更新消息之后,开新 issue 讨论。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants