数学模式下无法获取 unicode 符号

数学模式下无法获取 unicode 符号

我尝试了大约一周的时间使用unicode-mathXeLaTeX 启动包,但一无所获。PDF 创建得很好,但数学模式中的所有西里尔符号都被跳过了。我尝试使用不同的数学字体 - 毫无进展。在日志文件中,我发现了低级错误:

Missing character: There is no [cyrillic letter from input] in font cmmi12!

但文档中使用的所有字体都是Unicode字体。

这是一个我想要处理好的文件(当然它是UTF-8)。

\documentclass[12pt]{book}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=modern]{russian}
\setotherlanguage{english}
\defaultfontfeatures{Ligatures={TeX}}
\setmainfont{CMU Serif}
\setsansfont{CMU Sans Serif}
\setmonofont{CMU Typewriter Text}  

\usepackage{amsmath, amssymb}
\usepackage[russian]{hyperref}

\usepackage{unicode-math}
\setmathfont{Latin Modern Math}

\frenchspacing

\begin{document}
Просто буквы % Plain letters
$$Память: M_{доп}(n) = \Theta(N)$$ % Memory: M_add(n) = \Theta(n)
\end{document}

寻求您的帮助。

答案1

这不是西里尔数学字符的问题;如果文本是英文,则正确的输入应该是

Letters only
\[
\text{Memory: } M_{\textup{add}}(n) = \Theta(N)
\]

因为 Память 和 доп 不是数学。与以下输出进行比较时,差异变得明显

\[
Memory: M_{add}(n) = \Theta(N)
\]

在此处输入图片描述

下面的公式显然是错误的。文本下标不是数学变量,因此它们应该以普通文本字体(直立)排版,因此要么这样,要么\textnormal这样\textup(后者更短)。当然,您可以为它们定义自己的命令。

以下是完整的示例:

\documentclass[12pt]{book}

\usepackage{amsmath,amssymb}
\usepackage{unicode-math}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=modern]{russian}
\setotherlanguage{english}

\setmainfont{CMU Serif}
\setsansfont{CMU Sans Serif}
\setmonofont{CMU Typewriter Text}  

\usepackage{color}
\usepackage{minted}
\usepackage[russian]{hyperref}

\setmathfont{Latin Modern Math}

\frenchspacing

\begin{document}

Просто буквы % Plain letters
\[
\text{Память: } M_{\textnormal{доп}}(n) = \Theta(N)
\]
\end{document}

在此处输入图片描述

如果您想使用西里尔字母作为数学变量,那将是另一个问题,但您的情况并非如此。

如果您需要西里尔字母作为数学变量,可以采用以下方法进行设置:

\documentclass[12pt]{book}

\usepackage{amsmath,amssymb}
\usepackage{unicode-math}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=modern]{russian}
\setotherlanguage{english}

\setmainfont{CMU Serif}
\setsansfont{CMU Sans Serif}
\setmonofont{CMU Typewriter Text}  

\usepackage[russian]{hyperref}

\setmathfont{Latin Modern Math}

\DeclareSymbolFont{cyrletters}{\encodingdefault}{\familydefault}{m}{it}
\newcommand{\makecyrmathletter}[1]{%
  \begingroup\lccode`a=#1\lowercase{\endgroup
  \Umathcode`a}="0 \csname symcyrletters\endcsname\space #1
}
\count255="409
\loop\ifnum\count255<"44F
  \advance\count255 by 1
  \makecyrmathletter{\count255}
\repeat

\begin{document}
\[
(д+ф)^{2}=д^{2}+2дф+ф^{2}
\]
\end{document}

在此处输入图片描述

它做什么\makecyrmathletter?让我们回顾一下。它的想法是,它以一个整数作为参数并执行一些魔术。我们在以下循环中使用它,其中第一个循环是

\makecyrmathletter{\count255}

\count255其值(十六进制)对应"410于 U+0410 西里尔大写字母 A。

为了理解代码,我假设传递了显式值。然后进行第一级扩展

\begingroup\lccode`a="410\lowercase{\endgroup
\Umathcode`a}="0 \csname symcyrletters\endcsname\space "410

奇怪的\begingroup构造用于从数字中获取字母:我们可以循环遍历数字,而不是字母。因此,在组内,\lccode字母的a(反引号符号称为“字母常量”)到"410。使用此设置,\lowercase将扫描其参数,将每个字符标记更改为其“小写”对应项,但它实际上使用表格\lccode。然后结果将被传送以再次扫描。因此我们得到

\endgroup\Umathcode`А="0 \csname symcyrletters\endcsname\space "410

(只有a被改变,控制序列保持\lowercase不变)。\endgroup执行其工作,即将 的更改恢复\lccode`a到之前的状态,然后消失。

然后\Umathcode执行分配。它分配А一个数学代码,即在数学模式中找到的新解释。 后面=应该跟着三个数字。第一个数字说明对象的类型;0 表示普通符号;第二个数字告诉 XeTeX 从哪个字体系列中获取它。\csname symcyrletters\endcsname生成使用前一个声明分配的数字\DeclareSymbolFont。使用符号名称,我们不需要知道实际分配了什么数字。第三个数字告诉 XeTeX 应该从哪个位置获取字符,我们显然选择"410,因此是西里尔字母А。三个数字应该用空格分隔,这在第一种情况下是明确的;\space在第二种情况下我们需要,因为留下空格是行不通的。由于在查找数字时会执行扩展,因此这\space会转换为实际的空格标记。

可以使用更简单的循环expl3

\ExplSyntaxOn

\int_step_inline:nnn { "410 } { "44F }
 {
  \Umathcode #1 = "0 ~ \use:c{ symcyrletters } ~ #1
 }

\ExplSyntaxOff

答案2

关于数学中的西里尔字母已经进行了一些讨论,但问题仍然悬而未决:https://github.com/wspr/unicode-math/issues/29

作为约瑟夫提到您需要带有字形的字体。对于数学(如果您没有切换到带有的文本字体\text{..}),您还需要设置数学代码。例如;

\documentclass[12pt]{book}
\usepackage{unicode-math}
\setmainfont{Arial Unicode MS} %for text
\setmathfont[]{xits-math.otf}
\ExplSyntaxOn
\makeatletter
\newcommand\addmathletter[1]{%
  \Umathcode  #1="\mathchar@type\mathalpha \csname sym\um_symfont_tl\endcsname #1\relax
}
\int_step_inline:nnnn {1024}{1}{1154}{
  \addmathletter{#1}
}
\ExplSyntaxOff

\begin{document}
Просто буквы % Plain letters
$$Память: M_{доп}(n) = \Theta(N)$$ % Memory: M_add(n) = \Theta(n)
\end{document}

在此处输入图片描述

(此\Umathcode行是从 xetex 列表中的一条旧消息复制并改编的,我不知道开头的引号是起什么作用……)

答案3

只是为了好玩-一般情况下:

普通代数

平均能量损失

\documentclass[12pt]{article}

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

\setmainfont{Liberation Serif}

\setmathfont{XITS Math}



%See: https://tex.stackexchange.com/questions/201239/cant-get-unicode-symbols-in-math-mode

\DeclareSymbolFont{cyrletters}{\encodingdefault}{\familydefault}{m}{it}
\newcommand{\makecyrmathletter}[1]{%
  \begingroup\lccode`a=#1\lowercase{\endgroup
  \Umathcode`a}="0 \csname symcyrletters\endcsname\space #1
}
\count255="409
\loop\ifnum\count255<"44F
  \advance\count255 by 1
  \makecyrmathletter{\count255}
\repeat

%-----------
\setmainfont{Noto Serif Armenian}
%\familydefault = \rmdefault
\DeclareSymbolFont{armletters}{\encodingdefault}{NotoSerifArmenian(0)}{m}{n}
\newcommand{\makearmmathletter}[1]{%
  \begingroup\lccode`a=#1\lowercase{\endgroup
  \Umathcode`a}="0 \csname symarmletters\endcsname\space #1
}
\count255="530
\loop\ifnum\count255<"587
  \advance\count255 by 1
  \makearmmathletter{\count255}
\repeat



%-----------
\setmainfont{Noto Serif Georgian}
\DeclareSymbolFont{geoletters}{\encodingdefault}{NotoSerifGeorgian(0)}{m}{n}
\newcommand{\makegeomathletter}[1]{%
  \begingroup\lccode`a=#1\lowercase{\endgroup
  \Umathcode`a}="0 \csname symgeoletters\endcsname\space #1
}
\count255="109F
\loop\ifnum\count255<"10FA
  \advance\count255 by 1
  \makegeomathletter{\count255}
\repeat



%-----------
\setmainfont{Noto Serif Lao}
\DeclareSymbolFont{laoletters}{\encodingdefault}{NotoSerifLao(0)}{m}{n}
\newcommand{\makelaomathletter}[1]{%
  \begingroup\lccode`a=#1\lowercase{\endgroup
  \Umathcode`a}="0 \csname symlaoletters\endcsname\space #1
}
\count255="0E80
\loop\ifnum\count255<"0EDF
  \advance\count255 by 1
  \makelaomathletter{\count255}
\repeat



%-----------
\setmainfont{Noto Sans Egyptian Hieroglyphs}
\DeclareSymbolFont{egyletters}{\encodingdefault}{NotoSansEgyptianHieroglyphs(0)}{m}{n}
\newcommand{\makeegymathletter}[1]{%
  \begingroup\lccode`a=#1\lowercase{\endgroup
  \Umathcode`a}="0 \csname symegyletters\endcsname\space #1
}
%\count255="13000
%\loop\ifnum\count255<"1342E %too many?
%  \advance\count255 by 1
%  \makeegymathletter{\count255}
%\repeat
% has 1000 glyphs
\makeegymathletter{"13000}
\makeegymathletter{"13068}
\makeegymathletter{"1307B}
\makeegymathletter{"130D8}
\makeegymathletter{"131C1}



%-----------
\setmainfont{Noto Serif}


\begin{document}

Cyrillic:

\[
(д+ф)^{2}=д^{2}+2дф+ф^{2}м
\]

Armenian:

\[
(է+թ)^{2}=գ^{2}+2ե+ճդ^2-ա
\]

Georgian:

\[
(დ+ლ)^{2}=შ^{2}+2ლ+დშ^2-ა
\]

Lao:

\[
(ມ+ວ)^{2}=ມ^{2}+2ນ+ສວ^2-ກ
\]

Egyptian Hieroglyphs:

\[
(

相关内容