编辑

编辑

我用polyglossia它来在文档中切换语言并fontspec定义各种字体。这种组合给我带来了以下问题。

MWE:

\documentclass{article}
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{dutch}
\usepackage{fontspec}
\newfontfamily\mono{Latin Modern Mono}[Scale=2] % scaled for visibility
\begin{document}
foo\mono bar foo\textdutch{bar}
\end{document}

结果:

在此处输入图片描述

为什么第二个“bar”没有按照当前字体系列 ( \mono) 排版?这是因为 中的一项功能polyglossia支持不同语言的不同字体吗?如果是这样,我该如何重新定义\text<language>以便它使用当前字体,或者:如何检测当前字体然后在 中激活它\text<language>{<here>}?还是我明显做错了什么?

更新: Ulrike Fischer 的回答如下,但我有一个长期存在的问题和一个解决方案:

另一个不太 MWE 来说明我做错了什么。

\documentclass[]{memoir}

\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{dutch}
\newcommand*\dutchfont{} % the solution to the first problem, thanks to Ulrike Fischer

\usepackage{fontspec}
\newfontfamily\titlefont{Latin Modern Mono}[Scale=2] % scaled for visibility

\renewcommand*{\maketitlehooka}{\titlefont} % this hook executes just before \thetitle is printed

\title{fo\textdutch{ob}ar}

\begin{document}

\sffamily % <=== disable this and the thanks have the desired font
% \fontfamily\sfdefault\selectfont % this works correctly
\maketitle

\end{document}

当语言更改时,它会导致相同的错误字体选择。在此 MWE 中,文本 foobar 是英文的,并使用 选择的字体\titlefont,但中间的 -ob- 是荷兰语。如果在文本之前调用了\sffamily(可能还有任何其他命令),则此语言更改也会导致字体更改。我以前用无衬线字体排版过各种标题页元素。根据我的经验,任何包含默认字体以外的其他字体和语言更改的文本都会恢复为默认的无衬线字体。使用而不是确实可以正常工作。为什么这里使用 是不正确的?\..family\sffamily\maketitle\fontfamily\sfdefault\selectfont\sffamily\sffamily

答案1

您可以为 \dutchfont 添加定义:

\documentclass{article}
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{dutch}
\newcommand\dutchfont{}
\usepackage{fontspec}
\newfontfamily\mono{Latin Modern Mono}[Scale=2] % scaled for visibility
\begin{document}
foo\mono bar foo\textdutch{bar}
\end{document}

但我更喜欢 babel 而不是 polyglossia。

编辑

关于第二个例子:polyglossia 重新定义\sffamily存储“familytype”:

 \csgappto{sffamily }{\def\familytype{sf}}

它使用此字体系列类型来决定是否应在语言边界切换以及应切换到哪个字体系列。在我看来,禁用该系统很困难,而且 polyglossia 只知道三种标准字体系列。此外,没有“字体系列”的概念,因此无法禁用英语和荷兰语之间的字体切换,但可以保留荷兰语和西里尔语之间的字体切换。

字体应遵循以下通用规则:使用标准系列和标准命令,例如fontspec 选项中的\bfseries\large和非设置,例如 [Scale=2]:

\documentclass[]{memoir}
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{dutch}

\usepackage{fontspec}
\newcommand\titlefont{\sffamily\Huge} % scaled for visibility

\renewcommand*{\maketitlehooka}{\titlefont} % 

\title{fo\textdutch{ob}ar}

\begin{document}

\sffamily 
\maketitle

\end{document}

如果您想在某个地方使用特殊字体,那么您可能会将其隐藏为标准字体系列之一中的特殊变体,以欺骗多语者。

相关内容