使用 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 已定义。
我怎样才能避免这种行为?
答案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,从而避免您遇到的问题。