我听说 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
好的,那就来了。
我应该声明
- 我在这里只谈论文本字体。但我认为如果有人投入数年时间来制作具有 TeX 所需的所有功能的数学字体,他们也会制作与之配套的 TeX 字体设置。
- 我对于这一切并没有太多的正式了解。
- 我定期为客户项目安装字体,很少需要修复任何问题。通常(对于较新、质量较好的字体),一切都开箱即用。
- 对于项目,我们使用了一些额外的脚本(回到 Martin Schröder ;-),这些脚本主要围绕针对
otftotfm
字体系列、编码和字体的每种组合的单个调用而构建。除此之外,该脚本仅配置一些特定于项目的路径,并自动执行一整套调用,以便在一次运行中为项目安装每种字体。
此外,如果你读过otftotfm
手册,我其实没什么可说的。所以我只报告我使用普通 vanillaotftotfm
和ttf
我在 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
而且,更重要的是,最后没有关于更新地图文件的消息!
不幸的是,我没有找到更好的迹象表明安装不起作用。事实上,tfm
和vf
文件已经生成,但没有map
输入,pdftex
无法直接使用字体。
此时,你基本上有两个选择:
- 通过 尝试“标准”程序
ttf2afm
。 - 将字体加载
fontforge
并保存为otf
。
由于我对 1 一无所知,我选择了 2。这存在一些问题,因为字体是从 TTF 转换为 TYPE1,它们有不同的样条模型,等等。因此字形可能会发生变化,并且确实fontforge
抱怨路径相交之类的问题。但我从来没有看到过差异,我甚至不知道在哪里查看(在商业项目中,这种情况几乎从未发生过,如果发生,我们只会告诉客户购买 OTF 版本;字体不是那昂贵的)。
所以我把一些字体转换成了 OTF。无论如何,这些字体还远远达不到“印刷品”的质量!
fontforge
是一款免费的字体编辑器,以前叫做fontedit
IIRC。除此以外,它还可以用来转换字体格式。
此后,安装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 字体的过程归结为(如果你想要最简单的用法)
复制命令行
otftotfm -a -e ec -fkern -fliga myfont.ttf T1--myfont
进入命令外壳,
myfont
用字体名称替换。复制这些线条
\DeclareFontFamily{T1}{myfont}{} \DeclareFontShape{T1}{myfont}{m}{n}{ <-> T1--myfont }{}
放入一个文件中
t1myfontlc.fd
,myfont
用你的字体名称替换,并myfontlc
用你的字体名称替换小写。将此行添加
\pdfmapfile{lcdftools.map}
到文档的序言中。用于
\fontfamily{myfont}\selectfont
在文档中使用新字体。
考虑到手头的任务,我无法想象这怎么会变得更容易;-)
我不确定这个“解释”是否比其他解释更有用,但我认为现在字体安装比以前没那么可怕了;-)
如果还有其他问题,请提出。