多语种多语言——使用了错误的字体?

多语种多语言——使用了错误的字体?

我正在尝试用 Polyglossia/XeLaTeX 设置一个文档,该文档主要使用希伯来语,并包含一些英语摘录。但是,我无法让 fontspec 对除主字体(罗马字体)以外的任何字体使用正确的英语字体 - 它反而使用希伯来语指定的字体。

这是我的最小示例文件:

\documentclass{article}
\usepackage{fontspec}
\usepackage[a4paper]{geometry}

\makeatletter

\setmainfont[Language=English,Script=Latin]{Nimbus Roman No9 L}
\setsansfont[Language=English,Script=Latin]{Nimbus Sans L}
\setmonofont[Language=English,Script=Latin]{Nimbus Mono L}
\newfontfamily\hebrewfont[Language=Hebrew,Script=Hebrew,Scale=3.0]{Frank Ruehl CLM}
\newfontfamily\hebrewfontsf[Language=Hebrew,Script=Hebrew,Scale=3.0]{Nachlieli CLM}
\newfontfamily\hebrewfonttt[Language=Hebrew,Script=Hebrew,Scale=3.0]{Miriam Mono CLM}
\makeatother

\usepackage{xunicode}
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\begin{document}
בדיקה, באיזה פונט זה יוצג \textenglish{\ttfamily{Hello, World!}}.


\begin{english}
Hello, \sffamily{Sans}, \ttfamily{Mono}
\end{english}

\end{document}

希伯来字体缩放以更好地查看结果。结果如下所示:

结果图片 PDF

如您所见,仅使用默认的(罗马)英文字体,而所有其他英文文本均使用缩放的(希伯来语)字体。我尝试过使用或不使用语言/脚本规范,但结果总是相同的。

编辑:将其更改为英语为默认语言,希伯来语为其他语言似乎可以解决这个问题,但这远非理想 - 文档至少有 95% 是希伯来语。但也许这暗示了根本原因?

编辑2:将默认语言更改为英语也会导致不良后果,即希伯来语无衬线字体和打字机/单声道文本完全消失。

编辑3:Ulrike Fischer 的答案中提出的修复方法有副作用,使得在第一次使用后\textenglish,所有章节标题都会使用英文字体错误地呈现:

\documentclass{article}
\usepackage{fontspec}
\usepackage[a4paper]{geometry}
\usepackage{xunicode}
\usepackage{polyglossia}

\setmainfont{DejaVu Sans}
\setsansfont{DejaVu Sans}
\setmonofont{DejaVu Sans}
\newfontfamily\englishfont{TeX Gyre Termes}
\newfontfamily\englishfontsf{TeX Gyre Heros}
\newfontfamily\englishfonttt{TeX Gyre Cursor}

\setdefaultlanguage{hebrew}
\setotherlanguage{english}

\makeatletter 
\addto\inlineextras@english{\xpg@set@normalfont{english}}
\addto\blockextras@english{\xpg@set@normalfont{english}}
\makeatother


\begin{document}
\section{חלק ראשון}
נכתוב באנגלית \textenglish{Hello, World!}
ומעכשיו כל הכותרות לא יופיעו
\section{חלק שני}
הכותרת לא מופיעה, אבל הטקסט כן.

\end{document}

其结果是:
章节标题以错误字体呈现

不同的字体会有不同的行为 - 以前使用的 Nimbus 字体只显示空格,而 Liberation 字体显示空方块 - 我猜这与这些字体在希伯来语字形位置的内容有关。

答案1

希伯来语是您的主要语言,因此将英语设置为默认语言只是为了获得正确的字体感觉像是一种黑客行为。

我认为 polyglossia 中有一个错误,它似乎无法正确重置字体。

以下方法似乎可以解决问题。由于我没有您的字体,所以我不得不更改它们。

编辑

正如评论中所述,我的第一个解决方案破坏了 \section(和其他地方)中的字体。原因是全局\xpg@set@normalfont重新定义\normalfont。以下方法可以纠正这个问题,但可能会产生其他副作用。此外,它更像是一种变通方法,而不是解决方案。

总体而言,我认为 polyglossia 中的字体更改命令并不对称。对于“latin=main, hebrew=other”的情况有代码,但反过来却没有。

\documentclass{article}
\usepackage[a4paper]{geometry}    
\usepackage{polyglossia}

\setmainfont{DejaVu Sans}
\setsansfont{DejaVu Sans}
\setmonofont{DejaVu Sans}
\newfontfamily\englishfont{TeX Gyre Termes}
\newfontfamily\englishfontsf{TeX Gyre Heros}
\newfontfamily\englishfonttt{TeX Gyre Cursor}

\setdefaultlanguage{hebrew}
\setotherlanguage{english}

\makeatletter
\def\xpg@set@normalfont#1{%
  \letcs{\rmfamily}{#1@font@rm}%
  \letcs{\sffamily}{#1@font@sf}%
  \letcs{\ttfamily}{#1@font@tt}%
  \def\normalfont{\protect\xpg@select@fontfamily{#1}}%def instead of gdef
  \gdef\reset@font{\protect\normalfont}%
}
\addto\inlineextras@english{\xpg@set@normalfont{english}}
\addto\blockextras@english{\xpg@set@normalfont{english}}
\makeatother



\begin{document}
\section{חלק ראשון}
נכתוב באנגלית \textenglish{Hello, World!}
ומעכשיו כל הכותרות לא יופיעו

\begin{english}
blub \sffamily blub \ttfamily blb
\end{english}


\section{חלק שני}
הכותרת לא מופיעה, אבל הטקסט כן.

\end{document}

在此处输入图片描述

答案2

如果主要语言不是拉丁语,显然\sffamilylatin和会有很大帮助(文档第 6 页)。然后,我们可以有条件地重新定义和使用这些版本,方法是检查活动语言是否为英语,使用。\ttfamilylatinpolyglossia\sffamily\ttfamilylatin\IfLanguageName{english}{true part}{false part}

(我以前用过\iflanguage,但后来发现它的用途是灰心,并且\IfLanguageName来自iflang首选

\documentclass[12pt]{article}
\usepackage{polyglossia}
\usepackage{iflang}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}

% I don't actually which Hebrew fonts counts as serif or sans serif...
\newfontfamily\hebrewfont[Language=Hebrew,Script=Hebrew]{David CLM}
\newfontfamily\hebrewfontsf[Language=Hebrew,Script=Hebrew]{Miriam CLM}
\newfontfamily\hebrewfonttt[Language=Hebrew,Script=Hebrew]{Miriam Mono CLM}
\newfontfamily\englishfont{FreeSerif}
\newfontfamily\sffamilylatin{FreeSans}
\newfontfamily\ttfamilylatin{FreeMono}

% Conditionally redefine \sffamily, \ttfamily to use
% \sffamilylatin, \ttfamilylatin if active language is english
\AtBeginDocument{
  \let\oldttfamily\ttfamily
  \let\oldsffamily\sffamily
  \renewcommand{\ttfamily}{\IfLanguageName{english}{\ttfamilylatin}{\oldttfamily}}
  \renewcommand{\sffamily}{\IfLanguageName{english}{\sffamilylatin}{\oldsffamily}}
}

\begin{document}
בדיקה, באיזה פונט זה יוצג
\textsf{בדיקה, באיזה פונט זה יוצג}

\section{חלק ראשון}

נכתוב באנגלית \textenglish{Hello, World!}
ומעכשיו כל הכותרות לא יופיעו

\begin{english}
blub \sffamily blub \ttfamily blub \textsf{blub} \texttt{blub}
\end{english}


\section{חלק שני}
הכותרת לא מופיעה, אבל הטקסט כן.
\end{document}

示例项目:https://www.overleaf.com/5971027jytqjd#/19831055/

相关内容