为什么数学模式下某些重音符号不可见?我正在使用unicode-math
XeLaTeX 进行编译。以下是 MWE:
\documentclass{scrartcl}
\usepackage{unicode-math}
\begin{document}
x̃ŷz̄ $x̃ŷz̄$
\end{document}
这会在文本模式字母上产生重音,但在数学模式字母上不会产生重音。奇怪!
答案1
没有 Unicode“带有波浪号的拉丁小写字母 X”,因此您可以通过输入x
U+0303“组合波浪号”来获得“x̃”。
这在数学模式下不起作用,因为数学模式严格从左到右进行,并且后面的字符不会影响它之前的字符。
\tilde{o}
你可以使用以下技巧让现有的 Unicode 点(例如“带有波浪号的拉丁文小写字母 O”)在数学模式下表现得像
\AtBeginDocument{\mathcode`õ="8000 }
\begingroup\lccode`~=`õ
\lowercase{\endgroup\def~}{\tilde{o}}
可以考虑做类似的事情x
(先查看后面是否有组合字符),但这样会很慢,而且不太稳定。最好通过输入以下内容来更清楚地表达你的意图
\tilde{x}
仅作为概念证明,以下是您可以管理的方法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}
答案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}
我重新定义了该函数,将字母作为参数(这将使将代码扩展到所有字母变得更容易)并添加了更多重音。
进入文本模式可能不是最正确的方法,但我找不到其他解决方案。