我正在使用 Gentium Book Basic 字体的文件上运行 ConTeXt/XeTeX。我遇到的问题是 XeTeX 似乎花费大量时间反复尝试创建该字体或相关辅助文件(使用 mktexmf 和 mktextfm)。据我所知,字体运行良好。
总之,当我运行 XeTeX 时,我得到很多这样的输出:
(./macros/pagenohead.tex) (./data/front-matter-all.tex
kpathsea: Running mktextfm GentiumBookBasic
/usr/local/texlive/2012/texmf/web2c/mktexnam: Could not map source abbreviation for GentiumBookBasic.
/usr/local/texlive/2012/texmf/web2c/mktexnam: Need to update ?
mktextfm: Running mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input GentiumBookBasic
This is METAFONT, Version 2.718281 (TeX Live 2012)
kpathsea: Running mktexmf GentiumBookBasic
! I can't find file `GentiumBookBasic'.
<*> ...mag:=1; nonstopmode; input GentiumBookBasic
Please type another input file name
! Emergency stop.
<*> ...mag:=1; nonstopmode; input GentiumBookBasic
Transcript written on mfput.log.
grep: GentiumBookBasic.log: No such file or directory
mktextfm: `mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input GentiumBookBasic' failed to make GentiumBookBasic.tfm.
kpathsea: Appending font creation commands to missfont.log.
kpathsea: Running mktextfm GentiumBookBasic
实际上,在 16 页的文档中,这种情况重复了近 1700 次……大概每次我尝试使用 GentiumBookBasic 字体时都会发生这种情况。因此,它需要大约10分钟在合适的服务器上将其渲染为 PDF。当我切换到标准内置字体(如“Serif”)时,文档的渲染速度低于9 秒!
如果我们尝试渲染整本 1200 页的书而不解决这个问题,则可能会花费大约 12 个小时!
顺便说一句,当 PDF 最终从另一端输出时,Gentium 格式的文本看起来就像在 Gentium 字体中完美呈现一样。因此结果是正确的;只是它花费的时间更长,并且做了比应有的更多无用工作。
我该怎么做才能让 TeX 正确识别字体并停止在每次使用字体时尝试重新创建其关联文件?
细节:
- ConTeXt 版本:2012.05.30 11:26 MKII 版本:2012.11.5
- XeTeX,版本 3.1415926-2.4-0.9998(TeX Live 2012)
我们需要使用 TeXLive 未自带的字体:Gentium Book Basic。所以我需要找出如何让 XeTeX 找到第三方字体。
我读这里“XeTEX 和 LuaTEX 可以使用系统上安装的任何字体,而不仅仅是 TEX 树中的字体”。相比之下, “[集成第三方字体] 不幸是一个混乱的话题。除非您想深入研究 TEX 安装的许多细节,否则请忘掉它。... 一个可能的替代方法是使用 XeTEX 或 LuaTEX(参见第 2.4 节),它们允许您使用操作系统字体而无需在 TEX 中进行任何安装。”
因此显然我需要做的就是在操作系统(在我的情况下是 CentOS Linux)中安装 Gentium Book Basic,XeTeX 就应该能够找到它。
为了将 Gentium Book Basic 安装到系统中,我按照以下页面上的说明进行操作:这:
- ls Gen*
GenBasBI.ttf GenBasB.ttf GenBasI.ttf GenBasR.ttf GenBkBasBI.ttf GenBkBasB.ttf GenBkBasI.ttf GenBkBasR.ttf
- mkdir /usr/share/fonts/TTF
- cp Gen*.ttf /usr/share/fonts/TTF
- fc-缓存-f-v
- fc 列表 | grep Gentium
后者给出:
Gentium Basic:style=Bold Italic
Gentium Book Basic:style=Bold
Gentium Book Basic:style=Italic
Gentium Basic:style=Regular
Gentium Book Basic:style=Bold Italic
Gentium Book Basic:style=Regular
Gentium Basic:style=Italic
Gentium Basic:style=Bold
所以在我看来 Gentium 已成功安装在操作系统中。
这TeXLive 安装文档说如下:
在 Windows 上,TEX Live 附带的字体会自动提供给 XeTEX。但如果您在兼容 Unix 的系统上安装了 xetex 包,则需要配置系统,以便能够通过系统名称查找(而不仅仅是文件名查找)找到 TEX Live 附带的字体。
为了实现这一点,当安装 xetex 包时(无论是初始安装还是更高版本),都会在 TEXMFSYSVAR/fonts/conf/texlive-fontconfig.conf 中创建必要的配置文件。
要设置 TEX Live 字体以供全系统使用(假设您具有合适的权限),请按以下步骤操作:
Copy the texlive-fontconfig.conf file to /etc/fonts/conf.d/09-texlive.conf. Run fc-cache -fsv.
我觉得这很令人困惑。它是关心让 XeTeX 看到 TeXLive 未附带的字体,还是让系统的其余部分看到 TeXLive 附带的字体?似乎两者都有。不过,我认为这不会有什么坏处,所以我按照上述说明操作,fc-cache 报告它已成功完成。
现在介绍如何在 ConTeXt 文档中引用字体。我的字体定义如下:
\definefont[SerifS][GentiumBookBasic at \smallfontsize]
\definefont[SerifLB][GentiumBookBasic-Bold at \largefontsize]
等等。它们的使用风格如下:
% 'Small' Italic (8.1pt)
\def\IT#1{{\SerifSI#1}}
% 'Big' Bold (9.2pt)
\def\BO#1{{\SerifLB#1}}
在.tex 文件中引用:
\IT{Class: }
\BO{Previous Editions}
现在,将上述内容\definefont
与 报告的字体名称进行比较fc-list
,很明显前者使用的名称没有空格(“GentiumBookBasic”),而后者使用的名称有空格(“Gentium Book Basic”)。这可能是问题的根源吗?
命令参考页面ConTeXt中对此\definefont
没有太多说明。\definefontsynonym
字体手册说应该删除第二个参数中的空格。但我还是尝试了一下:
\definefont[SerifS][Gentium Book Basic at \smallfontsize]
等等。然而结果并没有更好:
kpathsea: Running mktextfm GentiumGentium
/usr/local/texlive/2012/texmf/web2c/mktexnam: Could not map source abbreviation for GentiumGentium.
ETC。
感谢花时间浏览上述内容的所有人。如果您能提供任何帮助,我们将不胜感激!
PS:我还尝试更改 .tex 文件中的字体定义,以使用实际的 TTF 文件名(不带扩展名)而不是完整的字体名称;例如
\definefont[SerifS][GenBkBasR at \smallfontsize]
甚至更好的是:
\definefont[SerifS][GenBkBasR.ttf at \smallfontsize]
这似乎没有什么区别。我仍然收到类似“我找不到文件‘GenBkBasR’”的错误。(当我提供扩展名时,扩展名被删除了。)
我甚至尝试使用file:
如下方法http://context.aanhet.net/svn/contextman/context-reference/en/co-fonts.pdf第2页:
\definefont[SerifS][file:GenBkBasR at \smallfontsize]
以及以下示例typescripts 模块Aditya 提到过,我尝试过
\definefont[SerifS][\s!file:GenBkBasR at \smallfontsize]
(虽然我不知道这个\s!
是干什么的)。但在这两种情况下,我都得到了这个“更糟糕”的错误:
kpathsea: Invalid fontname `[GenBkBasR]', contains '['
在得到通常的
kpathsea: Running mktextfm GenBkBasR
/usr/local/texlive/2012/texmf/web2c/mktexnam: Could not map source abbreviation for GenBkBasR.
等等。和以前不同的是,在这些情况下,TeX 无法完成渲染。
更新
让我尝试集中讨论一下这个问题...
为什么 Xetex(或系统的任何组件)试图在 Gentium Book Basic 上调用 mktexnam、mktextfm、mktexmf 等 - 是因为它认为尚未创建该字体的一些 TeX 辅助文件吗?每次都无法创建这些文件吗?但是字体被正确呈现,因此系统最终成功获取了所需的数据。我可以做些什么来让 TeX 成功写入所需的辅助数据文件,这样它就不会在每次引用字体时都费力地“绊倒”吗?我一直将 mktex* 等实用程序视为“幕后”,我想将它们保留在那里,但也许我必须了解它们的工作原理才能解决问题。
第一个错误,
mktexnam: Could not map source abbreviation for GentiumBookBasic
我可以通过提供显式映射来直接修复吗?怎么做?
答案1
哇。我没想到这会产生这么大的影响。
阅读这,
在这两个系统中,ConTEXt 首先尝试使用官方字体名称查找字体。如果此方法无效,则它会尝试使用文件名作为后备。由于这种方法效率不高,而且可能会生成(无害但看起来令人担忧的)警告,因此可以使用前缀强制 ConTEXt 进入其中一种模式,因此您通常会看到如下同义词定义:
\definefontsynonym [MSTimes] [名称:TimesNewRoman] [功能=默认] \definefontsynonym [Iwona-Regular] [文件:Iwona-Regular] [功能=默认]
我决定尝试[name:GentiumBookBasic ...]
而不是仅仅尝试[GentiumBookBasic ...]
。(正如我编辑的问题所示,我已经尝试过[file:GenBkBasR ...]
,但没有成功。)我认为使用name:
不会有太大区别,如果有的话,因为根据上述内容,无论如何都会首先尝试官方字体名称。
但它却改变了一切。
我看到的所有警告信息都消失了。我在输出中搜索了 mktexnam、mktextmf 等信息,但一无所获。
更重要的是,渲染时间从 9 分钟缩短到 13.5 秒!
我仍然感到困惑为什么在我开始使用之前,我遇到了“效率不高”(即速度减慢 40 到 60 倍!)的问题name:
。我猜 ConTEXt 首先按文件名搜索字体,而不是首先按官方字体名称搜索字体,这与文档(可能指的是不同的版本)相反。不过,它应该采取那么长?
得到教训:
我看到的警告显然是由于 ConTeXt 首先尝试按文件名查找字体,并尝试为不存在的文件名的字体创建辅助文件,然后再查找具有该官方字体名称的字体。后者作为后备方法,但前者花费了大量时间。
始终(或至少当出现这些警告时)在字体定义中指定您是否尝试通过字体名称或文件名来描述字体。
是的,XeTeX 确实可以使用刚安装在操作系统中的字体,如果你通过官方名称引用字体,但如果您尝试通过文件名引用字体,显然不行。
如果您需要在 中的字体名称中添加 'italic' 等属性
\definefont
,您可以这样做:\definefont[SerifLI][name:GentiumBookBasic-Italic at \largefontsize]
,即使没有名称为“GentiumBookBasic-Italic”的字体。这对应于fc-list
列为 的字体Gentium Book Basic:style=Italic
。这种语法并不出人意料,但字体章节草稿似乎没有解释是否Palatino-Italic
不仅仅是一个单一的字体名称。因此,我是否正确是调试过程中不确定的另一个维度。
答案2
你为什么不直接用沃尔夫冈·舒斯特的typescripts
模块这是ConTeXt 独立发行版以及 TeX Live,并附带 Gentium 的打字稿。
Gentium 字体包是 TeX Live 和 ConTeXt minimals 的一部分,并附带打字稿适用于 Genetium。您可以按如下方式使用它:
\usetypescriptfile[type-gentium]
\usetypescript[gentium]
\setupbodyfont[gentium]
\starttext
\input knuth
\stoptext
context --xetex filename
在我使用或编译文档后texexec --xetex filename
,pdffonts filename.pdf
会告诉
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
EBJEYZ+Gentium CID TrueType Identity-H yes yes yes 5 0
笔记:typescripts 模块针对作为 ConTeXt 独立版和 Tex Live 的一部分分发的 Gentium 字体进行了调整。我不知道“Gentium Book Basic”与此之间是否有区别。
答案3
我之前的回答是关于 Gentium Basic 的,这个回答解释了如何使用 Gentium Book Basic。
步骤 1:下载并安装 Gentium Book Basic。
我正在使用作为 TeX Live 的一部分安装的字体(我也与我的 ConTeXt 最小安装共享 TeX Live 字体目录)。
$ls -l /usr/share/texmf-dist/fonts/truetype/public/gentium
total 3464
-rw-r--r-- 1 root root 315860 Jun 26 01:46 GenAI102.ttf
-rw-r--r-- 1 root root 364056 Jun 26 01:46 GenAR102.ttf
-rw-r--r-- 1 root root 250668 Jun 26 01:46 GenBasBI.ttf
-rw-r--r-- 1 root root 271648 Jun 26 01:46 GenBasB.ttf
-rw-r--r-- 1 root root 263504 Jun 26 01:46 GenBasI.ttf
-rw-r--r-- 1 root root 269048 Jun 26 01:46 GenBasR.ttf
-rw-r--r-- 1 root root 249924 Jun 26 01:46 GenBkBasBI.ttf
-rw-r--r-- 1 root root 271832 Jun 26 01:46 GenBkBasB.ttf
-rw-r--r-- 1 root root 266156 Jun 26 01:46 GenBkBasI.ttf
-rw-r--r-- 1 root root 272460 Jun 26 01:46 GenBkBasR.ttf
-rw-r--r-- 1 root root 314476 Jun 26 01:46 GenI102.ttf
-rw-r--r-- 1 root root 362664 Jun 26 01:46 GenR102.ttf
这些GenBk...
字体是 Book Basic 字体。我想用 MkIV 和 XeTeX MkII 测试这些字体,所以我还更新了 MkIV 字体数据库:
mtxrun --script fonts --reload
(我不知道如何更新 XeTeX 中的字体数据库,但通常安装程序会帮我完成这项工作)。
第 2 步:为 Gentium Book Basic 创建打字稿
(这仅适用于 XeTeX。使用 LuaTeX,有一种更简单的方法,见下文)。
Gentium 字体附带一个 typescript 文件,但它使用的是 Gentium 而不是 Gentium Book。因此,我更改了相应的文件名以创建 Gentium Book 的 typescript 并将文件另存为type-gentium-book.tex
(文件名可以是任何名称,但我遵循 ConTeXt 中的惯例)。将文件保存在 ConTeXt 可以找到它的地方(当前目录或tex/context/
TDS 子树中的某个位置)。
\starttypescript [serif] [gentium-book]
\definefontsynonym [Gentium-Roman] [file:GenBkBasR] [features=default]
\definefontsynonym [Gentium-Italic] [file:GenBkBasI] [features=default]
\definefontsynonym [Gentium-Bold] [file:GenBkBasB] [features=default]
\definefontsynonym [Gentium-BoldItalic] [file:GenBkBasBI] [features=default]
\definefontsynonym [Gentium-Slanted] [Gentium-Italic]
\definefontsynonym [Gentium-BoldSlanted] [Gentium-BoldItalic]
\stoptypescript
\starttypescript [serif] [gentium-book] [name]
\definefontsynonym [Serif] [Gentium-Roman]
\definefontsynonym [SerifItalic] [Gentium-Italic]
\definefontsynonym [SerifBold] [Gentium-Bold]
\definefontsynonym [SerifBoldItalic] [Gentium-BoldItalic]
\definefontsynonym [SerifSlanted] [Gentium-Slanted]
\definefontsynonym [SerifBoldSlanted] [Gentium-BoldSlanted]
\definefontsynonym [SerifCaps] [Serif]
\definefontsynonym [OldStyle] [Serif]
\stoptypescript
\starttypescript [gentium-book]
\definetypeface [gentium-book] [rm] [serif] [gentium-book] [default] [features=default]
\stoptypescript
请注意,此打字稿适用于随 TeX Live 分发的字体。因此,我使用该file:..
选项。(如果文件不是 TeX 目录结构的一部分,则这很可能不起作用)。
上述 typescript 无法与 pdftex 引擎配合使用。由于问题只询问如何使用 TTF 字体,因此我不会介绍如何为 type1 字体设置 typescript(这是很多更复杂)。
步骤 3:XeTeX (MkII) 测试文件
\usetypescriptfile[type-gentium-book]
\usetypescript[gentium-book]
\setupbodyfont[gentium-book]
\starttext
\input knuth
\stoptext
编译texexec --xetex filename
并测试字体是否使用:
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
TGAVQL+GentiumBookBasic CID TrueType Identity-H yes yes yes 5 0
步骤 4:使用 MkIV 进行测试(困难方法)
创建打字稿后,它也应该与 MkIV 一起使用。ConTeXt MkIV 会自动搜索打字稿文件,因此测试文件更简单:
\setupbodyfont[gentium-book]
\starttext
\input knuth
\stoptext
使用以下命令进行编译context filename
并检查字体是否被使用:
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
FDSIOE+GentiumBookBasic CID TrueType Identity-H yes yes yes 18 0
步骤 5:使用 MkIV 进行测试(简单方法)
如果您对 XeTeX 解决方案不感兴趣,则无需创建 typescript 文件。请改用 Simplefonts 模块:
\usemodule[simplefonts]
\setmainfont[Gentium Book Basic]
\starttext
\input knuth
\stoptext
答案4
这是一份最小的 LaTeX 文档,您可以通过 XeLaTeX 运行它,以查看它是否是 ConTeXt 的错误或您的配置中的某些问题。(我没有 Gentium Book Basic,但我确保它与 Lucida Sans Unicode 一起运行:它从未尝试构建任何东西。)
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Gentium Book Basic}
% nonsense text; or just paste in your own text below
\usepackage{lipsum}
\begin{document}
\section{Lots and lots of text}
\lipsum
\end{document}