如何在数学模式下更改文本语言?

如何在数学模式下更改文本语言?

因此,我有一个文档,其主要语言是希伯来语,次要语言是英语。希伯来语用于常规文本,英语用于常规文本和数学公式中的文本。然而,事实证明,该命令\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}

David CLM + 新计算机现代书籍样本

如果您要返回显式语言标记,或者想要继续使用 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}

相关内容