使用 \let 时忽略文档字体

使用 \let 时忽略文档字体

我正在使用fourier-otfXeLaTeX,发现有些奇怪。这是我的 MWE。

\documentclass{article}

\usepackage{fourier-otf}

\let\eps\varepsilon
\def\epsd{\varepsilon}

\begin{document}
    $ \varepsilon $ %

    $ \eps $        % \let

    $ \epsd $       % \def'ined
\end{document}

结果如下。

当我使用\let定义新命令时,文档字体被忽略,并且 epsilon 以默认的 Computer Modern 排版。使用\def它工作正常。

\let当我想定义别名时,我总是使用,因为我认为将\let\eps\varepsilon的定义“复制”\varepsilon到中\eps。这似乎是正确的,因为两者都是\show相同的定义:\mathchar"122

我不明白为什么这两个……

\eps=\mathchar"122
\varepsilon=\mathchar"122

...\epsd=\varepsilon工作时行为不同。


我使用其他一些-otf字体(libertinus-otfdejavu-otf)进行了测试,结果显示相同的行为。但是,fourier(可能是 ttf 版本)可以工作。

答案1

为什么\let和会\def给出不同的结果?这是因为 的含义\varepsilon在您执行\let\eps\varepsilon和实际使用 时发生了变化\eps

您可以通过在最初的含义\typeout{\meaning\varepsilon}之前和之后添加内容来查看含义的变化:\begin{document}

\mathchar"122

以及进入文档后的含义:

macro:->\mitvarepsilon 

所以当你这样做的时候\let你告诉 LaTeX 你想要的\eps意思\let也就是\mathchar"122。当你这样做的时候,\def你告诉它使用\varepsilon 在你使用新命令时

至于为什么会发生这种情况,这是因为unicode-math使用的包fournier-otf会推动各种符号的定义在期间发生,\begin{document}以避免被用户可能加载的其他包破坏。fournier而 不使用unicode-math,则没有这种保护。

尽管如此,创建命令的首选方法是使用

\NewDocumentCommand{\eps}{\varepsilon}

而不是\let。 的主要用途\let是获取当时命令的含义,而不管包加载和命令声明的时间发生了什么,这都不是真正想要的。

相关内容