我有以下代码使用这个字体:
\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,因此不会发生除以零的情况。