fontspec 破坏了大写希腊字母的重新定义

fontspec 破坏了大写希腊字母的重新定义

使用 fontspec 包时,我无法重新定义大写数学符号。这是一个最小的工作示例:

\documentclass[ngerman]{standalone}
\usepackage{fontspec}

\let\psi\alpha        %works
\let\Psi\alpha        %does not work

\begin{document}
$\psi \Psi$
\end{document}

使用 \let 只会忽略重新定义。使用 \renewcommand 会产生一个错误,提示 \Psi 已定义。

我怎样才能避免这种行为?

这似乎与 fontspec 在 DeclareMathOperator 中破坏了大写希腊字母

答案1

在旧版 TeX 中,大写直立希腊字母取自主文本字体的 OT1 编码版本,但在fontspec加载时,主文本字体没有将字符放置在预期的位置。

标准定义\Psi相当于

\mathchardef\Psi="7009

如果fontspec没有关于此问题的任何信息,则输出中不会出现 Psi,因为第二个十六进制数字指定了主文本字体(系列 0)。但是,当确定已为文档设置了哪些字体时,它必须在开始文档时延迟新设置。

fontspec-xetex.sty我们发现fontspec-luatex.sty

 \DeclareSymbolFont{legacymaths}{OT1}{cmr}{m}{n}
[...]
     \DeclareMathSymbol{\Psi}{\mathalpha}{legacymaths}{9}

并且由于上述原因,此代码在文档开始时执行。

\Psi因此,序言中的重新定义将在文档开始时被取代。

因此,如果需要进行这样的重新定义,则必须将其传递给开始文档钩子

\AtBeginDocument{\let\Psi\alpha}

顺便说一句,\let不应该被使用,但是\RenewCommandCopy

小写希腊字母不需要任何符号,因为它们取自 1 族,与 无关fontspec。但当然,当unicode-math加载时,它就是 。

答案2

通过提示GPT-4来回答:

要在使用 fontspec 包时重新定义大写希腊字母,可以使用 \AtBeginDocument 命令将重新定义延迟到字体设置应用之后。请尝试以下操作:

\usepackage{fontspec}

\let\psi\alpha        % works

\AtBeginDocument{
  \let\Psi\alpha       % delayed redefinition
}

\begin{document}
$\psi \Psi$
\end{document}

这种方法可确保在完成所有包初始化(包括 fontspec)之后重新定义 \Psi,从而避免您遇到的问题。

相关内容