我有以下最少的文档:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{jizura3b}
\begin{document}
\end{document}
文档中的单个字符应使用所示字体显示;这是我自己创建的字体https://github.com/loveencounterflow/svgttf,进而使用https://github.com/fontello/svg2ttf将 SVG 文件转换为 TTF 字体。
确实,这在 OSX 和 Tex Live 2013 和 2014 上按预期工作;然而,在使用 Tex Live 2015 的 Ubuntu 上,我得到了核心转储:
This is XeTeX, Version 3.14159265-2.6-0.99992 (TeX Live 2015) (preloaded format=xelatex)
...
(/usr/local/texlive/2015/texmf-dist/tex/latex/fontspec/fontspec.cfg)))
(./test.aux) (/usr/local/texlive/2015/texmf-dist/tex/latex/tipa/t3cmr.fd)
[1] (./test.aux) )
Segmentation fault (core dumped)
(see the transcript file for additional information)
Error 35584 (driver return code) generating output;
file test.pdf may not be valid.
Transcript written on test.log.
通过谷歌搜索错误编号,35584
确实会表明错误可能与字体有关,这正是我得出的结论,尽管 OSX 和 Ubuntu 字体查看器上的多个应用程序都能正常显示字体而没有错误。
另一方面,这不是我发现的第一个除了 XeLaTeX 之外在其他地方都能正常工作的字体。
假设 XeLaTeX(或 fontspec?)遇到字体问题,建议采取哪些步骤来测试问题出在 XeLaTeX/fontspec 还是字体上?
有关的:如何准确找出字体中的哪些细节导致 LaTeX 脱轨?
另外,我认为无论字体是否有效,LaTeX 都不应该出现段错误,而应该以有用的错误消息和错误代码终止。据我所知,没有发出任何错误代码,所以我的工具链一开始忽略了这个问题;唯一正式表明存在问题的迹象是Segmentation fault (core dumped)
发送到了stderr
,而不是stdout
。
答案1
@Thérèse 非常感谢你的提示!我等了一会儿,想看看是否会有更多人参与进来,但由于没有其他人参与,我只能报告我如何解决这个问题。
首先,用 替换xelatex
确实luatex
有效。但是,这样做的缺点是,luatex
运行所需的时间比 长得多xelatex
,因此我进一步研究并尝试了fontlint
;基于此,我曾经fontforge
修复过损坏的字体。为了进行比较,首先查看fontlint
损坏字体和正常工作字体的输出:
$ fontlint <path to broken font>
Copyright (c) 2000-2012 by George Williams.
Executable based on sources from 14:57 GMT 31-Jul-2012-ML.
Library based on sources from 14:57 GMT 31-Jul-2012.
Missing required table: "post"
Validation jizura3b ...Failed
Self Intersecting Glyph
Wrong Direction
Missing Points at Extrema
$ fontlint <path to working font>
Copyright (c) 2000-2012 by George Williams.
Executable based on sources from 14:57 GMT 31-Jul-2012-ML.
Library based on sources from 14:57 GMT 31-Jul-2012.
Validation jizura3b ...Failed
Self Intersecting Glyph
Wrong Direction
Missing Points at Extrema
您可以看到,虽然报告了多个问题,但关键问题确实存在Missing required table: "post"
(我真的很希望 FontForge 能够修复所有缺陷,但没能做到)。
现在让 FontForge 修复字体的最简单方法是用 FontForge 的脚本语言准备一个非常短的脚本,如下所示:
#!/usr/bin/fontforge -lang=ff
Print("Reading "+$1);
Open($1);
Generate($1:r + ".rewritten-by-fontforge.ttf");
以您喜欢的任何名称保存它,使文件可执行,使用损坏字体的路径调用它,然后就好了。