![在多语种俄语中使用 mathspec 的 \setallmainfonts 会导致编译期间挂起](https://linux22.com/image/240649/%E5%9C%A8%E5%A4%9A%E8%AF%AD%E7%A7%8D%E4%BF%84%E8%AF%AD%E4%B8%AD%E4%BD%BF%E7%94%A8%20mathspec%20%E7%9A%84%20%5Csetallmainfonts%20%E4%BC%9A%E5%AF%BC%E8%87%B4%E7%BC%96%E8%AF%91%E6%9C%9F%E9%97%B4%E6%8C%82%E8%B5%B7.png)
mathspec
我刚刚遇到了一个问题,即命令\setallmainfonts
和语言设置为俄语的组合polyglossia
。我使用的是 MiKTeX 2.9 并使用 XeLaTeX 进行编译,当我将这两者一起使用时,编译会挂起并且无法完成。
我发现在加载俄语和其他语言时,日志文件中存在差异。对于俄语,还有一行加载了类似 babel 简写的内容,而加载其他语言时则不存在。也许这可能与问题有关。
仅当我在文档中实际使用一些数学命令(无论是在环境之间$
还是使用equation
环境)时才会发生挂起。
这是一个最小的例子:
\documentclass[12pt]{article}
\usepackage{mathspec}
\usepackage{xltxtra}
\setallmainfonts[Mapping=tex-text, Numbers={Lining,Proportional}]{Linux Libertine O}
\usepackage{polyglossia}
\setdefaultlanguage{russian}
\begin{document}
\begin{equation}
f(x)=\sigma
\end{equation}
\end{document}
我正在使用mathspec
和,\setallmainfonts
因为我想更改数学字体(\setmathsfont
也会导致挂起)。因此删除它们不是一个选择。
答案1
您对简写的看法是正确的。加载mathspec
会将 重新定义\sigma
为"σ
,使其"
处于活动状态,并\let
对该字符设置特定的控制序列。polyglossia
使用russian
选项加载会使其"
再次处于活动状态,并覆盖 的先前定义"
。mathspec
还设置"
为在数学模式下处于活动状态。但是,在数学模式下使用它会调用polyglossia
的意外定义"
,从而进入无限循环。
由于选项冲突,简单地交换两个包是行不通的fontspec
。我们能做的是在加载后恢复mathspec
的含义。这必须做,因为那时也会出现问题。"
russian
\AtBeginDocument
polyglossia
"
\documentclass{article}
\usepackage{mathspec}
\setallmainfonts[Mapping=tex-text, Numbers={Lining,Proportional}]{Linux Libertine O}
\usepackage{polyglossia}
\setdefaultlanguage{russian}
\makeatletter
\begingroup
\catcode`\"=\active
\AtBeginDocument{\let"=\eu@active@quote}
\endgroup
\makeatother
\begin{document}
\begin{equation}
f(x)=\sigma
\end{equation}
\end{document}
在我看来,这两个包都有问题:它们在没有明确用户请求的情况下更改了 catcode 和活动字符的定义。
编辑:Polyglossia 错误报告为第 28 期。
答案2
尝试这个设置:
\setmathfont{Latin Modern Math}
\setmainfont[Mapping=tex-text, Numbers={Lining,Proportional}]{Linux Libertine O}
如果没有 Latin Modern Math,请使用任何其他数学字体