重音符号和 unicode-math

重音符号和 unicode-math

为什么数学模式下某些重音符号不可见?我正在使用unicode-mathXeLaTeX 进行编译。以下是 MWE:

\documentclass{scrartcl}
\usepackage{unicode-math}
\begin{document}
x̃ŷz̄ $x̃ŷz̄$
\end{document}

这会在文本模式字母上产生重音,但在数学模式字母上不会产生重音。奇怪!

答案1

没有 Unicode“带有波浪号的拉丁小写字母 X”,因此您可以通过输入xU+0303“组合波浪号”来获得“x̃”。

这在数学模式下不起作用,因为数学模式严格从左到右进行,并且后面的字符不会影响它之前的字符。

\tilde{o}你可以使用以下技巧让现有的 Unicode 点(例如“带有波浪号的拉丁文小写字母 O”)在数学模式下表现得像

\AtBeginDocument{\mathcode`õ="8000 }
\begingroup\lccode`~=`õ
\lowercase{\endgroup\def~}{\tilde{o}}

可以考虑做类似的事情x(先查看后面是否有组合字符),但这样会很慢,而且不太稳定。最好通过输入以下内容来更清楚地表达你的意图

\tilde{x}

仅作为概念证明,以下是您可以管理的方法(我还保留了预组合õ)。\@ifnextchar测试应扩展到其他所需的复合字符。

\documentclass{scrartcl}
\usepackage{unicode-math}

\AtBeginDocument{\mathcode`õ="8000 }
\begingroup\lccode`~=`õ
\lowercase{\endgroup\def~}{\tilde{o}}

\AtBeginDocument{\edef\mathcodex{\Umathcharnum\the\Umathcodenum`x }}
\AtBeginDocument{\mathcode`x="8000 }
\begingroup\lccode`~=`x
\lowercase{\endgroup\def~}{\addaccentx}

\makeatletter
\newcommand\addaccentx{%
  \@ifnextchar ^^^^0303{\tilde{\mathcodex}\@gobble}{\mathcodex}%
}
\makeatother

\begin{document}
x̃ŷz̄ $õx̃$
\end{document}

enter image description here

答案2

根据 egreg 的回答:

\documentclass{scrartcl}

\usepackage{unicode-math}
\usepackage{amsmath}

\AtBeginDocument{\mathcode`x="8000 }
\begingroup\lccode`~=`x
\lowercase{\endgroup\def~}{\addaccent{x}}

\makeatletter
\newcommand\addaccent[1]{%
  \@ifnextchar ^^^^0303{\text{\emph{#1̃}}\@gobble}{%
  \@ifnextchar ^^^^0302{\text{\emph{#1̂}}\@gobble}{%
  \@ifnextchar ^^^^0304{\text{\emph{#1̄}}\@gobble}{%
  \text{\emph{#1}}}}}%
}
\makeatother

\begin{document}
x̃ŷz̄ $x̃x̂x̄ \frac{1}{x̃} $
\end{document}

我重新定义了该函数,将字母作为参数(这将使将代码扩展到所有字母变得更容易)并添加了更多重音。

进入文本模式可能不是最正确的方法,但我找不到其他解决方案。

相关内容