CTeX-org / ctex-kit

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

fontspec 选项设置问题 #663

Closed NShiroha closed 4 months ago

NShiroha commented 1 year ago

这个问题始于\hbar的输出效果问题。我发现自定义正文字体后,\hbar的效果会变得很奇怪:

\documentclass{article}
\usepackage{fontspec}
\usepackage{mathtools,amssymb}
\setmainfont{Times New Roman}
\begin{document}
    \[\hbar=\dfrac{h}{2\pi}\]   
\end{document}

图片 后来发现,启用fontspec宏包的no-math选项即可解决这个问题。 图片

不幸的是,ctex文档类默认加载fontspec宏包,在导言区加上\usepackage[no-math]{fontspec}的话会造成冲突。经过尝试,我惊奇地发现,在指定文档类时设置该选项,即使用\documentclass[no-math]{ctexart},就可以达到预期效果。

然而这又使我十分疑惑,因为 CTEX 宏集手册并未提及设置fontspec宏包选项的方法。随后我又发现xeCJK宏包手册有这么一段话:

xeCJK 以 ⟨key⟩=⟨var⟩ 的形式提供宏包选项,你可以在调用宏包的时候直接设置这些选项,也可以在调用宏包之后使用 \xeCJKsetup 来设置这些选项。xeCJK 内部调用 fontspec 宏包,可以在调用 xeCJK 的时候,使用它的宏包选项。xeCJK 会将 fontspec 的选项传递给它。

个人认为,这里的叙述太过模糊,并没有说清楚fontspec宏包选项如何设置,建议补充一下。

我现在也算半个新手,对很多东西依然缺乏了解,如有不妥还望包涵。

muzimuzhi commented 1 year ago

不幸的是,ctex文档类默认加载fontspec宏包,在导言区加上\usepackage[no-math]{fontspec}的话会造成冲突。

也可以在 \documentclass 之前使用 \PassOptionsToPackage{no-math}{fontspec},该命令的文档见 texdoc clsguidehttps://latexref.xyz/Class-and-package-commands.html

经过尝试,我惊奇地发现,在指定文档类时设置该选项,即使用\documentclass[no-math]{ctexart},就可以达到预期效果。

这是因为文档类选项会传递给在其后加载的所有宏包,同样见 texdoc clsguide。这是一个通用的知识,不限定于某个文档类或某个宏包,所以宏包文档一般不作介绍。非标准文档类有时候会提到。

xeCJK 作了特殊处理,它会把(对自己而言)未知的宏包选项,和已知的宏包选项中的 quiet 和 silence 都传递给 fontspec。所以 xeCJK 文档中提了一句。

随后我又发现xeCJK宏包手册有这么一段话:

xeCJK 以 ⟨key⟩=⟨var⟩ 的形式提供宏包选项,你可以在调用宏包的时候直接设置这些选项,也可以在调用宏包之后使用 \xeCJKsetup 来设置这些选项。xeCJK 内部调用 fontspec 宏包,可以在调用 xeCJK 的时候,使用它的宏包选项。xeCJK 会将 fontspec 的选项传递给它。

个人认为,这里的叙述太过模糊,并没有说清楚fontspec宏包选项如何设置,建议补充一下。

可能是「它」的指代带来了模糊,我理解的是「如果 fontspec 有宏包选项 xyz,那么向 xeCJK 传递宏包选项 xyz 等同于向 fontspec 传递 xyz」。你有没有建议的描述方式?

更新:根据 https://github.com/CTeX-org/ctex-kit/blob/049fed1128f4ab929fdd89cf4625df3b80a80aa6/xeCJK/xeCJK.dtx#L8240-L8265 https://github.com/CTeX-org/ctex-kit/blob/049fed1128f4ab929fdd89cf4625df3b80a80aa6/xeCJK/xeCJK.dtx#L8332 也许可以改成「xeCJK 内部调用 fontspec 宏包。调用 xeCJK 时使用的(对 xeCJK 来说)未知宏包选项和 quiet、silence 选项,都会传递给 fontspec。」

NShiroha commented 1 year ago

也许可以改成「xeCJK 内部调用 fontspec 宏包。调用 xeCJK 时使用的(对 xeCJK 来说)未知宏包选项和 quiet、silence 选项,都会传递给 fontspec。」

我觉得这样改可以接受,如果能给出示例就更好了。另外,最好在 CTEX 宏集手册中也简要说明一下。

这是因为文档类选项会传递给在其后加载的所有宏包,同样见 texdoc clsguide。这是一个通用的知识,不限定于某个文档类或某个宏包,所以宏包文档一般不作介绍。非标准文档类有时候会提到。

呃……可能是我不了解了,但您提到的texdoc clsguide标题也说了“for class and package writers”,我想这对一般用户来说也许不太能算通用知识……

不论如何,感谢您的解答。

muzimuzhi commented 1 year ago

(完全不需要使用「您」的)