fontspec 和 LuaTeX 的算术溢出

fontspec 和 LuaTeX 的算术溢出

我有以下代码使用这个字体

\documentclass{minimal}

\usepackage{lettrine}
\usepackage{fontspec,xunicode}

\newfontfamily\EBLettrineFont{EBGaramondInitialsF2}
\renewcommand{\LettrineFontHook}{\EBLettrineFont}

\begin{document}

\lettrine{T}{his} is a test


\end{document}

它与 配合使用可以正常工作 xelatex,但与 配合使用会崩溃lualatex

! Arithmetic overflow.
\LettrineFont ...\divide \@tempcnta by \@tempcntb 
                                                  \advance \@tempcnta by -99...
l.11 \lettrine{T}{his}
                       is a test
? 

怎么了?

答案1

lettrine包依赖于字体是否具有该字符X才能执行计算;而这个字体似乎没有该字符。lettrine有问题的宏是\LettrineFont。它构造一个包含给定字体的框X,然后测量其高度。对于此字体和此字符,LuaTeX 报告的框高度为 0 pt。随后的整数除法失败。

严格来说,这个lettrine假设是合理的,字体本身就有问题,因为它没有提供哪怕是最小的字符集。如果你仍然想使用这个字体,最简单的方法是修改\LettrineFont为使用该字体中存在的字符,例如O

\documentclass{minimal}

\usepackage{lettrine}
\usepackage{fontspec,xunicode}
\usepackage{etoolbox}

\newfontfamily\EBLettrineFont{EBGaramondInitialsF2}
\renewcommand{\LettrineFontHook}{\EBLettrineFont}

\patchcmd{\LettrineFont}{\selectfont X}{\selectfont O}{}{%
  \GenericWarning{}{Patching \protect\LettrineFont\space failed}}

\begin{document}

\lettrine{T}{his} is a test

\end{document}

XeTeX 与 LuaTeX 不同,在此示例代码中,XeTeX 将不存在的高度返回X为 8.10722 pt,因此不会发生除以零的情况。

相关内容