XeTeX 中的 Unicode 具有自动字体替换功能吗?

XeTeX 中的 Unicode 具有自动字体替换功能吗?

我有一台文字处理器(文字研磨器) 支持 Unicode。它可以导出 LaTeX 文件,然后通过 XeTeX 运行。

不幸的是,虽然 XeTeX理解正确使用 Unicode,如果默认字体中没有特定字形,则不会进行任何类型的字体替换。由于默认字体是 Computer Modern Roman,其字体覆盖率很差,如果我不指定字体,默认行为就是我的所有 Unicode 字符都会消失。这不是最佳选择。

为了测试目的,我安装了 Linux Libertine O 并硬编码了对字体的引用。现在更多东西都可以工作了,因为 Linux Libertine 具有更好的 Unicode 覆盖率。但我仍然缺少字形。我非常希望不必在输出文件中硬编码字体引用,因为这样会使最终用户使用输出文件的可能性大大降低。(例如,Linux Libertine O 不是我的发行版的默认部分。)

有什么方法可以告诉 XeTeX自动地找到支持 Unicode 字形的合适字体了吗?我对使用 Computer Modern Roman 进行渲染很满意,对于不支持的字形,我会使用其他字体;只要字形确实匹配,我不在乎外观是否匹配那里(如果用户想要特定字体,他们可以编辑该文件。)

我目前使用的发行版是 Debian 版的 xetex-live,但如果有发行版无关的修复程序,我希望得到一个。我很高兴需要 XeTeX。

答案1

此答案试图完善上一个答案和“需要混合搭配 Unicode 字体”的评论。ucharclasses 包就是为这种“拼凑”而设计的。

\usepackage{ucharclasses}
\usepackage{fontspec}

\setDefaultTransitions{\fontspec{Code2000}}{}
\setTransitionsForLatin{\fontspec{Palatino Linotype}}{}
\setTransitionsForGreek{\fontspec{Galatia SIL}}{}

然后,当文本进入新的 Unicode 块时,xetex 将会切换字体。

我尝试将其与 Ulrike Fischer 的代码结合起来,检查是否可以加载字体。它似乎有效:

\usepackage[Latin,Japanese]{ucharclasses}
\usepackage{fontspec}

\setmainfont{FreeSerif}
\ifnum\the\XeTeXcharglyph"D5=0
  \setTransitionsForLatin{\fontspec{FreeSerif}}{}
\else
  \setTransitionsForLatin{\fontspec{URW Palladio L}}{}
\fi

\setTransitionsForJapanese{\fontspec{VL Gothic}}{}

\begin{document}
Here is ここ.

答案2

据我所知,不可能告诉 XeTeX“尝试查找带有希腊字符的任意字体”。另外,我认为不可能测试(不使用需要 --shell-escape 的外部工具)字体是否存在,因此无法执行“如果字体 A 存在,则使用它,否则尝试字体 B”之类的操作:如果您尝试加载不存在的字体,则始终会出错。

但可以测试当前字体中是否存在特定字形,从而实现警告/错误:

\documentclass{article}
\usepackage{fontspec}

\begin{document}

\ifnum\the\XeTeXcharglyph"D5=0 
 Ä doesn't exist \else Ä exists \fi

\ifnum\the\XeTeXcharglyph"3B1=0
 ^^^3b1 (alpha) doesn't exist\else
 ^^^3b1 (alpha) exists  \fi


\setmainfont{Arial} 

\ifnum\the\XeTeXcharglyph"D5=0
 Ä doesn't exist \else Ä exists \fi

\ifnum\the\XeTeXcharglyph"3B1=0
 ^^^3b1 (alpha) doesn't exist\else
 ^^^3b1 (alpha) exists  \fi

\end{document}

相关内容