我尝试了大约一周的时间使用unicode-math
XeLaTeX 启动包,但一无所获。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:
\[
(