因此,我有一个文档,其主要语言是希伯来语,次要语言是英语。希伯来语用于常规文本,英语用于常规文本和数学公式中的文本。然而,事实证明,该命令\text{}
使用的是希伯来语(主要)字体,而不是用于英语文本的字体。以下是一个例子:
\documentclass[a4paper,english,hebrew]{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{fontspec}
\setmainfont[Mapping=tex-text]{David CLM}
\newfontfamily{\englishfont}[Ligatures=TeX]{Latin Modern Roman}
\setmathrm[Ligatures=TeX]{Latin Modern Roman}
\makeatother
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\begin{document}
\noindent שלום \textenglish{Hello} \LRE{
\[
y=\underbrace{x+z}_{\text{const}}=\text{abc}=\mathrm{abc}
\]
}
\end{document}
它看起来是这样的:
\text{abc}
请注意(使用 David CLM) 和\mathrm{abc}
(使用 Latin Modern Roman,这是所需的字体)之间的字体差异。目前我使用\mathrm{}
它作为一种解决方法,但由于许多原因(例如数学模式间距),它很不方便。有没有办法强制\text{}
使用\englishfont
变体?
顺便说一句,\text{}
当主要语言是 RTL 时,也会打乱单词的顺序。例如,命令
\text{abc def}=\mathrm{abc\,def}
给出
也就是说,这里的问题不仅仅是字体。
答案1
首先,请注意,您需要的命令是\textnormal
,而不是\text
— 尤其是 DavidCLM 和amsthm
。如果您\text
在斜体的定理陈述中使用 ,它将继承其周围文本的斜体格式。并且您的英语和希伯来语斜体倾斜相反方向!使用\textnormal
重置所有文本格式,这正是您在这里想要的。
LuaTeX 中的 Babel 可以检测您正在输入的语言并自动更改字体。通过此设置,、\textenglish
等\begin{hebrew}
仍然有效,但它们通常不会执行任何操作,因为您正在输入的脚本会自动更改语言并覆盖它们。
如果您需要交替使用英语和希伯来语的完整段落,这将不够:即使在英语部分,布局仍将保持从右到左。您需要删除选项onchar=
并返回\textenglish
和\begin{english}
。
再次强调,此 MWE 需要 LuaLaTeX。(由于您使用Mapping=
,因此您似乎正在使用 XeTeX 进行编译。)
\documentclass[a4paper]{article}
\tracinglostchars=2
\usepackage{amsmath,amsthm}
\usepackage[bidi=basic,
layout=sectioning.tabular,
nil
]{babel}
\usepackage{unicode-math}
\defaultfontfeatures{ Scale=MatchUppercase,
Ligatures=TeX,
Renderer=HarfBuzz }
% The Culmus fonts are free for download at
% https://sourceforge.net/projects/culmus/
\defaultfontfeatures[DavidCLM]{
UprightFont = *-Medium,
ItalicFont = *-MediumItalic,
BoldFont = *-Bold,
BoldItalicFont = *-BoldItalic,
Extension = .otf }
\defaultfontfeatures[MiriamCLM]{
UprightFont = *-Book,
BoldFont = *-Bold,
Extension = .ttf }
\babelprovide[import, onchar=ids fonts]{english}
\babelfont{rm}
[Scale=1.0, Language=Default]{NewComputerModernBook}
\babelfont{sf}
[Language=Default]{NewComputerModernSansBook}
\babelfont{tt}
[Language=Default]{NewComputerModernMonoBook}
\babelprovide[import, main, onchar=ids fonts]{hebrew}
\babelfont[hebrew]{rm}
[Language=Default]{DavidCLM}
\babelfont[hebrew]{sf}
[Language=Default]{MiriamCLM}
\babelfont[hebrew]{tt}
[Language=Default]{MiriamMonoCLM}
\setmathfont{NewCMMath-Book}
\setmathrm{NewComputerModernBook}
\setmathsf{NewComputerModernSansBook}
\setmathtt{NewComputerModernMonoBook}
\babeltags{english=english} % Enable \textenglish, \begin{english}, etc.
\babeltags{hebrew=hebrew} % Enable \texthebrew, \begin{hebrew}, etc.
\begin{document}
\noindent שלום Hello
\[
y=\underbrace{x+z}_{\textnormal{const}}=\textnormal{abc}=\mathrm{abc}
\]
\end{document}
如果您要返回显式语言标记,或者想要继续使用 Polyglossia,有两个快速解决方法。一种是定义一个新命令,如\mathtext
或\mathen
作为 的快捷方式\textnormal{\textenglish{...}}
。另一种是将您的方程式包装在 和 中,\begin{english}
以便\end{english}
命令\text
默认使用您的英文字体。至少在这种情况下使用\textup
而不是\text
,这样您就不会遇到左右倾斜的斜体字的正面碰撞。
\documentclass[a4paper]{article}
\tracinglostchars=2
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\defaultfontfeatures{ Scale=MatchUppercase,
Ligatures=TeX }
\setmainfont[Script=Hebrew, Scale=1.0]{David CLM}
\newfontfamily{\englishfont}{Latin Modern Roman}
\setmathrm{Latin Modern Roman}
\newcommand\mathtext[1]{\textnormal{\textenglish{#1}}}
\begin{document}
\noindent שלום \textenglish{Hello}
\begin{english}\[
y=\underbrace{x+z}_{\mathtext{const}}=\textup{abc}=\mathrm{abc}
\]\end{english}
\end{document}
答案2
由于您使用的是 XeLaTeX,您可以加载unicode-math
包(自动加载fontspec
包)并通过指令设置全局数学字体\setmathfont
。
也就是说,您应该使用\mathrm
并\mathit
确保参数使用数学字体的字形而不是文本字体的字形进行排版。
对于下面的截图,我使用了Cardo 字体,因为我的 TeX 发行版不具备David CLM
。 (我选择 Cardo 是因为它看起来与 Latin Modern 非常不同,因此很容易发现任何差异。)
% !TEX TS-program = xelatex
\documentclass[a4paper]{article}
\usepackage{amsmath,amsthm}
\usepackage{unicode-math}
\setmainfont[Ligatures=TeX]{Cardo} % or some other suitable font
\newfontfamily{\englishfont}{Latin Modern Roman}[Ligatures=TeX, Scale=MatchLowercase]
\setmathfont{Latin Modern Math}[Scale=MatchLowercase]
\setmathrm[Ligatures=TeX]{Latin Modern Roman}
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\begin{document}
\noindent שלום \quad \textenglish{Hello} \quad Hello
\[ % no need to encase the displayed equation in an \LRE "wrapper"
y=\underbrace{x+z}_{\mathrm{const}}=Hello=\mathit{Hello}=\mathrm{Hello}=\text{Hello}
\]
\LRE{% % of course, \LRE still works
\[
y=\underbrace{x+z}_{\mathrm{const}}=Hello=\mathit{Hello}=\mathrm{Hello}=\text{Hello}
\]
}
\end{document}