DejaVu Sans Mono 与 MiKTeX 的 XeLaTeX 之间间距奇怪

DejaVu Sans Mono 与 MiKTeX 的 XeLaTeX 之间间距奇怪
\documentclass{article}
\usepackage{fontspec}
    \setmainfont{DejaVu Serif}
    \setsansfont{DejaVu Sans}
    \setmonofont{DejaVu Sans Mono}
\begin{document}
Hello World!

\textsf{Hello World!}

\texttt{Hello World!}
\end{document}

使用 XeLaTeX 编译后得到如下结果:

XeLaTeX 输出

使用 SumatraPDF 复制输出甚至会显示字母之间的常规空格字符和单词之间的换行符:

Hello World!
Hello World!
H e l l o
W o r l d !

(但是,使用 Adob​​e Reader XI Win 复制时,会出现三行相同的内容。)

LuaLaTeX 不会出现此问题:

LuaLaTeX 输出

无论使用哪种 PDF 查看器,LuaLaTeX 的 OCR 层文本都是完美无缺的。

我猜这是 XeTeX 的一个错误?我能以某种方式规避它吗?

我使用的是 MiKTeX 2.9 和 DejaVu 字体 2.33 版,我认为这些字体是 Windows (7) 预装的,至少我不记得手动安装过这些字体。这个版本似乎当前版本,无论如何。

附言:如果有人能推荐另一种等宽字体,用于 a) 与 Linux Libertine 完美匹配且 b) 包含小写希腊字母的代码,那也会很有帮助。但这只是题外话:)

答案1

您是否尝试过更详细地指定字体?我在 MiKTeX 2.9 中测试了以下内容,没有问题。

\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures{
    Extension      = .ttf ,
    Ligatures      = TeX ,
    UprightFont    = * ,
    ItalicFont     = *-Oblique ,
    BoldFont       = *-Bold ,
    BoldItalicFont = *-BoldOblique
}
\setmainfont[ItalicFont = *-Italic, BoldItalicFont = *-BoldItalic]{DejaVuSerif}
\setsansfont{DejaVuSans}
\setmonofont{DejaVuSansMono}

\begin{document}
Hello World!

\textsf{Hello World!}

\texttt{Hello World!}
\end{document}

您确实需要dejavu安装该软件包。

答案2

问题其实与\setmainfont{Linux Libertine O} 使用 pfb 文件而不是 otf:XeLaTeX 甚至没有使用 Windows 字体,而是使用 texmf 树中的字体(出于某种原因,这些字体似乎存在缺陷)。解决方案与另一个问题相同:告诉 MiKTeX 不要使用这些字体。

具体操作如下:

打开localfonts2.conf文件。你可能在不同的地方有此文件的多个版本;对我有用的版本在C:\Users\doncherry\AppData\Roaming\MiKTeX\2.9\fontconfig\config(“Admin” MiKTeX 安装)中。文件应如下所示:

<?xml version="1.0"?>
<fontconfig>
  <selectfont>
    <rejectfont>
      <glob>C:/Program Files (x86)/MiKTeX 2.9/fonts/type1/public/dejavu/*</glob>
    </rejectfont>
  </selectfont>
</fontconfig>

使用此配置,一切对我来说都正常。根据哈立德·霍斯尼,将来这个规范将不再需要,也许在 MiKTeX 3.0 中。


更新:

虽然不使用 Type1 字体可以解决该问题,但 Type 1 字体仍然有缺陷。我联系了该dejavu软件包的作者;他指出了问题所在(Em 大小太大),并表示将在软件包的未来版本中修复该问题。

相关内容