关于数学/文本模式和格式的 unicode-math 符号的困惑

关于数学/文本模式和格式的 unicode-math 符号的困惑

定义的许多数学符号unicode-math在文本模式下“有效”,或者至少不会产生错误。例如,从中取一个代表性样本unicode-math-table.tex,以下代码使用 lualatex 进行编译

\documentclass{article}
\usepackage{unicode-math,array,shortvrb}
\newcolumntype{M}{>{$}c<{$}}
\MakeShortVerb{\|}

\begin{document}

\begin{tabular}{ r | M | c | l}
Command & \text{Math mode} & Text mode & Symbol class \\
\hline
|\twolowline| & \twolowline & \twolowline & |\mathord| \\
|\dagger| & \dagger & \dagger & |\mathbin| \\
|\ddagger| & \ddagger & \ddagger & |\mathbin| \\
|\smblkcircle| & \smblkcircle & \smblkcircle & |\mathbin| \\
|\enleadertwodots| & \enleadertwodots & \enleadertwodots & |\mathord| \\
|\unicodeellipsis| & \unicodeellipsis & \unicodeellipsis & |\mathord| \\
|\hyphenbullet| & \hyphenbullet & \hyphenbullet & |\mathord| \\
|\fracslash| & \fracslash & \fracslash & |\mathbin| \\
|\Question| & \Question & \Question & |\mathord| \\
|\closure| & \closure & \closure & |\mathrel| \\
|\qprime| & \qprime & \qprime & |\mathord| \\
|\euro| & \euro & \euro & |\mathord| \\
|\enclosecircle| & \enclosecircle & \enclosecircle & |\mathord| \\
|\enclosesquare| & \enclosesquare & \enclosesquare & |\mathord| \\
|\BbbZ| & \BbbZ & \BbbZ & |\mathalpha| \\
|\mho| & \mho & \mho & |\mathord| \\
|\mfrakZ| & \mfrakZ & \mfrakZ & |\mathalpha| \\
|\turnediota| & \turnediota & \turnediota & |\mathalpha| \\
|\Angstrom| & \Angstrom & \Angstrom & |\mathalpha| \\
|\mscrB| & \mscrB & \mscrB & |\mathalpha| \\
|\mfrakC| & \mfrakC & \mfrakC & |\mathalpha| \\
|\mscre| & \mscre & \mscre & |\mathalpha| \\
|\leftarrow| & \leftarrow & \leftarrow & |\mathrel| \\
|\uparrow| & \uparrow & \uparrow & |\mathrel| \\
|\rightarrow| & \rightarrow & \rightarrow & |\mathrel| \\
|\downarrow| & \downarrow & \downarrow & |\mathrel| \\
|\leftrightarrow| & \leftrightarrow & \leftrightarrow & |\mathrel| \\
|\updownarrow| & \updownarrow & \updownarrow & |\mathrel| \\
|\nwarrow| & \nwarrow & \nwarrow & |\mathrel| \\
|\nearrow| & \nearrow & \nearrow & |\mathrel| \\
\end{tabular}
\end{document}

至少对于 lualatex 来说,\UnicodeMathSymbol除了类\mathopen\mathclose\mathaccent(wide)\mathaccentoverlay\mathbotaccent(wide)、中的符号之外\mathover,用 定义的每个符号\mathunder都可以在文本模式下编译而不会出错。是否生成符号取决于字体,如上所示,文本模式下的符号通常略有不同(这是意料之中的,因为它们来自不同的 Unicode 块(我认为))。

但是,如果您尝试使用 xelatex 进行编译,则会收到错误! Missing $ inserted.\qprime如果删除该行,则可以编译,但通常在 xelatex 的文本模式下工作的符号较少。

最后观察:没有unicode-math,例如

\documentclass{article}
\begin{document}
\dagger
\end{document}

在 lualatex 下编译无错误,但不产生符号。使用 xelatex 时,它会抛出错误。添加后\usepackage{unicode-math},它会编译并产生具有两种格式的符号。

我的问题是:

  1. 为什么在数学模式之外使用数学符号时,lualatex 不会产生错误?更一般地说,为什么 lualatex 和 xelatex 之间的行为不同?
  2. 选择让符号在文本模式下工作是有意为之吗unicode-math

猜测是\UnicodeMathSymbol指示\dagger扩展为文字 Unicode 字符,然后由 lualatex 或 xelatex 在适当的上下文(数学/文本)中解释。只要没有\mathaccent需要数学模式的额外代码(例如 for ),那么“数学”部分\UnicodeMathSymbol实际上并不重要。但这只是猜测,并不能解释为什么\qprimexelatex 在数学模式之外会产生错误。

答案1

\documentclass{article}
\begin{document}
\show\dagger\dagger
\end{document}

显示这\dagger不是一个宏,它是通过 定义为经典 tex 的\mathchardef。在经典 TeX 和 XeTeX 中使用\mathchar标记是错误的,但在 luatex 中记录的更改是\mathchar文本中的 不是错误,数学类被忽略,它的作用就像\char从当前字体中选择一个字符。

添加后,unicode-math你会看到,正如你猜测的那样,该命令是一个简单的\def字符宏。因此,就像在文本和数学中工作一样,由字符+控制\mathcode

 \dagger=the character †

\qprime不是宏,而是定义 va\Umathchar

\qprime=\Umathchar"0"00"002057.

这就像\mathcharxetex 中的文本错误一样,但 luatex 会忽略前两个组件,并且像\char"002057

\documentclass{article}
\usepackage{unicode-math}
\begin{document}
\show\alpha\alpha
\show\dagger\dagger
\show\qprime\qprime
\end{document}

相关内容