定义的许多数学符号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}
,它会编译并产生具有两种格式的符号。
我的问题是:
- 为什么在数学模式之外使用数学符号时,lualatex 不会产生错误?更一般地说,为什么 lualatex 和 xelatex 之间的行为不同?
- 选择让符号在文本模式下工作是有意为之吗
unicode-math
?
猜测是\UnicodeMathSymbol
指示\dagger
扩展为文字 Unicode 字符†
,然后由 lualatex 或 xelatex 在适当的上下文(数学/文本)中解释。只要没有\mathaccent
需要数学模式的额外代码(例如 for ),那么“数学”部分\UnicodeMathSymbol
实际上并不重要。但这只是猜测,并不能解释为什么\qprime
xelatex 在数学模式之外会产生错误。
答案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.
这就像\mathchar
xetex 中的文本错误一样,但 luatex 会忽略前两个组件,并且像\char"002057
\documentclass{article}
\usepackage{unicode-math}
\begin{document}
\show\alpha\alpha
\show\dagger\dagger
\show\qprime\qprime
\end{document}