我正在使用fourier-otf
XeLaTeX,发现有些奇怪。这是我的 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-otf
和dejavu-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
是获取当时命令的含义,而不管包加载和命令声明的时间发生了什么,这都不是真正想要的。