如何使用 otftotfm 将 TrueType 字体与 PDFTeX 结合使用?

如何使用 otftotfm 将 TrueType 字体与 PDFTeX 结合使用?

我听说 PDFTeX 可以使用 TrueType 字体。一些 答案 有关的对此,但仅限于这些第一个提到使用 otftotfm,据我所知这是现在的标准方法,但没有一个清楚地解释在创建文档后如何使用字体。otftofm 文档只是使用\renewcommand{\rmdefault}{MinionPro},看起来很简单,但我认为 LaTeX 使用了 4 个字母的名称,类似于{\fontfamily{antt}\selectfont Foobarbaz},而不是人类可读的名称。

有一个看起来很漂亮的otftoftm 的良好手册,但它非常专注于 otf 字体,所以我不确定应该对 TTF 字体使用哪些功能。

还有一个包在 CTAN 上,但它似乎需要 Ruby,而我目前没有 Ruby(但如果这确实是最好的方法,可以得到它)。此外,如何一起使用多个 TTF 文件。例如,如果我想使用 Windows 自带的 Times New Roman(例如,我知道有times软件包),它有 Times New Roman Bold、Times New Roman Bold Italic、Times New Roman Italic 和 Times New Roman Regular。

那么有人可以指导我完成有关如何将所有这些放在一起的文档,以及如何在 LaTeX 文档中使用它,或者编写一个吗?

编辑;有人问我为什么不直接使用 TrueType 字体而不使用 otftofm。我主要指定该工具以将其与其他问题区分开来:如果有更简单的方法,我也会接受它。

答案1

好的,那就来了。

我应该声明

  1. 我在这里只谈论文本字体。但我认为如果有人投入数年时间来制作具有 TeX 所需的所有功能的数学字体,他们也会制作与之配套的 TeX 字体设置。
  2. 我对于这一切并没有太多的正式了解。
  3. 我定期为客户项目安装字体,很少需要修复任何问题。通常(对于较新、质量较好的字体),一切都开箱即用。
  4. 对于项目,我们使用了一些额外的脚本(回到 Martin Schröder ;-),这些脚本主要围绕针对otftotfm字体系列、编码和字体的每种组合的单个调用而构建。除此之外,该脚本仅配置一些特定于项目的路径,并自动执行一整套调用,以便在一次运行中为项目安装每种字体。

此外,如果你读过otftotfm手册,我其实没什么可说的。所以我只报告我使用普通 vanillaotftotfmttf我在 Linux 机器上找到的一些字体进行的一些分步实验,严格按照手册进行。

呼唤otftotfm

首先,otftotfm实际上是用于安装.otf用于 LaTeX 的字体。根据 OTF 中“隐藏”的字体格式,它将写入.ttf.pfb。所有这些都在幕后发生。这一切都在映射文件中解决,该文件也会自动更新。

正如您明确要求的那样.ttf,这就是我将在下文中提到的内容。.otf文件的用法和所有后续步骤完全相同。事实上,除了警告 TTF 支持是“实验性的”并且有时会因非良好行为的 TTF 而失败外,otftotfm并没有真正区分.otf和(良好行为) 。我从未遇到过 OTF 失败的情况。.ttf

Ubuntu-R.ttf如上所述,安装字体自动模式,以下调用就足够了:

otftotfm -a --verbose -e ec  -fkern -fliga Ubuntu-R.ttf T1--Ubuntu--Regular &> Ubuntu.log

代表-a自动模式,意味着所有派生文件将自动放在正确的位置。 -e ec指定要使用的编码。ec是正常T1编码,但您也可以texnansx按照手册中的建议使用。 可能那些ec不在的字符texnansx在大多数非 TeX 字体中都找不到。

-fkern -fliga激活 otf 功能“pair kerns”和“f-ligatures”,这是 TeX 一直想要的功能。还有许多其他受支持的功能,但我不知道它们是什么。

Ubuntu-R.ttf只是我找到的字体的文件名。T1--Ubuntu--Regular是我为字体选择的“TeX 名称”;我们稍后会需要它。

现在是查看日志文件的好时机。我只会复制一些有趣的行(由于选项的原因,它相当长--verbose):

otftotfm: encoding file ec.enc found with kpathsea at /opt/tex/texlive/qstex/texmf-dist/fonts/enc/dvips/base/ec.enc

otftotfm: warning: TrueType-flavored font support is experimental

otftotfm: placing encoding files in '/home/slehmke/.texlive2011/texmf-var/fonts/enc/dvips/lcdftools'

otftotfm: updating /home/slehmke/.texlive2011/texmf-var/fonts/map/dvips/lcdftools/lcdftools.map for T1--Ubuntu--Regular--base

原则上,这意味着一切都很好。我们还获得了一些有关所用路径的信息。

唯一稍微不理想的是lcdftools(的供应商名称otftotfm)被用作字体的默认供应商名称。otftotfm真的可以把它从字体信息中拿出来(就像它对字体名称所做的那样)!

所以我用

otfinfo -i Ubuntu-R.ttf

产生(除其他外)

Family:              Ubuntu
Subfamily:           Regular
Full name:           Ubuntu
PostScript name:     Ubuntu
Version:             Version 0.71
Manufacturer:        Dalton Maag Ltd
Vendor URL:          http://www.daltonmaag.com/

所以现在我可以给出一个明确的供应商名称otftotfm(请注意,这对于工作来说根本不是必要的,它只是更有序)。

otftotfm -a -e ec  -fkern -fliga --verbose --vendor daltonmaag Ubuntu-R.ttf T1--Ubuntu--Regular &> Ubuntu.log

按照同样的方式,我安装了这个系列的其他成员:

otftotfm -a -e ec  -fkern -fliga --verbose --vendor daltonmaag Ubuntu-RI.ttf T1--Ubuntu--RegularItalic &>> Ubuntu.log
otftotfm -a -e ec  -fkern -fliga --verbose --vendor daltonmaag Ubuntu-L.ttf T1--Ubuntu--Light &>> Ubuntu.log
otftotfm -a -e ec  -fkern -fliga --verbose --vendor daltonmaag Ubuntu-LI.ttf T1--Ubuntu--LightItalic &>> Ubuntu.log
otftotfm -a -e ec  -fkern -fliga --verbose --vendor daltonmaag Ubuntu-B.ttf T1--Ubuntu--Bold &>> Ubuntu.log
otftotfm -a -e ec  -fkern -fliga --verbose --vendor daltonmaag Ubuntu-BI.ttf T1--Ubuntu--BoldItalic &>> Ubuntu.log

现在,最复杂的部分已经结束。所有必要的内部文件都已到位。

只是为了好玩,我还安装了一些我在 Linux 机器中找到的“装饰性”字体。每个字体都代表一种字体,因此它们不构成或属于一个字体系列。

otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts BaileysCar.otf T1--BaileysCar--Regular &> BaileysCar.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts CanadianParticipants.otf T1--CanadianParticipants--Regular &> CanadianParticipants.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts EnnobledPet.otf T1--EnnobledPet--Regular &> EnnobledPet.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts GroovyGhosties.otf T1--GroovyGhosties--Regular &> GroovyGhosties.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts HookedonBooze.otf T1--HookedonBooze--Regular &> HookedonBooze.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts pulsesta.ttf T1--PulseState--Regular &> PulseState.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts sendcash.ttf T1--SendCash--Regular &> SendCash.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts WakeBake.otf T1--WakeBake--Regular &> WakeBake.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts wetpet.ttf T1--WetPet--Regular &> WetPet.log
otftotfm -a --verbose -e ec -fkern -fliga --vendor larabiefonts WildSewerage.otf T1--WildSewerage--Regular &> WildSewerage.log

但那是什么?安装的一些字体是 OTF 字体???

原因是原来尝试安装ttf失败了。

打电话时

otftotfm -a --verbose -e ec  -fkern -fliga --vendor larabiefonts baileysc.ttf T1--BaileysCar--Regular &> BaileysCar.log

我在日志文件中找到了以下几行

otftotfm: bad table 0 range 10 length (format 4)
otftotfm: warning: 'kern' and 'liga' features ignored, not supported by font

而且,更重要的是,最后没有关于更新地图文件的消息!

不幸的是,我没有找到更好的迹象表明安装不起作用。事实上,tfmvf文件已经生成,但没有map输入,pdftex无法直接使用字体。

此时,你基本上有两个选择:

  1. 通过 尝试“标准”程序ttf2afm
  2. 将字体加载fontforge并保存为otf

由于我对 1 一无所知,我选择了 2。这存在一些问题,因为字体是从 TTF 转换为 TYPE1,它们有不同的样条模型,等等。因此字形可能会发生变化,并且确实fontforge抱怨路径相交之类的问题。但我从来没有看到过差异,我甚至不知道在哪里查看(在商业项目中,这种情况几乎从未发生过,如果发生,我们只会告诉客户购买 OTF 版本;字体不是昂贵的)。

所以我把一些字体转换成了 OTF。无论如何,这些字体还远远达不到“印刷品”的质量!

fontforge是一款免费的字体编辑器,以前叫做fonteditIIRC。除此以外,它还可以用来转换字体格式。

此后,安装otftotfm肯定可以正常工作。

.fd文件

唯一没有自动生成的otftotfm是一个fd向 LaTeX 声明某个字体系列的文件。

对于单一字体来说,这很容易:只需声明我们有什么字体。

\DeclareFontFamily{T1}{BaileysCar}{}
\DeclareFontShape{T1}{BaileysCar}{m}{n}{
  <->   T1--BaileysCar--Regular
}{}

进入文件t1baileyscar.fd。这里我们声明一个BaileysCar由单一字体组成的字体系列中等的/普通的。字体名称T1--BaileysCar--Regular只是我在安装字体时选择的“TeX 名称”。请注意,文件名必须完全正确t1baileyscar.fd,由“LaTeX 编码名称”(编码为 T1 ec)和系列名称组成小写!LaTeX 在给定编码中查找给定字体系列的声明时将构造此名称。

对于Ubuntu由多种字体组成的真正系列,最好创建一个更大的fd文件来声明更大范围的字体形状。以下文件t1ubuntu.fd改编.fd自我在系统上找到的另一个文件(例如t1ptm.fd)。

\ProvidesFile{t1ubuntu.fd}
   [2012/04/22 scalable font definitions for T1/Ubuntu.]

\DeclareFontFamily{T1}{Ubuntu}{}

\DeclareFontShape{T1}{Ubuntu}{m}{n}{
   <-> T1--Ubuntu--Regular
}{}
\DeclareFontShape{T1}{Ubuntu}{m}{sc}{
   <-> ssub * Ubuntu/m/n
}{}
\DeclareFontShape{T1}{Ubuntu}{m}{sl}{
   <-> T1--Ubuntu--RegularItalic
}{}
\DeclareFontShape{T1}{Ubuntu}{b}{n}{
   <-> T1--Ubuntu--Bold
}{}
\DeclareFontShape{T1}{Ubuntu}{b}{sc}{
   <-> ssub * Ubuntu/b/n
}{}
\DeclareFontShape{T1}{Ubuntu}{b}{sl}{
   <-> T1--Ubuntu--BoldItalic
}{}
\DeclareFontShape{T1}{Ubuntu}{l}{n}{
   <-> T1--Ubuntu--Light
}{}
\DeclareFontShape{T1}{Ubuntu}{l}{sc}{
   <-> ssub * Ubuntu/l/n
}{}
\DeclareFontShape{T1}{Ubuntu}{l}{sl}{
   <-> T1--Ubuntu--LightItalic
}{}
\DeclareFontShape{T1}{Ubuntu}{m}{it}{<->ssub * Ubuntu/m/sl}{}
\DeclareFontShape{T1}{Ubuntu}{bx}{n}{<->ssub * Ubuntu/b/n}{}
\DeclareFontShape{T1}{Ubuntu}{bx}{sc}{<->ssub * Ubuntu/b/sc}{}
\DeclareFontShape{T1}{Ubuntu}{bx}{sl}{<->ssub * Ubuntu/b/sl}{}
\DeclareFontShape{T1}{Ubuntu}{b}{it}{<->ssub * Ubuntu/b/sl}{}
\DeclareFontShape{T1}{Ubuntu}{bx}{it}{<->ssub * Ubuntu/b/it}{}
\DeclareFontShape{T1}{Ubuntu}{l}{it}{<->ssub * Ubuntu/l/sl}{}
\endinput

除了我实际拥有的字体外,我还声明了不存在的形状的替代。声明

\DeclareFontShape{T1}{Ubuntu}{m}{sc}{
   <-> ssub * Ubuntu/m/n
}{}

意味着当寻找“中等小型大写字母”字体时,应该使用“中等正常字体”。

文件的文档.fd位于指南

使用示例

为了演示所有字体,我制作了以下示例文件:

\documentclass[a4paper]{article}

\usepackage[top=10mm,bottom=10mm,left=10mm,right=10mm]{geometry}

\usepackage[T1]{fontenc}

\usepackage{microtype}

\usepackage{lipsum}

\usepackage[latin]{babel}

\pdfmapfile{larabiefonts.map}
\pdfmapfile{daltonmaag.map}

\renewcommand\rmdefault{Ubuntu}
\renewcommand\sfdefault{Ubuntu}


\begin{document}

\noindent
\parbox[t]{\dimexpr.5\linewidth-1ex\relax}
{%
  \section{Ubuntu test \textit{foo}}

  \lipsum[1]\textit{\lipsum[1]}

  \fontseries{l}\selectfont\lipsum[1]\textit{\lipsum[1]}
}
\hfill
\parbox[t]{\dimexpr.5\linewidth-1ex\relax}
{%
  \fontfamily{BaileysCar}\selectfont\lipsum[1]

  \fontfamily{CanadianParticipants}\selectfont\lipsum[1]

  \fontfamily{EnnobledPet}\selectfont\lipsum[1]
}
\newpage
\noindent
\parbox[t]{\dimexpr.5\linewidth-1ex\relax}
{%
  \fontfamily{GroovyGhosties}\selectfont\lipsum[1]

  \fontfamily{HookedonBooze}\selectfont\lipsum[1]

  \fontfamily{PulseState}\selectfont\lipsum[1]

  \fontfamily{WakeBake}\selectfont\lipsum[1]
}
\hfill
\parbox[t]{\dimexpr.5\linewidth-1ex\relax}
{%
  \fontfamily{WetPet}\selectfont\lipsum[1]

  \fontfamily{WildSewerage}\selectfont\lipsum[1]
}
\end{document}

引用我们字体安装的那些行是

\pdfmapfile{larabiefonts.map}
\pdfmapfile{daltonmaag.map}

这些指的是生成的.map文件。您可以在日志文件中查找该信息,但它实际上是 <vendorname> .map

此外,我需要用 来引用字体系列的名称\fontfamily。重新定义\rmdefault只会更改整个文档的默认罗马字体系列。

结果如下:

字体示例

在最左边的栏中,您可以看到新的“Ubuntu”系列以不同的字体按预期运行。

为了更详细地展示所有漂亮的新装饰字体:

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

结论

因此,基本上,在 LaTeX 中使用新 TTF 字体的过程归结为(如果你想要最简单的用法)

  1. 复制命令行

    otftotfm -a -e ec  -fkern -fliga myfont.ttf T1--myfont
    

    进入命令外壳,myfont用字体名称替换。

  2. 复制这些线条

    \DeclareFontFamily{T1}{myfont}{}
    \DeclareFontShape{T1}{myfont}{m}{n}{
      <->   T1--myfont
    }{}
    

    放入一个文件中t1myfontlc.fdmyfont用你的字体名称替换,并myfontlc用你的字体名称替换小写

  3. 将此行添加\pdfmapfile{lcdftools.map}到文档的序言中。

  4. 用于\fontfamily{myfont}\selectfont在文档中使用新字体。

考虑到手头的任务,我无法想象这怎么会变得更容易;-)

我不确定这个“解释”是否比其他解释更有用,但我认为现在字体安装比以前没那么可怕了;-)

如果还有其他问题,请提出。

相关内容