unicode-math 和 glossaries-extra 之间的冲突

unicode-math 和 glossaries-extra 之间的冲突
\documentclass{article}

\usepackage[symbols]{glossaries-extra}
\usepackage{unicode-math}
\makeglossaries
\glsxtrnewsymbol[description={tilde}]{tilde}{\ensuremath{\tilde{D}}}
\glsxtrnewsymbol[description={hat}]{hat}{\ensuremath{\hat{D}}}

\begin{document}
\printglossary[type=symbols, style=long]
\begin{itemize}
    \item gls: $\gls{tilde}$, $\gls{hat}$
    \item ensuremath: $\ensuremath{\tilde{D}}$, $\ensuremath{\hat{D}}$
    \item normal: $\tilde{D}$, $\hat{D}$
\end{itemize}
\end{document}

输出如下所示。

在此处输入图片描述

我该如何修复这个移位的波浪号?

答案1

unicode-math

\setmathfont重新定义\tilde,这会将 的单步扩展\tilde从更改\protect\tilde␣\tilde。如果\setmathfont未在前言中使用,则unicode-math在环境的开头使用它document

glossaries-extra

第一个用法使用option\gls{tilde}对应的内部宏的值。如果未使用,则继承 option 的值,后一个则继承 option 的值。而你的例子相当于设置。glossariesfirstfirsttextnamename={\ensuremath{\tilde{D}}}

默认情况下,选项firsttext通过受保护的扩展(使用\protected@xdef)存储它们的值。因此相应的内部宏都存储\protect\ensuremath␣{\protect\tilde␣{D}}

结合

在OP的例子中,

  • 在 中\glsxtrnewsymbol, 的一步展开式\tilde,即\protect\tilde␣,被存储以\gls供使用。
  • 在文档的开头,\setmathfont重新定义了\tilde,但没有\tilde␣
  • 因此\gls{tilde}或多或少相当于\ensuremath{\tilde␣{D}},这会产生错误的数学重音波浪号位置。

解决方法

一般来说,防止\tilde单步扩展或关闭选项的扩展都first可以text解决问题。

% solution 1, protect \tilde
\glsxtrnewsymbol[description={tilde}]{tilde}{\ensuremath{\protect\tilde{D}}}

% solution 2, switch off the expansion of options `first` and `text`
\glssetnoexpandfield{text}
\glssetnoexpandfield{first}
\glsxtrnewsymbol[description={tilde}]{tilde}{\ensuremath{\tilde{D}}}

特别是,\setmathfont在定义任何词汇表条目之前明确使用 也是可行的。这就是 @cicada 的答案有效的原因。

知乎上有答案,我自己发的,但是用中文,针对几乎相同的问题提供了更多细节,并使用了不同的解释方式。希望有帮助。

答案2

在之前加载unicode-mathglossaries-extra,并设置要使用的数学字体unicode-math似乎可以解决问题:

波浪符号 D

平均能量损失

\documentclass{article}

\usepackage{unicode-math}
\usepackage[symbols,automake]{glossaries-extra}
\setmathfont{XITS Math}
\setmainfont{Noto Serif}

\makeglossaries
\glsxtrnewsymbol[description={tilde}]{tilde}{\ensuremath{\tilde{D}}}
\glsxtrnewsymbol[description={hat}]{hat}{\ensuremath{\hat{D}}}

\begin{document}
\printglossary[type=symbols, style=long]
\begin{itemize}
    \item gls: $\gls{tilde}$, $\gls{hat}$
    \item ensuremath: $\ensuremath{\tilde{D}}$, $\ensuremath{\hat{D}}$
    \item normal: $\tilde{D}$, $\hat{D}$
\end{itemize}
\end{document}

相关内容