根据脚本自动切换字体,而不仅仅是在同一字体中混合字母

根据脚本自动切换字体,而不仅仅是在同一字体中混合字母

以下与 xelatex 一起工作并产生预期的输出:

\documentclass{book}
\usepackage{fontspec}

\setmainfont{DejaVu Serif}
%\setmainfont{GFS Porson}

\begin{document}

one two three

ἑν δύω τρία

\end{document}

对于文档的希腊文部分,我更愿意使用 GFS Porson 字体。但是,如果我注释掉选择 DejaVu 的行并取消注释以下行,则不起作用:因为 Porson 不包含拉丁字母,所以英文单词在页面上只会呈现为空白。

有没有办法设置,以便我使用字体 A 表示希腊语,使用字体 B 表示英语?这可以基于 A 是否缺少相关字符的标准,也可以基于我说的话,“嘿,xelatex,请使用字体 A 表示 unicode 拉丁代码块中的输入,但使用字体 B 表示希腊代码块中的输入。”

请注意,这与先前的这个问题。

[编辑] 经过 Davislor 的对话和进一步帮助后,我想出了一个非最小工作版本:

\documentclass{article}
\tracinglostchars=2 % Warn if the current font is missing a glyph
\usepackage[paperwidth=10cm]{geometry} % Format the MWE for TeX.SX
%\usepackage[greek, english]{babel}
\usepackage{babel}
\usepackage{fontspec}
\usepackage{unicode-math}
\usepackage[GreekAndCoptic, GreekExtended]{ucharclasses}

\babelprovide[import=el-polyton]{greek}

\setDefaultTransitions{\selectlanguage{english}}{\selectlanguage{english}}
\setTransitionTo{GreekAndCoptic}{\selectlanguage{greek}}
\setTransitionTo{GreekExtended}{\selectlanguage{greek}}

\defaultfontfeatures{ Scale=MatchLowercase, Ligatures = TeX }
\defaultfontfeatures{ Scale=MatchUppercase, Ligatures=TeX }
\babelfont[greek]{rm}
          {GFS Porson}
\babelfont{rm}
          [Scale=1.0]{DejaVu Serif}
\babelfont{sf}
          [Ligatures={Common,Discretionary}, Language=Default]{DejaVu Sans}
\babelfont{tt}
          [Language=Default]{Liberation Mono}
%\setmathfont{Liberation Math}

\begin{document}
Homer’s \textit{Ὀδύσσεια} begins, “ἄνδρα μοι ἔννεπε, μοῦσα, πολύτροπον, ὃς
μάλα πολλὰ πλάγχθη.”
\end{document}

这会产生所需的输出,但也会输出一堆警告。

答案1

使用 Babel,在 LuaTeX 或 XeTeX 中修改我的答案在这里针对特定语言进行覆盖\babelfont。以下是 LuaLaTeX 的 MWE:

\documentclass{article}
\tracinglostchars=2 % Warn if the current font is missing a glyph
\usepackage[paperwidth=10cm]{geometry} % Format the MWE for TeX.SX
\usepackage[english]{babel}
\usepackage{fontspec}

\babelprovide[import=el-polyton, onchar=fonts ids]{greek}

\defaultfontfeatures{ Scale=MatchUppercase, Ligatures = TeX }

\defaultfontfeatures[GFSPorson]{
  ItalicFont=GFSOlga, % The GFS ships Italic faces as a separate family.
  Extension={.otf} }

\babelfont{rm}
          [Scale=1.0, Ligatures=Common]{DejaVu Serif}
\babelfont[greek]{rm}
          [Script=Latin, Language=Default]{GFSPorson}

\begin{document}
Homer’s \textit{Ὀδύσσεια} begins, “ἄνδρα μοι ἔννεπε, μοῦσα, πολύτροπον, ὃς
μάλα πολλὰ πλάγχθη.”
\end{document}

Porson/Olga/DejaVu Serif 示例

或者,将 Porson 设为默认值并设置\babelfont[english]{rm}。您可以进行与我的其他答案相同的更改,以使其在 XeLaTeX 中工作。

使用polyglossia,设置

\setmainfont{DejaVu Serif}[Scale=1.0]
\newfontfamily\greekfont{GFS Porson} % This font does not support Script=, Language= or Ligatures=.

使用 PDFTeX,使用

\usepackage[LGR, T1]{fontenc}
\usepackage{textalpha}
\usepackage[greek,english]{babel}
\usepackage{dejavu}
\usepackage{substitutefont}

\substitutefont{LGR}{\rmdefault}{porson}

这是 XeLaTeX 的另一个 MWE。它还会抑制部分(但不是全部)警告消息,例如未定义sf字体tt

\documentclass{article}
\tracinglostchars=2 % Warn if the current font is missing a glyph
\usepackage[paperwidth=10cm]{geometry} % Format the MWE for TeX.SX
\usepackage[english]{babel}
\usepackage{fontspec}
\usepackage[GreekAndCoptic,GreekExtended]{ucharclasses}

\babelprovide[import=el-polyton]{greek}

\setDefaultTransitions{\selectlanguage{english}}{\selectlanguage{english}}
\setTransitionTo{GreekAndCoptic}{\selectlanguage{greek}}
\setTransitionTo{GreekExtended}{\selectlanguage{greek}}

\defaultfontfeatures{ Scale=MatchUppercase, Ligatures = TeX }

\defaultfontfeatures[GFSPorson]{
  ItalicFont=GFSOlga, % The GFS ships Italic faces as a separate family.
  Extension={.otf}  }

\babelfont{rm}
          [Scale=1.0, Ligatures=Common, Language=Default]{DejaVu Serif}
\babelfont[greek]{rm}
          [Language=Default]{GFSPorson}

\begin{document}
Homer’s \textit{Ὀδύσσεια} begins, “ἄνδρα μοι ἔννεπε, μοῦσα, πολύτροπον, ὃς
μάλα πολλὰ πλάγχθη.”
\end{document}

相关内容