更新

更新

我正在使用 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 filenamepdffonts 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}

相关内容