CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
966 stars 124 forks source link

lualatex下如何开启伪粗体 #644

Closed Firestar-Reimu closed 1 year ago

Firestar-Reimu commented 1 year ago

这个问题来源于 ElegantBook 中有一句

\xeCJKsetup{AutoFakeBold=true}

使得该宏包无法在lualatex下编译。

想知道lualatex(即luatex-ja)下有没有对应的命令

AlphaZTX commented 1 year ago

@Firestar-Reimu 送你个建议:你不知道的东西不要乱猜,收回你最后一句话吧

Sophanatprime commented 1 year ago

AutoFakeBoldAutoFakeSlantfontspec 就有的功能(文档 Part Ⅲ,第 6.7 节)。只是不支持设置 truefalse 而已。 用 ctex 或者直接使用 luatexja-fontspec 都行。

muzimuzhi commented 1 year ago

因为 xeCJK 默认有 EmboldenFactor=4,所以 xelatex 下的

\usepackage[fontset=none]{ctex}
\xeCJKsetup{AutoFakeBold=true}

在加粗程度上,应该和

\usepackage[fontset=none]{ctex}
\defaultfontfeatures{AutoFakeBold=4}

效果一致。但 xeCJKAutoFakeBold 只在找不到 bold 字体时生效,而 fontspec 的相同选项,会不管有没有 bold 字体,总是使用 fake bold。

Firestar-Reimu commented 1 year ago

那怎么样写代码决定使用不同后端使用的代码呢,例如:

if use xelatex:
    \xeCJKsetup{AutoFakeBold=true}
else if use lualatex:
    \defaultfontfeatures{AutoFakeBold=4}
stone-zeng commented 1 year ago

iftex 包了解一下~

Firestar-Reimu commented 1 year ago

在 cls 文件的 209-222 行,我修改了以下内容:

  \ifdefstring{\ELEGANT@chinesefont}{nofont}{
    \RequirePackage[UTF8,scheme=plain,fontset=none]{ctex}
    \RequirePackage{iftex}
    \ifxetex
      \xeCJKsetup{AutoFakeBold=true}
      \xeCJKsetup{AutoFakeSlant=true}
    \else
    \fi
    \ifluahbtex
      \defaultfontfeatures{AutoFakeBold=4}
      \defaultfontfeatures{AutoFakeSlant=0.167}
    \else
    \fi
    }{\relax}

test.tar.gz

效果:test.tex可以编译出伪粗体(单独加了一句),test2.tex不行(lualatex不行,xelatex可以)

Sophanatprime commented 1 year ago

\defaultfontfeatures{...} 的形式会覆盖之前设置的 feature(见文档)。你会发现 \textit{...} 会出现伪斜体。

应该把这两个 feature 写到一起,或使用 \defaultfontfeatures+{...} 的形式。

Firestar-Reimu commented 1 year ago

谢谢!

但 xeCJK 的 AutoFakeBold 只在找不到 bold 字体时生效,而 fontspec 的相同选项,会不管有没有 bold 字体,总是使用 fake bold。

这个问题我感觉要么 fontspec 上游解决,要么关闭这个功能,让用户自己实现(毕竟 fakebold 不推荐使用)